linux怎么查看本机内存大小
479
2022-09-08
k8s故障处理-使用kubectl exec无法进入pod
故障现象
在一次运维k8s集群的时候,需要进入pod内部执行命令,kubectl exex
出现报错,无法进入容器内部。报错信息如下:
类似于这样:
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~