Как изменить развертывание без изменения файла вручную?

Я определил развертывание для своего приложения:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: 172.20.34.206:5000/myapp_img:2.0
        ports:
        - containerPort: 8080

Теперь, если я хочу обновить образ приложения 2.0 до 3.0, я делаю это:

  • $ kubectl edit deployment/myapp-deployment
  • vim открыт. Я меняю версию изображения с 2.0 на 3.0 и сохраняю.

Как это можно автоматизировать? Есть ли способ сделать это, просто выполнив команду? Что-то вроде:

$ kubectl edit deployment/myapp-deployment --image=172.20.34.206:5000/myapp:img:3.0

Я думал, используя Kubernetes API REST, но я не понимаю документацию .

Ответ 1

Вы можете сделать это через REST API с помощью PATCH verb. Однако более простым способом является использование патча kubectl. Следующая команда обновляет тэг приложения:

kubectl patch deployment myapp-deployment -p \
  '{"spec":{"template":{"spec":{"containers":[{"name":"myapp","image":"172.20.34.206:5000/myapp:img:3.0"}]}}}}'

Согласно документации, формат YAML также должен быть принят. См. вопрос Kubernetes # 458, хотя (и, в частности, этот комментарий), которые могут намекнуть на проблему.

Ответ 2

Существует команда set image, которая может быть полезна в простых случаях

Обновить существующий образ (-ы) контейнера. Возможные ресурсы включают (без учета регистра): pod (po), репликационный контроллер (rc), развертывание (развертывание), daemonset (ds), job, replicaset (rs)

kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N

http://kubernetes.io/docs/user-guide/kubectl/kubectl_set_image/

$ kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
deployment "nginx-deployment" image updated

http://kubernetes.io/docs/user-guide/deployments/

Ответ 3

(я бы разместил это как комментарий, если бы у меня была достаточно репутации)

Да, согласно http://kubernetes.io/docs/user-guide/kubectl/kubectl_patch/ принимаются как форматы JSON, так и YAML.

Но я вижу, что на всех примерах используется формат JSON. Подано https://github.com/kubernetes/kubernetes.github.io/issues/458, чтобы добавить пример формата YAML.

Ответ 4

Недавно я создал инструмент для автоматизации обновлений развертывания при наличии новых изображений, он работает с Kubernetes и Helm:

https://github.com/rusenask/keel

Вам нужно только обозначить свои развертывания политикой Keel, например keel.sh/policy=major, чтобы включить основные обновления версий, больше информации в readme. Работает аналогично Helm, никаких дополнительных CLI/UI не требуется.