GCE上的Kubernetes Master无法识别AWS EC2节点求助
我来帮你梳理下EC2节点侧导致join失败的常见排查方向,结合你用的K8s 1.9.3和Docker 17.12版本,一步步来定位问题:
排查EC2节点kubeadm join失败的具体步骤
1. 深挖kubelet日志的关键报错
你已经拿到了systemctl status kubelet.service和journalctl -u kubelet的输出,重点盯这几类报错:
- 网络连通类:有没有
connection timed out或者cannot reach apiserver的提示?如果有,说明EC2节点到GCE master的6443端口不通,这是跨云集群最常见的问题之一 - 版本兼容类:K8s 1.9.3官方推荐的Docker版本是1.13.1、17.03.x,你用的17.12可能存在兼容性冲突,日志里如果出现
docker daemon version incompatible这类提示,就得考虑降级Docker - Cgroup驱动不匹配:K8s 1.9默认用
cgroupfs,如果Docker配置的是systemd,会直接导致kubelet启动失败。检查Docker配置文件/etc/docker/daemon.json里的exec-opts是否为["native.cgroupdriver=cgroupfs"],同时核对kubelet配置/etc/systemd/system/kubelet.service.d/10-kubeadm.conf里的--cgroup-driver参数是否一致
2. 验证跨云网络的连通性
虽然你说两边都开了防火墙,但跨云环境的网络限制很容易踩坑:
- 在EC2节点上执行
telnet <master-public-ip> 6443,如果连接失败,按以下顺序排查:- 确认GCE防火墙规则是否真的允许**所有来源(0.0.0.0/0)**访问6443端口,且规则已绑定到master节点所在的实例
- 检查AWS安全组的出站规则,是否允许访问所有端口(至少要放行6443),同时确认EC2所在子网的NACL没有限制出站流量
- 验证EC2节点能否正常访问公网(比如
ping 8.8.8.8),如果不行,大概率是子网没配置互联网网关
3. 确认kubeadjoin命令的有效性
- 检查token是否过期:K8s 1.9的token默认24小时就会过期,你可以在GCE master上执行
kubeadm token list查看状态,如果过期了,重新生成带join命令的token:kubeadm token create --print-join-command - 确认master IP是公网IP:EC2节点在AWS,无法直接访问GCE的内网IP,必须用master的公网IP,同时要确保master的kube-apiserver配置里绑定了这个公网IP(执行
ps aux | grep kube-apiserver,看有没有--advertise-address=<公网IP>参数)
4. 修正EC2节点的系统基础配置
K8s 1.9对节点系统配置有硬性要求:
- 临时关闭SELinux:
setenforce 0,然后修改/etc/selinux/config设置SELINUX=disabled永久生效 - 关闭swap:
swapoff -a,并注释/etc/fstab里的swap挂载行,kubelet必须关闭swap才能正常运行 - 开启必要的内核参数:
把这两行写入sysctl -w net.bridge.bridge-nf-call-iptables=1 sysctl -w net.ipv4.ip_forward=1/etc/sysctl.conf,确保重启后依然生效
5. 重启kubelet并重试join
当所有配置修正后,先重启kubelet服务:
systemctl daemon-reload systemctl restart kubelet
然后重新执行kubeadm join命令,再查看kubelet日志有没有新的变化。
如果还是卡壳,把日志里的具体报错内容贴出来,比如完整的错误提示行,这样能更精准地定位问题。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

