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


у меня есть следующий контроллер репликации в Kubernetes на GKE:

apiVersion: v1
kind: ReplicationController
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 2
  selector:
    app: myapp
    deployment: initial
  template:
    metadata:
      labels:
        app: myapp
        deployment: initial
    spec:
      containers:
      - name: myapp
        image: myregistry.com/myapp:5c3dda6b
        ports:
        - containerPort: 80
      imagePullPolicy: Always
      imagePullSecrets:
        - name: myregistry.com-registry-key

теперь, если я говорю

kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b

обновление прокатки выполняется, но не повторное вытягивание. Зачем?

5 57

5 ответов:

Kubernetes потянет на создание стручок, если (см. обновление-images doc):

  • использование изображений с тегами :latest
  • imagePullPolicy: Always указано

это здорово, если вы хотите всегда тянуть. Но что делать, если вы хотите это сделать по требованию: например, если вы хотите использовать some-public-image:latest но только хотите вытащить более новую версию вручную, когда вы попросите об этом. В настоящее время вы можете:

  • Set imagePullPolicy до IfNotPresent или Never и pre-pull: потяните вручную изображения на каждом узле кластера, чтобы последний кэшировался, а затем выполните kubectl rolling-update или аналогичный перезапуск стручков (уродливый легко сломанный Хак!)
  • временно изменить imagePullPolicy, не kubectl apply перезагрузите РМО (например,kubectl rolling-update), вернуть imagePullPolicy, вернуть kubectl apply (некрасиво!)
  • тянуть и толкатьsome-public-image:latest в ваш личный репозиторий и сделать kubectl rolling-update (тяжело!)

нет хорошего решения для на-demande тянуть. Если это изменится, пожалуйста, прокомментируйте; я обновлю этот anwser.

нужно сгруппироваться imagePullPolicy внутри данных контейнера вместо данных спецификации. Тем не менее, я подал вопрос об этом, потому что я нахожу это странным. Кроме того, нет никакого сообщения об ошибке.

Итак, этот фрагмент спецификации работает:

spec:
  containers:
  - name: myapp
    image: myregistry.com/myapp:5c3dda6b
    ports:
    - containerPort: 80
    imagePullPolicy: Always
  imagePullSecrets:
    - name: myregistry.com-registry-key

видимо, теперь при запуске Роллинг-обновление с --image аргумент тот же, что и существующий образ контейнера, вы также должны указать --image-pull-policy. Следующая команда должна принудительно вытягивать изображение, когда оно совпадает с изображением контейнера:

kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b --image-pull-policy Always

команда rolling update, когда задан аргумент изображения,предполагает, что изображение отличается чем то, что в настоящее время существует в контроллере репликации.

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

image: etoews/my-image:latest
imagePullPolicy: Always

затем я удаляю стручок вручную

kubectl delete pod my-app-3498980157-2zxhd

поскольку это развертывание, Kubernetes автоматически воссоздаст стручок и вытащит последний образ.