背景
k8s集群使用istio做为网关,istio使用的是老旧版本1.12.6。这次新项目需要使用istio的新特性vs.spec.http.directResponse
,所以升级集群的istio版本为1.18.6
参考istio官方文档对istio进行蓝绿升级。
大概步骤和原理
- 通过revision关键字在集群中安装新版本的istio,
- 更改ns的注入标签,
- 重启deployment控制器
- 确认旧版本的istiod控制平面没有服务依赖,清理控制平面及其他的crd
refer
https://istio.io/latest/zh/docs/setup/upgrade/canary/
https://jimmysong.io/blog/istio-canary-upgrade/
实施
下载新版本的istio
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.18.6 TARGET_ARCH=x86_64 sh -
curl -x socks5://xxx.xxx.xxx.xx:xxxx -LO https://github.com/istio/istio/releases/download/1.18.6/istio-1.18.6-linux-amd64.tar.gz
tar xf istio-1.18.6-linux-amd64.tar.gz
检查集群是否支持当前版本istio
/opt/istio-1.18.6/bin/istioctl x precheck
安装
/opt/istio-1.18.6/bin/istioctl install --set revision=1-18-6
kubectl get pod -n istio-system
# 查看控制面的istiod的镜像版本
kubectl describe pod istiod-858c757664-btcnx
# 验证版本
/opt/istio-1.18.6/bin/istioctl version
测试新版本的istio自动注入
kubectl create ns istio-test
# 先将ns打上默认的注入label
kubectl label ns istio-test istio-injection=enabled
kubectl apply -n istio-test -f /opt/istio-1.18.6/samples/sleep/sleep.yaml
kubectl get pod -n istio-test
# 验证注入的istio仍然是旧版本的istio
kubectl describe pod sleep-74f54c8d5d-mv9jc -n istio-test
# 为ns打上新的label
kubectl label ns istio-test istio-injection- istio.io/rev=1-18-6
# 重启deployment使得新的istio-proxy自动注入
kubectl rollout restart deployment -n istio-test
# 验证
kubectl describe pod sleep-5cdd998d69-t4ngn -n istio-test
/opt/istio-1.18.6/bin/istioctl proxy-status |grep istio-test
测试没问题之后将istio默认的注入crd删掉,并将默认的tag设置为新版本的istio
kubectl delete mutatingwebhookconfigurations.admissionregistration.k8s.io istio-sidecar-injector
/opt/istio-1.18.6/bin/istioctl tag set default --revision 1-18-6
# 有报错信息的话 执行强制覆盖
/opt/istio-1.18.6/bin/istioctl tag set default --revision 1-18-6 --overwrite
验证集群中是否存在directResponse资源字段
kubectl explain vs.spec.http
总结
还有其他的升级方法:使用operator执行蓝绿升级,原地升级。或者istioctl原地升级
其他可能会用到的命令
kubectl get endpoints -n istio-system -o "custom-columns=NAME:.metadata.name,PODS:.subsets[*].addresses[*].targetRef.name"
kubectl get pods -n istio-system -o=jsonpath='{range .items[*]}{.metadata.name}{" "}{.metadata.namespace}{"\n"}{end}' | xargs -I{} sh -c 'echo "{}" && kubectl get pod {} -o jsonpath="{.spec.volumes[*].configMap.name}"'
kubectl get pod istio-ingressgateway-5f64bc6cb6-nbwsh -o json | jq '.kind, .metadata.name, .spec.volumes' | grep injector
kubectl get pods -n istio-system -o=jsonpath='{range .items[*]}{.metadata.name}{" "}{.metadata.namespace}{"\n"}{end}'