问题原因:
在k8s集群里面最早安装了一个版本的istio,后来因为安装文件被删除,就是istio的那个下载的包,因为该包里面包含很多测试的文件和命令工具,由于删除后,后面使用者又用了一个新的istio下载包,导致k8s集群里面安装了一些乱七八糟的版本,istio升级也并没有清除之前安装的一些api-resources
问题出现
后面确定还是重新安装1.11.1版本的istio
- 下载1.11.1版本的包:
https://storage.googleapis.com/istio-release/releases/1.11.1/istio-1.11.1-linux-amd64.tar.gz
- 解压:
tar -xzvf istio-1.11.1-linux-amd64.tar.gz
- 进入工作目录:
cd istio-1.11.1
- 执行安装命令:
istioctl install --set profile=demo -y
- 等一会
当过了一段时间后,执行kubectl get po -n istio-system
发现pod没有启动,
使用kubectl describe命令发现是curl他自己的pod的***.***.**.**:8080/ready
健康检查不通过
使用kubectl log 日志发现: failed to list *v1alpha3.DestinationRule 。。。。
而打印这一行日志的是k8s.io打印的,那应该就是检查api-resource的时候出现了某个资源已经没了,但是遍历的时候名字还在,资源没了。
接下来就是确定是不是这个问题:
问题确认
- 查询api-versions
[root@ip istio-1.11.1]# kubectl api-versions
networking.istio.io/v1alpha3
networking.istio.io/v1beta1
- 确认
networking.istio.io/v1alpha3
是脏数据 因为list他失败 - 然后就是删除该
networking.istio.io/v1alpha3
对应的api-resources - 查询api-resources:
[root@ip istio-1.11.1]# kubectl api-resources
destinationrules dr networking.istio.io/v1alpha3 true DestinationRule
gateways gw networking.istio.io/v1alpha3 true Gateway
serviceentries se networking.istio.io/v1alpha3 true ServiceEntry
virtualservices vs networking.istio.io/v1alpha3 true
- 然后就是删除上面的这些拥有
networking.istio.io/v1alpha3
的api-resources - 删除过程,这里只演示删除
destinationrules
# 1. 首先要通过api-resources的名字,过滤得到该crd的全名,否则删不掉的
[root@ip istio-1.11.1]# kubectl get crd | grep destinationrules
destinationrules.networking.istio.io 2022-11-29T11:06:13Z
# 2. 删掉该资源
[root@ip istio-1.11.1]# kubectl delete crd destinationrules.networking.istio.io
destinationrules.networking.istio.io "destinationrules.networking.istio.io " deleted
- 经过上面的循环操作,将所有的
networking.istio.io/v1alpha3
关联的crd都删掉后,这样再重新安装istio的时候pod istiod就可以起来了。
ps: 这里有一个需要注意的地方,当测试好istio的时候,如果不需要的时候,可以删掉istio的关联所有资源,但是,注意istio-1.11是没有uninstll的命令的,我们可以去istio的release发布版本中找一个高版本的,比如1.15版本,下载一个包,解压后使用uninstall方法,这样就可以将当前所有的资源都卸载掉,不产生脏东西,最后再删掉name-space