DaemonSet 업데이트하기

DaemonSet 업데이트하기

이 페이지에서는 DaemonSet에서 롤링 업데이트를 수행하는 방법을 보여줘요.

출처: 문서

본문

시작하기 전에

쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 설정돼 있어야 해요.

DaemonSet 업데이트 전략

DaemonSet에는 두 가지 업데이트 전략 유형이 있어요:

  • OnDelete: OnDelete 업데이트 전략을 사용하면 DaemonSet 템플릿을 업데이트한 뒤, 이전 DaemonSet 파드를 수동으로 삭제할 때에만 새 DaemonSet 파드가 생성됩니다. 이는 쿠버네티스 1.5 이전 버전의 DaemonSet과 같은 동작입니다.
  • RollingUpdate: 이것이 기본 업데이트 전략입니다. RollingUpdate 업데이트 전략을 사용하면 DaemonSet 템플릿을 업데이트한 뒤, 이전 DaemonSet 파드가 종료되고 새 DaemonSet 파드가 제어된 방식으로 자동 생성됩니다. 전체 업데이트 과정 동안 DaemonSet의 파드는 각 노드에서 최대 하나만 실행됩니다.

롤링 업데이트 수행하기

DaemonSet의 롤링 업데이트 기능을 활성화하려면 .spec.updateStrategy.typeRollingUpdate로 설정해야 해요.

.spec.updateStrategy.rollingUpdate.maxUnavailable(기본값 1), .spec.minReadySeconds(기본값 0), .spec.updateStrategy.rollingUpdate.maxSurge(기본값 0)도 설정하고 싶을 수 있습니다.

RollingUpdate 업데이트 전략으로 DaemonSet 만들기

이 YAML 파일은 업데이트 전략이 'RollingUpdate'인 DaemonSet을 지정해요.

DaemonSet 매니페스트의 업데이트 전략을 확인한 뒤 DaemonSet을 만들어요:

kubectl create -f https://k8s.io/examples/controllers/fluentd-daemonset.yaml

또는 kubectl apply로 DaemonSet을 업데이트할 계획이라면 kubectl apply로 같은 DaemonSet을 만들어도 됩니다:

kubectl apply -f https://k8s.io/examples/controllers/fluentd-daemonset.yaml

DaemonSet RollingUpdate 업데이트 전략 확인

DaemonSet의 업데이트 전략을 확인하고 RollingUpdate로 설정되어 있는지 확인해요:

kubectl get ds/fluentd-elasticsearch -o go-template='{{.spec.updateStrategy.type}}{{"\n"}}' -n kube-system

시스템에 DaemonSet을 만들지 않았다면 대신 다음 명령으로 DaemonSet 매니페스트를 확인해요:

kubectl apply -f https://k8s.io/examples/controllers/fluentd-daemonset.yaml --dry-run=client -o go-template='{{.spec.updateStrategy.type}}{{"\n"}}'

두 명령의 출력은 다음과 같아야 합니다:

RollingUpdate

출력이 RollingUpdate가 아니라면 돌아가서 DaemonSet 오브젝트나 매니페스트를 그에 맞게 수정해요.

DaemonSet 템플릿 업데이트

RollingUpdate DaemonSet의 .spec.template에 대한 어떤 업데이트든 롤링 업데이트를 트리거해요. 새 YAML 파일을 적용해 DaemonSet을 업데이트해봅시다. 이는 여러 다른 kubectl 명령으로 할 수 있습니다.

선언형 명령

구성 파일로 DaemonSet을 업데이트한다면 kubectl apply를 사용해요:

kubectl apply -f https://k8s.io/examples/controllers/fluentd-daemonset-update.yaml

명령형 명령

명령형 명령으로 DaemonSet을 업데이트한다면 kubectl edit을 사용해요:

kubectl edit ds/fluentd-elasticsearch -n kube-system
컨테이너 이미지만 업데이트하기

DaemonSet 템플릿에서 컨테이너 이미지만 업데이트해야 한다면, 즉 .spec.template.spec.containers[*].image라면 kubectl set image를 사용해요:

kubectl set image ds/fluentd-elasticsearch fluentd-elasticsearch=quay.io/fluentd_elasticsearch/fluentd:v2.6.0 -n kube-system

롤링 업데이트 상태 확인

마지막으로 최신 DaemonSet 롤링 업데이트의 롤아웃 상태를 확인해요:

kubectl rollout status ds/fluentd-elasticsearch -n kube-system

롤아웃이 완료되면 출력은 다음과 비슷합니다:

daemonset "fluentd-elasticsearch" successfully rolled out

문제 해결

DaemonSet 롤링 업데이트가 멈춤

때때로 DaemonSet 롤링 업데이트가 멈출 수 있어요. 몇 가지 가능한 원인이 있습니다:

일부 노드의 리소스 부족

새 DaemonSet 파드가 적어도 하나의 노드에 스케줄될 수 없기 때문에 롤아웃이 멈춰요. 이는 노드가 리소스 부족일 때 가능합니다.

이 경우 kubectl get nodes의 출력과 다음 출력을 비교해 DaemonSet 파드가 스케줄되지 않은 노드를 찾아요:

kubectl get pods -l name=fluentd-elasticsearch -o wide -n kube-system

그 노드들을 찾으면 노드에서 일부 비-DaemonSet 파드를 삭제해 새 DaemonSet 파드를 위한 공간을 만들어요.

삭제된 파드가 어떤 컨트롤러에도 제어되지 않거나 파드가 복제되지 않으면 서비스 중단을 일으켜요. 이는 PodDisruptionBudget도 존중하지 않습니다.

손상된 롤아웃

최근 DaemonSet 템플릿 업데이트가 손상된 경우, 예를 들어 컨테이너가 크래시 루프 중이거나 컨테이너 이미지가 존재하지 않으면(종종 오타로), DaemonSet 롤아웃은 진행되지 않아요.

이를 고치려면 DaemonSet 템플릿을 다시 업데이트해요. 새 롤아웃은 이전의 비정상 롤아웃에 막히지 않습니다.

클록 스큐

DaemonSet에 .spec.minReadySeconds가 지정되면 마스터와 노드 사이의 클록 스큐로 인해 DaemonSet이 올바른 롤아웃 진행을 감지하지 못할 수 있어요.

정리하기

네임스페이스에서 DaemonSet을 삭제해요:

kubectl delete ds fluentd-elasticsearch -n kube-system

더 알아보기 (Learn more)