Как развернуть контейнер в gce, обновив образ контейнера? - PullRequest
0 голосов
/ 30 мая 2020

Я настраиваю свой компакт-диск с помощью следующих команд для развертывания контейнера в gce:

gcloud compute instances stop my-awesome-app
gcloud compute instances update my-awesome-app --no-shielded-integrity-monitoring
gcloud beta compute instances update-container my-awesome-app --container-image=docker.io/my-docker-hub-user/my-awesome-app:${IMAGE_TAG}
gcloud compute instances start my-awesome-app

Затем экземпляр остановится, заменит образ контейнера и запустится.

Если я создам новый экземпляр с последний образ, все работает нормально.

Если я развертываю с моим конвейером компакт-дисков, экземпляр ВСЕГДА зависает навсегда (после получения события запуска новое ведение журнала не происходит), НИКОГДА не вытягивает новый образ и НИКОГДА не запускается и работает.

Кто-нибудь может мне сказать, в чем проблема?

Ответы [ 3 ]

3 голосов
/ 03 июня 2020

Я не запускаю и не останавливаю свой экземпляр для обновления контейнера. Я просто:

gcloud compute instances update-container $instanceName2 --zone $instanceZone --container-image $registry:$BUILD_ID

Но перед тем, как вытащить новый образ, я всегда делаю docker обрезку, чтобы мой диск не был заполнен изображениями:

gcloud compute ssh $instanceName2 --zone $instanceZone --command 'docker system prune -f -a'

Для меня лучший способ заключалось в использовании шаблона, указывающего на мой репозиторий, и на основе этого шаблона для создания группы управляемых экземпляров. Таким образом, вы можете избежать простоев при развертывании и по-прежнему иметь только одну машину в работе 99% времени. Подробности

1 голос
/ 03 июня 2020

Я надеюсь, что документ [1] будет вам полезен, откуда вы могли бы получить инструкции по обновлению контейнера на виртуальной машине в Google Cloud.

Если вы хотите обновить виртуальную машину, на которой запущен контейнер, Compute Engine выполняет следующие два шага:

  1. Обновляет объявление контейнера в экземпляре. Compute Engine сохраняет обновленное объявление контейнера в метаданных экземпляра под ключом метаданных gce-container-decl.
  2. Останавливает и перезапускает экземпляр для активации обновленной конфигурации, если он запущен. Если экземпляр остановлен, обновляет объявление контейнера и оставляет экземпляр остановленным. Экземпляр виртуальной машины загружает новый образ и запускает контейнер при запуске виртуальной машины.

Выполните шаги от 1 до 5, как указано в документе [1], Compute Engine сохраняет изменения и автоматически перезапускает экземпляр, чтобы Обновить. После перезапуска виртуальной машины она загружает новый образ и запускает контейнер с обновленной конфигурацией.

[1] https://cloud.google.com/compute/docs/containers/deploying-containers#updating_a_container_on_a_vm_instance

0 голосов
/ 04 июня 2020

Спасибо за ответы!

Наконец-то я нашел свой путь. 1. При каждом развертывании будет создаваться новый управляемый экземпляр с контейнером. 2. Затем мой зарезервированный IP-адрес указывается новому экземпляру. (Так что мне не нужно обновлять DNS) 3. Наконец, по возможности отключите старое развертывание.

Обратной стороной является очевидное время простоя во время развертывания, но я думаю, что конвейер развертывания достаточно хорош для мой текущий проект.

# install dependencies
apt-get --yes install jq

# Create new instance
NEW_INSTANCE="$INSTANCE_NAME_PREFIX-build-$CIRCLE_BUILD_NUM"
gcloud beta compute instances create-with-container "$NEW_INSTANCE" \
    --machine-type=f1-micro \
    --container-image=docker.io/xxx/yyy:$IMAGE_TAG \
    --container-env="ANSIBLE_VAULT_PASSWORD=${ANSIBLE_VAULT_PASSWORD}" \
    --tags http-server,https-server \
    --zone ${GOOGLE_COMPUTE_ZONE}

IP_ADDRESS=$(gcloud compute addresses list --filter="name=('$RESERVED_IP_NAME')" --format=json | jq '.[0].address' --raw-output)
OLD_INSTANCE=$(gcloud compute instances list --filter="EXTERNAL_IP=('$IP_ADDRESS')" --zones asia-east1-a --format=json | jq '.[0].name' --raw-output)

# Remove ephemeral IP address from new instance
echo "Removing ephemeral IP address from instance: $NEW_INSTANCE"
gcloud compute instances delete-access-config "$NEW_INSTANCE" \
    --access-config-name "external-nat" \
    --zone ${GOOGLE_COMPUTE_ZONE}

# Remove reserved IP address from old instance
# Ignore error if there is no access config present
if [ "$OLD_INSTANCE" != "null" ]; then
    echo "Removing reserved IP address from instance: $OLD_INSTANCE"
    gcloud compute instances delete-access-config "$OLD_INSTANCE" \
        --access-config-name "external-nat" \
        --zone ${GOOGLE_COMPUTE_ZONE} || true
fi

# Assign reserved IP address to new instance
gcloud compute instances add-access-config "$NEW_INSTANCE" \
    --access-config-name "external-nat" --address "$IP_ADDRESS" \
    --zone ${GOOGLE_COMPUTE_ZONE}

# Shutdown old instance
if [ "$OLD_INSTANCE" != "null" ]; then
    gcloud compute instances stop "$OLD_INSTANCE" --zone ${GOOGLE_COMPUTE_ZONE}
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...