Eu tenho o seguinte controlador de replicação no Kubernetes no 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
Agora, se eu disser
kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b
a atualização sem interrupção é executada, mas não é necessário repetir. Por quê?
image
pull
kubernetes
Torsten Bronger
fonte
fonte
imagePullPolicy
campo.latest
, não faça isso. O mais recente puxará a imagem, bem, mais recentemente, com a tag mais recente. O que você quer é uma linha SemVer. ~ 1.2.3 por exemplo. isso puxará imagens com tags entre o intervalo de> = 1.2.3 e <1.3.0. Desde que o fornecedor da imagem siga o SemVer, você sabe (e essa é a parte importante) que nenhuma alteração reversa foi adicionada (de propósito) e que nenhum novo recurso foi adicionado (possível preocupação com a segurança). Por favor, nunca uselatest
em sistemas de produção.Respostas:
O Kubernetes utilizará a criação do Pod, se houver (consulte o documento de atualização de imagens ):
:latest
imagePullPolicy: Always
é especificadoIsso é ótimo se você quiser puxar sempre. Mas e se você quiser fazê-lo sob demanda : por exemplo, se você deseja usar,
some-public-image:latest
mas deseja extrair manualmente uma versão mais nova quando solicitada. Você pode atualmente:imagePullPolicy
comoIfNotPresent
ouNever
e pré-puxe : puxe manualmente imagens em cada nó do cluster para que o último seja armazenado em cache e faça umkubectl rolling-update
ou semelhante para reiniciar os Pods (hack fácil e feio!)imagePullPolicy
, faça akubectl apply
, reinicie o pod (por exemplokubectl rolling-update
), revertaimagePullPolicy
, refaça akubectl apply
(feio!)some-public-image:latest
para o seu repositório privado e faça umkubectl rolling-update
(pesado!)Não é uma boa solução para puxar sob demanda. Se isso mudar, comente; Vou atualizar esta resposta.
fonte
:latest
- e quantopatch
? também puxa sempre a imagem mais recente / mais recente? Parece não funcionar para mim :(:latest
etiqueta que apontava para uma nova imagem ekubectl rolling-update
trabalhava para atualizar os pods.É necessário agrupar
imagePullPolicy
dentro dos dados do contêiner em vez de dentro dos dados de especificação. No entanto, arquivei um problema sobre isso porque acho estranho. Além disso, não há mensagem de erro.Portanto, este trecho de especificação funciona:
fonte
imagePullPolicy
(ou marcação:latest
) é bom se você deseja sempre puxar, mas não resolve a questão de puxar sob demanda.imagePullPolicy: Always
dentro da definição de contêiner terákubernetes
imagens com tags marcadas:latest
sempre que uma versão mais recente delas for enviada para o registro?imagePullPolicy: Always
simplesmente diz ao Kubernetes para sempre puxar a imagem do registro. Que imagem será configurada porimage
atributo. Se você configurá-lo paraimage: your-image:latest
, sempre puxará ayour-image
imagem com alatest
tag.Meu hack durante o desenvolvimento é alterar meu manifesto de implantação para adicionar a tag mais recente e sempre puxar assim
Então eu apago o pod manualmente
Por ser uma implantação, o Kubernetes recriará automaticamente o pod e exibirá a imagem mais recente.
fonte
Uma solução popular é corrigir a implantação com uma anotação fictícia (ou rótulo):
Supondo que sua implantação atenda a esses requisitos , isso fará com que os K8s obtenham qualquer nova imagem e reimplemente.
fonte
ImagePullPolicy
como Sempre . anotações gostamdeployment.kubernetes.io/revision: "v-someversion"
ekubernetes.io/change-cause: the reason
podem ser bastante úteis e seguem para implantações imutáveis.Haverá um novo comando para fazer isso diretamente:
Crie um novo
kubectl rollout restart
comando que faça uma reinicialização contínua de uma implantação.A solicitação de recebimento foi mesclada. Será parte da versão
1.15
( changelog )fonte
Aparentemente, agora, quando você executa uma atualização sem interrupção com o
--image
argumento igual à imagem do contêiner existente, também deve especificar um--image-pull-policy
. O comando a seguir deve forçar a atração da imagem quando ela é igual à imagem do contêiner:kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b --image-pull-policy Always
fonte
fonte
Agora, o comando
kubectl rollout restart deploy YOUR-DEPLOYMENT
combinado com umaimagePullPolicy: Always
política permitirá que você reinicie todos os seus pods com uma versão mais recente da sua imagem.fonte
O comando rolling update, quando recebe um argumento de imagem, assume que a imagem é diferente da que existe atualmente no controlador de replicação.
fonte
--image
bandeira.Você pode definir
imagePullPolicy: Always
no seu arquivo de implantação.fonte
A política de recebimento de imagem sempre ajuda a extrair a imagem toda vez que um novo pod é criado (isso pode ser como escalar as réplicas ou morrer de pods e criar um novo pod)
Mas se você deseja atualizar a imagem do pod atual em execução, a implantação é a melhor maneira. Deixa você atualizar sem falhas sem nenhum problema (principalmente quando você tem um volume persistente anexado ao pod) :)
fonte