使用Kubespray结合KubeVIP部署多主HA Kubernetes集群失败
Kubespray结合KubeVIP部署多主HA Kubernetes集群失败
我太懂你现在的糟心感受了——用Kubespray搭带KubeVIP的多主K8s集群,居然卡在TASK [kubernetes/control-plane : Kubeadm | Create kubeadm config]这一步超时,连VIP影子都看不到,折腾半天没进展确实头疼。咱们一步步拆解问题,从基础到细节排查:
先确认网络基础配置有没有踩坑
- 验证网卡接口是否正确:你配置的
kube_vip_interface: ens192,别光看配置文件,手动在每个控制节点跑ip link show确认这个接口真的存在,而且确实是承载节点业务IP的网卡。有些虚拟化环境(比如VMware、Proxmox)里,网卡名可能会被自动改成ens3、eth0这类,配错接口的话KubeVIP根本没法绑定VIP。 - 检查ARP通信与端口放行:因为你开了
kube_vip_arp_enabled: true,ARP包是KubeVIP实现VIP漂移的关键。先在控制节点上跑arping 192.168.2.63,看能不能收到其他节点的响应;同时确认节点间的防火墙/安全组没有拦截ARP流量,以及TCP 6443端口(apiserver的通信端口)——kubeadm生成配置时需要连接apiserver,超时大概率是这个链路不通。
排查KubeVIP组件是否正常启动
部署失败后,先看看节点上有没有KubeVIP的痕迹:
- 用
docker ps -a(或者crictl ps -a,如果用containerd)检查有没有kube-vip相关的容器。如果容器没启动,直接看容器日志找原因:docker logs <kube-vip容器ID>,常见的报错比如找不到指定网卡、缺少CAP_NET_ADMIN权限(Kubespray理论会自动配置,但偶尔会出问题)。 - 如果容器根本没创建,那可能是Kubespray的KubeVIP模板渲染有问题,你可以去节点上看看生成的KubeVIP配置文件(一般在
/etc/kubernetes/manifests/目录下),有没有参数写错,比如VIP、网卡名是不是和你配置的一致。
确认kube_proxy_strict_arp配置生效
你已经设置了kube_proxy_strict_arp: true,这是KubeVIP正常工作的必要条件(避免kube-proxy干扰ARP请求),但得确认它真的生效了:
- 去节点上打开
/var/lib/kube-proxy/config.conf,检查strictARP字段是不是true。如果没生效,可能是Kubespray的配置优先级问题,你可以先手动在每个控制节点修改这个配置,重启kube-proxy服务(systemctl restart kube-proxy),再重新跑Kubespray部署。
揪出kubeadm配置超时的核心原因
这个任务超时,本质上是kubeadm没法连接到VIP上的apiserver(192.168.2.63:6443),因为VIP没绑定或者apiserver没起来:
- 任务超时的时候,立刻在控制节点上手动执行
curl https://192.168.2.63:6443/version -k,看看能不能拿到响应。如果不通,直接指向VIP未绑定或者网络阻断的问题。 - 别只看Kubespray的任务失败提示,去翻ansible的详细日志(比如
ansible-playbook输出的日志文件),找kubeadm命令执行时的stderr输出——这里面会有具体的报错,比如证书验证失败、apiserver连接超时等,是排查的关键。
容易忽略的细节检查
- 时间同步:K8s对节点时间同步要求极高,如果控制节点之间时间差超过几秒,证书验证会失败,apiserver启动不了,VIP自然也没法工作。用
timedatectl检查每个节点的时间,确保都同步到同一个NTP服务器。 - 主机名与DNS解析:Kubespray要求节点能互相解析主机名和VIP。在每个节点上ping其他节点的主机名,看看能不能通;也可以检查
/etc/hosts文件,确认有没有正确配置节点IP和主机名的映射(虽然KubeVIP会处理VIP,但DNS解析异常也会干扰kubeadm流程)。
快速验证KubeVIP本身是否正常
如果上面的排查都没头绪,你可以手动在一个控制节点上启动KubeVIP,验证它能不能绑定VIP:
- 先拉取稳定版镜像:
docker pull ghcr.io/kube-vip/kube-vip:v0.6.4 - 手动生成并部署KubeVIP的Pod配置:
docker run --network host --rm ghcr.io/kube-vip/kube-vip:v0.6.4 manifest pod --interface ens192 --vip 192.168.2.63 --controlplane --arp --leaderElection | kubectl apply -f -
- 运行后用
ip a检查ens192接口,看有没有192.168.2.63的地址。如果手动操作能成功绑定VIP,说明是Kubespray的部署流程或者参数传递有问题,你可以对比手动生成的配置和Kubespray生成的配置,找出差异点。
备注:内容来源于stack exchange,提问作者Mohammad Reza Ghahremani
相关产品推荐
相关产品推荐

