Не удается создать виртуальную машину Google Compute Engine с изображением контейнера без внешнего IP-адреса en

#docker #google-cloud-platform #google-compute-engine #google-container-optimized-os

# #docker #google-облачная платформа #google-compute-engine #google-container-optimized-os

Вопрос:

Я пытаюсь создать виртуальную машину, используя изображение marketplace posgresql11 (хотя проблема, по-видимому, является общей для всех изображений, которые я пробовал), с помощью следующей команды GCLOUD:

 gcloud compute instances create-with-container postgres-test 
  --container-image gcr.io/cloud-marketplace/google/postgresql11:latest 
  --container-env-file=envdata.txt 
  --container-mount-host-path mount-path=/var/lib/postgresql,host-path=/mnt/disks/postgres_data,mode=rw 
  --machine-type=e2-small 
  --scopes=cloud-platform 
  --boot-disk-size=10GB 
  --boot-disk-device-name=postgres-test 
  --create-disk="mode=rw,size=10GB,type=pd-standard,name=postgres-test-data,device-name=postgres-test_data" 
  --network-interface=subnet="default,no-address" 
  --tags=database-postgres 
  --metadata-from-file user-data=metadata.txt
 

envdata.txt файл содержит данные переменной среды для изображения и metadata.txt файл содержит инструкции bootcmd по форматированию и монтированию внешнего диска для данных postgres.

envdata.txt:

 POSTGRES_USER=postgresuser
POSTGRES_PASSWORD=postgrespassword
 

metadata.txt:

 #cloud-config

bootcmd:
- fsck.ext4 -tvy /dev/sdb
- mkdir -p /mnt/disks/postgres_data
- mount -t ext4 -O ... /dev/sdb /mnt/disks/postgres_data
 

Виртуальная машина создана, но команда sudo journalctl показывает, что начинается попытка подключиться к GCR, но, похоже, она не увенчалась успехом. Образ docker для postgres не загружается и не запускается на виртуальной машине.

Если я сейчас удалю команду no-address из строки сетевого интерфейса облачной команды (позволяющей Google выделять внешний IP-адрес виртуальной машине), выполнив следующее:

 gcloud compute instances create-with-container postgres-test 
  --container-image gcr.io/cloud-marketplace/google/postgresql11:latest 
  --container-env-file=envdata.txt 
  --container-mount-host-path mount-path=/var/lib/postgresql,host-path=/mnt/disks/postgres_data,mode=rw 
  --machine-type=e2-small 
  --scopes=cloud-platform 
  --boot-disk-size=10GB 
  --boot-disk-device-name=postgres-test 
  --create-disk="mode=rw,size=10GB,type=pd-standard,name=postgres-test-data,device-name=postgres-test_data" 
  --network-interface=subnet="default" 
  --tags=database-postgres 
  --metadata-from-file user-data=metadata.txt
 

Затем создается виртуальная машина, загружается и выполняется образ POSTGRES. sudo journalctl показывает, что соединение с GCR запущено и запущено.

Может ли кто-нибудь объяснить мне, почему выполнение образа в моем случае зависит от наличия внешнего IP-адреса и как я могу создать виртуальную машину с использованием GCR без необходимости выделения внешнего IP-адреса экземпляру?

Ответ №1:

Если у вас общедоступный IP-адрес, то запросы от вашего экземпляра в Интернет проходят через интернет-шлюз. Если у вашего экземпляра нет общедоступного IP-адреса, вам необходимо настроить Cloud NAT для обеспечения маршрута к Интернету. Это самое простое решение. Если вам нужен только доступ к API и службам Google, а не к общедоступному Интернету, см. Следующий вариант.

Google Cloud NAT

Google также предлагает Private Google Access доступ только к API и сервисам Google.

Частный доступ к Google

Комментарии:

1. Привет, Джон, спасибо за ваш ответ. Проблема, с которой я сталкиваюсь, заключается в том, что экземпляр не имеет доступа к GCR, который является внутренней службой Google. Причина вопроса заключалась именно в том, почему, если для создания экземпляра не требуется доступ к Интернету, поскольку GCR является внутренним, тогда почему создание экземпляра, по-видимому, зависит от внешнего доступа?

2. Служба GCR не подключена к вашей внутренней сети (VPC). Это часть сети Google. Поэтому вы должны создать подключение с помощью одного из методов в моем ответе.