问题描述
在启动了kube-vip Layer2模式的kubernetes HA集群,安装了MetalLB并使用Layer2模式转发service LoadBalancer到集群外部时,LoadBalancer IP不能被访问。
原因(猜测,日志无报错)
ARP表冲突,kube-vip默认启用了Service LoadBalancer模式(后面文章再研究),导致MetalLB申请的IP不能被ARP解析。
kube-vip官网找到以下内容:
解决方案
关闭kube-vip的LoadBalancer,只使用MetalLB提供的LB能力。
vim /etc/kubernetes/manifests/kube-vip.yaml
重启所有master的kubelet
systemctl restart kubelet
删除vip重新生成
不确定有没有作用,先写上
# 所有master都执行
ip addr del dev ens192 10.20.13.111/32
ens192:网卡
10.20.13.111/32:vip
测试
经过以上步骤,此时再次访问vip,还是不通,原因我猜测是ip已经被写入ARP表还未过期,可以新增一个LoadBalancer模式的Service
方法一:
将不通的LoadBalancer IP作为源地址发送请求到k8s节,以此来刷新ARP表
arping -I ens192 -s 10.20.13.231 10.20.13.90
10.20.13.90:master ip其中之一(任意节点应该也可以)
10.20.13.231:不通的LoadBalancer IP
方法二:
新增service,使用一个之前未使用过的LoadBalancer`
示例:
kubectl expose deployment nginx-deployment --type=LoadBalancer --port=80 --name=nginx-lb
nginx-deployment:deployment名称