K8s default-container注解不生效问题排查方法咨询
GKE场景下kubectl exec默认容器指向init容器的排查步骤
- 校验Pod注解的实际生效状态
执行命令拉取Pod的完整元数据:kubectl get pod <目标Pod名称> -o yaml | grep -A10 annotations,重点核对两个点:一是kubectl.kubernetes.io/default-container注解的key拼写完全准确,无大小写错误、多余字符;二是注解值确实为foo,无多余空格、引号转义问题。如果注解不存在或者值不对,说明上层工作负载(Deployment/StatefulSet等)的模板配置有误,或者集群准入webhook在Pod创建时篡改了注解内容。 - 检查init容器的实际运行状态
执行kubectl describe pod <目标Pod名称>,定位到Init Containers段落查看baz容器的状态:正常逻辑下init容器执行完初始化任务后会进入Terminated状态、退出码为0。如果baz因为进程卡死、启动探针配置错误、spot节点抢占时的kubelet状态残留等原因一直处于Running状态,会干扰kubectl的默认容器选择逻辑。 - 核对kubectl客户端与集群版本匹配性
执行kubectl version查看本地客户端和GKE集群控制面的版本:kubectl.kubernetes.io/default-container注解从v1.20版本开始正式支持,如果本地kubectl版本低于1.20,或者客户端与集群版本差超过1个小版本,会出现注解解析失效问题。老版本kubectl选择默认容器时不会参考该注解,会直接选中容器列表中第一个处于Running状态的容器,而init容器在返回的容器列表中排序优先于业务容器,就会出现直接进入baz容器的现象。 - 排查本地kubeconfig的默认容器覆盖配置
执行kubectl config get-contexts查看当前使用的集群上下文配置,同时检查~/.kube/config文件中当前context是否设置了default-container: baz字段,kubeconfig中配置的默认容器优先级高于Pod上的注解,会直接覆盖注解配置。 - 开启调试日志定位具体选择逻辑
执行带详细日志的exec命令:kubectl exec -it <目标Pod名称> -v=6 -- sh,日志中会完整打印kubectl获取Pod元数据、解析注解、判定容器状态、最终选中目标容器的全流程,可以直接定位到选中baz的具体判断分支。 - 验证spot节点状态残留影响
如果上述检查都无异常,可以删除异常Pod等待控制器重新拉起:kubectl delete pod <目标Pod名称>,新Pod调度完成后再测试exec行为。spot节点被抢占回收时,偶尔会出现kubelet上报的容器状态不一致问题,导致api server侧留存的init容器状态异常,重建Pod即可恢复。
GKE 1.21~1.23的部分小版本存在默认容器选择逻辑bug:当Pod内存在运行状态的init容器时,会直接忽略default-container注解,优先选中排序最靠前的运行中init容器,该问题在1.24及以上版本已修复。
内容的提问来源于stack exchange,提问作者mbxzxz
相关产品推荐
相关产品推荐

