기존 항목을 삭제하지 않고 k8s ConfigMap 또는 Secret 업데이트


101

저는 K8S ConfigMap 및 Secret을 사용하여 속성을 관리하고 있습니다. 내 디자인은 매우 간단하여 속성 파일을 git repo에 보관하고 Thoughtworks GO와 같은 빌드 서버를 사용하여 자동으로 k8s 클러스터에 ConfigMaps 또는 Secrets (선택 조건)로 배포합니다.

현재 기존 ConfigMap 및 Secret을 항상 삭제하고 아래와 같이 업데이트 할 새 항목을 만들어야하는 것이 실제로 효율적이지 않다는 것을 알았습니다.

  1. kubectl delete configmap foo

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

한 단계 위를 만들고 현재를 삭제하는 것보다 효율적으로 만드는 멋지고 간단한 방법이 있습니까? 잠재적으로 내가 지금하고있는 일은 이전 configmap이 삭제되고 새 configmap이 생성되지 않은 동안 마운트를 시도하면 이러한 configmap을 사용하는 컨테이너를 손상시킬 수 있습니다.


방금 configmap을 환경 값에 자동으로 매핑하는 프로젝트를 만들었습니다. 누군가에게 유용 할 수 있습니다. github.com/Acanguven/kubernetes-configmap-update
아멧 캔하기 Guven

답변:


162

다음 kubectl create configmap과 같이 명령 에서 YAML을 가져와으로 파이프 할 수 있습니다 kubectl replace.

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

3
Pipe the command is the way to go, was n't think of the --dry-run which is the key part of the command!
제임스 지앙

5
여기에 표시된 ConfigMaps 예제 외에도이 동일한 패턴이 Secrets에서도 작동 할 수 있습니다.
rwehner

2
는 Kubernetes 1.10 이것을 시도하지만 난이 오류가 계속error: 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


3
좋은 대답입니다. kubectl apply대신을 사용 kubectl replace하면 새로운 구성

35

나중에 참조 kubectl replace할 수 있도록이 작업을 수행하는 매우 편리한 방법입니다.

kubectl replace -f some_spec.yaml 완전한 configMap (또는 기타 객체)을 업데이트 할 수 있습니다.

여기에서 직접 문서 및 예제를 참조 하십시오.

도움말에서 복사 / 붙여 넣기 :

# 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

2
이것은 --from-file요구 사항을 놓쳤습니다 . Configmap은 yaml뿐만 아니라 임의의 파일에서 만들 수 있습니다.
Dave Hillier

@ sébastien-portebois 감사합니다! ConfigMap이 아직 존재하지 않는 첫 번째에도 --force접근 <dry-run ConfigMap creation> | kubectl replace --force -f -명령 을 사용할 수 있는 옵션을 몰랐습니다 . 그러나 포드를 찾지 못해 부족한 동안 Pod가 손상 될 수 있으므로 ConfigMap을 삭제하는 것이 안전한지 확실하지 않습니다. 아마도 접근 방식이 더 낫 <dry-run ConfigMap creation> | kubectl apply -f -습니까? 이 점은 @ karthic-c가 소개 한 것입니다. 어떻게 생각하십니까? 또한 @ jordan-liggitt 어떻게 생각하십니까?
Alex MM

21

에서 약간 변경 configMap하려면edit

kubectl edit configmap <cfg-name>

vi편집기 에서 configMap이 열립니다 . 변경하고 저장하십시오.


2
멋있는. 그러나 OP가 언급했듯이 이것은 자동화 된 프로세스로 목표를 달성하는 방법에 관한 것입니다. 내 시나리오에서는 ThoughtWorks Go를 건물 서버로 사용합니다.
James Jiang

5

kubectl replace configmap이 이미있는 경우 실패합니다.

$ 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

가장 좋은 해결책은 kubectl apply존재하지 않는 경우 configmap을 생성하고 존재하는 경우 configmap을 업데이트하는 방법을 사용 하는 것입니다.

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

configmap/falco-config configured


6
"구성 kubectl replace 이미 존재 하지 않으면 실패 "를 의미한다고 생각합니다 .
David Dooling

1

기존 configmap의 사본을 가져 오십시오.

kubectl get configmap foo -o yaml > foo.yaml

그런 다음 수정하고 적용 명령을 사용하면 작동합니다.

kubectl apply -f foo.yaml

참고 : 다음 문제가있는 경우 기존 구성 맵의 최신 "resourceVersion"을 포함하고 다시 시도하십시오.

"configmaps"foo "에서 작업을 수행 할 수 없습니다. 개체가 수정되었습니다. 변경 사항을 최신 버전에 적용하고 다시 시도하십시오."

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.