我有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>
答案 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复制的:
- -node-ip字符串-节点的IP地址。如果设置,kubelet将使用该IP地址作为节点
- -hostname-override字符串-如果为非空,则将使用此字符串作为标识,而不是实际的主机名。