Как заставить 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
обновление обновления выполняется, но повторное извлечение не выполняется. Зачем?
Ответы
Ответ 1
Нужно группировать imagePullPolicy
внутри данных контейнера, а не внутри данных спецификации. Тем не менее, я подал issue об этом, потому что считаю это странным. Кроме того, сообщение об ошибке отсутствует.
Итак, этот spec-фрагмент работает:
spec:
containers:
- name: myapp
image: myregistry.com/myapp:5c3dda6b
ports:
- containerPort: 80
imagePullPolicy: Always
imagePullSecrets:
- name: myregistry.com-registry-key
Ответ 2
Кубернеты будут тянуть за создание Pod, если либо (см. обновление-images doc):
- Использование изображений с тегами
:latest
-
imagePullPolicy: Always
указан
Это здорово, если вы хотите всегда тянуть. Но что, если вы хотите сделать это по требованию: например, если вы хотите использовать some-public-image:latest
, но только хотите вывести новую версию вручную, когда вы ее попросите. Вы можете:
- Установите
imagePullPolicy
в IfNotPresent
или Never
и pre-pull: потяните вручную изображения в каждом кластере node, чтобы последние были кешированы, затем сделайте a kubectl rolling-update
или аналогично перезапуску Pods (уродливый легко сломанный хак!)
- Временно измените
imagePullPolicy
, выполните kubectl apply
, перезагрузите модуль (например, kubectl rolling-update
), верните imagePullPolicy
, повторите kubectl apply
(уродливый!)
- Потяните и нажмите
some-public-image:latest
в свой частный репозиторий и сделайте kubectl rolling-update
(тяжелый!)
Нет хорошего решения для потяжной нагрузки. Если это изменится, прокомментируйте; Я обновлю этот anwser.
Ответ 3
Мой взлом во время разработки - это изменить мой манифест развертывания, чтобы добавить последний тег и всегда тянуть так
image: etoews/my-image:latest
imagePullPolicy: Always
Затем я удаляю pod вручную
kubectl delete pod my-app-3498980157-2zxhd
Поскольку это развертывание, Kubernetes автоматически воссоздает модуль и вытаскивает последнее изображение.
Ответ 4
Популярный обходной путь - исправление развертывания с помощью фиктивной аннотации (или метки):
kubectl patch deployment <name> -p \
"{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"'date +'%s''\"}}}}}"
Если ваше развертывание соответствует этим требованиям, это приведет к тому, что K8s получит новый образ и развернет его.
Ответ 5
По-видимому, теперь, когда вы запускаете обновление для обновления с аргументом --image
так же, как и существующее изображение контейнера, вы также должны указать --image-pull-policy
. Следующая команда должна принудительно тянуть изображение, если оно совпадает с изображением контейнера:
kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b --image-pull-policy Always
Ответ 6
Команда непрерывного обновления, когда ей передается аргумент изображения, предполагает, что изображение отличается от того, которое в настоящее время существует в контроллере репликации.
Ответ 7
Для этого будет новая команда:
Создайте новую kubectl rollout restart
которая выполняет повторный перезапуск развертывания.
Запрос на удаление был объединен. Это будет частью версии 1.15
(список изменений)
Ответ 8
Отредактируйте развертывание, изменив imagePullPolicy на всегда и удалив модуль достаточно для меня, как предположил Эверетт. Это среда разработки, хотя.
https://kubernetes.io/docs/concepts/containers/images/
Ответ 9
Вы можете определить imagePullPolicy: Always
в своем файле развертывания.
Ответ 10
Теперь команда kubectl rollout restart deploy YOUR-DEPLOYMENT
в сочетании с политикой imagePullPolicy: Always
позволит вам перезапустить все ваши модули с последней версией вашего образа.