2015-10-13 2 views
30

У меня есть следующий контроллер репликации в Kubernetes на GKE:Как заставить Kubernetes снова вытащить изображение?

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 

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

+0

При обновлении следует использовать другое изображение. – xdays

+1

Я дал другое изображение, только с тем же тегом. Если вам нужно дать другой тег, ну, я не вижу смысла в поле 'imagePullPolicy'. –

ответ

13

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

Таким образом, эта спецификация сниппет работы:

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

'imagePullPolicy' (или пометка': последний') хорош, если вы хотите всегда тянуть, но не решает вопрос о том, чтобы потянуть на demande. – Wernight

+0

Да, я хочу * всегда * тянуть, как указано в вопросе. –

+0

Использование 'imagePullPolicy: Always' внутри определения контейнера будет иметь' kubernetes' выборки изображений, помеченных ': последним' всякий раз, когда их новая версия будет перенесена в реестр? – pkaramol

2

Скоростная команда обновления при предоставлении аргумента изображения assumes that the image is different, чем то, что в настоящее время существует в контроллере репликации.

+0

Означает ли это, что тег изображения (aka name) должен быть другим? –

+0

Да, имя изображения должно отличаться, если вы передадите флаг '--image'. –

+1

Как мой собственный ответ говорит, он работает, если имя изображения одинаковое. Просто изображение imagePullPolicy было не в том месте. Для моей защиты, k8s 1.0 docs ошибочны в этом аспекте. –

32

Kubernetes будет тянуть при создании Pod, если (см updating-images doc):

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

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

  • Установите 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 тянуть. Если это изменится, прокомментируйте; Я обновлю этот андерсер.

+0

Вы говорите, что кубернеты будут тянуть за создание Pod при использовании ': latest' - как насчет' patch'ing? он также всегда тянет новейшее/последнее изображение? Кажется, не работает для меня :( – pkyeck

+0

Это зависит от того, будет ли ваш патч заново воссоздать Pod или нет. Скорее всего, нет, тогда он больше не потянется. Вы можете убить Pod вручную или пометить что-то уникальное и патч с этим обновленным тегом. – Wernight

+0

Это ответ на другой вопрос. Я попросил * форсировать * перетягивание. –

3

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

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

0

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

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

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

kubectl delete pod my-app-3498980157-2zxhd 

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

Смежные вопросы