1.Kubernetes 控制平面组件间通信异常
1.1 问题
Kubernetes 控制平面组件(如 API 服务器、etcd、控制器管理器、调度器等)之间通信异常,导致集群管理功能受限或失效
影响范围:
- 直接影响:集群管理功能受限,如无法创建/更新资源、Pod 无法调度、状态更新延迟等。
- 间接影响:可能导致整个集群的稳定性下降,应用无法正常部署、扩展或恢复,数据一致性问题,严重的甚至可能导致集群完全不可用
1.2 排查方案
- 检查控制平面组件状态:使用
kubectl get componentstatuses|cs
查看控制平面各组件的状态,关注是否有Unhealthy
或Unknown
的组件。 - 查看控制平面日志:分别检查 API 服务器、etcd、控制器管理器、调度器等组件的日志,查找与通信异常相关的错误或警告。
- 检查 etcd 集群健康状况:使用
etcdctl
工具检查 etcd 集群的健康状况、成员列表、领导者选举状态等,确认各成员间通信是否正常。 - 检查控制平面网络连接:使用
netstat
、ss
或telnet
等工具检查控制平面组件之间的网络连接,确认端口是否可达、TCP 连接是否正常。 - 审查控制平面配置:检查控制平面组件的配置文件(如
/etc/kubernetes/manifests
下的静态 Pod 清单),确认 API 服务器的--etcd-servers
、控制器管理器和调度器的--master
参数等是否正确。
2.案例
比如kubeadmn安装的k8s,默认是没开启,导致出现Unhealthy,但是由于本身服务是正常的,只是健康检查的端口没启,所以不影响正常使用
shell
$ kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Unhealthy Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: connect: connection refused
scheduler Unhealthy Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: connect: connection refused
etcd-0 Healthy {"health":"true"}
$ kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Unhealthy Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: connect: connection refused
scheduler Unhealthy Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: connect: connection refused
etcd-0 Healthy {"health":"true"}
- 解决
路径,/etc/kubernetes/manifests,把port=0那行注释
注意这里修改的任何东西,不需要重启,k8会自动生效
shell
vi kube-controller-manager.yaml
vi kube-scheduler.yaml
#该 --port=0表示禁止使用非安全的http接口
[root@kube-master manifests]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true","reason":""}
vi kube-controller-manager.yaml
vi kube-scheduler.yaml
#该 --port=0表示禁止使用非安全的http接口
[root@kube-master manifests]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true","reason":""}