深入排查k8s集群6443端口连接拒绝:从kubectl故障到系统级修复
1. 当kubectl突然罢工6443端口连接拒绝的紧急处理那天早上我像往常一样打开终端准备用kubectl get pods查看集群状态结果终端冷冰冰地抛出一行错误Unable to connect to the server: dial tcp 192.168.1.1:6443: connect: connection refused。这个错误就像一盆冷水浇下来——6443端口是kube-apiserver的生命线它拒绝连接意味着整个集群的控制平面瘫痪了。遇到这种情况先别慌我通常会按照先表层后深层的顺序排查。第一步永远是检查网络连通性用telnet 192.168.1.1 6443测试端口可达性。如果连telnet都失败说明问题可能出在更基础的网络层。这时候我会立即做三件事确认master节点是否存活ping 192.168.1.1检查kube-apiserver进程状态ps -ef | grep kube-apiserver快速查看系统日志journalctl -xe --no-pager | tail -20记得有次在生产环境遇到类似问题发现是某个运维同事不小心改动了iptables规则。所以我现在养成了习惯遇到6443问题先快速检查防火墙状态# CentOS/RHEL sudo firewall-cmd --list-ports | grep 6443 # 或者直接临时放行 sudo firewall-cmd --add-port6443/tcp --permanent sudo firewall-cmd --reload2. 系统级深度排查从表象到根源2.1 防火墙与SELinux的隐藏陷阱很多文档都会告诉你检查防火墙但实际环境中往往有更隐蔽的问题。比如有一次我排查了3小时最后发现是SELinux在作祟。建议用这两个命令双重确认# 查看SELinux状态 getenforce # 临时设置为permissive模式测试 sudo setenforce 0如果问题解决说明确实是SELinux策略导致。永久解决方案是修改/etc/selinux/config文件但生产环境要谨慎评估安全影响。还有个容易忽略的点是网络插件的兼容性问题特别是当你使用Calico、Flannel等CNI插件时。可以查看kubelet日志journalctl -u kubelet -f | grep -i network2.2 Swap分区的幽灵问题虽然k8s官方文档明确要求禁用swap但现实情况往往更复杂。有次我明明用free -m看到swap是0但kubelet日志里还是不断报swap警告。后来发现是**/proc/swappiness的幽灵值**在作怪。完整的排查步骤应该是# 1. 检查当前swap状态 free -m # 2. 查看swappiness值 cat /proc/sys/vm/swappiness # 3. 彻底禁用 sudo swapoff -a sudo sed -i /swap/d /etc/fstab sudo sysctl vm.swappiness0更棘手的情况是某些云厂商的实例默认带有swap分区这时候可能需要重做系统镜像。我曾经在AWS的某个EC2实例上花了半天时间才定位到这个坑。3. Docker与kubelet的微妙关系3.1 cgroup驱动的那点事儿大多数k8s集群问题最终都会追溯到Docker配置特别是cgroupdriver这个参数。我见过最诡异的案例是kubelet和Docker使用了不同的cgroup驱动导致apiserver间歇性崩溃。诊断方法如下# 查看Docker使用的cgroup驱动 docker info | grep -i cgroup # 查看kubelet的cgroup配置 cat /var/lib/kubelet/config.yaml | grep cgroup修复时需要双端对齐配置。先修改Docker配置/etc/docker/daemon.json{ exec-opts: [native.cgroupdriversystemd], registry-mirrors: [https://registry.docker-cn.com] }然后修改kubelet配置通常在/var/lib/kubelet/config.yamlcgroupDriver: systemd最后记得重启服务sudo systemctl restart docker kubelet3.2 版本兼容性的暗礁k8s和Docker的版本兼容性是个大坑。有次升级集群后6443端口随机拒绝连接最后发现是Docker 20.x与k8s 1.18的兼容性问题。版本匹配原则我总结为k8s 1.18 → Docker 18.09k8s 1.20 → Docker 19.03k8s 1.22 → containerd更稳定降级Docker的具体操作以CentOS为例# 卸载现有版本 sudo yum remove docker-ce docker-ce-cli # 安装指定版本 sudo yum install -y docker-ce-18.09.9 docker-ce-cli-18.09.94. 那些意想不到的低级错误4.1 /etc/hosts的隐藏炸弹这个案例让我记忆犹新集群只有一个master节点但kubelet日志里不断报node master not found。排查到最后发现是**/etc/hosts文件有重复定义**192.168.1.1 km1 192.168.1.1 localhost # 这行导致冲突解决方法很简单但容易忽略备份当前hosts文件确保每个IP只对应一个主机名删除所有localhost的冗余绑定4.2 时间不同步引发的血案有一次6443端口问题折腾了一整天最后发现是NTP时间不同步导致证书验证失败。检查方法# 查看时间差异 timedatectl # 强制同步时间 sudo ntpdate pool.ntp.org现在我会在初始化脚本里强制加入时间同步sudo timedatectl set-ntp true sudo systemctl restart systemd-timesyncd4.3 证书过期的午夜惊魂最可怕的莫过于证书突然过期。凌晨三点被报警叫醒处理6443连接问题发现是apiserver证书过期。预防性检查命令openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates建议在crontab里加入每月检查任务0 0 1 * * openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates | mail -s k8s cert check adminexample.com5. 终极武器系统级诊断工具箱当常规手段都失效时我会祭出这套组合拳网络层诊断# 检查端口监听状态 ss -tulnp | grep 6443 # 追踪网络包 sudo tcpdump -i any port 6443 -w api.pcap进程级检查# 查看apiserver进程树 pstree -p | grep kube-apiserver # 检查内存占用 pidof kube-apiserver | xargs pmap -x内核级排查# 查看被拒绝的连接 dmesg | grep -i refused # 检查conntrack表 conntrack -L | grep 6443最后的大招是strace动态追踪虽然输出量大但往往能发现意外线索sudo strace -ff -p $(pidof kube-apiserver) -o api.strace记得有次通过strace发现是/var/lib/etcd磁盘空间不足导致apiserver异常清理etcd历史版本后立即恢复。这类问题通常会在日志中有体现但需要结合df -h和du -sh命令交叉验证。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2462898.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!