Как заставить Kubernetes повторно вытянуть изображение?

161

У меня есть следующий контроллер репликации в 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

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

Торстен Бронджер
источник
12
Я дал другое изображение, только с тем же тегом. Если необходимо дать другой тег, ну, я не вижу смысла в этой imagePullPolicyобласти.
Торстен Бронджер
4
Я хочу использовать определенный тег, но его новейшая версия.
Торстен Бронджер
3
@TorstenBronger Я думаю, что это серьезное изменение в теории Кубернетеса / Докера. Идея, что вы можете использовать image: tag (кроме последних) в два разных момента времени и получать два разных изображения, была бы проблематичной. Тег похож на номер версии. Лучше было бы всегда менять тег при изменении изображения.
duct_tape_coder
2
Это зависит. Есть программное обеспечение с очень стабильным API, но обновления безопасности. Затем я хочу последнюю версию, не говоря об этом явно.
Торстен Бронджер
1
@TorstenBronger Что касается использования latest, не делайте этого. Последняя будет тянуть, ну, совсем недавно изображение с последней меткой. То, что вы хотите, это диапазон SemVer. ~ 1.2.3 например. это потянет изображения с тегами между> = 1.2.3 и <1.3.0. До тех пор, пока поставщик изображений следует SemVer, о котором вы знаете (и это важная часть), не было внесено каких-либо обратных изменений (специально) и не было добавлено никаких новых функций (возможно, из-за проблем безопасности). Пожалуйста, пожалуйста, никогда не используйте latestв производственных системах.
Дэвид Дж Эдди

Ответы:

141

Kubernetes потянет за создание Pod, если либо (см. Документацию update -images ):

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

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

  • Набор imagePullPolicyдля IfNotPresentили Neverи предварительно тянуть : вручную изображения натянуть на каждом узле кластера , так что последний кэшируются, то сделать kubectl rolling-updateили аналогичным перезапустить Бобы (некрасиво легко ломаются хак!)
  • Временно изменить imagePullPolicy, сделать kubectl apply, перезапустить модуль (например kubectl rolling-update), вернуться imagePullPolicy, повторить kubectl apply(уродливый!)
  • Потяните и нажмите some-public-image:latest на ваш личный репозиторий и сделайте kubectl rolling-update(тяжелый!)

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

Wernight
источник
Вы говорите, kubernetes будет тянуть на создание Pod при использовании :latest- как насчет patching? всегда ли он тянет самое новое / последнее изображение? Кажется, не работает для меня :(
pkyeck
Это зависит от того, заставляет ли ваш патч пересоздавать Pod или нет. Скорее всего нет, тогда он не будет тянуть снова. Вы можете убить Pod вручную, или пометить что-то уникальное и исправить с этим обновленным тегом.
Wernight
Это ответ на другой вопрос. Я попросил насильно подтянуть.
Торстен Бронджер
Это позволило мне вызвать новый рывок из GCR. У меня был :latestтег, который указывал на новое изображение, и kubectl rolling-updateработал, чтобы обновить стручки.
Рэнди Л
Спасибо. Пошел на подход Pull & Push. Автоматизировал как можно больше с помощью скриптов bash, но согласился, это тяжело :)
arcseldon
77

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

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

spec:
  containers:
  - name: myapp
    image: myregistry.com/myapp:5c3dda6b
    ports:
    - containerPort: 80
    imagePullPolicy: Always
  imagePullSecrets:
    - name: myregistry.com-registry-key
Торстен Бронджер
источник
3
imagePullPolicy(или пометка :latest) это хорошо, если вы хотите всегда тянуть, но не решаете вопрос о потягивании деманд.
Wernight
1
Да, я хочу всегда тянуть, как указано в вопросе.
Торстен Бронджер
1
Использование imagePullPolicy: Alwaysвнутри определения контейнера приведет к тому, что kubernetesвыборочные изображения будут помечены :latestвсякий раз, когда более новая их версия помещается в реестр?
пкарамол
1
@pkaramol Нет. imagePullPolicy: Alwaysпросто говорит Kubernetes всегда извлекать изображение из реестра. Какое изображение будет настроено по imageатрибуту. Если вы настроите его image: your-image:latest, то он всегда будет тянуть your-imageизображение с latestтегом.
Gajus
26

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

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

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

