Kubernetes에서 configmap이 업데이트되면 포드를 다시 시작 하시겠습니까?


121

configmap이 변경 / 업데이트 될 때 배포와 연결된 Kubernetes 포드 및 포드를 자동으로 다시 시작하려면 어떻게해야합니까?


구성 맵이 변경 될 때 포드를 자동으로 다시 시작하는 기능에 대해 이야기 한 적이 있지만 내 지식으로는 아직 Kubernetes 1.2에서 사용할 수 없습니다.

그래서 제가하고 싶은 것은 구성 맵을 소비하는 포드와 관련된 배포 리소스 의 "롤링 재시작"입니다 . 실제 템플릿에서 아무것도 변경하지 않고 Kubernetes에서 배포의 롤링 재시작을 강제하는 것이 가능합니까? 그렇다면 어떻게해야합니까? 이것이 현재 가장 좋은 방법입니까, 아니면 더 나은 옵션이 있습니까?


$ kubectl set env deployment my deployment --env="LAST_RESTART=$(date)" --namespace ...나를 위해 일 할
maciek

답변:


60

구성 맵 업데이트시 포드에 신호를 보내는 것은 작업중인 기능입니다 ( https://github.com/kubernetes/kubernetes/issues/22368 ).

confimap이 변경되었음을 알리고 앱을 다시 시작하는 사용자 지정 pid1을 언제든지 작성할 수 있습니다.

예를 들어, 2 개의 컨테이너에 동일한 구성 맵을 마운트하고, 구성 맵 콘텐츠의 해시가 변경되면 실패하는 두 번째 컨테이너에 http 상태 확인을 노출하고,이를 첫 번째 컨테이너의 활성 프로브로 밀어 넣을 수 있습니다 (컨테이너가 포드는 동일한 네트워크 네임 스페이스를 공유 함). 프로브가 실패하면 kubelet이 첫 번째 컨테이너를 다시 시작합니다.

물론 포드가 어떤 노드에 있는지 신경 쓰지 않는 경우 간단히 삭제하면 복제 컨트롤러가 노드를 "다시 시작"합니다.


"포드 삭제"는 모든 포드 이름 수집, 하나 삭제, 교체 될 때까지 기다림, 두 번째 포드 삭제, 교체 될 때까지 기다림 등을 의미합니다. 맞습니까?
Torsten Bronger 2010 년

6
배포를 사용하여 축소 한 다음 확장합니다. 그래도 여전히 약간의 다운 타임이있을 것입니다. 이를 줄이기 위해 한 줄로 할 수 있습니다. kubectl scale deployment/update-demo --replicas=0; kubectl scale deployment/update-demo --replicas=4;
Nick H

모든 포드를 찾고 싶지 않고 가동 중지 시간을 신경 쓰지 않는다면 RC를 제거한 다음 RC를 다시 만드십시오.
Drew

1
이것은 마운트 된 볼륨이 업데이트되고 전체 팟 (Pod)을 다시 시작하지 않고 팟 (Pod)에서 파일을 다시 읽으면된다는 의미입니까?
Matt Williamson

@NickH 빠르고 더럽습니다. 다행히 제 경우에는 다운 타임이 허용되었고 이것은 훌륭하게 작동했습니다. 감사합니다!
ChocolateAndCheese

129

이 문제에 대한 현재 최선의 해결책 ( https://github.com/kubernetes/kubernetes/issues/22368 에서 자세히 참조 됨 )은 배포를 사용하고 ConfigMap을 변경할 수없는 것으로 간주하는 것입니다.

구성을 변경하려면 원하는 변경 사항으로 새 ConfigMap을 만들고 새 ConfigMap에서 배포를 가리 킵니다. 새 구성이 손상되면 배포에서 작동중인 ReplicaSet 축소를 거부합니다. 새 구성이 작동하면 이전 ReplicaSet이 0 개의 복제본으로 확장되고 삭제되고 새 pod가 새 구성으로 시작됩니다.

ConfigMap을 제자리에서 편집하는 것만 큼 빠르지는 않지만 훨씬 안전합니다.


2
이것이 우리가 취한 접근 방식입니다
Johan

5
새로운 실험 도구 kustomize는 결정적 구성 맵 해시 자동 생성을 지원하므로 새 구성
Symmetric

이것이 Spinnaker가 배후에서하는 일이므로 사용하면 걱정할 필요가 없습니다.
Gus

32

내가 찾은 가장 좋은 방법은 Reloader를 실행하는 것입니다.

이를 통해 configmap 또는 secrets를 정의하여 업데이트 될 때 배포의 롤링 업데이트가 수행되는 것을 볼 수 있습니다. 예를 들면 다음과 같습니다.

foo라는 배포 및 ConfigMap이 foo-configmap있습니다. configmap이 변경 될 때마다 배치의 팟 (Pod)을 롤링하려고합니다. 다음을 사용하여 Reloader를 실행해야합니다.

kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml

그런 다음 배포에서이 주석을 지정합니다.

kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "foo-configmap"
  name: foo
...

Reloader는 kubernetes> = 1.9
jacktrade

31

https://github.com/kubernetes/helm/blob/master/docs/charts_tips_and_tricks.md#user-content-automatically-roll-deployments-when-configmaps-or-secrets-change

종종 configmaps 또는 secrets는 컨테이너의 구성 파일로 삽입됩니다. 애플리케이션에 따라 후속 helm upgrade.

sha256sum함수를 함수와 함께 사용하여 include다른 사양이 변경되는 경우 배포 템플릿 섹션이 업데이트되도록 할 수 있습니다 .

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
[...]

제 경우에는 어떤 이유로 $.Template.BasePath작동하지 않았지만 작동합니다 $.Chart.Name.

spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: admin-app
      annotations:
        checksum/config: {{ include (print $.Chart.Name "/templates/" $.Chart.Name "-configmap.yaml") . | sha256sum }}

8
일반 Kubernetes 사용에는 적용되지 않으며 Helm에만 적용
Emii Khaos

2
답은이 질문에 관련이없는 아마 도움이되지만
아난드 싱 쿤와

helm3이 최근에 출시되었습니다. 따라서 링크가 오래되었습니다. master분기를 가리 킵니다 . 다음 URL은 (현재) 최신으로 이어질 것 helm2 개 문서 : github.com/helm/helm/blob/release-2.16/docs/...
마르셀 호이어

멋진 솔루션. 내 경우에는 sha256sum에 65 개의 문자가있어 Deployment.apps "xxx" is invalid: metadata.labels: Invalid value: "xxx": must be no more than 63 characters. 대안은 | trunc 63이지만 sha1sum은 "더 고유"해야합니다.
iptizer

11

배포와 관련이없는 메타 데이터 레이블을 업데이트 할 수 있습니다. 롤링 업데이트를 트리거합니다.

예를 들면 :

metadata:
  labels:
    configmap-version: 1

메타 데이터에 대한 문서를 찾고 있습니다. labels : configmap-version : 1
c4f4t0r

7
메타 데이터 레이블 변경으로 인해 포드가 다시 시작되지 않음
dan carter

이 답변은 upwotes가 있으므로 물어볼 필요가 있습니다. 메타 데이터를 업데이트하면 Kubernetes 클러스터가 롤링 업데이트를 트리거합니까? @ 마 오즈 - 사독

1
나는 이것이 메타 데이터 레이블이 아래에있는 한 작동한다고 믿는다template.spec
Saikiran Yerram

1

배포가 하위 차트에 있고이를 제어하는 ​​값이 상위 차트의 값 파일에있는이 문제가있었습니다. 다음은 다시 시작을 트리거하는 데 사용한 것입니다.

spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ tpl (toYaml .Values) . | sha256sum }}

