云主机安装kubernetes遇到的节点之间不互通问题

云主机安装kubernetes遇到的节点之间不互通问题

四月 23, 2022

云主机安装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

正常你能看到的图片应该这样

pic
然后执行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:端口就能成功访问了。