Atualize o ConfigMap ou o segredo do k8s sem excluir o existente

95

Tenho usado K8S ConfigMap e Secret para gerenciar nossas propriedades. Meu projeto é bastante simples, que mantém os arquivos de propriedades em um repositório git e usa um servidor de compilação como o Thoughtworks GO para implementá-los automaticamente como ConfigMaps ou Secrets (na condição de escolha) para meu cluster k8s.

Atualmente, descobri que não é muito eficiente ter que sempre excluir o ConfigMap e o Segredo existentes e criar um novo para atualizar conforme abaixo:

  1. kubectl delete configmap foo

  2. kubectl create configmap foo --from-file foo.properties

Existe uma maneira simples e agradável de tornar o acima de uma etapa mais eficiente do que excluir a corrente? potencialmente, o que estou fazendo agora pode comprometer o contêiner que usa esses configmaps se ele tentar montar enquanto o antigo configmap é excluído e o novo não foi criado.

Desde já, obrigado.

James Jiang
fonte
Acabei de criar um projeto para mapear o configmap para os valores do ambiente automaticamente, pode ser útil para alguém. github.com/Acanguven/kubernetes-configmap-update
Ahmet Can Güven

Respostas:

154

Você pode obter YAML a partir do kubectl create configmapcomando e canalizá-lo para kubectl replace, assim:

kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -
Jordan Liggitt
fonte
3
Pipe o comando é o caminho a percorrer, não pensando no --dry-run que parece ser a parte chave do comando!
James Jiang
5
Por que vale a pena, esse mesmo padrão pode funcionar para segredos, além do exemplo de ConfigMaps mostrado aqui.
rwehner
2
tentando fazer isso com o Kubernetes 1.10, mas continuo recebendo o erroerror: error validating "STDIN": error validating data: [apiVersion not set, kind not set]; if you choose to ignore these errors, turn validation off with --validate=false
yee379,
2
esse é um bug em 1.10 resolvido em 1.10.1 - consulte github.com/kubernetes/kubernetes/issues/61780 e github.com/kubernetes/kubernetes/pull/61808
Jordan Liggitt
2
Ótima resposta. usando em kubectl applyvez de kubectl replace, funcionará tanto para o configmap novo quanto para o existente
nahsh
32

Para referência futura, kubectl replaceagora é uma maneira muito útil de conseguir isso

kubectl replace -f some_spec.yaml Permite que você atualize um configMap completo (ou outros objetos)

Veja documentos e exemplos diretamente aqui

Copiar / colar da ajuda:

# Replace a pod using the data in pod.json.
kubectl replace -f ./pod.json

# Replace a pod based on the JSON passed into stdin.
cat pod.json | kubectl replace -f -

# Update a single-container pod's image version (tag) to v4
kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -

# Force replace, delete and then re-create the resource
kubectl replace --force -f ./pod.json
Sébastien Portebois
fonte
2
Isso não atendeu ao --from-filerequisito. Os configmaps podem ser criados a partir de um arquivo arbitrário, não apenas do yaml.
Dave Hillier
@ sébastien-portebois obrigado! Não conhecia a --forceopção, o que nos permitiria usar o <dry-run ConfigMap creation> | kubectl replace --force -f -comando de aproximação ainda pela 1ª vez, quando o ConfigMap ainda não existe. Mas não tenho certeza se é seguro excluir o ConfigMap, pois os pods podem quebrar durante sua falta por não encontrá-lo. Talvez seja melhor a abordagem <dry-run ConfigMap creation> | kubectl apply -f -? Este ponto foi introduzido por @ karthic-c, o que você acha? Também @ jordan-liggitt, o que você acha?
Alex MM
18

Para pequenas mudanças em configMap, useedit

kubectl edit configmap <cfg-name>

Isso abrirá o configMap no vieditor. Faça as alterações e salve-as.

mergulho profundo
fonte
1
Legal. No entanto, como o OP mencionou, trata-se de como atingir a meta com processos automatizados, por exemplo. com o ThoughtWorks Go como servidor de construção em meu cenário.
James Jiang
3

kubectl replace falha se um configmap já existe:

$ kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl replace -f -

Error from server (NotFound): error when replacing "STDIN": configmaps "falco-config" not found

A melhor solução é usar o kubectl applyque criaria o configmap, se não estiver presente, ou atualizar o configmap, se estiver presente:

$ kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl apply -f -

configmap/falco-config configured

Karthik C
fonte
5
Eu acho que você quer dizer " kubectl replacefalha se um configmap ainda não existir".
David Dooling