Я использую облако 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).