Kubernetes节点位于NAT后如何暴露服务

5
我正在尝试让Kubernetes集群正常工作,其中一些节点在NAT后面没有公共IP地址。(为什么我需要它是另外一个故事)
有3个节点:
1. Kubernetes集群主节点(带有公共IP地址) 2. Node1(带有公共IP地址) 3. Node2(作为VM在我的笔记本电脑上在NAT后面运行,没有公共IP地址)
所有3个节点都使用Ubuntu 18.04和Kubernetes v1.10.2(3),Docker 17.12运行。
Kubernetes集群是这样创建的:
``` kubeadm init --pod-network-cidr=10.244.0.0/16 ```
使用Flannel网络:
``` kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ```
Node1和Node2加入了集群:
``` NAME STATUS ROLES AGE VERSION master-node Ready master 3h v1.10.2 node1 Ready <none> 2h v1.10.3 node2 Ready <none> 2h v1.10.2 ```
创建并计划了Nginx部署+服务(类型=NodePort)用于Node1(带公共IP):
https://pastebin.com/6CrugunB
``` kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h my-nginx NodePort 10.110.202.32 <none> 80:31742/TCP 16m ```
此部署可以通过http://MASTER_NODE_PUBLIC_IP:31742和http://NODE1_PUBLIC_IP:31742访问,如预期。
为Node2(没有公共IP)创建了另一个Nginx部署+服务(类型=NodePort):
https://pastebin.com/AFK42UNW

kubectl get svc 名称 类型 集群IP 外部IP 端口(S) 年龄 kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3小时 my-nginx NodePort 10.110.202.32 <none> 80:31742/TCP 22分钟 nginx-behind-nat NodePort 10.105.242.178 <none> 80:32350/TCP 22分钟

然而,无法通过http://MASTER_NODE_PUBLIC_IP:32350http://NODE1_PUBLIC_IP:32350访问此服务。

仅可以从我的笔记本电脑通过http://MY_VM_IP:32350进行访问。

此外:我也无法通过kubectl exec进入nginx-behind-nat pods。

有没有办法实现这一点?

1个回答

1
如 Kubernetes 文档 所述:

Kubernetes 对任何网络实现(除了任何有意的网络分段策略)都有以下基本要求:

  • 所有容器都可以在无需 NAT 的情况下相互通信
  • 所有节点都可以在无需 NAT 的情况下与所有容器(反之亦然)通信
  • 容器看到自己的 IP 与其他人看到它的 IP 相同

实际上,这意味着您不能只拿两台运行 Docker 的计算机并期望 Kubernetes 能正常工作。您必须确保满足基本要求。

默认情况下,api-server 到节点、端口或服务的连接仅是普通的 HTTP 连接,没有认证和加密。
它们可以通过 HTTPS 工作,但默认情况下,apiserver 不会验证 HTTPS 终端点证书,因此不提供任何完整性保证,并且可能受到中间人攻击的影响。

有关保护集群内部连接的详细信息,请查看此 文档


1
最初的问题更多关于连接性本身而不是安全性,但我认为我明白了:连接NAT后面的节点的唯一方法是使用SSH隧道,对吗?如果是这样,请您更新您的答案,并详细说明如何为Kubernetes节点设置SSH隧道。谢谢! - mennanov
SSH隧道在v1.9中已被弃用。https://github.com/kubernetes/kubernetes/commit/639e0bfb7a8188d50df2b826e1fa80063fce2eb2#diff-168683a4511ef3635cd821d1cc034d77 https://github.com/kubernetes/kubernetes/issues/48419 - VAS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接