我准备使用istio来替代原来的traefic网关和consul服务注册发现的方案,但在安装istio过程中遇到了一些问题,把解决的过程记录下来,便于今后遇到类似问题做个参考。
istio安装的中文文档地址:Istio Prelim 1.23 / 文档
参照Istio Prelim 1.23 / 入门 官网的安装方法,首先下载istioctl,然后使用命令istioctl install以默认配置安装,正常部署会安装这两个pod
NAME READY STATUS RESTARTS AGE
istio-ingressgateway-94974fc7f-cxjwz 1/1 Running 0 5d4h
istiod-54785969-6rfzh 1/1 Running 0 5d4h
我下载的istioctl是1.22.0这个版本,在安装过程中遇到的第一个问题:镜像下拉不下来。
可以通过
kubectl get events -n istio-system
kubectl describe pod istio-ingressgateway-94974fc7f-cxjwz -n istio-system
kubectl describe pod istiod-54785969-6rfzh -n istio-system
来查看问题原因。这里涉及下拉的镜像有两个:
pilot
proxyv2
在tar -xzvf istio-1.22.0-linux-amd64.tar.gz 解压后,cd到解压后的目录中查看manifest.yaml文件,可以看到其用的镜像仓库地址是docker.io/istio。这里有两种解决方案:
1、添加指定仓库的参数执行命令
bin/istioctl install --set hub=docker.m.daocloud.io/istio
2、到github下载相应版本的pilot和proxyv2打包文件通过docker本地安装,具体操作如下
到https://gcsweb.istio.io/gcs/istio-release/releases/1.22.0/docker/网址下载
pilot.tar.gz和proxyv2.tar.gz然后执行命令
sudo docker load -i ./pilot.tar.gz
sudo docker load -i ./proxyv2.tar.gz
sudo docker tag pilot:1.22.0 core.harbor.shell.com:443/istio/pilot:1.22.0
sudo docker tag proxyv2:1.22.0 core.harbor.shell.com:443/istio/proxyv2:1.22.0
sudo docker push core.harbor.shell.com:443/istio/pilot:1.22.0
sudo docker push core.harbor.shell.com:443/istio/proxyv2:1.22.0
将下拉不下来的两个镜像上传到自建的仓库中,然后在将下载仓库修改为本地仓库
bin/istioctl install --set hub=core.harbor.shell.com:443/istio
镜像下拉问题解决后,遇到的第二个问题是 istio-ingressgateway启动不起来。
报错类似这种
warn sds failed to warm certificate: failed to generate workload certificate: create certificate: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial tcp: lookup istiod.istio-system.svc: i/o timeout"
一般这种问题属于dns解析的事,根据官网的问题排除步骤可参考如下。
调试 DNS 问题 | Kubernetes
后来重启了 kube-system 下的两个coredns 的pod问题解决了
第三个问题istio-system命名空间下载svc中的istio-ingressgateway一直处于pending状态。
找了很多文档,后来在官网的Istio Prelim 1.23 / 入口网关中找到了问题的答案。
需要通过kubectl edit 将LoadBalancer模式改为NodePort模式。