如何在不终止服务容器时停止/杀死K8s中Istio envoy sidecar代理
不终止业务容器停止/杀死Istio Envoy Sidecar的可行方案
Istio注入的Envoy sidecar默认容器名为istio-proxy,所有操作仅针对该容器执行,完全不会影响同Pod内的业务容器,以下是可直接落地的操作方式:
方案1:直接向Envoy进程发送终止信号(最通用)
通过kubectl在sidecar容器内执行进程终止命令,适配所有Istio版本:
- 优雅终止Envoy(等待连接排空后退出,模拟sidecar正常下线场景):
kubectl exec <目标业务Pod名> -n <Pod所在命名空间> -c istio-proxy -- pkill envoy
- 强制杀死Envoy(立即终止进程,模拟sidecar崩溃场景):
kubectl exec <目标业务Pod名> -n <Pod所在命名空间> -c istio-proxy -- pkill -9 envoy
注意:默认配置下istio-proxy开启了livenessProbe存活探针,杀死Envoy进程后,kubelet会在探针检测失败后自动重启istio-proxy容器,全程业务容器无重启、无感知,可直接观测sidecar短时故障下的系统表现。如果需要Envoy长时间停止不自动拉起,先执行以下命令临时移除sidecar的存活探针即可,配置变更仅对当前运行的Pod生效,Pod重建后自动恢复默认配置:
kubectl patch pod <目标业务Pod名> -n <命名空间> -p '{"spec":{"containers":[{"name":"istio-proxy","livenessProbe":null}]}}'
方案2:调用Envoy原生管理接口优雅退出(行为最贴近真实下线)
Envoy默认监听15000端口提供本地管理接口,直接调用退出接口即可触发优雅终止,和sidecar正常被kubelet终止的行为完全一致:
kubectl exec <目标业务Pod名> -n <命名空间> -c istio-proxy -- curl -X POST http://127.0.0.1:15000/quitquitquit
Istio 1.10+版本提供的istioctl命令本质是封装了这个接口调用,也可以直接用istioctl操作:
istioctl proxy-config shutdown <目标业务Pod名> -n <命名空间>
前置校验操作
如果集群自定义过sidecar注入模板,执行操作前可以先确认Pod内的容器名,避免误操作:
kubectl get pod <目标业务Pod名> -n <命名空间> -o jsonpath='{.spec.containers[*].name}'
返回结果中除业务容器名外的就是sidecar容器名,默认值为istio-proxy。
内容的提问来源于stack exchange,提问作者paul
相关产品推荐
相关产品推荐

