控制平面升级后,已经运行Istio的应用程序仍将使用旧版本的Sidecar。要想升级Sidecar,需要重新注入它。
1.自动Sidecar注入情况下
如果使用自动Sidecar注入,可以通过对所有pod进行滚动升级来升级Sidecar,这样新版本的Sidecar将被自动重新注入。可以使用如下脚本通过patch优雅结束时长来触发滚动更新:
NAMESPACE=$1
DEPLOYMENT_LIST=$(kubectl -n $NAMESPACE get deployment -o jsonpath='{.items[*].
metadata.name}')
echo "Refreshing pods in all Deployments: $DEPLOYMENT_LIST"
for deployment_name in $DEPLOYMENT_LIST ; do
TERMINATION_GRACE_PERIOD_SECONDS=$(kubectl -n $NAMESPACE get deployment "$deployment_name" -o jsonpath='{.spec.template.spec.terminationGracePeriodSeconds}')
if [ "$TERMINATION_GRACE_PERIOD_SECONDS" -eq 30 ]; then
TERMINATION_GRACE_PERIOD_SECONDS='31'
else
TERMINATION_GRACE_PERIOD_SECONDS='30'
fi
patch_string="{\"spec\":{\"template\":{\"spec\":{\"terminationGracePeriodSeconds\":$TERMINATION_GRACE_PERIOD_SECONDS}}}}"
kubectl -n $NAMESPACE patch deployment $deployment_name -p $patch_string
done
echo "done."
2.手动Sidecar注入情况下
如果使用手动注入,可以通过执行以下命令来升级Sidecar:
kubectl apply -f <(istioctl kube-inject -f $ORIGINAL_DEPLOYMENT_YAML)
如果Sidecar以前被注入了一些定制的注入配置文件,则需要执行以下命令来升级Sidecar:
kubectl apply -f <(istioctl kube-inject --injectConfigFile inject-config.yaml --filename $ORIGINAL_DEPLOYMENT_YAML)