K8s集群初始化超时:从kubelet-check到advertiseAddress配置的排查与解决

张开发
2026/5/19 15:17:43 15 分钟阅读
K8s集群初始化超时:从kubelet-check到advertiseAddress配置的排查与解决
1. 初识K8s集群初始化超时问题最近在部署Kubernetes 1.19集群时遇到了一个让人头疼的问题控制平面初始化时卡在等待阶段报错显示[kubelet-check] Initial timeout of 40s passed。这个错误看似简单但背后却隐藏着不少玄机。作为一个踩过这个坑的老司机我想分享一下我的排查过程和解决方案。刚开始看到这个错误时我以为是kubelet服务没启动好于是按照提示检查了systemctl status kubelet和journalctl日志但都没发现明显异常。接着我又怀疑是cgroup配置问题检查了相关参数也没发现问题。这时候我才意识到问题可能出在更底层的地方。2. 深入分析kubelet健康检查机制2.1 kubelet健康检查的工作原理kubelet是Kubernetes集群中的关键组件负责维护节点上容器的正常运行。在集群初始化过程中kubeadm会通过健康检查来确认kubelet是否就绪。这个检查有两个关键点40秒超时机制kubeadm默认会给kubelet 40秒的启动时间就绪条件kubelet需要能够与API Server建立有效通信在实际操作中我发现即使kubelet服务已经启动如果它无法正确连接到API Server也会触发这个超时错误。这就引出了一个问题为什么kubelet连不上API Server2.2 证书与网络连接的关系仔细查看初始化日志我注意到一个关键信息证书生成时使用的IP地址。在错误的配置中证书是为外部IP1.2.3.4生成的而kubelet实际上是在尝试连接本地网络接口。这就造成了TLS握手失败进而导致健康检查超时。[certs] apiserver serving cert is signed for DNS names [k8s-master kubernetes...] and IPs [10.96.0.1 1.2.3.4]这个细节让我恍然大悟证书中必须包含kubelet实际连接使用的IP地址否则TLS验证就会失败。3. advertiseAddress配置的陷阱与正确姿势3.1 常见错误配置分析很多人在配置advertiseAddress时会犯两个典型错误使用外部IP或域名比如配置成公网IP或者域名使用0.0.0.0以为这样可以匹配所有接口这两种配置都会导致证书生成不正确。特别是使用域名时会遇到更直接的报错couldnt use k8s.cnlogs.com as apiserver-advertise-address, must be ipv4 or ipv6 address3.2 正确的配置方法正确的做法是使用master节点的实际内部IP地址。这个IP需要满足是节点上真实存在的网络接口IP集群内其他节点能够访问到这个IP与kubelet连接的地址一致在我的环境中将配置改为localAPIEndpoint: advertiseAddress: 10.0.128.0 bindPort: 6443这样就确保了证书生成、kubelet连接和实际网络接口三者一致。4. 完整的排查与解决流程4.1 分步解决方案根据我的实战经验解决这个问题需要以下步骤确认节点IP使用ip addr命令查看节点的实际IP地址修改配置文件确保init-config.yaml中的advertiseAddress使用正确的IP重置环境执行kubeadm reset清理之前的错误配置重新初始化使用修正后的配置文件运行kubeadm init4.2 配置文件完整示例以下是我最终使用的有效配置文件apiVersion: kubeadm.k8s.io/v1beta2 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 10.0.128.0 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock name: k8s-master taints: - effect: NoSchedule key: node-role.kubernetes.io/master --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: type: CoreDNS etcd: local: dataDir: /var/lib/etcd imageRepository: registry.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: v1.19.0 networking: dnsDomain: cluster.local podsubnet: 192.168.0.0/16 serviceSubnet: 10.96.0.0/16 scheduler: {}4.3 验证成功的标志当配置正确后初始化过程会显示以下关键信息[apiclient] All control plane components are healthy after 6.002090 seconds [upload-config] Storing the configuration used in ConfigMap kubeadm-config in the kube-system Namespace这表明所有控制平面组件都已正常启动集群初始化成功。5. 深度技术原理剖析5.1 证书生成机制kubeadm在初始化时会自动生成一系列证书这些证书中包含了API Server的可访问地址。关键点在于Subject Alternative Names(SANs)证书中会包含API Server的所有有效访问地址IP与DNS名称包括service网段IP、节点IP、DNS名称等严格匹配客户端连接时使用的地址必须与证书中的某个条目完全匹配如果advertiseAddress配置错误生成的证书就不包含kubelet实际使用的连接地址导致TLS验证失败。5.2 控制平面启动顺序理解控制平面组件的启动顺序也很重要etcd最先启动为API Server提供存储后端API Server启动后其他组件才能连接kubelet需要能够访问API Server来报告状态这个依赖关系决定了如果API Server因为证书问题无法正常提供服务整个初始化过程就会卡住。6. 常见问题扩展与预防措施6.1 多网卡环境下的特殊处理在生产环境中节点可能有多个网络接口。这时需要特别注意选择正确的网络接口IP作为advertiseAddress确保所有节点间的网络连通性如果有网络策略限制需要开放必要的端口6.2 高可用集群的配置差异对于高可用集群advertiseAddress通常要配置为负载均衡器的VIP。这种情况下证书中需要包含VIP和所有master节点的IP需要额外配置负载均衡器kubelet配置也需要相应调整6.3 预防性检查清单为了避免类似问题我总结了一个检查清单使用ip addr确认网络接口配置测试节点间网络连通性检查防火墙规则确保6443等端口开放验证DNS解析如果使用主机名提前拉取所需镜像避免网络问题7. 其他可能引起超时的原因虽然advertiseAddress配置错误是常见原因但还有其他可能性资源不足节点内存或CPU不足导致组件启动缓慢镜像拉取失败网络问题导致关键镜像无法下载存储问题etcd数据目录权限不正确版本不兼容组件版本不匹配对于这些情况查看各组件的日志是定位问题的关键docker ps -a | grep kube docker logs container_id8. 实战经验与技巧分享在多次部署K8s集群后我总结了一些实用技巧预检脚本使用kubeadm的kubeadm config images pull提前拉取镜像日志级别初始化时添加--v5参数获取更详细日志快速重置kubeadm reset -f可以强制重置环境配置验证使用kubeadm config print init-defaults查看默认配置对于复杂的生产环境建议先在测试环境验证配置然后再应用到生产环境。同时保持所有节点的系统版本、依赖软件版本一致也很重要。

更多文章