it-swarm.com.ru

Kubernetes, как сделать развертывание для обновления образа

У меня есть развертывание с одним модулем, с моим настраиваемым образом докера, как:

containers:
  - name: mycontainer
    image: myimage:latest

Во время разработки я хочу загрузить новую последнюю версию и сделать развертывание обновленным. Не могу найти, как это сделать, без явного определения тега/версии и увеличения его для каждой сборки, и сделать

kubectl set image deployment/my-deployment mycontainer=myimage:1.9.1
64
abovesun

Вы можете настроить свой модуль с периодом отсрочки (например, 30 секунд или более, в зависимости от времени запуска контейнера и размера изображения) и установить "imagePullPolicy: "Always". И используйте kubectl delete pod pod_name. Будет создан новый контейнер и автоматически загружено последнее изображение, после чего старый контейнер будет прерван.

Пример:

spec:
  terminationGracePeriodSeconds: 30
  containers:
  - name: my_container
    image: my_image:latest
    imagePullPolicy: "Always"

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

kubectl --user="kube-user" --server="https://kubemaster.example.com"  --token=$ACCESS_TOKEN set image deployment/my-deployment mycontainer=myimage:"$BUILD_NUMBER-$SHORT_GIT_COMMIT"

Еще один трюк - изначально запустить:

kubectl set image deployment/my-deployment mycontainer=myimage:latest

а потом:

kubectl set image deployment/my-deployment mycontainer=myimage

Это на самом деле будет запускать обновление, но убедитесь, что у вас также установлен imagePullPolicy: "Always".

Обновление:

другой трюк, который я обнаружил, когда вам не нужно менять имя изображения, это изменить значение поля, которое вызовет непрерывное обновление, например, terminationGracePeriodSeconds. Вы можете сделать это, используя kubectl edit deployment your_deployment или kubectl apply -f your_deployment.yaml или используя такой патч:

kubectl patch deployment your_deployment -p \
  '{"spec":{"template":{"spec":{"terminationGracePeriodSeconds":31}}}}'

Просто убедитесь, что вы всегда меняете числовое значение.

88
Camil

Ну, есть интересная дискуссия на эту тему по проекту GitHub kubernetes. Смотрите проблему: https://github.com/kubernetes/kubernetes/issues/33664

Из описанных там решений я бы предложил одно из двух.

Первый

1. Подготовить развертывание

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: demo
        image: registry.example.com/apps/demo:master
        imagePullPolicy: Always
        env:
        - name: FOR_GODS_SAKE_PLEASE_REDEPLOY
          value: 'THIS_STRING_IS_REPLACED_DURING_BUILD'

2.Deploy

sed -ie "s/THIS_STRING_IS_REPLACED_DURING_BUILD/$(date)/g" deployment.yml
kubectl apply -f deployment.yml

Второй (один лайнер):

kubectl patch deployment web -p \
  "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"

Конечно, imagePullPolicy: Always требуется в обоих случаях.

19
Przemek Nowak

Кажется, что k8s ожидает, что мы предоставим разные теги изображений для каждого развертывания. Моя стратегия по умолчанию будет состоять в том, чтобы заставить систему CI генерировать и выдвигать образы докеров, помечая их номером сборки: xpmatteo/foobar:456.

Для локальной разработки может быть удобно использовать скрипт или make-файл, например так:

# create a unique tag    
VERSION:=$(Shell date +%Y%m%d%H%M%S)
TAG=xpmatteo/foobar:$(VERSION)

deploy:
    npm run-script build
    docker build -t $(TAG) . 
    docker Push $(TAG)
    sed s%IMAGE_TAG_PLACEHOLDER%$(TAG)% foobar-deployment.yaml | kubectl apply -f - --record

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

2
xpmatteo

Я использую Gitlab-CI, чтобы создать образ, а затем развернуть его непосредственно в GCK. Если использовать аккуратный трюк, чтобы добиться непрерывного обновления без изменения каких-либо реальных настроек контейнера, то есть изменения метки на текущий commit-short-sha.

Моя команда выглядит так:

kubectl patch deployment my-deployment -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"build\":\"$CI_COMMIT_SHORT_SHA\"}}}}}}"

Где вы можете использовать любое имя и любое значение для метки, если она меняется с каждой сборкой.

Повеселись!

1
David Faber