k8s故障处理-使用kubectl exec无法进入pod

网友投稿 479 2022-09-08

k8s故障处理-使用kubectl exec无法进入pod

故障现象

在一次运维k8s集群的时候,需要进入pod内部执行命令,kubectl exex -it bash,

出现报错,无法进入容器内部。报错信息如下:

类似于这样:

kubectl exec -it -n my-ns my-pod sherror: unable to upgrade connection: error dialing backend: dial tcp 127.0.0.1:37751: connect: connection refused

其他的pod可以正常进入。十分费解。但是可以确认的是,能够进入的pod配置了对应的service包暴露服务,而不能进入的pod配置是nodeport方式暴露.

kubectl exec原理与问题分析

为了解决这个问题,就需要对kubectl exex原理有所了解。

以下是一个大致的kubectl exec请求流程。

客户端 kubectl exec -i -t ...kube-apiserver 向 Kubelet 发送流式请求 /exec/Kubelet 通过 CRI 接口向 CRI Shim 请求 Exec 的 URLCRI Shim 向 Kubelet 返回 Exec URLKubelet 向 kube-apiserver 返回重定向的响应kube-apiserver 重定向流式请求到 Exec URL,接着就是 CRI Shim 内部的 Streaming Server 跟 kube-apiserver 进行数据交互,完成 Exec 的请求和响应

查询了网上的资料,说kubelte为了处理attach容器,监听的port,这个port是随机linseten的,因为port随机,极有可能是pod对应的service使用了nodeport随机暴露的端口与容器的streaming server随机端口冲突,因此streaming server端口占用,与kubelete通信异常,无法响应,自然就无法进入 pod了。

在github同样找到了有类似的问题。详细见

​​= 1024 20000(范围需要评估下)来限制kubelet随机端口的使用范围。需要重启kubelet让其重新在这个范围监听端口。需要重启node

修改nodeport的范围。 Master 节点上会有一个文件 /etc/kubernetes/manifests/kube-apiserver.yaml​,修改此文件,向其中添加 --service-node-port-range=20000-22767 ,避免冲突,需要重启master直接修改 pod对应的service的yaml文件指定nodeport端口,避免冲突,如下所示:

需要重启service

4 直接修改service的类型,由nodeport改为port,

需要重启service

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:公关界的007:一块小饼干背后的社会能量,这个六一被奥利奥暖到了!
下一篇:DoMarketing-营销智库:许留山被曝获颁清盘令,经典甜品何以走向全面溃败?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~