在不同云/网络上使用 kubeadm 进行 kubernetes 多节点设置

问题描述 投票:0回答:1

我正在尝试使用 kubeadm 在实验室中的一个 AWS 节点和第二台服务器上创建多节点 kubernetes 设置。

AWS VM 在其接口 (eth0) 上分配了私有 IP,并附加了一个弹性 IP。 同样,我的实验室服务器分配了一个私有实验室 IP(enp0) 和一个由 IT 团队分配的公共 IP,类似于弹性 IP,即不在服务器接口上

我的单节点 kubernetes 设置在任一主机上都运行良好,但是当我创建多节点设置时,由于连接问题,它无法工作,因为无法从工作节点访问 kubernetes 服务。

我添加了一些博客中提到的规则

iptables -t nat -A OUTPUT -d <server private ip> -j DNAT --to-destination <server public ip>

此规则添加到每个具有第二个节点的 ip 的节点上,之后我就可以直接访问其他节点的私有 ip。通过 ping 和 ssh 检查。

然后在基于 centos 的系统上运行以下命令来设置 kubernetes

yum install -y kubelet-1.20.0-0 kubeadm-1.20.0-0 kubectl-1.20.0-0
kubeadm init
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
kubeadm join xxxx
kubectl apply -f https://docs.projectcalico.org/v3.20/manifests/calico.yaml

但是我的 calico-node pod 出现如下错误

[root@controller ~]# kubectl logs -f calico-node-ws4g9 -n kube-system
2022-08-18 13:12:44.036 [INFO][9] startup/startup.go 396: Early log level set to info
2022-08-18 13:12:44.037 [INFO][9] startup/utils.go 126: Using NODENAME environment for node name node01
2022-08-18 13:12:44.037 [INFO][9] startup/utils.go 138: Determined node name: node01
2022-08-18 13:12:44.037 [INFO][9] startup/startup.go 98: Starting node node01 with version v3.20.6
2022-08-18 13:12:44.039 [INFO][9] startup/startup.go 401: Checking datastore connection
2022-08-18 13:13:14.040 [INFO][9] startup/startup.go 416: Hit error connecting to datastore - retry error=Get "https://10.96.0.1:443/api/v1/nodes/foo": dial tcp 10.96.0.1:443: i/o timeout
2022-08-18 13:13:45.042 [INFO][9] startup/startup.go 416: Hit error connecting to datastore - retry error=Get "https://10.96.0.1:443/api/v1/nodes/foo": dial tcp 10.96.0.1:443: i/o timeout

我无法解决这两个节点之间的连接问题。 我可以更改我的实验室服务器设置以将公共 IP 放在网络接口上,但在 AWS EC2 实例上无法完成相同的操作

任何人都可以帮我解决这个问题吗?

amazon-web-services kubernetes vpn
1个回答
0
投票

您可以查看worker节点上的路由表。我遇到的问题和你的类似:

  • 控制平面和工作节点上的eth0公共IP
  • eth1 私有 IP(例如,控制平面 10.0.0.1,工作线程 10.0.0.2)。

Kubernetes 使用

bind-address
advertise-address
安装在专用网络上。集群网络为10.96.0.0/12。

在worker IPTables中,k8s生成了一条从10.96.0.1到10.0.0.1(控制平面私有IP)进行DNAT的规则。这都是正确的。

问题是工作节点无法使用简单的 telnet 访问 10.96.0.1:443。这是 kube-api 地址,如果无法访问,它会使工作线程无法使用。 通过 10.0.0.1:6443 直接联系 kube-api 可以正常工作(DNAT 正在将 10.96.0.1:443 转换为 10.0.0.1:6443)。

问题出在路由表中,其中网络 10.96.0.0/12 不存在。由于它不存在,因此 10.96.0.0/12 网络的数据包将通过默认网关(公共接口)进行路由。因此,在 DNAT 之后,任何对 10.96.0.1 的请求都会以 和 之间的连接结束,这是不可能的。

解决方案是为10.96.0.0/12网络添加路由

ip route add 10.96.0.0/12 dev eth1

更改了路由表

Destination       Gateway         Genmask         Flags Metric Ref    Use Iface
default           my.gateway.net  0.0.0.0         UG    0      0        0 eth0
10.0.0.0          0.0.0.0         255.255.252.0   U     0      0        0 eth1
<public.ip.ip.ip> my.gateway.net  255.255.255.0   UG    0      0        0 eth0

Destination       Gateway         Genmask         Flags Metric Ref    Use Iface
default           my.gateway.net  0.0.0.0         UG    0      0        0 eth0
10.0.0.0          0.0.0.0         255.255.252.0   U     0      0        0 eth1
10.96.0.0         0.0.0.0         255.240.0.0     U     0      0        0 eth1
<public.ip.ip.ip> my.gateway.net  255.255.255.0   UG    0      0        0 eth0

此更改后,立即可以到达 10.96.0.1:443,并且工作节点正在运行并加入集群。就我而言,每个具有私有和公共 IP 的工作节点都应该添加此路由。

© www.soinside.com 2019 - 2024. All rights reserved.