Kubernetes на vps с публичными и частными сетевыми адаптерами

У меня 3 VPS с 2 сетевыми адаптерами каждый, один публичный и один частный. Я хочу, чтобы для связи кластера использовалась частная подсеть, но открывать контейнеры для публики. Когда я настраиваю кластер с использованием —apiserver-Advertise-address с частным IP-адресом, но все узлы показывают свои общедоступные IP-адреса при запуске kubectl get pods —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
406
2

Ответы 2

Проверьте маршруты на своих узлах. Вы можете увидеть свои маршруты на своих узлах следующим образом:

 ip route # or
 netstat -r

Если ваши узлы присоединились к кластеру, используя частный адрес мастера (ов), все должно быть в порядке, и весь ваш трафик Kubernetes между узлами-мастерами должен проходить через вашу частную сеть.

Надеюсь, это поможет.

мои узлы названы с использованием имени хоста, поэтому имя - k8s-master, k8s-worker1 и т. д., выполнение команды, которую я дал, показывает IP-адрес, на котором работают поды.

Luke 14.09.2018 13:02

Вы можете опубликовать свой результат? что заставляет вас думать, что трафик проходит через общедоступную сеть?

Rico 14.09.2018 15:47

Я добавил результат выше.

Luke 14.09.2018 15:48

Вы использовали какие-то другие аргументы? Для демона kubelet--address, демона kube-proxy - --bind-address, демона kube-api - --bind-address

aurelius 14.09.2018 17:17

Как вы создали свой кластер?

Rico 14.09.2018 18:15

Обычно kubelet и apiserver слушают все интерфейсы, поэтому реклама на "публичном" интерфейсе будет работать "из коробки":

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.

Следующая часть ответа посвящена тому, как кубелет выбирает IP-адрес для представления узла. Вы не упомянули версию своего кластера, поэтому я выбрал версию v1.11, которая сейчас у меня в кластере:

На GitHub есть проблема, связанная с этим поведением kubelet: kubelet сообщает неверный IP-адрес # 44702

В конце обсуждения Yujuhongобъяснил почему так происходит:

kubelet uses the IP address reported by the cloud provider if it exists, or the first non-loopback ipv4 address (code here) if there is no cloud provider. In addition, it could be overwritten by kubelet flags.

Я обновил ссылки в цитате до версии v1.11. Вот что упоминается в комментариях код для 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:

  1. --node-ip string - IP address of the node. If set, kubelet will use this IP address for the node
  2. --hostname-override string - If non-empty, will use this string as identification instead of the actual hostname.

Другие вопросы по теме