Каков наилучший способ обновить тег изображения для фиксации SHA через CloudBuilder?

У меня есть deployment.yaml, содержащий развертывание 3 контейнеров + служба LB, и cloudbuild.yaml, содержащий этапы для создания образов контейнеров каждый раз, когда появляется новая фиксация в определенной ветке в репозитории Bitbucket git.

Все работает нормально, за исключением того факта, что мое развертывание не обновляется всякий раз, когда появляется новая версия образа (я использовал тег :latest в развертывании), и чтобы изменить это, я понял, что мои образы развертывания должны использовать что-то уникальное. , кроме :latest, например SHA git commit.

Проблема: Я не знаю, как выполнить обновление объявления изображения во время процесса GCB CI, чтобы оно содержало новый SHA фиксации.

YAML: https://paste.ee/p/CsETr.




Ответы (2)


Нашел решение, используя тег изображения или переменные URI при развертывании и заменив их на sed во время сборки.

deplyment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: dev
  name: app
  labels:
    app: app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      initContainers:
      - name: init
        image: INIT_IMAGE_NAME
        imagePullPolicy: Always
        command: ['sh', '-c', 'cp -r /app /srv; chown -R 82:82 /srv/app']
        volumeMounts:
        - name: code
          mountPath: /srv
      containers:
      - name: nginx
        image: NGINX_IMAGE_NAME
        imagePullPolicy: Always
        ports:
        - containerPort: 80
        volumeMounts:
        - name: code
          mountPath: /srv
        - name: php-socket
          mountPath: /var/run
        livenessProbe:
          httpGet:
            path: /health.html
            port: 80
            httpHeaders:
            - name: X-Healthcheck
              value: Checked
          initialDelaySeconds: 5
          timeoutSeconds: 1
          periodSeconds: 15
        readinessProbe:
          httpGet:
            path: /health.html
            port: 80
            httpHeaders:
            - name: X-Healthcheck
              value: Checked
          initialDelaySeconds: 5
          timeoutSeconds: 1
          periodSeconds: 15
      - name: php
        image: PHP_IMAGE_NAME
        imagePullPolicy: Always
        volumeMounts:
        - name: code
          mountPath: /srv
        - name: php-socket
          mountPath: /var/run
        livenessProbe:
          httpGet:
            path: /health.html
            port: 80
            httpHeaders:
            - name: X-Healthcheck
              value: Checked
          initialDelaySeconds: 5
          timeoutSeconds: 1
          periodSeconds: 15
        readinessProbe:
          httpGet:
            path: /health.html
            port: 80
            httpHeaders:
            - name: X-Healthcheck
              value: Checked
          initialDelaySeconds: 5
          timeoutSeconds: 1
          periodSeconds: 15
      volumes:
        - name: code
          emptyDir: {}
        - name: php-socket
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  namespace: dev
  name: app-service
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: app

cloudbuild.yaml

steps:

# Build Images
- id: Building Init Image
  name: gcr.io/cloud-builders/docker
  args: ['build','-t', 'eu.gcr.io/$PROJECT_ID/init:$SHORT_SHA', '-f', 'init.dockerfile', '.']

- id: Building Nginx Image
  name: gcr.io/cloud-builders/docker
  args: ['build','-t', 'eu.gcr.io/$PROJECT_ID/nginx:$SHORT_SHA', '-f', 'nginx.dockerfile', '.']
  waitFor: ['-']

- id: Building PHP-FPM Image
  name: gcr.io/cloud-builders/docker
  args: ['build','-t', 'eu.gcr.io/$PROJECT_ID/php:$SHORT_SHA', '-f', 'php.dockerfile', '.']
  waitFor: ['-']


# Push Images
- id: Pushing Init Image
  name: gcr.io/cloud-builders/docker
  args: ['push','eu.gcr.io/$PROJECT_ID/init:$SHORT_SHA']

- id: Pushing Nginx Image
  name: gcr.io/cloud-builders/docker
  args: ['push','eu.gcr.io/$PROJECT_ID/nginx:$SHORT_SHA']

- id: Pushing PHP-FPM Image
  name: gcr.io/cloud-builders/docker
  args: ['push','eu.gcr.io/$PROJECT_ID/php:$SHORT_SHA']


# Update Image Tags
- id: 'Setting Init Image Tag'
  name: ubuntu
  args: ['bash','-c','sed -i "s,INIT_IMAGE_NAME,eu.gcr.io/$PROJECT_ID/init:$SHORT_SHA," deployment.yaml']

- id: 'Setting Nginx Image Tag'
  name: ubuntu
  args: ['bash','-c','sed -i "s,NGINX_IMAGE_NAME,eu.gcr.io/$PROJECT_ID/nginx:$SHORT_SHA," deployment.yaml']

- id: 'Setting PHP Image Tag'
  name: ubuntu
  args: ['bash','-c','sed -i "s,PHP_IMAGE_NAME,eu.gcr.io/$PROJECT_ID/php:$SHORT_SHA," deployment.yaml']


# Update Deployment
- id: Updating Deployment
  name: gcr.io/cloud-builders/kubectl
  args: ['apply','-f','deployment.yaml']

  env:
    - CLOUDSDK_COMPUTE_ZONE=europe-west2-b
    - CLOUDSDK_CONTAINER_CLUSTER=clusterx

# Images
images:
  - eu.gcr.io/$PROJECT_ID/init:$SHORT_SHA
  - eu.gcr.io/$PROJECT_ID/nginx:$SHORT_SHA
  - eu.gcr.io/$PROJECT_ID/php:$SHORT_SHA

# Tags
tags:
  - master
  - dev
  - init
person dzhi    schedule 28.07.2018

Я считаю, что Kubernetes не будет тянуть изображение, которое у него уже есть (поскольку он использует тот же тег :latest).

Я думаю, что ваша система выиграет от использования нового тега:

- id: Updating Deployment
  name: gcr.io/cloud-builders/kubectl
  args: ['set', 'image', 'deployment/app', 'nginx=eu.gcr.io/$PROJECT_ID/nginx:$SHORT_SHA']
  env:
    - CLOUDSDK_COMPUTE_ZONE=europe-west1-b
    - CLOUDSDK_CONTAINER_CLUSTER=cluster-1

(Вам также нужно будет установить изображение для других контейнеров.

Другим методом может быть обновление файла развертывания новыми тегами и применение всего файла.

person Philmod    schedule 23.07.2018
comment
Да, что-то в этом роде, но я бы предпочел, чтобы я мог применить один файл (deployment.yaml), содержащий все образы модулей, вместо обновления изображений по одному, как вы предложили. Я изучаю шаг сборки sed, чтобы изменить имена переменных образа deployment.yaml на те, которые генерируются GCP на лету. - person dzhi; 23.07.2018
comment
Вы должны иметь возможность обновить файл развертывания с помощью новых тегов, предложенных Филиппом, и применить весь файл. - person arp-sunny.; 26.07.2018