kubectl delete pod my-app-3498980157-2zxhd

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

Эверетт Тоуэс
источник
Мне нравится использовать преимущества объекта "желаемого состояния" объекта "развертывание" ... спасибо за предложение!
Марчелло де Сэйлс
2
Стоит отметить, что стратегия жизнеспособна, только если сбои в обслуживании и простои терпимы. Для разработки это кажется разумным, но я бы никогда не перенес эту стратегию на производственное развертывание.
digitaldreamer
Отредактируйте развертывание, изменив imagePullPolicy на всегда и удалив модуль достаточно для меня, как предложил Эверетт. Это среда разработки, хотя. kubernetes.io/docs/concepts/containers/images
Джос Роберто
17

Популярный обходной путь , чтобы залатать развертывание с фиктивной аннотацией (или меток):

kubectl patch deployment <name> -p \
  "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"

Предполагая, что ваше развертывание соответствует этим требованиям , это заставит K8 извлекать любой новый образ и повторно развертывать .

Тамлин
источник
2
Да, я использую аннотацию для этого.
Торстен Бронджер
какая аннотация?
Джерил Кук
1
Другим сложным решением будет сочетание обоих т.е. добавление аннотации и установки , ImagePullPolicyкак Always . аннотации, такие как deployment.kubernetes.io/revision: "v-someversion"и kubernetes.io/change-cause: the reasonмогут быть весьма полезны и направлены на постоянное развертывание.
Chandan
16

Там будет новая команда, чтобы сделать это напрямую:

Создайте новую kubectl rollout restartкоманду, которая выполняет повторный запуск развертывания.

Запрос тянуть GOT слиты. Это будет частью версии 1.15( changelog )

S.Spieker
источник
Да, часть выпуска: github.com/kubernetes/kubernetes/issues/13488
Тило
Да, это лучший способ вызвать обновление в новой версии kubernetes версии 1.15.
Дельфин
7

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

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

sjking
источник
6
# Linux

kubectl patch deployment <name> -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"

# windows

kubectl patch deployment <name> -p (-join("{\""spec\"":{\""template\"":{\""metadata\"":{\""annotations\"":{\""date\"":\""" , $(Get-Date -Format o).replace(':','-').replace('+','_') , "\""}}}}}"))
Бар Нури
источник
3

Теперь команда в kubectl rollout restart deploy YOUR-DEPLOYMENTсочетании с imagePullPolicy: Alwaysполитикой позволит вам перезапустить все ваши модули с последней версией вашего образа.

Orabîg
источник
3

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

Роберт Бейли
источник
Означает ли это, что тег изображения (он же имя) должен быть другим?
Торстен Бронджер
Да, имя изображения должно отличаться, если вы пропустите --imageфлаг.
Роберт Бейли
1
Как говорит мой собственный ответ, это работает также, если имя изображения совпадает. Просто imagePullPolicy был не в том месте. В мою защиту, документы k8s 1.0 ошибочны в этом аспекте.
Торстен Бронджер
Должен любить, когда документы не синхронизированы с поведением. : /
Роберт Бейли
1
Этот URL-адрес тоже устарел.
Дэн Тененбаум
2

Вы можете определить imagePullPolicy: Alwaysв своем файле развертывания.

Сачин Арот
источник
0

Политика извлечения изображения всегда помогает вытягивать изображение каждый раз, когда создается новый модуль (это может быть в любом случае, например, масштабирование реплик, или модуль умирает, и создается новый модуль)

Но если вы хотите обновить образ текущего запущенного модуля, лучше всего использовать развертывание. Это оставляет вам безупречное обновление без каких-либо проблем (в основном, когда у вас есть постоянный том, подключенный к модулю) :)

Хариш Десетти
источник