控制平面升级后,已经启用Istio的应用程序仍将使用旧版本的Sidecar代理,因此需要进行升级。本文介绍如何通过自动注入Sidecar和手动注入Sidecar这两种方式升级Sidecar代理。

前提条件

kubectl连接至ACK集群,请参见通过kubectl连接Kubernetes集群

背景信息

Sidecar升级的操作是在数据面的Kubernetes集群中进行的,对应的kubeconfig应当是面向数据面的Kubernetes集群,而不是网格实例对应的kubeconfig。因此kubeconfig应当从容器服务控制台获取,而不是从服务网格控制台获取。

自动注入Sidecar

如果使用自动注入Sidecar的方式,可以通过对所有pod进行滚动升级来升级Sidecar代理,这样新版本的Sidecar将被自动重新注入。建议使用该方式简化升级步骤。

可以使用以下shell脚本通过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
    #echo "get TERMINATION_GRACE_PERIOD_SECONDS from deployment: $deployment_name"
    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}}}}"
    #echo $patch_string
    kubectl -n $NAMESPACE patch deployment $deployment_name -p $patch_string
done
echo "done."

例如,将以上脚本存为文件upgradeproxy.sh,并赋予可执行权限(例如在Linux命令行下执行 chmod +x upgradeproxy.sh )。

该命令需要指定命名空间名称作为参数,例如更新default命名空间下的pod,则需要执行 ./upgradeproxy.sh default

chmod +x upgradeproxy.sh
./upgradeproxy.sh  default

手动注入Sidecar

如果没有使用自动注入Sidecar的方式,则需要执行以下相应的命令手动升级Sidecar。

按照之前手工注入的方式,重新生成一个新的部署YAML文件,并重新执行kubectl apply命令。

kubectl apply -f <(istioctl kube-inject -f <未注入过Sidecar代理配置的原始应用YAML文件>)