前言
k8s sig开发了kind用于k8s开发,但是国内的环境让这个东西成为空谈。但是其实是有解决方法的,我们同样可以使用。本文告诉你如何使用gland + kind在mac上本地开发与调试istio。
背景
最近在本地调试istio,由于代码是master分支,而安装的集群是istio 1.6版本老版本;
istio从1.7开始,已经开始使用envoy v3版本的api,v2版本没有兼容,导致调试时经常失败。
因此想安装最新的istio来调试,但是原有的环境又不想破坏掉。因此需要有一个环境,安装最新版本的istio用于调试。
在亚太机器上使用kind构建了一套集群,1分钟时间。
如果要从本地访问这个集群,需要给该docker的apiserver证书中加入宿主机的外网IP。
但是由kind是使用docker起的一个K8s集群,没有找到如何来修改证书的方法。
后来想到可以在该集群上通过iptables nat把流量源地址改成127.0.0.1,绕过apiserver证书对IP限制。但是并未去实践。
因此想在本地使用kind快速构建出集群,但是苦于国内糟糕的网络环境,如是有了本篇文章。
本篇文章,解决了国内使用kind普遍存在的拉取镜像慢、镜像拉取次受限导致无法痛快使用Kind集群的问题。
安装Kind
kind本身是个二进制命令,可以直接创建出一个k8s集群。
该集群是其实本质上是一个docker容器,因此启动速度很快(科学上网前提),对宿主机环境依赖小。
一条命令搞定kind命令安装:
go get sigs.k8s.io/kind
Mac Docker配置
由于依赖Mac本地Docker,在国内下载镜像速度慢,一般想到的方法是给docker配置代理。配置代理的方法:
# ~/.docker/config.json
{
"proxies":
{
"default":
{
"httpProxy": "http://127.0.0.1:3001",
"httpsProxy": "http://127.0.0.1:3001",
"noProxy": "*.test.example.com,.example2.com,127.0.0.0/8"
}
}
}
加上代理后,拉取镜像到本地的速度确实快了不少。
但是受Dockerhub拉取次数限制。
因此最好的方法是配置私有仓库,然后让私有仓库从dockerhub拉取镜像。可以避免重复从dockerhub上拉取相同的镜像,且从私有仓库拉取走内网,速度很快。
在亚太环境上配置好私有registry仓库,然后本地配置registry到该地址。搭建私有创库的方法参考之前的文章。
本地docker 配置如下:
cat ~/.docker/daemon.json
{"debug":true,"experimental":false,"registry-mirrors": ["http://192.168.0.10:5000"]}
启动docker后,检查配置生效:
docker info
Registry Mirrors:
http://192.168.0.10:5000/
安装k8s集群
上面的配置就绪后,只剩安装K8s集群。
一条命令即可以创建一个集群:
kind create cluster
注意:该命令会覆盖本地配置好的~/.kube/config
如果创建不成功,集群会自动清除;使用下面的命令,保留环境,输出日志方便debug
kind create cluster --retain
kind export logs
检查集群已经成功创建:
kubectl get po -A
kube-system coredns-f9fd979d6-6dxnx 1/1 Running 0 3h2m
kube-system coredns-f9fd979d6-v959w 1/1 Running 0 3h2m
kube-system etcd-kind-control-plane 1/1 Running 0 3h2m
kube-system kindnet-tvm2p 1/1 Running 0 3h2m
kube-system kube-apiserver-kind-control-plane 1/1 Running 0 3h2m
kube-system kube-controller-manager-kind-control-plane 1/1 Running 1 3h2m
kube-system kube-proxy-7xgr8 1/1 Running 0 3h2m
kube-system kube-scheduler-kind-control-plane 1/1 Running 0 3h2m
local-path-storage local-path-provisioner-78776bfc44-45ww8 1/1 Running 0 3h2m
使用istio debug
首先打包istioctl
➜ istioctl git:(master) ✗ pwd
/Users/hugo/go/src/istio.io/istio/istioctl/cmd/istioctl
➜ istioctl git:(master) ✗ go build
➜ istioctl git:(master) ✗ ls
doc.go istioctl istioctl_test.go main.go
build 出来istioctl后,安装:
➜ istioctl git:(master) ✗ ./istioctl install
安装负载httpbin,注入sidecar用于测试:
➜ ✗ kubectl create deploy httpbin --image zackzhangkai/httpbin --port 80
➜ ✗ k label ns default istio-injection=enabled
template annotations中加入inject sidecar,重启注入sidecar
✗ k get po
NAME READY STATUS RESTARTS AGE
httpbin-8d5d56c7d-nqgzn 2/2 Running 0 68m
启动pilot discovery
➜ pilot-discovery git:(master) pwd
/Users/hugo/go/src/istio.io/istio/pilot/cmd/pilot-discovery
➜ pilot-discovery git:(master) ls
main.go request.go var
➜ pilot-discovery git:(master) go run main.go discovery
使用pilot cli检查xds
➜ debug git:(master) ✗ pwd
/Users/hugo/go/src/istio.io/istio/pilot/tools/debug
➜ debug git:(master) ✗ go run pilot_cli.go --type lds --proxytag httpbin-8d5d56c7d-nqgzn
"typeUrl": "type.googleapis.com/envoy.config.listener.v3.Listener",
"nonce": "Ixb+bcZpQIE=319bdf9c-adc4-4174-8d71-77cc801b14e2"
此时成功借助pilot cli完成了对pilot的简单调试。