NAT服务暴露背后的Kubernetes节点

时间:2018-05-21 21:34:39

标签: docker kubernetes flannel ubuntu-18.04

我试图让一个Kubernetes群集与一些在没有公共IP地址的NAT后工作的节点一起工作。 (为什么我需要它是一个不同的故事)

有3个节点:

  1. Kubernetes群集主服务器(具有公共IP地址)
  2. Node1(带有公共IP地址)
  3. Node2(在我的笔记本电脑上作为虚拟机,没有公共IP地址在NAT后面工作)
  4. 所有3个节点都在运行Ubuntu 18.04,其中包含Kubernetes v1.10.2(3),Docker 17.12

    Kubernetes集群就是这样创建的:

    kubeadm init --pod-network-cidr=10.244.0.0/16

    使用法兰绒网络:

    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

    为Node1创建并安排了Nginx部署+服务(type = NodePort)(使用公共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:31742http://NODE1_PUBLIC_IP:31742访问此部署。

    为Node2创建并安排了另一个Nginx部署+服务(type = NodePort)(没有公共IP):

    https://pastebin.com/AFK42UNW

    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 22m nginx-behind-nat NodePort 10.105.242.178 <none> 80:32350/TCP 22m

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

    只能通过笔记本电脑上的http://MY_VM_IP:32350访问。

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

    有没有办法实现它?

1 个答案:

答案 0 :(得分:1)

如Kubernetes documentation所述:

  

Kubernetes对任何一方提出以下基本要求   网络实施(禁止任何有意的网络)   细分政策):

     
      
  • 所有容器都可以与没有NAT的所有其他容器通信
  •   
  • 所有节点都可以与所有容器通信(反之亦然),无需NAT
  •   
  • 容器看到的IP与其他人看到的IP相同
  •   
     

这在实践中意味着你不能只拿两个   计算机运行Docker并期望Kubernetes工作。你必须   确保满足基本要求。

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

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