Skip to content

1.Kubernetes 控制平面组件间通信异常

1.1 问题

Kubernetes 控制平面组件(如 API 服务器、etcd、控制器管理器、调度器等)之间通信异常,导致集群管理功能受限或失效

影响范围:

  • 直接影响:集群管理功能受限,如无法创建/更新资源、Pod 无法调度、状态更新延迟等。
  • 间接影响:可能导致整个集群的稳定性下降,应用无法正常部署、扩展或恢复,数据一致性问题,严重的甚至可能导致集群完全不可用

1.2 排查方案

  1. 检查控制平面组件状态:使用 kubectl get componentstatuses|cs 查看控制平面各组件的状态,关注是否有 UnhealthyUnknown 的组件。
  2. 查看控制平面日志:分别检查 API 服务器、etcd、控制器管理器、调度器等组件的日志,查找与通信异常相关的错误或警告。
  3. 检查 etcd 集群健康状况:使用 etcdctl 工具检查 etcd 集群的健康状况、成员列表、领导者选举状态等,确认各成员间通信是否正常。
  4. 检查控制平面网络连接:使用 netstatsstelnet 等工具检查控制平面组件之间的网络连接,确认端口是否可达、TCP 连接是否正常。
  5. 审查控制平面配置:检查控制平面组件的配置文件(如 /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":""}