#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 также предлагает Private Google Access
доступ только к API и сервисам Google.
Комментарии:
1. Привет, Джон, спасибо за ваш ответ. Проблема, с которой я сталкиваюсь, заключается в том, что экземпляр не имеет доступа к GCR, который является внутренней службой Google. Причина вопроса заключалась именно в том, почему, если для создания экземпляра не требуется доступ к Интернету, поскольку GCR является внутренним, тогда почему создание экземпляра, по-видимому, зависит от внешнего доступа?
2. Служба GCR не подключена к вашей внутренней сети (VPC). Это часть сети Google. Поэтому вы должны создать подключение с помощью одного из методов в моем ответе.