분명히 이것은 모든 값 변경 에 대해 재시작을 트리거 하지만 우리 상황에서는 작동합니다. 원래 자식 차트에 있던 것은 자식 차트 자체의 config.yaml이 변경된 경우에만 작동합니다.

    checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }}

0

나는 퀀 타의 해법을 수행하고 완벽하게 작동합니다. 그러나 내가 이해하지 못하는 것은 포드가 실제로 다시 시작되지 않는다는 것입니다. 포드는 여전히 동일하지만 변화가 있습니다!

예 : Pod가 50 분 이후 실행 중이고 변경 내용이 온라인 상태입니다. 내 브라우저에서 확인할 수 있으며 Pod가 여전히 +50 분 실행 중입니다 !! Helm3을 사용하고 있습니다 ... configmap 업데이트를 다시 시작하지 않고이를 가능하게하는 이유를 알고 있습니까?


1
확인! 알아 냈어요 ... configmap을 볼륨으로 마운트하고 동적으로 업데이트했기 때문에 ... 그래서이 "체크섬"작업을 수행하면 내 포드가 다시 시작되지 않지만 변경 사항이 적용됩니다! 좋은 솔루션 :)
Ibrahim Yesilay

-1

또 다른 방법은 배포의 명령 섹션에 삽입하는 것입니다.

...
command: [ "echo", "
  option = value\n
  other_option = value\n
" ]
...

또는 좀 더 ConfigMap과 비슷하게 만들려면 command섹션 에서 해당 구성을 호스팅 하고 실행 kubectl create하면서 이름에 고유 한 '버전'을 추가하고 (예 : 콘텐츠의 해시 계산) 모든 항목을 수정 하는 추가 배포를 사용 합니다. 해당 구성을 사용하는 배포 :

...
command: [ "/usr/sbin/kubectl-apply-config.sh", "
  option = value\n
  other_option = value\n
" ]
...

kubectl-apply-config.sh작동이 끝나면 게시 할 것입니다 .

(그렇게하지 마십시오. 너무 나빠 보입니다)

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