问题出现得很突然,日志倒是留得挺全。K8s 1.24 集群里 kubectl exec -it 进任何 Pod 都报 error: unable to upgrade connection: Forbidden,日志查询正常,kubectl logs 也能拿到输出。
刚开始盯着「kubelet 的证书 SAN 里没有节点内网 IP,TLS 校验直接失败」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。apiserver 到 kubelet 的 10250 端口被节点安全组挡住,只放行了 6443,扩容新节点时最容易漏。另一种情况是kubelet 只监听在 127.0.0.1,apiserver 从节点 IP 连不进去。
另外,RBAC 里该用户没有 pods/exec 的 create 权限,报错文案却像网络问题。
从 apiserver 节点直连 kubelet 端口
curl -k https://10.0.0.9:10250/healthz
再往下确认 kubelet 的监听地址
ss -lntp | grep 10250
随后核对 kubelet 证书里的 SAN
openssl x509 -in /var/lib/kubelet/pki/kubelet.crt -noout -text | grep -A1 'Alternative'
补上 RBAC 后重试 exec
kubectl auth can-i create pods/exec -n default
同事提醒我看一下最近一次发布,时间点确实对得上。
怎么算真的好了,看的是同一批现象。curl 的 healthz 返回 ok,kubectl exec 能进入容器并执行 id,报错不再出现,权限检查输出 yes。
云上安全组默认只放行少量端口,加节点时容易漏掉 10250 与 30000 以上区间;exec 失败的报错经常掩盖 RBAC 问题,先看 auth can-i。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
