前言
今天在搭建k8s的时候,发现不同服务间容器内无法通过别名来通信,但是能通过容器ip来通信,说白了就是
-
ping 服务名 --不通
-
ping 容器IP --通
网上查阅很多资料,才找到问题所在,话不多说,以下是解决方案。
我的k8s版本
- kubernetes :v1.20.13
- kuboard:v3.3.0.6
用ipvs替换iptables
在所有节点上操作如下
- 开启内核支持
cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
- 让配置生效
sysctl -p
- 开启ipvs支持
yum -y install ipvsadm ipset
- ipvs生效
# 临时生效
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
# 永久生效(建议)
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
配置kube-proxy,在master上操作
- 因使用kubeadmin安装,所以操作方式如
kubectl edit cm kube-proxy -n kube-system
- 修改mode配置
kind: MasterConfiguration
apiVersion: kubeadm.k8s.io/v1alpha1
...
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
syncPeriod: 30s
kind: KubeProxyConfiguration
metricsBindAddress: 127.0.0.1:10249
mode: "ipvs" #修改这里
- 在master重启kube-proxy
kubectl get pod -n kube-system | grep kube-proxy | awk '{print $1}' | xargs kubectl delete pod -n kube-system