Merge pull request #41276 from H13m0n/dev-1.26-safely-drain-node

[ko] Translate safely-drain-node.md into Korean
pull/41777/head
Kubernetes Prow Robot 2023-06-26 05:45:45 -07:00 committed by GitHub
commit 8981d3dbd6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 131 additions and 0 deletions

View File

@ -0,0 +1,131 @@
---
# reviewers:
# - davidopp
# - mml
# - foxish
# - kow3ns
title: 안전하게 노드 드레인(drain)하기
content_type: task
weight: 310
---
<!-- overview -->
이 페이지는 사용자가 정의한 PodDisruptionBudget을 선택적으로 준수하면서
{{< glossary_tooltip text="노드" term_id="node" >}}를 안전하게 드레인하는 방법을 보여준다.
## {{% heading "prerequisites" %}}
이 작업은 다음 사전 요구 사항을 충족한다고 가정한다.
1. 노드를 드레인하는 동안 애플리케이션에 고가용성이 필요하지
않거나, 혹은
2. [PodDisruptionBudget](/ko/docs/concepts/workloads/pods/disruptions/) 개념에 대해 읽었으며,
이를 필요로 하는 애플리케이션을 위해
[PodDisruptionBudgets를 설정](/docs/tasks/run-application/configure-pdb/)했다.
<!-- steps -->
## (선택 사항) 중단(disruption) 버짓 구성하기 {#configure-poddisruptionbudget}
유지보수 중에 워크로드를 계속 사용할 수 있도록,
[PodDisruptionBudget](/ko/docs/concepts/workloads/pods/disruptions/)를 구성할 수 있다.
만약 드레인하려는 노드에서 애플리케이션이 실행중이거나 실행될 수 있는
가용성이 중요하다면, 먼저 [PodDisruptionBudgets를 설정](/docs/tasks/run-application/configure-pdb/)한
뒤에 이 가이드를 따른다.
노드 드레인 중에 오동작하는 애플리케이션을 축출하려면 PodDisruptionBudgets에
`AlwaysAllow` [비정상 파드 축출 정책](/docs/tasks/run-application/configure-pdb/#unhealthy-pod-eviction-policy)을 설정하는 것을 권장한다.
기본적으로 드레인을 진행하기 전에 애플리케이션 파드가 [healthy](/docs/tasks/run-application/configure-pdb/#healthiness-of-a-pod)가
될 때까지 기다린다.
## `kubectl drain`을 사용하여 서비스에서 노드 제거하기
노드에서 유지보수(예: 커널 업그레이드, 하드웨어 유지보수 등)을 수행하기 전에
`kubectl drain`을 사용하여 노드에서 모든 파드를 안전하게 축출할 수 있다.
안전한 축출은 파드의 컨테이너가
[정상적으로 종료(gracefully terminate)](/ko/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination)될 수 있도록 하며,
사용자가 지정한 PodDisruptionBudgets을 준수한다.
{{< note >}}
기본적으로 `kubectl drain`은 노드의 종료할 수 없는
특정 시스템 파드는 무시한다. 자세한 내용은
[kubectl drain](/docs/reference/generated/kubectl/kubectl-commands/#drain)
문서를 참고한다.
{{< /note >}}
`kubectl drain`이 성공적으로 실행된 경우, 모든 파드
(이전 단락에서 설명한 무시된 파드를 제외)가 (사용자가 원하는 유예 종료 기간을
준수하고 사용자가 정의한 PodDisruptionBudget을 준수하여) 안전하게 축출되었음을
나타낸다. 그런 다음 물리적 머신의 전원을 끄거나
클라우드 플랫폼에서 실행 중인 경우 가상 머신을 삭제하여
노드를 끄는 것이 안전하다.
{{< note >}}
새로운 파드가 `node.kubernetes.io/unschedulable` 테인트(taint)를 허용하는 경우,
해당 파드는 드레인한 노드로 스케줄링 될 수 있다. 이를 방지하려면 DaemonSets 이외의
다른 테인트를 허용하지 않도록 한다.
사용자 또는 다른 API 사용자가 (스케줄러를 우회하여) 파드의 [`nodeName`](/ko/docs/concepts/scheduling-eviction/assign-pod-node/#nodename)
필드를 직접 설정하면, 해당 노드를 드레인하고 스케줄할 수 없도록 표시했더라도, 파드는
지정된 노드에 바인딩되어 해당 노드에서 실행된다.
{{< /note >}}
먼저 축출하려는 노드의 이름을 식별한다. 다음 명령어로 클러스터의 모든 노드를 출력할 수 있다.
```shell
kubectl get nodes
```
그런 다음, 쿠버네티스에게 노드를 드레인하라고 지시한다.
```shell
kubectl drain <node name>
```
DaemonSet에서 관리하는 파드가 있는 경우, 노드를 성공적으로
드레인하려면 `kubectl`과 함께 `--ignore-daemonsets`를 지정해야 한다. `kubectl drain`
서브커맨드 자체는 실제로 해당 DaemonSet 파드의 노드를 드레인하지 않는다.
DaemonSet 컨트롤러(컨트롤 플레인의 일부)는 누락된 파드를 즉시 새로운 동등한
파드로 대체한다. 또한, 데몬셋 컨트롤러는 스케줄링할 수 없는 테인트를 무시하는
파드를 생성하여, 새로운 파드가 드레인 중인 노드에서 실행될 수 있도록 한다.
위의 명령이 (오류 없이) 실행되면, 노드의 전원을 끌 수 있다
(혹은, 클라우드 플랫폼의 경우, 노드인 가상 머신을 삭제할 수 있다).
만약 유지보수 작업 중에 노드를 클러스터에 남겨두려면 다음을 실행한다.
```shell
kubectl uncordon <node name>
```
이렇게 함으로써 노드에 새로운 파드 스케줄링을 재개할 수 있음을 쿠버네티스에게 알려줄 수 있다.
## 여러 노드를 병렬로 드레인하기
`kubectl drain` 명령은 한 번에 하나의 노드에 대해서만 실행해야 한다.
그러나 서로 다른 터미널이나 백그라운드에서 여러 노드에
대한 `kubectl drain` 명령을 병렬로 실행할 수 있다.
동시에 실행되는 여러 드레인 명령은 여전히
사용자가 명시한 PodDisruptionBudget을 준수한다.
예를 들어, 3개의 레플리카가 있는 스테이트풀셋(StatefulSet)이 있고
PodDisruptionBudget이 `minAvailable: 2`으로 설정되어 있는 경우,
`kubectl drain`은 세 개의 레플리카 파드가 모두 [healthy](/docs/tasks/run-application/configure-pdb/#healthiness-of-a-pod)인
경우에만 스테이트풀셋에서 파드를 제거하며,
만약 여러 개의 드레인 명령을 동시에 실행하면
쿠버네티스는 PodDisruptionBudget을 준수하여 주어진 시간에
1개(`replicas - minAvailable` 로 계산된 것)만 사용할 수 없는
파드로 확인한다. [healthy](/docs/tasks/run-application/configure-pdb/#healthiness-of-a-pod)
레플리카의 수가 지정된 버짓 아래로 떨어지게 하는 드레인은 모두 차단된다.
## 축출 API {#eviction-api}
[kubectl drain](/docs/reference/generated/kubectl/kubectl-commands/#drain)을 사용하지 않으려는 경우
(예를 들어 외부 명령 호출을 피하거나 파드 축출 프로세스를 더 세밀하게
제어하려는 경우), 축출 API를 사용하여 프로그래밍 방식으로 축출을
유발할 수도 있다.
더 자세한 정보는, [API를 이용한 축출(API-initiated Eviction)](/ko/docs/concepts/scheduling-eviction/api-eviction/)을 확인한다.
## {{% heading "whatsnext" %}}
* 애플리케이션을 보호하려면 다음 단계인 [파드 중단 버짓 구성](/docs/tasks/run-application/configure-pdb/)을 따른다.