VPS上具有公共和私有NIC的Kubernetes

时间:2018-09-13 18:34:12

标签: kubernetes

我有3个VPS,每个VPS都有2个NIC,一个是公共的,一个是私有的。我希望群集通信使用专用子网,但将容器公开给公众。当我使用带有私有ip的“ apiserver-advertise-address”配置集群,但是运行kubectl get pod时,所有节点都显示其公共IP -all-namespaces -o wide

命令输出

NAMESPACE         NAME                                 READY     STATUS    RESTARTS   AGE       IP               NODE          NOMINATED NODE
heptio-sonobuoy   sonobuoy                             1/3       Error     0          1d        10.244.2.2       k8s-worker2   <none>
kube-system       calico-node-47j4q                    2/2       Running   0          1d        95.179.192.7     k8s-worker1   <none>
kube-system       calico-node-8ttn6                    2/2       Running   2          1d        45.76.143.32     k8s-master    <none>
kube-system       calico-node-dh2d9                    2/2       Running   0          1d        95.179.192.128   k8s-worker2   <none>
kube-system       coredns-78fcdf6894-cjf6p             1/1       Running   1          1d        10.244.0.11      k8s-master    <none>
kube-system       coredns-78fcdf6894-q6zzb             1/1       Running   1          1d        10.244.0.12      k8s-master    <none>
kube-system       etcd-k8s-master                      1/1       Running   1          1d        45.76.143.32     k8s-master    <none>
kube-system       kube-apiserver-k8s-master            1/1       Running   2          1d        45.76.143.32     k8s-master    <none>
kube-system       kube-controller-manager-k8s-master   1/1       Running   2          1d        45.76.143.32     k8s-master    <none>
kube-system       kube-proxy-j58cv                     1/1       Running   0          1d        95.179.192.128   k8s-worker2   <none>
kube-system       kube-proxy-pbnpl                     1/1       Running   1          1d        45.76.143.32     k8s-master    <none>
kube-system       kube-proxy-z7cmm                     1/1       Running   0          1d        95.179.192.7     k8s-worker1   <none>
kube-system       kube-scheduler-k8s-master            1/1       Running   2          1d        45.76.143.32     k8s-master    <none>

2 个答案:

答案 0 :(得分:0)

检查节点上的路由。您可以在节点上看到这样的路由:

 ip route # or
 netstat -r

如果您的节点使用主机的专用地址加入集群,则应该没问题,并且节点-主机之间的所有Kubernetes流量都应流经您的专用网络。

希望有帮助。

答案 1 :(得分:0)

通常,kubelet和apiserver会侦听所有接口,因此“ public”接口上的广告将立即可用:

tcp6       0      0 :::10250      :::*        LISTEN      -  # kubelet
tcp6       0      0 :::6443       :::*        LISTEN      -  # kubeapi 
tcp6       0      0 :::30000      :::*        LISTEN      -  # NodePort service
tcp6       0      0 :::10256      :::*        LISTEN      -  # kubeproxy

如果将公共IP地址用于群集节点,则可能需要限制对边缘安全设备上群集的访问。

在集群内部,apiserver和集群节点之间的流量进入apiserver选项--apiserver-advertise-address指定的子网中。

答案的以下部分与kubelet如何为节点表示选择IP地址有关。
您没有提及集群的版本,所以我选择了集群中当前拥有的版本v1.11

GitHub上有一个与此kubelet行为有关的问题:kubelet reports wrong IP address #44702

在讨论结束时,yujuhong explained为什么会发生:

  

kubelet使用IP address reported by the cloud provider(如果存在),或者使用第一个非环回ipv4地址(code here)(如果没有云提供商)。另外,它可能会被kubelet标志覆盖。

我已将报价单中的链接更新为v1.11。这里是code对v1.11的注释中提到的内容:

    // 1) Use nodeIP if set
    // 2) If the user has specified an IP to HostnameOverride, use it
    // 3) Lookup the IP from node name by DNS and use the first valid IPv4 address.
    //    If the node does not have a valid IPv4 address, use the first valid IPv6 address.
    // 4) Try to get the IP from the network interface used as default gateway

代码注释中提到的kubelet选项是从kubelet documentation复制的:

  
      
  1. -node-ip字符串-节点的IP地址。如果设置,kubelet将使用该IP地址作为节点
  2.   
  3. -hostname-override字符串-如果为非空,则将使用此字符串作为标识,而不是实际的主机名。
  4.