云主机安装kubernetes遇到的节点之间不互通问题
参考:
https://www.cnblogs.com/xuweiweiwoaini/p/13884112.html
https://cloud.tencent.com/developer/article/1591506
https://cloud.tencent.com/developer/article/1819134
前期工作都类似,但是在处理各个主机之间联通的时候,没有查到相同的文章,写一篇记录。
材料
一个腾讯云centos7,一个阿里云centos7,一个腾讯云ubuntu
三台主机内网不互通,外网有ip可直接访问
问题
创建service开放了30288端口,在开放了安全组30288之后,master仍无法通过30288访问到node节点。
解决
在参考2中,里面提出了解决方案。在初始化时应该正确配置公网ip。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers controlPlaneEndpoint: 82.157.190.81:6443 clusterName: kubernetes apiServer: certSANs: - 82.157.190.81 extraArgs: authorization-mode: Node,RBAC advertise-address: 82.157.190.81 networking: dnsDomain: cluster.local podSubnet: 10.244.0.0/16 serviceSubnet: 10.96.0.0/12
|
注意apiServer下面的controlPlaneEndpoint,certSANs写公网ip,extraArgs的advertise-address同公网ip。
然后通过下面命令初始化
1
| kubeadm init --config=kubeinit.yaml | tee kubeadm-init.log
|
正常你能看到的图片应该这样

然后执行cp和chown,cp配置文件。
如果到这你可以成功访问其他节点了,那祝贺你,后面和你没关系了
接下来需要在安全组中开放端口,这里参考Kubernetes集群开启Firewall
master开放对应的协议端口,注意不全是tcp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=9153/tcp
|
node开放端口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=9153/tcp
|
然后本机开启nat转发
1 2 3 4 5
| firewall-cmd --add-masquerade --permanent
# 检查是否允许NAT转发
firewall-cmd --query-masquerade
|
此时还是不通。
然后我在参考3中发现了结果,可以通过tcpdump抓包,查看包的源地址和目的地址,判断包是否发出。
在tcpdump监控eth0网卡之后,发现目的地址是另一台主机的内网ip。
通过kubectl describe nodes k8s-node-2得到
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Name: k8s-node-2 Roles: <none> Labels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/arch=amd64 kubernetes.io/hostname=k8s-node-2 kubernetes.io/os=linux Annotations: flannel.alpha.coreos.com/backend-data: {"VNI":1,"VtepMAC":"7e:a5:78:f3:de:1c"} flannel.alpha.coreos.com/backend-type: vxlan flannel.alpha.coreos.com/kube-subnet-manager: true flannel.alpha.coreos.com/public-ip: 10.0.16.5 kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock node.alpha.kubernetes.io/ttl: 0 volumes.kubernetes.io/controller-managed-attach-detach: true
|
在public-ip部分,显示的是内网ip,把他改成外网ip。
1 2 3 4 5 6 7
| [root@k8s-master ~]# kubectl annotate node k8s-node-2 flannel.alpha.coreos.com/public-ip-overwrite=43.138.19.214 --overwrite node/k8s-node-2 annotated [root@k8s-master ~]# kubectl -n kube-system get pods --field-selector spec.nodeName=k8s-node-2 | grep flannel kube-flannel-ds-ddn72 1/1 Running 0 56m [root@k8s-master ~]# kubectl -n kube-system get pod kube-flannel-ds-ddn72 -o yaml | kubectl replace --force -f - pod "kube-flannel-ds-ddn72" deleted pod/kube-flannel-ds-ddn72 replaced
|
这个时候通过master公网ip:端口就能成功访问了。