Есть ли способ автоматического развертывания в GCE на основе нового образа, создаваемого в реестре контейнеров Google?
У меня есть развертывание Kubernetes на GCE, которое я хотел бы автоматически обновлять на основе новых изображений, создаваемых в реестре контейнеров Google (в идеале с помощью триггера сборки). Есть способ сделать это?
Заранее спасибо.
-Отметка
3 ответа
Я смог сделать это с помощью GCR и Cloud Builder с cloudbuild.yaml
файл как ниже. Чтобы это работало, сервисная учетная запись с именем вроде xyz@cloudbuild.gserviceaccount.com
должны были быть назначены разрешения IAM, нажав Project -> Editor. Это необходимо для того, чтобы служба Cloud Build могла создавать ключи SSH и добавлять их в метаданные GCE, чтобы Cloud Builder мог подключаться к SSH. Этот SSHing - это большой обходной путь для эффективного выполнения любой команды на сервере VM GCE.
steps:
# Build Docker image: docker build -f Dockerfile -t gcr.io/my-project/my-image:latest .
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-f', 'Dockerfile', '-t', 'gcr.io/my-project/my-image:latest', '.']
# Push to GCR: gcloud docker -- push gcr.io/my-project/my-image:latest
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/my-project/my-image:latest']
# Connect to GCE server and pull new image
- name: 'gcr.io/cloud-builders/gcloud'
args: ['compute', 'ssh', '$_SERVER', '--zone', '$_ZONE', '--command', 'gcloud docker -- pull gcr.io/my-project/my-image:latest']
# Connect to server and stop current container
- name: 'gcr.io/cloud-builders/gcloud'
args: ['compute', 'ssh', '$_SERVER', '--zone', '$_ZONE', '--command', 'docker stop my-image']
# Connect to server and stop current container
- name: 'gcr.io/cloud-builders/gcloud'
args: ['compute', 'ssh', '$_SERVER', '--zone', '$_ZONE', '--command', 'docker rm my-image']
# Connect to server and start new container
- name: 'gcr.io/cloud-builders/gcloud'
args: ['compute', 'ssh', '$_SERVER', '--zone', '$_ZONE', '--command', 'docker run --restart always --name my-image -d -p 443:443 --log-driver=gcplogs gcr.io/my-project/my-image:latest']
substitutions:
_SERVER: 'my-gce-vm-server'
_ZONE: 'us-east1-c'
Бонус Pro Советы:
substitutions
хорошо, если вы когда-нибудь поддержите новый сервер и захотите использовать его вместо- с помощью
--log-driver=gcplogs
заставляет ваши журналы Docker отображаться в журнале Stackdriver вашей облачной консоли Google в соответствующем "Экземпляре виртуальной машины GCE". Просто убедитесь, что выбраны "Все журналы" и "Любой уровень журнала", так как журналы Docker не имеют уровня журнала и неsyslog
или жеactivity_log
Сообщения
Другой вариант: некоторые из наших пользователей используют шаг сборки kubectl для запуска развертывания в конце своей сборки.
Вы можете позвонить любому kubectl
введите команду на шаге сборки при условии, что вы настроили соответствующие разрешения IAM, чтобы сделать это как часть сборки. (См. README
.) Этот пример вызывает kubectl get pods
,
Обратите внимание, что изображения автоматически добавляются только в конце завершенной сборки, поэтому для создания образа и его развертывания в одной сборке вам необходимо вставить свой собственный docker push
этап сборки до этапа развертывания.
Вы можете использовать Google Cloud pub/sub для прослушивания изменений в реестре контейнеров Google. Эта страница дает обзор этой функции. Вы можете использовать модель push для своего приложения.
Тем не менее, обратите внимание, что это альфа-функция, и ее поведение может измениться в будущих версиях.
Если вы не хотите, чтобы внешнее управление предоставлялось pub / sub, ваш скрипт сборки должен сделать следующее:
- Пометьте изображение и загрузите его в реестр контейнеров.
- Обновить версию образа в сценариях развертывания
- Запустите сценарий развертывания, который, в свою очередь, будет тянуть последний образ