Назад | Перейти на главную страницу

Доступ к службе порта узла в частном кластере GKE из другого частного кластера GKE

Я использую облако Google, и у меня есть два частных кластера GKE.

Один из них содержит некоторые службы, установленные как nodePort. Другой кластер должен подключиться к этому и получить доступ к предоставленным службам.

Кластер с предоставленными службами имеет только один узел с частным IP. Я могу успешно пропинговать этот узел из другого кластера, используя этот частный IP-адрес.

Но как я могу получить доступ к услугам?

Я также безуспешно пытался настроить некоторые правила брандмауэра.

Если я правильно понял вашу ситуацию, то у вас есть 2 частных кластера GKE, и вы хотели бы знать, можно ли получить доступ к приложениям, работающим в одном кластере, из другого.

Краткий и общий ответ: Да это возможно.

Ниже вы можете увидеть детали и доказательства моего тестирования. Я быстро собрал следующую настройку (оба кластера идентичны, за исключением Master/Service/Pod address ranges):

cluster-4
Cluster Master version: 1.14.10-gke.27
Total size: 1
Network: default
Subnet: default
VPC-native (alias IP): Enabled
Pod address range: 10.24.0.0/14
Service address range: 10.0.32.0/20
Private cluster: Enabled
Master address range: 172.16.1.0/28 

cluster-5

Pod address range: 10.60.0.0/14
Service address range: 10.127.0.0/20
Private cluster: Enabled
Master address range: 172.16.2.0/28 

Конфигурация брандмауэра должна разрешать трафик от «диапазонов адресов Pod» к узлам. Другими словами, трафик, исходящий из «диапазона адресов Pod» кластера 5, должен быть доставлен на IP-адрес узла кластера 4.

Для этого я добавил правило, разрешающее TCP-трафик с 10.60.0.0/14 на «все узлы в сети» на порт 31526.

Мой nginx работает на cluster-4

$ kubectl get nodes -o wide 
NAME            STATUS   AGE   VERSION           INTERNAL-IP   EXTERNAL-IP                              
gke-cluster-4   Ready    48m   v1.14.10-gke.27   10.128.0.12                 

$ kubectl get svc -o wide 
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE     
hello-nginx  NodePort    10.0.40.183   <none>        80:31526/TCP   2m23s   

Итак, мой nginx будет доступен по адресу 10.128.0.12:31526 для всех клиентов, которые не входят в мои cluster-4.

Я запустил стручок busybox на cluster-5

$ kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
busybox-68dc67fcc5-gwd95   1/1     Running   0          11s

и попытался получить доступ к моему nginx.

$ kubectl exec -it busybox-68dc67fcc5-gwd95 -- sh

# route 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.60.0.1       0.0.0.0         UG    0      0        0 eth0
10.60.0.0       *               255.255.255.0   U     0      0        0 eth0

# wget 10.128.0.12:31526
Connecting to 10.128.0.12:31526 (10.128.0.12:31526)
saving to 'index.html'
index.html           100% |************|   612  0:00:00 ETA
'index.html' saved

В 10.60.0.1 это IP-адрес, назначенный cbr0 интерфейс на моем cluster-5 узел.

kiwi@gke-cluster-5 ~ $ ifconfig 
cbr0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1460
        inet 10.60.0.1  

И последнее, но не менее важное: я проверил, что говорится в официальной документации по теме, и оказалось, что это хорошо согласуется с моими выводами.

Частные кластеры дает вам возможность изолировать узлы от входящего и исходящего подключения к общедоступному Интернету. Это достигается за счет того, что узлы имеют только внутренние IP-адреса RFC 1918.

Несмотря на то, что IP-адреса узлов являются частными, внешние клиенты могут обращаться к службам в вашем кластере. Если говорить о сервисе типа NodePort, то нужно создать Ingress.

GKE использует информацию в Сервисе и Ingress для настройки балансировщика нагрузки HTTP (S). Затем внешние клиенты могут позвонить на внешний IP-адрес Балансировщик нагрузки HTTP (S).