Cloud NAT позволяет виртуальным машинам и подам выходить в Интернет, используя общий публичный IP-адрес.
Приватный Google Kubernetes-кластер, ноды которого не имеют публичных IP-адресов используются в случае:
— с точки зрения безопасности,чтобы невозможно было подключиться к ним снаружи
— необходимо,чтобы все ноды/поды выходили в Интернет с одного(или нескольких) IP-адреса/ов(например, для добавления этих одного/нескольких IP-адресов в white-листы на удаленной стороне, к которой подключаются ноды/поды)
Cloud NAT использует NAT-gateway для управления этими соединениями. NAT-gateway зависит от региона и сети VPC. Если виртуальные машины запущены в нескольких регионах, то необходимо создавать NAT Gateway для каждого региона
Более подробная информация доступна здесь:
https://cloud.google.com/nat/docs/overview?hl=en_US
Алгоритм действий состоит из следующих шагов:
1.Создание приватного Google Kubernetes кластера
2.Создание Nat Gateway
3.Тестирование выхода в Интернет с приватного кластера
1.Создание приватного Google Kubernetes кластера из 3-х машин(по умолчанию)
Ноды кластера будут иметь только приватные IP-адреса, а master-публичный
1 |
# gcloud container clusters create private-cluster --create-subnetwork name=private-cluster --enable-ip-alias --enable-private-nodes --master-ipv4-cidr 172.16.0.0/28 --enable-master-authorized-networks --master-authorized-networks 0.0.0.0/0 |
Описание нескольких используемых опций
1 |
--enable-master-authorized-networks --master-authorized-networks |
Для усиления безопасности значение параметра master-authorized-networks следует изменить на адрес/диапазон адресов, с которых будет разрешено подключаться к Kubernetes master-серверу(API-серверу) через HTTPS(например, с помощью утилиты kubectl)
В данном примере подключение разрешено с любого адреса
Аналогичное поведение(разрешение подключений к мастеру отовсюду) может быть достигнуто через использование опциb
1 |
--no-enable-master-authorized-networks |
, чтобы отключить какие-либо ограничения на подключения к мастеру.
1 |
--master-ipv4-cidr |
– диапазон IP-адресов, который будет использоваться для master-сети. Должен иметь размер сети /28 и использоваться вместе с опцией —enable-private-nodes
Для создания приватного кластера обязательно необходимо использоваться опции
1 |
--enable-ip-alias |
, что позволяет VPC автоматически настраивать маршрутизацию для подов
1 |
--enable-private-nodes |
– создавать кластер без публичных IP-адресов на нодах кластера
Настройка kubectl на использование созданного кластера
В консоли Google Cloud https://console.cloud.google.com/kubernetes/list
получаем команду для автоматической настройки kubectl-утилиты на работу с созданным Kubernetes-кластером
1 |
# gcloud container clusters get-credentials private-cluster --zone europe-west1-b --project mydemoproject-123456 |
Просмотр состояние нод кластера
1 |
# kubectl get node -o wide |
1 2 3 4 |
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME gke-private-cluster-default-pool-887640f2-b1jb Ready 13m v1.11.7-gke.4 10.75.52.3 Container-Optimized OS from Google 4.14.89+ docker://17.3.2 gke-private-cluster-default-pool-887640f2-dh5f Ready 13m v1.11.7-gke.4 10.75.52.2 Container-Optimized OS from Google 4.14.89+ docker://17.3.2 gke-private-cluster-default-pool-887640f2-xgnp Ready 13m v1.11.7-gke.4 10.75.52.4 Container-Optimized OS from Google 4.14.89+ docker://17.3.2 |
2.Создание Nat Gateway
1 |
Googl Cloud Console→Network Services→Cloud NAT |
1 2 |
Gateway name→gke-nat(произвольное имя) VPC network→default |
1 |
Region→выбираем регион, в котором был создан Kubernetes кластер(в моем случае gcloud утилита, с помощью которой создавался Kubernetes кластер, настроена на использование региона europe-west1, поэтому кластер был создан в этом регионе и соответственно в нем необходимо создавать NAT Gateway) |
1 2 3 4 5 |
Cloud router→Create new router Name→my-router(произвольное имя) Decscription→(опционально) Network→default Region->europe-west1 |
1 2 3 |
В Source(какие под сети должны использовать Nat Gateway) выбираем Custom Subnet name->подсеть,в которой был создан приватный кластер В IPranges выбираем ALL(чтобы натились как адреса виртуальных машин так и адреса подов) |
На вкладке NatIPAdress выбираем Manual и определяем статический IP-адрес(если он уже существует в нашем регионе) или создаем новый статический IP-адрес в том же регионе, что и созданный кластер
После нажатия кнопки Create проверяем его настройки
Просмотр виртуального роутера/Nat Gateway с командной строки
Список Nat Gateway в необходимом регионе
1 |
# gcloud beta compute routers list --filter="region:( europe-west1 )" |
1 2 |
NAME REGION NETWORK my-router europe-west1 default |
Детальная информация о выбранном Nat Gateway
1 |
# gcloud beta compute routers get-status my-router |
1 2 3 4 5 6 7 8 9 10 11 |
kind: compute#routerStatusResponse result: natStatus: - minExtraNatIpsNeeded: 0 name: gke-nat numVmEndpointsWithNatMappings: 0 userAllocatedNatIpResources: - https://www.googleapis.com/compute/beta/projects/mydemoproject-123456/regions/europe-west1/addresses/first-nat-static-ip userAllocatedNatIps: - 35.205.128.59 network: https://www.googleapis.com/compute/beta/projects/mydemoproject-123456/global/networks/default |
3.Тестирование выхода в Интернет с пода в приватном кластере
Создадим новый деплоймент,который запустит под и зайдем в этот под для выполнения команды по проверки внешнего IP-адреса, через который pod выходит в интернет
1 |
# kubectl run -i --tty get-ip-address --image=dwdraju/alpine-curl-jq --restart=Never |
1 |
# curl checkip.amazonaws.com |
1 |
35.205.128.59 |
Как видно из вывода команды, под выходит в Интернет с ip-адресом 35.205.128.59, который соответствует IP-адресу NAT Gateway
Источник:
https://medium.com/google-cloud/using-cloud-nat-with-gke-cluster-c82364546d9e
https://medium.com/bluekiri/setup-a-kubernetes-cluster-on-gcp-with-cloud-nat-efe6aa5780c6
https://medium.com/bluekiri/high-availability-nat-gateway-at-google-cloud-platform-with-cloud-nat-8a792b1c4cc4
https://cloud.google.com/nat/docs/overview?hl=en_US