Merge pull request #29237 from kubernetes/dev-1.21-ko.7
[ko] 7th Korean localization work for v1.21
This commit is contained in:
		
						commit
						a772fcf9cc
					
				| 
						 | 
					@ -210,7 +210,7 @@ rules:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
자체 클라우드 컨트롤러 매니저를 구현하거나 기존 프로젝트를 확장하는 방법을 알고 싶은가?
 | 
					자체 클라우드 컨트롤러 매니저를 구현하거나 기존 프로젝트를 확장하는 방법을 알고 싶은가?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
클라우드 컨트롤러 매니저는 Go 인터페이스를 사용해서 모든 클라우드 플러그인을 구현할 수 있다. 구체적으로, [kubernetes/cloud-provider](https://github.com/kubernetes/cloud-provider)의 [`cloud.go`](https://github.com/kubernetes/cloud-provider/blob/release-1.17/cloud.go#L42-L62)에 정의된 `CloudProvider` 인터페이스를 사용한다.
 | 
					클라우드 컨트롤러 매니저는 Go 인터페이스를 사용함으로써, 어떠한 클라우드에 대한 구현체(implementation)라도 플러그인 될 수 있도록 한다. 구체적으로는, [kubernetes/cloud-provider](https://github.com/kubernetes/cloud-provider)의 [`cloud.go`](https://github.com/kubernetes/cloud-provider/blob/release-1.21/cloud.go#L42-L69)에 정의된 `CloudProvider` 인터페이스를 사용한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
이 문서(노드, 라우트와 서비스)에서 강조된 공유 컨트롤러의 구현과 공유 cloudprovider 인터페이스와 함께 일부 스캐폴딩(scaffolding)은 쿠버네티스 핵심의 일부이다. 클라우드 공급자 전용 구현은 쿠버네티스의 핵심 바깥에 있으며 `CloudProvider` 인터페이스를 구현한다.
 | 
					이 문서(노드, 라우트와 서비스)에서 강조된 공유 컨트롤러의 구현과 공유 cloudprovider 인터페이스와 함께 일부 스캐폴딩(scaffolding)은 쿠버네티스 핵심의 일부이다. 클라우드 공급자 전용 구현은 쿠버네티스의 핵심 바깥에 있으며 `CloudProvider` 인터페이스를 구현한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -83,8 +83,11 @@ kubectl logs counter
 | 
				
			||||||
[`configure-helper` 스크립트](https://github.com/kubernetes/kubernetes/blob/{{< param "githubbranch" >}}/cluster/gce/gci/configure-helper.sh)를 통해
 | 
					[`configure-helper` 스크립트](https://github.com/kubernetes/kubernetes/blob/{{< param "githubbranch" >}}/cluster/gce/gci/configure-helper.sh)를 통해
 | 
				
			||||||
자세히 알 수 있다.
 | 
					자세히 알 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**CRI 컨테이너 런타임** 을 사용할 때, kubelet은 로그를 로테이션하고 로깅 디렉터리 구조를 관리한다. kubelet은
 | 
					**CRI 컨테이너 런타임** 을 사용할 때, kubelet은 로그를 로테이션하고 로깅 디렉터리 구조를 관리한다.
 | 
				
			||||||
이 정보를 CRI 컨테이너 런타임에 전송하고 런타임은 컨테이너 로그를 지정된 위치에 기록한다. 두 개의 kubelet 플래그 `container-log-max-size` 및 `container-log-max-files` 를 사용하여 각 로그 파일의 최대 크기와 각 컨테이너에 허용되는 최대 파일 수를 각각 구성할 수 있다.
 | 
					kubelet은 이 정보를 CRI 컨테이너 런타임에 전송하고 런타임은 컨테이너 로그를 지정된 위치에 기록한다.
 | 
				
			||||||
 | 
					[kubelet config file](/docs/tasks/administer-cluster/kubelet-config-file/)에 있는
 | 
				
			||||||
 | 
					두 개의 kubelet 파라미터 [`containerLogMaxSize` 및 `containerLogMaxFiles`](/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-KubeletConfiguration)를
 | 
				
			||||||
 | 
					사용하여 각 로그 파일의 최대 크기와 각 컨테이너에 허용되는 최대 파일 수를 각각 구성할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
기본 로깅 예제에서와 같이 [`kubectl logs`](/docs/reference/generated/kubectl/kubectl-commands#logs)를
 | 
					기본 로깅 예제에서와 같이 [`kubectl logs`](/docs/reference/generated/kubectl/kubectl-commands#logs)를
 | 
				
			||||||
실행하면, 노드의 kubelet이 요청을 처리하고
 | 
					실행하면, 노드의 kubelet이 요청을 처리하고
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1235,10 +1235,6 @@ API 서버에서 kubelet으로의 통신은 SSL/TLS로 보호된다.
 | 
				
			||||||
 - 시크릿을 사용하는 파드를 생성할 수 있는 사용자는 해당 시크릿의 값도 볼 수 있다.
 | 
					 - 시크릿을 사용하는 파드를 생성할 수 있는 사용자는 해당 시크릿의 값도 볼 수 있다.
 | 
				
			||||||
   API 서버 정책이 해당 사용자가 시크릿을 읽을 수 있도록 허용하지 않더라도, 사용자는
 | 
					   API 서버 정책이 해당 사용자가 시크릿을 읽을 수 있도록 허용하지 않더라도, 사용자는
 | 
				
			||||||
   시크릿을 노출하는 파드를 실행할 수 있다.
 | 
					   시크릿을 노출하는 파드를 실행할 수 있다.
 | 
				
			||||||
 - 현재, 모든 노드에 대한 루트 권한이 있는 모든 사용자는 kubelet을 가장하여
 | 
					 | 
				
			||||||
   API 서버에서 _모든_ 시크릿을 읽을 수 있다. 단일 노드에 대한 루트 취약점 공격의
 | 
					 | 
				
			||||||
   영향을 제한하기 위해, 실제로 필요한 노드에만 시크릿을 보내는 것이 앞으로 계획된
 | 
					 | 
				
			||||||
   기능이다.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## {{% heading "whatsnext" %}}
 | 
					## {{% heading "whatsnext" %}}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,8 +51,7 @@ weight: 30
 | 
				
			||||||
* 내부 멤버 선출 절차없이 분산 애플리케이션의
 | 
					* 내부 멤버 선출 절차없이 분산 애플리케이션의
 | 
				
			||||||
  리더를 선택
 | 
					  리더를 선택
 | 
				
			||||||
 | 
					
 | 
				
			||||||
오퍼레이터의 모습을 더 자세하게 볼 수 있는 방법은 무엇인가? 자세한 예는
 | 
					오퍼레이터의 모습을 더 자세하게 볼 수 있는 방법은 무엇인가? 예시는 다음과 같다.
 | 
				
			||||||
다음과 같다.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 클러스터에 구성할 수 있는 SampleDB라는 사용자 정의 리소스.
 | 
					1. 클러스터에 구성할 수 있는 SampleDB라는 사용자 정의 리소스.
 | 
				
			||||||
2. 오퍼레이터의 컨트롤러 부분이 포함된 파드의 실행을
 | 
					2. 오퍼레이터의 컨트롤러 부분이 포함된 파드의 실행을
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,7 +72,7 @@ spec:
 | 
				
			||||||
## 넘어가기 전에: 내장 노드 레이블들 {#built-in-node-labels}
 | 
					## 넘어가기 전에: 내장 노드 레이블들 {#built-in-node-labels}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[붙인](#1-단계-노드에-레이블-붙이기) 레이블뿐만 아니라, 노드에는
 | 
					[붙인](#1-단계-노드에-레이블-붙이기) 레이블뿐만 아니라, 노드에는
 | 
				
			||||||
표준 레이블 셋이 미리 채워져 있다. 이들 목록은 [잘 알려진 레이블, 어노테이션 및 테인트](/docs/reference/labels-annotations-taints/)를 참고한다.
 | 
					표준 레이블 셋이 미리 채워져 있다. 이들 목록은 [잘 알려진 레이블, 어노테이션 및 테인트](/ko/docs/reference/labels-annotations-taints/)를 참고한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< note >}}
 | 
					{{< note >}}
 | 
				
			||||||
이 레이블들의 값은 클라우드 공급자에 따라 다르고 신뢰성이 보장되지 않는다.
 | 
					이 레이블들의 값은 클라우드 공급자에 따라 다르고 신뢰성이 보장되지 않는다.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,411 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					title: 노드-압박 축출
 | 
				
			||||||
 | 
					content_type: concept
 | 
				
			||||||
 | 
					weight: 60
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{<glossary_definition term_id="node-pressure-eviction" length="short">}}</br>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{<glossary_tooltip term_id="kubelet" text="kubelet">}}은 
 | 
				
			||||||
 | 
					클러스터 노드의 CPU, 메모리, 디스크 공간, 파일시스템 inode와 같은 자원을 모니터링한다.
 | 
				
			||||||
 | 
					이러한 자원 중 하나 이상이 특정 소모 수준에 도달하면, 
 | 
				
			||||||
 | 
					kubelet은 하나 이상의 파드를 능동적으로 중단시켜 
 | 
				
			||||||
 | 
					자원을 회수하고 고갈 상황을 방지할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					노드-압박 축출 과정에서, kubelet은 축출할 파드의 `PodPhase`를 
 | 
				
			||||||
 | 
					`Failed`로 설정한다. 이로써 파드가 종료된다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					노드-압박 축출은 
 | 
				
			||||||
 | 
					[API를 이용한 축출](/ko/docs/concepts/scheduling-eviction/api-eviction/)과는 차이가 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet은 이전에 설정된 `PodDisruptionBudget` 값이나 파드의 `terminationGracePeriodSeconds` 값을 따르지 않는다. 
 | 
				
			||||||
 | 
					[소프트 축출 임계값](#soft-eviction-thresholds)을 사용하는 경우, 
 | 
				
			||||||
 | 
					kubelet은 이전에 설정된 `eviction-max-pod-grace-period` 값을 따른다. 
 | 
				
			||||||
 | 
					[하드 축출 임계값](#hard-eviction-thresholds)을 사용하는 경우, 파드 종료 시 `0s` 만큼 기다린 후 종료한다(즉, 기다리지 않고 바로 종료한다).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					실패한 파드를 새로운 파드로 교체하는 
 | 
				
			||||||
 | 
					{{< glossary_tooltip text="워크로드" term_id="workload" >}} 리소스(예: 
 | 
				
			||||||
 | 
					{{< glossary_tooltip text="스테이트풀셋(StatefulSet)" term_id="statefulset" >}} 또는 
 | 
				
			||||||
 | 
					{{< glossary_tooltip text="디플로이먼트(Deployment)" term_id="deployment" >}})가 파드를 관리하는 경우, 
 | 
				
			||||||
 | 
					컨트롤 플레인이나 `kube-controller-manager`가 축출된 파드를 대신할 새 파드를 생성한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{<note>}}
 | 
				
			||||||
 | 
					kubelet은 최종 사용자 파드를 종료하기 전에 
 | 
				
			||||||
 | 
					먼저 [노드 수준 자원을 회수](#reclaim-node-resources)하려고 시도한다. 
 | 
				
			||||||
 | 
					예를 들어, 디스크 자원이 부족하면 먼저 사용하지 않는 컨테이너 이미지를 제거한다.
 | 
				
			||||||
 | 
					{{</note>}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet은 축출 결정을 내리기 위해 다음과 같은 다양한 파라미터를 사용한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * 축출 신호
 | 
				
			||||||
 | 
					  * 축출 임계값
 | 
				
			||||||
 | 
					  * 모니터링 간격
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 축출 신호 {#eviction-signals}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					축출 신호는 특정 시점에서 특정 자원의 현재 상태이다. 
 | 
				
			||||||
 | 
					Kubelet은 노드에서 사용할 수 있는 리소스의 최소량인 
 | 
				
			||||||
 | 
					축출 임계값과 축출 신호를 비교하여 
 | 
				
			||||||
 | 
					축출 결정을 내린다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Kubelet은 다음과 같은 축출 신호를 사용한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					| 축출 신호      | 설명                                                                           |
 | 
				
			||||||
 | 
					|----------------------|---------------------------------------------------------------------------------------|
 | 
				
			||||||
 | 
					| `memory.available`   | `memory.available` := `node.status.capacity[memory]` - `node.stats.memory.workingSet` |
 | 
				
			||||||
 | 
					| `nodefs.available`   | `nodefs.available` := `node.stats.fs.available`                                       |
 | 
				
			||||||
 | 
					| `nodefs.inodesFree`  | `nodefs.inodesFree` := `node.stats.fs.inodesFree`                                     |
 | 
				
			||||||
 | 
					| `imagefs.available`  | `imagefs.available` := `node.stats.runtime.imagefs.available`                         |
 | 
				
			||||||
 | 
					| `imagefs.inodesFree` | `imagefs.inodesFree` := `node.stats.runtime.imagefs.inodesFree`                       |
 | 
				
			||||||
 | 
					| `pid.available`      | `pid.available` := `node.stats.rlimit.maxpid` - `node.stats.rlimit.curproc`           |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					이 표에서, `설명` 열은 kubelet이 축출 신호 값을 계산하는 방법을 나타낸다. 
 | 
				
			||||||
 | 
					각 축출 신호는 백분율 또는 숫자값을 지원한다. 
 | 
				
			||||||
 | 
					Kubelet은 총 용량 대비 축출 신호의 백분율 값을 
 | 
				
			||||||
 | 
					계산한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`memory.available` 값은 `free -m`과 같은 도구가 아니라 cgroupfs로부터 도출된다. 
 | 
				
			||||||
 | 
					이는 `free -m`이 컨테이너 안에서는 동작하지 않고, 또한 사용자가 
 | 
				
			||||||
 | 
					[node allocatable](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable) 
 | 
				
			||||||
 | 
					기능을 사용하는 경우 자원 부족에 대한 결정은 루트 노드뿐만 아니라 
 | 
				
			||||||
 | 
					cgroup 계층 구조의 최종 사용자 파드 부분에서도 지역적으로 이루어지기 때문에 중요하다. 
 | 
				
			||||||
 | 
					이 [스크립트](/examples/admin/resource/memory-available.sh)는 
 | 
				
			||||||
 | 
					kubelet이 `memory.available`을 계산하기 위해 수행하는 동일한 단계들을 재현한다. 
 | 
				
			||||||
 | 
					kubelet은 메모리 압박 상황에서 메모리가 회수 가능하다고 가정하므로, 
 | 
				
			||||||
 | 
					inactive_file(즉, 비활성 LRU 목록의 파일 기반 메모리 바이트 수)을 
 | 
				
			||||||
 | 
					계산에서 제외한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet은 다음과 같은 파일시스템 파티션을 지원한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. `nodefs`: 노드의 메인 파일시스템이며, 로컬 디스크 볼륨, emptyDir, 
 | 
				
			||||||
 | 
					   로그 스토리지 등에 사용된다. 예를 들어 `nodefs`는 `/var/lib/kubelet/`을 포함한다.
 | 
				
			||||||
 | 
					1. `imagefs`: 컨테이너 런타임이 컨테이너 이미지 및 
 | 
				
			||||||
 | 
					   컨테이너 쓰기 가능 레이어를 저장하는 데 사용하는 선택적 파일시스템이다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Kubelet은 이러한 파일시스템을 자동으로 검색하고 다른 파일시스템은 무시한다. 
 | 
				
			||||||
 | 
					Kubelet은 다른 구성은 지원하지 않는다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{<note>}}
 | 
				
			||||||
 | 
					일부 kubelet 가비지 수집 기능은 더 이상 사용되지 않으며 축출로 대체되었다.
 | 
				
			||||||
 | 
					사용 중지된 기능의 목록은 [kubelet 가비지 수집 사용 중단](/ko/docs/concepts/cluster-administration/kubelet-garbage-collection/#사용-중단-deprecation)을 참조한다.
 | 
				
			||||||
 | 
					{{</note>}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 축출 임계값
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet이 축출 결정을 내릴 때 사용하는 축출 임계값을 
 | 
				
			||||||
 | 
					사용자가 임의로 설정할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					축출 임계값은 `[eviction-signal][operator][quantity]` 형태를 갖는다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* `eviction-signal`에는 사용할 [축출 신호](#eviction-signals)를 적는다.
 | 
				
			||||||
 | 
					* `operator`에는 [관계연산자](https://ko.wikipedia.org/wiki/관계연산자#표준_관계연산자)를 
 | 
				
			||||||
 | 
					  적는다(예: `<` - 미만)
 | 
				
			||||||
 | 
					* `quantity`에는 `1Gi`와 같이 축출 임계값 수치를 적는다. 
 | 
				
			||||||
 | 
					  `quantity`에 들어가는 값은 쿠버네티스가 사용하는 수치 표현 방식과 맞아야 한다. 
 | 
				
			||||||
 | 
					  숫자값 또는 백분율(`%`)을 사용할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					예를 들어, 노드에 총 `10Gi`의 메모리가 있고 
 | 
				
			||||||
 | 
					`1Gi` 아래로 내려갔을 때 축출이 시작되도록 만들고 싶으면, 축출 임계값을 
 | 
				
			||||||
 | 
					`memory.available<10%` 또는 `memory.available<1Gi` 형태로 정할 수 있다. 둘을 동시에 사용할 수는 없다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					소프트 축출 임계값과 하드 축출 임계값을 설정할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### 소프트 축출 임계값 {#soft-eviction-thresholds}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					소프트 축출 임계값은 관리자가 설정하는 유예 시간(필수)과 함께 정의된다. 
 | 
				
			||||||
 | 
					kubelet은 유예 시간이 초과될 때까지 파드를 제거하지 않는다. 
 | 
				
			||||||
 | 
					유예 시간이 지정되지 않으면 kubelet 시작 시 
 | 
				
			||||||
 | 
					오류가 반환된다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet이 축출 과정에서 사용할 수 있도록, 
 | 
				
			||||||
 | 
					'소프트 축출 임계값'과 '최대 허용 파드 종료 유예 시간' 둘 다를 설정할 수 있다. 
 | 
				
			||||||
 | 
					'최대 허용 파드 종료 유예 시간'이 설정되어 있는 상태에서 '소프트 축출 임계값'에 도달하면, 
 | 
				
			||||||
 | 
					kubelet은 두 유예 시간 중 작은 쪽을 적용한다. 
 | 
				
			||||||
 | 
					'최대 허용 파드 종료 유예 시간'을 설정하지 않으면, 
 | 
				
			||||||
 | 
					kubelet은 축출된 파드를 유예 시간 없이 즉시 종료한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					소프트 축출 임계값을 설정할 때 다음과 같은 플래그를 사용할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* `eviction-soft`: 축출 임계값(예: `memory.available<1.5Gi`)의 집합이며, 
 | 
				
			||||||
 | 
					  지정된 유예 시간동안 이 축출 임계값 조건이 충족되면 파드 축출이 트리거된다.
 | 
				
			||||||
 | 
					* `eviction-soft-grace-period`: 축출 유예 시간의 집합이며, 
 | 
				
			||||||
 | 
					  소프트 축출 임계값 조건이 이 유예 시간동안 충족되면 파드 축출이 트리거된다.
 | 
				
			||||||
 | 
					* `eviction-max-pod-grace-period`: '최대 허용 파드 종료 유예 시간(단위: 초)'이며, 
 | 
				
			||||||
 | 
					  소프트 축출 임계값 조건이 충족되어 파드를 종료할 때 사용한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### 하드 축출 임계값 {#hard-eviction-thresholds}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					하드 축출 임계값에는 유예 시간이 없다. 하드 축출 임계값 조건이 충족되면, 
 | 
				
			||||||
 | 
					kubelet은 고갈된 자원을 회수하기 위해 파드를 유예 시간 없이 
 | 
				
			||||||
 | 
					즉시 종료한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`eviction-hard` 플래그를 사용하여 하드 축출 
 | 
				
			||||||
 | 
					임계값(예: `memory.available<1Gi`)을 설정할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet은 다음과 같은 하드 축출 임계값을 기본적으로 설정하고 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* `memory.available<100Mi`
 | 
				
			||||||
 | 
					* `nodefs.available<10%`
 | 
				
			||||||
 | 
					* `imagefs.available<15%`
 | 
				
			||||||
 | 
					* `nodefs.inodesFree<5%` (리눅스 노드)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 축출 모니터링 시간 간격
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet은 `housekeeping-interval`에 설정된 시간 간격(기본값: `10s`)마다 
 | 
				
			||||||
 | 
					축출 임계값을 확인한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 노드 컨디션 {#node-conditions}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet은 하드/소프트 축출 임계값 조건이 충족되어 
 | 
				
			||||||
 | 
					노드 압박이 발생했다는 것을 알리기 위해, 
 | 
				
			||||||
 | 
					설정된 유예 시간과는 관계없이 노드 컨디션을 보고한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet은 다음과 같이 노드 컨디션과 축출 신호를 매핑한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					| 노드 컨디션    | 축출 신호                                                                       | 설명                                                                                                                  |
 | 
				
			||||||
 | 
					|-------------------|---------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------|
 | 
				
			||||||
 | 
					| `MemoryPressure`  | `memory.available`                                                                    | 노드의 가용 메모리 양이 축출 임계값에 도달함                                                             |
 | 
				
			||||||
 | 
					| `DiskPressure`    | `nodefs.available`, `nodefs.inodesFree`, `imagefs.available`, 또는 `imagefs.inodesFree` | 노드의 루트 파일시스템 또는 이미지 파일시스템의 가용 디스크 공간 또는 inode의 수가 축출 임계값에 도달함 |
 | 
				
			||||||
 | 
					| `PIDPressure`     | `pid.available`                                                                       | (리눅스) 노드의 가용 프로세스 ID(PID)가 축출 임계값 이하로 내려옴                                   |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet은 `--node-status-update-frequency`에 설정된 
 | 
				
			||||||
 | 
					시간 간격(기본값: `10s`)마다 노드 컨디션을 업데이트한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### 노드 컨디션 진동(oscillation)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					경우에 따라, 노드의 축출 신호값이 사전에 설정된 유예 시간 동안 유지되지 않고 
 | 
				
			||||||
 | 
					소프트 축출 임계값을 중심으로 진동할 수 있다. 이로 인해 노드 컨디션이 계속 
 | 
				
			||||||
 | 
					`true`와 `false`로 바뀌며, 잘못된 축출 결정을 야기할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					이러한 진동을 방지하기 위해, `eviction-pressure-transition-period` 플래그를 
 | 
				
			||||||
 | 
					사용하여 kubelet이 노드 컨디션을 다른 상태로 바꾸기 위해 기다려야 하는 시간을 
 | 
				
			||||||
 | 
					설정할 수 있다. 기본값은 `5m`이다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 노드-수준 자원 회수하기 {#reclaim-node-resources}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet은 최종 사용자 파드를 축출하기 전에 노드-수준 자원 회수를 시도한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`DiskPressure` 노드 컨디션이 보고되면, 
 | 
				
			||||||
 | 
					kubelet은 노드의 파일시스템을 기반으로 노드-수준 자원을 회수한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### `imagefs`가 있는 경우
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					컨테이너 런타임이 사용할 전용 `imagefs` 파일시스템이 노드에 있으면, 
 | 
				
			||||||
 | 
					kubelet은 다음 작업을 수행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  * `nodefs` 파일시스템이 축출 임계값 조건을 충족하면, 
 | 
				
			||||||
 | 
					    kubelet은 종료된 파드와 컨테이너에 대해 가비지 수집을 수행한다.
 | 
				
			||||||
 | 
					  * `imagefs` 파일시스템이 축출 임계값 조건을 충족하면, 
 | 
				
			||||||
 | 
					    kubelet은 모든 사용중이지 않은 이미지를 삭제한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### `imagefs`가 없는 경우
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					노드에 `nodefs` 파일시스템만 있고 이것이 축출 임계값 조건을 충족한 경우, 
 | 
				
			||||||
 | 
					kubelet은 다음 순서로 디스크 공간을 확보한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. 종료된 파드와 컨테이너에 대해 가비지 수집을 수행한다.
 | 
				
			||||||
 | 
					1. 사용중이지 않은 이미지를 삭제한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### kubelet 축출을 위한 파드 선택
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet이 노드-수준 자원을 회수했음에도 축출 신호가 임계값 아래로 내려가지 않으면, 
 | 
				
			||||||
 | 
					kubelet은 최종 사용자 파드 축출을 시작한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet은 파드 축출 순서를 결정하기 위해 다음의 파라미터를 활용한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. 파드의 자원 사용량이 요청량을 초과했는지 여부
 | 
				
			||||||
 | 
					1. [파드 우선순위](/ko/docs/concepts/scheduling-eviction/pod-priority-preemption/)
 | 
				
			||||||
 | 
					1. 파드의 자원 요청량 대비 자원 사용량
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					결과적으로, kubelet은 다음과 같은 순서로 파드의 축출 순서를 정하고 축출을 수행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. `BestEffort` 또는 `Burstable` 파드 중 자원 사용량이 요청량을 초과한 파드. 
 | 
				
			||||||
 | 
					   이 파드들은 파드들의 우선순위, 그리고 자원 사용량이 요청량을 
 | 
				
			||||||
 | 
					   얼마나 초과했는지에 따라 축출된다.
 | 
				
			||||||
 | 
					1. `Guaranteed`, `Burstable` 파드 중 자원 사용량이 요청량보다 낮은 파드는 
 | 
				
			||||||
 | 
					   우선순위에 따라 후순위로 축출된다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{<note>}}
 | 
				
			||||||
 | 
					kubelet이 파드 축출 순서를 결정할 때 파드의 QoS 클래스는 이용하지 않는다. 
 | 
				
			||||||
 | 
					메모리 등의 자원을 회수할 때, QoS 클래스를 이용하여 가장 가능성이 높은 파드 축출 순서를 예측할 수는 있다. 
 | 
				
			||||||
 | 
					QoS는 EphemeralStorage 요청에 적용되지 않으므로, 
 | 
				
			||||||
 | 
					노드가 예를 들어 `DiskPressure` 아래에 있는 경우 위의 시나리오가 적용되지 않는다.
 | 
				
			||||||
 | 
					{{</note>}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`Guaranteed` 파드는 모든 컨테이너에 대해 자원 요청량과 제한이 명시되고 
 | 
				
			||||||
 | 
					그 둘이 동일할 때에만 보장(guaranteed)된다. 다른 파드의 자원 사용으로 인해 
 | 
				
			||||||
 | 
					`Guaranteed` 파드가 축출되는 일은 발생하지 않는다. 만약 시스템 데몬(예: 
 | 
				
			||||||
 | 
					`kubelet`, `docker`, `journald`)이 `system-reserved` 또는 `kube-reserved` 
 | 
				
			||||||
 | 
					할당을 통해 예약된 것보다 더 많은 자원을 소비하고, 노드에는 요청량보다 적은 양의 
 | 
				
			||||||
 | 
					자원을 사용하고 있는 `Guaranteed` / `Burstable` 파드만 존재한다면, 
 | 
				
			||||||
 | 
					kubelet은 노드 안정성을 유지하고 자원 고갈이 다른 파드에 미칠 영향을 통제하기 위해 
 | 
				
			||||||
 | 
					이러한 파드 중 하나를 골라 축출해야 한다. 
 | 
				
			||||||
 | 
					이 경우, 가장 낮은 `Priority`를 갖는 파드가 선택된다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`inodes`와 `PIDs`에 대한 요청량은 정의하고 있지 않기 때문에, kubelet이 `inode` 
 | 
				
			||||||
 | 
					또는 `PID` 고갈 때문에 파드를 축출할 때에는 파드의 `Priority`를 이용하여 축출 
 | 
				
			||||||
 | 
					순위를 정한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					노드에 전용 `imagefs` 파일시스템이 있는지 여부에 따라 kubelet이 파드 축출 순서를 
 | 
				
			||||||
 | 
					정하는 방식에 차이가 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### `imagefs`가 있는 경우
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`nodefs`로 인한 축출의 경우, kubelet은 `nodefs` 
 | 
				
			||||||
 | 
					사용량(`모든 컨테이너의 로컬 볼륨 + 로그`)을 기준으로 축출 순서를 정한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`imagefs`로 인한 축출의 경우, kubelet은 모든 컨테이너의 
 | 
				
			||||||
 | 
					쓰기 가능한 레이어(writable layer) 사용량을 기준으로 축출 순서를 정한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### `imagefs`가 없는 경우
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`nodefs`로 인한 축출의 경우, kubelet은 각 파드의 총 
 | 
				
			||||||
 | 
					디스크 사용량(`모든 컨테이너의 로컬 볼륨 + 로그 + 쓰기 가능한 레이어`)을 기준으로 축출 순서를 정한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 최소 축출 회수량
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					경우에 따라, 파드를 축출했음에도 적은 양의 자원만이 회수될 수 있다. 
 | 
				
			||||||
 | 
					이로 인해 kubelet이 반복적으로 축출 임계값 도달을 감지하고 
 | 
				
			||||||
 | 
					여러 번의 축출을 수행할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`--eviction-minimum-reclaim` 플래그 또는 
 | 
				
			||||||
 | 
					[kubelet 설정 파일](/docs/tasks/administer-cluster/kubelet-config-file/)을 이용하여 
 | 
				
			||||||
 | 
					각 자원에 대한 최소 회수량을 설정할 수 있다. kubelet이 자원 부족 상황을 감지하면, 
 | 
				
			||||||
 | 
					앞서 설정한 최소 회수량에 도달할때까지 회수를 계속 진행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					예를 들어, 다음 YAML은 최소 회수량을 정의하고 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					apiVersion: kubelet.config.k8s.io/v1beta1
 | 
				
			||||||
 | 
					kind: KubeletConfiguration
 | 
				
			||||||
 | 
					evictionHard:
 | 
				
			||||||
 | 
					  memory.available: "500Mi"
 | 
				
			||||||
 | 
					  nodefs.available: "1Gi"
 | 
				
			||||||
 | 
					  imagefs.available: "100Gi"
 | 
				
			||||||
 | 
					evictionMinimumReclaim:
 | 
				
			||||||
 | 
					  memory.available: "0Mi"
 | 
				
			||||||
 | 
					  nodefs.available: "500Mi"
 | 
				
			||||||
 | 
					  imagefs.available: "2Gi"
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					이 예제에서, 만약 `nodefs.available` 축출 신호가 축출 임계값 조건에 도달하면, 
 | 
				
			||||||
 | 
					kubelet은 축출 신호가 임계값인 `1Gi`에 도달할 때까지 자원을 회수하며, 
 | 
				
			||||||
 | 
					이어서 축출 신호가 `1.5Gi`에 도달할 때까지 최소 `500Mi` 이상의 자원을 
 | 
				
			||||||
 | 
					회수한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					유사한 방식으로, kubelet은 `imagefs.available` 축출 신호가 
 | 
				
			||||||
 | 
					`102Gi`에 도달할 때까지 `imagefs` 자원을 회수한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					모든 자원에 대해 `eviction-minimum-reclaim`의 기본값은 `0`이다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 노드 메모리 부족 시의 동작
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet의 메모리 회수가 가능하기 이전에 
 | 
				
			||||||
 | 
					노드에 메모리 부족(out of memory, 이하 OOM) 이벤트가 발생하면, 
 | 
				
			||||||
 | 
					노드는 [oom_killer](https://lwn.net/Articles/391222/)에 의존한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet은 각 파드에 설정된 QoS를 기반으로 각 컨테이너에 `oom_score_adj` 값을 설정한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					| 서비스 품질(Quality of Service) | oom_score_adj                                                                     |
 | 
				
			||||||
 | 
					|--------------------|-----------------------------------------------------------------------------------|
 | 
				
			||||||
 | 
					| `Guaranteed`       | -997                                                                              |
 | 
				
			||||||
 | 
					| `BestEffort`       | 1000                                                                              |
 | 
				
			||||||
 | 
					| `Burstable`        | min(max(2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999) |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{<note>}}
 | 
				
			||||||
 | 
					또한, kubelet은 `system-node-critical` {{<glossary_tooltip text="파드 우선 순위(Priority)" term_id="pod-priority">}}를 갖는 파드의 컨테이너에 
 | 
				
			||||||
 | 
					`oom_score_adj` 값을 `-997`로 설정한다.
 | 
				
			||||||
 | 
					{{</note>}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					노드가 OOM을 겪기 전에 kubelet이 메모리를 회수하지 못하면, `oom_killer`가 노드의 
 | 
				
			||||||
 | 
					메모리 사용률 백분율을 이용하여 `oom_score`를 계산하고, 각 컨테이너의 실질 
 | 
				
			||||||
 | 
					`oom_score`를 구하기 위해 `oom_score_adj`를 더한다. 그 뒤 `oom_score`가 가장 높은 
 | 
				
			||||||
 | 
					컨테이너부터 종료시킨다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					이는 곧, 스케줄링 요청에 비해 많은 양의 메모리를 사용하면서 
 | 
				
			||||||
 | 
					QoS가 낮은 파드에 속한 컨테이너가 먼저 종료됨을 의미한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					파드 축출과 달리, 컨테이너가 OOM으로 인해 종료되면, 
 | 
				
			||||||
 | 
					`kubelet`이 컨테이너의 `RestartPolicy`를 기반으로 컨테이너를 다시 실행할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 추천 예시 {#node-pressure-eviction-good-practices}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					아래 섹션에서 축출 설정에 대한 추천 예시를 소개한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### 스케줄 가능한 자원과 축출 정책
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet에 축출 정책을 설정할 때, 만약 어떤 파드 배치가 즉시 메모리 압박을 
 | 
				
			||||||
 | 
					야기하기 때문에 축출을 유발한다면 스케줄러가 그 파드 배치를 수행하지 않도록 
 | 
				
			||||||
 | 
					설정해야 한다. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					다음 시나리오를 가정한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* 노드 메모리 용량: `10Gi`
 | 
				
			||||||
 | 
					* 운영자는 시스템 데몬(커널, `kubelet` 등)을 위해 메모리 용량의 10%를 확보해 놓고 싶어 한다.
 | 
				
			||||||
 | 
					* 운영자는 시스템 OOM 발생을 줄이기 위해 메모리 사용률이 95%인 상황에서 파드를 축출하고 싶어한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					이것이 실현되도록, kubelet이 다음과 같이 실행된다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					--eviction-hard=memory.available<500Mi
 | 
				
			||||||
 | 
					--system-reserved=memory=1.5Gi
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					이 환경 설정에서, `--system-reserved` 플래그는 시스템 용으로 `1.5Gi` 메모리를 
 | 
				
			||||||
 | 
					확보하는데, 이는 `총 메모리의 10% + 축출 임계값`에 해당된다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					파드가 요청량보다 많은 메모리를 사용하거나 시스템이 `1Gi` 이상의 메모리를 
 | 
				
			||||||
 | 
					사용하여, `memory.available` 축출 신호가 `500Mi` 아래로 내려가면 노드가 축출 
 | 
				
			||||||
 | 
					임계값에 도달할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### 데몬셋(DaemonSet)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					파드 우선 순위(Priority)는 파드 축출 결정을 내릴 때의 주요 요소이다. 
 | 
				
			||||||
 | 
					kubelet이 `DaemonSet`에 속하는 파드를 축출하지 않도록 하려면 
 | 
				
			||||||
 | 
					해당 파드의 파드 스펙에 충분히 높은 `priorityClass`를 지정한다. 
 | 
				
			||||||
 | 
					또는 낮은 `priorityClass`나 기본값을 사용하여 
 | 
				
			||||||
 | 
					리소스가 충분할 때만 `DaemonSet` 파드가 실행되도록 허용할 수도 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 알려진 이슈
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					다음 섹션에서는 리소스 부족 처리와 관련된 알려진 이슈에 대해 다룬다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### kubelet이 메모리 압박을 즉시 감지하지 못할 수 있음
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					기본적으로 kubelet은 `cAdvisor`를 폴링하여 
 | 
				
			||||||
 | 
					일정한 간격으로 메모리 사용량 통계를 수집한다. 
 | 
				
			||||||
 | 
					해당 타임 윈도우 내에서 메모리 사용량이 빠르게 증가하면 kubelet이 
 | 
				
			||||||
 | 
					`MemoryPressure`를 충분히 빠르게 감지하지 못해 `OOMKiller`가 계속 호출될 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`--kernel-memcg-notification` 플래그를 사용하여 
 | 
				
			||||||
 | 
					kubelet의 `memcg` 알림 API가 임계값을 초과할 때 즉시 알림을 받도록 
 | 
				
			||||||
 | 
					할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					사용률(utilization)을 극단적으로 높이려는 것이 아니라 오버커밋(overcommit)에 대한 합리적인 조치만 원하는 경우, 
 | 
				
			||||||
 | 
					이 문제에 대한 현실적인 해결 방법은 `--kube-reserved` 및 
 | 
				
			||||||
 | 
					`--system-reserved` 플래그를 사용하여 시스템에 메모리를 할당하는 것이다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### `active_file` 메모리가 사용 가능한 메모리로 간주되지 않음
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					리눅스에서, 커널은 활성 LRU 목록의 파일 지원 메모리 바이트 수를 `active_file` 
 | 
				
			||||||
 | 
					통계로 추적한다. kubelet은 `active_file` 메모리 영역을 회수할 수 없는 것으로 
 | 
				
			||||||
 | 
					취급한다. 임시 로컬 스토리지를 포함하여 블록 지원 로컬 스토리지를 집중적으로 
 | 
				
			||||||
 | 
					사용하는 워크로드의 경우 파일 및 블록 데이터의 커널 수준 캐시는 최근에 액세스한 
 | 
				
			||||||
 | 
					많은 캐시 페이지가 `active_file`로 계산될 가능성이 있음을 의미한다. 활성 LRU 
 | 
				
			||||||
 | 
					목록에 이러한 커널 블록 버퍼가 충분히 많으면, kubelet은 이를 높은 자원 사용 
 | 
				
			||||||
 | 
					상태로 간주하고 노드가 메모리 압박을 겪고 있다고 테인트를 표시할 수 있으며, 이는 
 | 
				
			||||||
 | 
					파드 축출을 유발한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					더 자세한 사항은 [https://github.com/kubernetes/kubernetes/issues/43916](https://github.com/kubernetes/kubernetes/issues/43916)를 참고한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					집중적인 I/O 작업을 수행할 가능성이 있는 컨테이너에 대해 메모리 제한량 및 메모리 
 | 
				
			||||||
 | 
					요청량을 동일하게 설정하여 이 문제를 해결할 수 있다. 해당 컨테이너에 대한 최적의 
 | 
				
			||||||
 | 
					메모리 제한량을 추정하거나 측정해야 한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## {{% heading "whatsnext" %}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* [API를 이용한 축출](/ko/docs/concepts/scheduling-eviction/api-eviction/)에 대해 알아본다.
 | 
				
			||||||
 | 
					* [파드 우선순위와 선점](/ko/docs/concepts/scheduling-eviction/pod-priority-preemption/)에 대해 알아본다.
 | 
				
			||||||
 | 
					* [PodDisruptionBudgets](/docs/tasks/run-application/configure-pdb/)에 대해 알아본다.
 | 
				
			||||||
 | 
					* [서비스 품질](/ko/docs/tasks/configure-pod-container/quality-service-pod/)(QoS)에 대해 알아본다.
 | 
				
			||||||
 | 
					* [축출 API](/docs/reference/generated/kubernetes-api/{{<param "version">}}/#create-eviction-pod-v1-core)를 확인한다.
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,9 @@
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
title: 스토리지 클래스
 | 
					title: 스토리지 클래스
 | 
				
			||||||
content_type: concept
 | 
					content_type: concept
 | 
				
			||||||
weight: 30
 | 
					weight: 30
 | 
				
			||||||
| 
						 | 
					@ -184,7 +189,7 @@ CSI | 1.14 (alpha), 1.16 (beta)
 | 
				
			||||||
CSI 드라이버에 대한 문서를 본다.
 | 
					CSI 드라이버에 대한 문서를 본다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< note >}}
 | 
					{{< note >}}
 | 
				
			||||||
   `waitForFirstConsumer`를 사용한다면, 노드 어피니티를 지정하기 위해서 파드 스펙에 `nodeName`을 사용하지는 않아야 한다.
 | 
					   `WaitForFirstConsumer`를 사용한다면, 노드 어피니티를 지정하기 위해서 파드 스펙에 `nodeName`을 사용하지는 않아야 한다.
 | 
				
			||||||
   만약 `nodeName`을 사용한다면, 스케줄러가 바이패스되고 PVC가 `pending` 상태로 있을 것이다.
 | 
					   만약 `nodeName`을 사용한다면, 스케줄러가 바이패스되고 PVC가 `pending` 상태로 있을 것이다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   대신, 아래와 같이 호스트네임을 이용하는 노드셀렉터를 사용할 수 있다.
 | 
					   대신, 아래와 같이 호스트네임을 이용하는 노드셀렉터를 사용할 수 있다.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -304,13 +304,23 @@ kubelet은 실행 중인 컨테이너들에 대해서 선택적으로 세 가지
 | 
				
			||||||
보일 수도 있지만, 스팩에 준비성 프로브가 존재한다는 것은 파드가
 | 
					보일 수도 있지만, 스팩에 준비성 프로브가 존재한다는 것은 파드가
 | 
				
			||||||
트래픽을 받지 않는 상태에서 시작되고 프로브가 성공하기 시작한 이후에만
 | 
					트래픽을 받지 않는 상태에서 시작되고 프로브가 성공하기 시작한 이후에만
 | 
				
			||||||
트래픽을 받는다는 뜻이다.
 | 
					트래픽을 받는다는 뜻이다.
 | 
				
			||||||
만약 컨테이너가 대량의 데이터, 설정 파일들,
 | 
					 | 
				
			||||||
또는 시동 중 마그레이션을 처리해야 한다면, 준비성 프로브를 지정하길 바란다.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
만약 당신의 컨테이너가 유지 관리를 위해서 자체 중단되게 하려면,
 | 
					만약 컨테이너가 유지 관리를 위해서 자체 중단되게 하려면,
 | 
				
			||||||
준비성 프로브를 지정하길 바란다.
 | 
					준비성 프로브를 지정하길 바란다.
 | 
				
			||||||
준비성 프로브는 활성 프로브와는 다르게 준비성에 특정된 엔드포인트를 확인한다.
 | 
					준비성 프로브는 활성 프로브와는 다르게 준비성에 특정된 엔드포인트를 확인한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					만약 애플리케이션이 백엔드 서비스에 엄격한 의존성이 있다면,
 | 
				
			||||||
 | 
					활성 프로브와 준비성 프로브 모두 활용할 수도 있다. 활성 프로브는 애플리케이션 스스로가 건강한 상태면
 | 
				
			||||||
 | 
					통과하지만, 준비성 프로브는 추가적으로 요구되는 각 백-엔드 서비스가 가용한지 확인한다. 이를 이용하여,
 | 
				
			||||||
 | 
					오류 메시지만 응답하는 파드로
 | 
				
			||||||
 | 
					트래픽이 가는 것을 막을 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					만약 컨테이너가 시동 시 대량 데이터의 로딩, 구성 파일, 또는
 | 
				
			||||||
 | 
					마이그레이션에 대한 작업을
 | 
				
			||||||
 | 
					수행해야 한다면, [스타트업 프로브](#언제-스타트업-프로브를-사용해야-하는가)를 사용하면 된다. 그러나, 만약
 | 
				
			||||||
 | 
					failed 애플리케이션과 시동 중에 아직 데이터를 처리하고 있는 애플리케이션을 구분하여 탐지하고
 | 
				
			||||||
 | 
					싶다면, 준비성 프로브를 사용하는 것이 더 적합할 것이다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< note >}}
 | 
					{{< note >}}
 | 
				
			||||||
파드가 삭제될 때 요청들을 흘려 보내기(drain) 위해
 | 
					파드가 삭제될 때 요청들을 흘려 보내기(drain) 위해
 | 
				
			||||||
준비성 프로브가 꼭 필요한 것은 아니다. 삭제 시에, 파드는
 | 
					준비성 프로브가 꼭 필요한 것은 아니다. 삭제 시에, 파드는
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,6 +9,7 @@ content_type: concept
 | 
				
			||||||
no_list: true
 | 
					no_list: true
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!-- overview -->
 | 
					<!-- overview -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
쿠버네티스 문서의 본 섹션에서는 레퍼런스를 다룬다.
 | 
					쿠버네티스 문서의 본 섹션에서는 레퍼런스를 다룬다.
 | 
				
			||||||
| 
						 | 
					@ -63,7 +64,7 @@ TCP/UDP 스트림 포워딩이나 백-엔드 집합에 걸쳐서 라운드-로
 | 
				
			||||||
  * [kube-scheduler 정책](/ko/docs/reference/scheduling/policies)
 | 
					  * [kube-scheduler 정책](/ko/docs/reference/scheduling/policies)
 | 
				
			||||||
  * [kube-scheduler 프로파일](/ko/docs/reference/scheduling/config/#여러-프로파일)
 | 
					  * [kube-scheduler 프로파일](/ko/docs/reference/scheduling/config/#여러-프로파일)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 환경설정 API
 | 
					## API 설정
 | 
				
			||||||
 | 
					
 | 
				
			||||||
이 섹션은 쿠버네티스 구성요소 또는 도구를 환경설정하는 데에 사용되는
 | 
					이 섹션은 쿠버네티스 구성요소 또는 도구를 환경설정하는 데에 사용되는
 | 
				
			||||||
"미발표된" API를 다룬다. 이 API들은 사용자나 관리자가 클러스터를
 | 
					"미발표된" API를 다룬다. 이 API들은 사용자나 관리자가 클러스터를
 | 
				
			||||||
| 
						 | 
					@ -78,6 +79,10 @@ TCP/UDP 스트림 포워딩이나 백-엔드 집합에 걸쳐서 라운드-로
 | 
				
			||||||
* [클라이언트 인증 API (v1beta1)](/docs/reference/config-api/client-authentication.v1beta1/)
 | 
					* [클라이언트 인증 API (v1beta1)](/docs/reference/config-api/client-authentication.v1beta1/)
 | 
				
			||||||
* [WebhookAdmission 환경설정 (v1)](/docs/reference/config-api/apiserver-webhookadmission.v1/)
 | 
					* [WebhookAdmission 환경설정 (v1)](/docs/reference/config-api/apiserver-webhookadmission.v1/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## kubeadm을 위한 API 설정
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* [v1beta2](/docs/reference/config-api/kubeadm-config.v1beta2/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 설계 문서
 | 
					## 설계 문서
 | 
				
			||||||
 | 
					
 | 
				
			||||||
쿠버네티스 기능에 대한 설계 문서의 아카이브.
 | 
					쿠버네티스 기능에 대한 설계 문서의 아카이브.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,6 +61,7 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능 
 | 
				
			||||||
| `BalanceAttachedNodeVolumes` | `false` | 알파 | 1.11 | |
 | 
					| `BalanceAttachedNodeVolumes` | `false` | 알파 | 1.11 | |
 | 
				
			||||||
| `BoundServiceAccountTokenVolume` | `false` | 알파 | 1.13 | 1.20 |
 | 
					| `BoundServiceAccountTokenVolume` | `false` | 알파 | 1.13 | 1.20 |
 | 
				
			||||||
| `BoundServiceAccountTokenVolume` | `true` | 베타 | 1.21 | |
 | 
					| `BoundServiceAccountTokenVolume` | `true` | 베타 | 1.21 | |
 | 
				
			||||||
 | 
					| `ControllerManagerLeaderMigration` | `false` | 알파 | 1.21 | |
 | 
				
			||||||
| `CPUManager` | `false` | 알파 | 1.8 | 1.9 |
 | 
					| `CPUManager` | `false` | 알파 | 1.8 | 1.9 |
 | 
				
			||||||
| `CPUManager` | `true` | 베타 | 1.10 | |
 | 
					| `CPUManager` | `true` | 베타 | 1.10 | |
 | 
				
			||||||
| `CSIInlineVolume` | `false` | 알파 | 1.15 | 1.15 |
 | 
					| `CSIInlineVolume` | `false` | 알파 | 1.15 | 1.15 |
 | 
				
			||||||
| 
						 | 
					@ -379,7 +380,6 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능 
 | 
				
			||||||
| `TokenRequestProjection` | `false` | 알파 | 1.11 | 1.11 |
 | 
					| `TokenRequestProjection` | `false` | 알파 | 1.11 | 1.11 |
 | 
				
			||||||
| `TokenRequestProjection` | `true` | 베타 | 1.12 | 1.19 |
 | 
					| `TokenRequestProjection` | `true` | 베타 | 1.12 | 1.19 |
 | 
				
			||||||
| `TokenRequestProjection` | `true` | GA | 1.20 | - |
 | 
					| `TokenRequestProjection` | `true` | GA | 1.20 | - |
 | 
				
			||||||
| `VolumeCapacityPriority` | `false` | 알파 | 1.21 | - |
 | 
					 | 
				
			||||||
| `VolumePVCDataSource` | `false` | 알파 | 1.15 | 1.15 |
 | 
					| `VolumePVCDataSource` | `false` | 알파 | 1.15 | 1.15 |
 | 
				
			||||||
| `VolumePVCDataSource` | `true` | 베타 | 1.16 | 1.17 |
 | 
					| `VolumePVCDataSource` | `true` | 베타 | 1.16 | 1.17 |
 | 
				
			||||||
| `VolumePVCDataSource` | `true` | GA | 1.18 | - |
 | 
					| `VolumePVCDataSource` | `true` | GA | 1.18 | - |
 | 
				
			||||||
| 
						 | 
					@ -479,6 +479,11 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능 
 | 
				
			||||||
  `kube-apiserver`를 시작하여 확장 토큰 기능을 끈다.
 | 
					  `kube-apiserver`를 시작하여 확장 토큰 기능을 끈다.
 | 
				
			||||||
  자세한 내용은 [바운드 서비스 계정 토큰](https://github.com/kubernetes/enhancements/blob/master/keps/sig-auth/1205-bound-service-account-tokens/README.md)을
 | 
					  자세한 내용은 [바운드 서비스 계정 토큰](https://github.com/kubernetes/enhancements/blob/master/keps/sig-auth/1205-bound-service-account-tokens/README.md)을
 | 
				
			||||||
  확인한다.
 | 
					  확인한다.
 | 
				
			||||||
 | 
					- `ControllerManagerLeaderMigration`: HA 클러스터에서 클러스터 오퍼레이터가
 | 
				
			||||||
 | 
					  kube-controller-manager의 컨트롤러들을 외부 controller-manager(예를 들면,
 | 
				
			||||||
 | 
					  cloud-controller-manager)로 다운타임 없이 라이브 마이그레이션할 수 있도록 허용하도록
 | 
				
			||||||
 | 
					  [kube-controller-manager](/docs/tasks/administer-cluster/controller-manager-leader-migration/#initial-leader-migration-configuration)와 [cloud-controller-manager](/docs/tasks/administer-cluster/controller-manager-leader-migration/#deploy-cloud-controller-manager)의
 | 
				
			||||||
 | 
					  리더 마이그레이션(Leader Migration)을 활성화한다.
 | 
				
			||||||
- `CPUManager`: 컨테이너 수준의 CPU 어피니티 지원을 활성화한다.
 | 
					- `CPUManager`: 컨테이너 수준의 CPU 어피니티 지원을 활성화한다.
 | 
				
			||||||
  [CPU 관리 정책](/docs/tasks/administer-cluster/cpu-management-policies/)을 참고한다.
 | 
					  [CPU 관리 정책](/docs/tasks/administer-cluster/cpu-management-policies/)을 참고한다.
 | 
				
			||||||
- `CRIContainerLogRotation`: cri 컨테이너 런타임에 컨테이너 로그 로테이션을 활성화한다. 로그 파일 사이즈 기본값은 10MB이며,
 | 
					- `CRIContainerLogRotation`: cri 컨테이너 런타임에 컨테이너 로그 로테이션을 활성화한다. 로그 파일 사이즈 기본값은 10MB이며,
 | 
				
			||||||
| 
						 | 
					@ -637,7 +642,7 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능 
 | 
				
			||||||
- `ExperimentalCriticalPodAnnotation`: 특정 파드에 *critical* 로
 | 
					- `ExperimentalCriticalPodAnnotation`: 특정 파드에 *critical* 로
 | 
				
			||||||
  어노테이션을 달아서 [스케줄링이 보장되도록](/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/) 한다.
 | 
					  어노테이션을 달아서 [스케줄링이 보장되도록](/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/) 한다.
 | 
				
			||||||
  이 기능은 v1.13부터 파드 우선 순위 및 선점으로 인해 사용 중단되었다.
 | 
					  이 기능은 v1.13부터 파드 우선 순위 및 선점으로 인해 사용 중단되었다.
 | 
				
			||||||
- `ExperimentalHostUserNamespaceDefaultingGate`: 사용자 네임스페이스를 호스트로
 | 
					- `ExperimentalHostUserNamespaceDefaulting`: 사용자 네임스페이스를 호스트로
 | 
				
			||||||
  기본 활성화한다. 이것은 다른 호스트 네임스페이스, 호스트 마운트,
 | 
					  기본 활성화한다. 이것은 다른 호스트 네임스페이스, 호스트 마운트,
 | 
				
			||||||
  권한이 있는 컨테이너 또는 특정 비-네임스페이스(non-namespaced) 기능(예: `MKNODE`, `SYS_MODULE` 등)을
 | 
					  권한이 있는 컨테이너 또는 특정 비-네임스페이스(non-namespaced) 기능(예: `MKNODE`, `SYS_MODULE` 등)을
 | 
				
			||||||
  사용하는 컨테이너를 위한 것이다. 도커 데몬에서 사용자 네임스페이스
 | 
					  사용하는 컨테이너를 위한 것이다. 도커 데몬에서 사용자 네임스페이스
 | 
				
			||||||
| 
						 | 
					@ -764,6 +769,8 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능 
 | 
				
			||||||
- `RotateKubeletClientCertificate`: kubelet에서 클라이언트 TLS 인증서의 로테이션을 활성화한다.
 | 
					- `RotateKubeletClientCertificate`: kubelet에서 클라이언트 TLS 인증서의 로테이션을 활성화한다.
 | 
				
			||||||
  자세한 내용은 [kubelet 구성](/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/#kubelet-configuration)을 참고한다.
 | 
					  자세한 내용은 [kubelet 구성](/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/#kubelet-configuration)을 참고한다.
 | 
				
			||||||
- `RotateKubeletServerCertificate`: kubelet에서 서버 TLS 인증서의 로테이션을 활성화한다.
 | 
					- `RotateKubeletServerCertificate`: kubelet에서 서버 TLS 인증서의 로테이션을 활성화한다.
 | 
				
			||||||
 | 
					  자세한 사항은
 | 
				
			||||||
 | 
					  [kubelet 구성](/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/#kubelet-configuration)을 확인한다.
 | 
				
			||||||
- `RunAsGroup`: 컨테이너의 init 프로세스에 설정된 기본 그룹 ID 제어를
 | 
					- `RunAsGroup`: 컨테이너의 init 프로세스에 설정된 기본 그룹 ID 제어를
 | 
				
			||||||
  활성화한다.
 | 
					  활성화한다.
 | 
				
			||||||
- `RuntimeClass`: 컨테이너 런타임 구성을 선택하기 위해 [런타임클래스(RuntimeClass)](/ko/docs/concepts/containers/runtime-class/)
 | 
					- `RuntimeClass`: 컨테이너 런타임 구성을 선택하기 위해 [런타임클래스(RuntimeClass)](/ko/docs/concepts/containers/runtime-class/)
 | 
				
			||||||
| 
						 | 
					@ -794,6 +801,8 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능 
 | 
				
			||||||
- `SetHostnameAsFQDN`: 전체 주소 도메인 이름(FQDN)을 파드의 호스트 이름으로
 | 
					- `SetHostnameAsFQDN`: 전체 주소 도메인 이름(FQDN)을 파드의 호스트 이름으로
 | 
				
			||||||
  설정하는 기능을 활성화한다.
 | 
					  설정하는 기능을 활성화한다.
 | 
				
			||||||
  [파드의 `setHostnameAsFQDN` 필드](/ko/docs/concepts/services-networking/dns-pod-service/#pod-sethostnameasfqdn-field)를 참고한다.
 | 
					  [파드의 `setHostnameAsFQDN` 필드](/ko/docs/concepts/services-networking/dns-pod-service/#pod-sethostnameasfqdn-field)를 참고한다.
 | 
				
			||||||
 | 
					- `SizeMemoryBackedVolumes`: memory-backed 볼륨(보통 `emptyDir` 볼륨)의 크기 상한을
 | 
				
			||||||
 | 
					  지정할 수 있도록 kubelets를 활성화한다.
 | 
				
			||||||
- `StartupProbe`: kubelet에서
 | 
					- `StartupProbe`: kubelet에서
 | 
				
			||||||
  [스타트업](/ko/docs/concepts/workloads/pods/pod-lifecycle/#언제-스타트업-프로브를-사용해야-하는가)
 | 
					  [스타트업](/ko/docs/concepts/workloads/pods/pod-lifecycle/#언제-스타트업-프로브를-사용해야-하는가)
 | 
				
			||||||
  프로브를 활성화한다.
 | 
					  프로브를 활성화한다.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,15 +4,15 @@ id: kube-controller-manager
 | 
				
			||||||
date: 2018-04-12
 | 
					date: 2018-04-12
 | 
				
			||||||
full_link: /docs/reference/command-line-tools-reference/kube-controller-manager/
 | 
					full_link: /docs/reference/command-line-tools-reference/kube-controller-manager/
 | 
				
			||||||
short_description: >
 | 
					short_description: >
 | 
				
			||||||
  {{< glossary_tooltip text="컨트롤러" term_id="controller" >}} 프로세스를 실행하는 컨트롤 플레인 컴포넌트.
 | 
					  컨트롤러 프로세스를 실행하는 컨트롤 플레인 컴포넌트.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
aka:
 | 
					aka:
 | 
				
			||||||
tags:
 | 
					tags:
 | 
				
			||||||
- architecture
 | 
					- architecture
 | 
				
			||||||
- fundamental
 | 
					- fundamental
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 {{< glossary_tooltip text="컨트롤러" term_id="controller" >}}를 구동하는 마스터 상의 컴포넌트.
 | 
					 {{< glossary_tooltip text="컨트롤러" term_id="controller" >}} 프로세스를 실행하는 컨트롤 플레인 컴포넌트.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!--more-->
 | 
					<!--more-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
논리적으로, 각 {{< glossary_tooltip text="컨트롤러" term_id="controller" >}}는 개별 프로세스이지만, 복잡성을 낮추기 위해 모두 단일 바이너리로 컴파일되고 단일 프로세스 내에서 실행된다.
 | 
					논리적으로, 각 {{< glossary_tooltip text="컨트롤러" term_id="controller" >}}는 분리된 프로세스이지만, 복잡성을 낮추기 위해 모두 단일 바이너리로 컴파일되고 단일 프로세스 내에서 실행된다.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,24 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					title: 노드-압박 축출
 | 
				
			||||||
 | 
					id: node-pressure-eviction
 | 
				
			||||||
 | 
					date: 2021-05-13
 | 
				
			||||||
 | 
					full_link: /ko/docs/concepts/scheduling-eviction/node-pressure-eviction/
 | 
				
			||||||
 | 
					short_description: >
 | 
				
			||||||
 | 
					  노드-압박 축출은 kubelet이 노드의 자원을 회수하기 위해 
 | 
				
			||||||
 | 
					  파드를 능동적으로 중단시키는 절차이다.
 | 
				
			||||||
 | 
					aka:
 | 
				
			||||||
 | 
					- kubelet eviction
 | 
				
			||||||
 | 
					tags:
 | 
				
			||||||
 | 
					- operation
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					노드-압박 축출은 {{<glossary_tooltip term_id="kubelet" text="kubelet">}}이 노드의 자원을 회수하기 위해 
 | 
				
			||||||
 | 
					파드를 능동적으로 중단시키는 절차이다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!--more-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					kubelet은 클러스터 노드의 CPU, 메모리, 디스크 공간, 파일시스템 
 | 
				
			||||||
 | 
					inode와 같은 자원을 모니터링한다. 이러한 자원 중 하나 이상이 
 | 
				
			||||||
 | 
					특정 소모 수준에 도달하면, kubelet은 하나 이상의 파드를 능동적으로 중단시켜 
 | 
				
			||||||
 | 
					자원을 회수하고 고갈 상황을 방지할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					노드-압박 축출은 [API를 이용한 축출](/ko/docs/concepts/scheduling-eviction/api-eviction/)과는 차이가 있다.
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,10 @@
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
title: 도구
 | 
					title: 도구
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
content_type: concept
 | 
					content_type: concept
 | 
				
			||||||
 | 
					weight: 80
 | 
				
			||||||
 | 
					no_list: true
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!-- overview -->
 | 
					<!-- overview -->
 | 
				
			||||||
| 
						 | 
					@ -10,13 +12,6 @@ content_type: concept
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!-- body -->
 | 
					<!-- body -->
 | 
				
			||||||
## Kubectl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[`kubectl`](/ko/docs/tasks/tools/#kubectl)은 쿠버네티스를 위한 커맨드라인 툴이며, 쿠버네티스 클러스터 매니저을 제어한다.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Kubeadm
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
[`kubeadm`](/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/)은 물리적 환경, 클라우드 서버, 또는 가상머신 상에서 안전한 쿠버네티스를 쉽게 프로비저닝하기 위한 커맨드라인 툴이다(현재는 알파 상태).
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Minikube
 | 
					## Minikube
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,8 +26,8 @@ content_type: concept
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Helm
 | 
					## Helm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[`쿠버네티스 Helm`](https://github.com/kubernetes/helm)은 사전 구성된 쿠버네티스 리소스를 관리하기위한 도구이며
 | 
					[Helm](https://helm.sh/)은 사전 구성된 쿠버네티스 리소스 패키지를 관리하기 위한 도구이다.
 | 
				
			||||||
또한 Helm의 쿠버네티스 차트라고도 한다.
 | 
					이 패키지는 _Helm charts_ 라고 알려져 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Helm의 용도
 | 
					Helm의 용도
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,7 +23,7 @@ kubeadm의 `ClusterConfiguration` 오브젝트는 API 서버, 컨트롤러매니
 | 
				
			||||||
3.  `kubeadm init`에 `--config <CONFIG YAML 파일>` 파라미터를 추가해서 실행한다.
 | 
					3.  `kubeadm init`에 `--config <CONFIG YAML 파일>` 파라미터를 추가해서 실행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
각 필드의 구성에서 자세한 정보를 보려면,
 | 
					각 필드의 구성에서 자세한 정보를 보려면,
 | 
				
			||||||
[API 참고 문서](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2#ClusterConfiguration)에서 확인해 볼 수 있다.
 | 
					[API 참고 문서](/docs/reference/config-api/kubeadm-config.v1beta2/)에서 확인해 볼 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< note >}}
 | 
					{{< note >}}
 | 
				
			||||||
`kubeadm config print init-defaults`를 실행하고 원하는 파일에 출력을 저장하여 기본값인 `ClusterConfiguration` 오브젝트를 생성할 수 있다.
 | 
					`kubeadm config print init-defaults`를 실행하고 원하는 파일에 출력을 저장하여 기본값인 `ClusterConfiguration` 오브젝트를 생성할 수 있다.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -102,6 +102,8 @@ weight: 65
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Microsoft는 `mcr.microsoft.com/oss/kubernetes/pause:3.4.1`에서
 | 
					Microsoft는 `mcr.microsoft.com/oss/kubernetes/pause:3.4.1`에서
 | 
				
			||||||
윈도우 퍼즈 인프라 컨테이너를 유지한다.
 | 
					윈도우 퍼즈 인프라 컨테이너를 유지한다.
 | 
				
			||||||
 | 
					이외에도 `k8s.gcr.io/pause:3.5`를 통해 쿠버네티스에서 관리하는 다중 아키텍처 이미지를
 | 
				
			||||||
 | 
					사용할 수도 있는데, 이 이미지는 리눅스와 윈도우를 모두 지원한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### 컴퓨트
 | 
					#### 컴퓨트
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					title: 쿠버네티스 API 활성화 혹은 비활성화하기
 | 
				
			||||||
 | 
					content_type: task
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- overview -->
 | 
				
			||||||
 | 
					이 페이지는 클러스터 {{< glossary_tooltip text="컨트롤 플레인" term_id="control-plane" >}}의
 | 
				
			||||||
 | 
					특정한 API 버전을 활성화하거나 비활성화하는 방법에 대해 설명한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- steps -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					API 서버에 `--runtime-config=api/<version>` 커맨드 라인 인자를 사용함으로서 특정한 API 버전을 
 | 
				
			||||||
 | 
					활성화하거나 비활성화할 수 있다. 이 인자에 대한 값으로는 콤마로 구분된 API 버전의 목록을 사용한다.
 | 
				
			||||||
 | 
					뒤쪽에 위치한 값은 앞쪽의 값보다 우선적으로 사용된다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					이 `runtime-config` 커맨드 라인 인자에는 다음의 두 개의 특수 키를 사용할 수도 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- `api/all`: 사용할 수 있는 모든 API를 선택한다.
 | 
				
			||||||
 | 
					- `api/legacy`: 레거시 API만을 선택한다. 여기서 레거시 API란 명시적으로
 | 
				
			||||||
 | 
					   [사용이 중단된](/docs/reference/using-api/deprecation-policy/) 모든 API를 가리킨다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					예를 들어서, v1을 제외한 모든 API 버전을 비활성화하기 위해서는 `kube-apiserver`에 
 | 
				
			||||||
 | 
					`--runtime-config=api/all=false,api/v1=true` 인자를 사용한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## {{% heading "whatsnext" %}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`kube-apiserver` 컴포넌트에 대한 더 자세한 내용은 다음의 [문서](/docs/reference/command-line-tools-reference/kube-apiserver/)
 | 
				
			||||||
 | 
					를 참고한다.
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,38 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					title: 토폴로지 인지 힌트 활성화하기
 | 
				
			||||||
 | 
					content_type: task
 | 
				
			||||||
 | 
					min-kubernetes-server-version: 1.21
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- overview -->
 | 
				
			||||||
 | 
					{{< feature-state for_k8s_version="v1.21" state="alpha" >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_토폴로지 인지 힌트_ 는 {{< glossary_tooltip text="엔드포인트슬라이스(EndpointSlices)" term_id="endpoint-slice" >}}에 포함되어 있는 
 | 
				
			||||||
 | 
					토폴로지 정보를 이용해 토폴로지 인지 라우팅을 가능하게 한다.
 | 
				
			||||||
 | 
					이 방법은 트래픽을 해당 트래픽이 시작된 곳과 최대한 근접하도록 라우팅하는데,
 | 
				
			||||||
 | 
					이를 통해 비용을 줄이거나 네트워크 성능을 향상시킬 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## {{% heading "prerequisites" %}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					토폴로지 인지 힌트를 활성화하기 위해서는 다음의 필수 구성 요소가 필요하다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* {{< glossary_tooltip text="kube-proxy" term_id="kube-proxy" >}}가 
 | 
				
			||||||
 | 
					  iptables 모드 혹은 IPVS 모드로 동작하도록 설정
 | 
				
			||||||
 | 
					* 엔드포인트슬라이스가 비활성화되지 않았는지 확인
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 토폴로지 인지 힌트 활성화하기
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					서비스 토폴로지 힌트를 활성화하기 위해서는 kube-apiserver, kube-controller-manager, kube-proxy에 대해
 | 
				
			||||||
 | 
					`TopologyAwareHints` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를
 | 
				
			||||||
 | 
					활성화한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					--feature-gates="TopologyAwareHints=true"
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## {{% heading "whatsnext" %}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* 서비스 항목 아래의 [토폴로지 인지 힌트](/docs/concepts/services-networking/topology-aware-hints)를 참고
 | 
				
			||||||
 | 
					* [서비스와 애플리케이션 연결하기](/ko/docs/concepts/services-networking/connect-applications-service/)를 참고
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					title: 중요한 애드온 파드 스케줄링 보장하기
 | 
				
			||||||
 | 
					content_type: concept
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- overview -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					API 서버, 스케줄러 및 컨트롤러 매니저와 같은 쿠버네티스 주요 컴포넌트들은 컨트롤 플레인 노드에서 동작한다. 반면, 애드온들은 일반 클러스터 노드에서 동작한다.
 | 
				
			||||||
 | 
					이러한 애드온들 중 일부(예: 메트릭 서버, DNS, UI)는 클러스터 전부가 정상적으로 동작하는 데 필수적일 수 있다.
 | 
				
			||||||
 | 
					만약, 필수 애드온이 축출되고(수동 축출, 혹은 업그레이드와 같은 동작으로 인한 의도하지 않은 축출)
 | 
				
			||||||
 | 
					pending 상태가 된다면, 클러스터가 더 이상 제대로 동작하지 않을 수 있다. (사용률이 매우 높은 클러스터에서 해당 애드온이
 | 
				
			||||||
 | 
					축출되자마자 다른 대기중인 파드가 스케줄링되거나 다른 이유로 노드에서 사용할 수 있는 자원량이 줄어들어 pending 상태가 발생할 수 있다)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					유의할 점은, 파드를 중요(critical)로 표시하는 것은 축출을 완전히 방지하기 위함이 아니다. 이것은 단지 파드가 영구적으로 사용할 수 없게 되는 것만을 방지하기 위함이다.
 | 
				
			||||||
 | 
					중요로 표시한 스태틱(static) 파드는 축출될 수 없다. 반면, 중요로 표시한 일반적인(non-static) 파드의 경우 항상 다시 스케줄링된다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- body -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 파드를 중요(critical)로 표시하기
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					파드를 중요로 표시하기 위해서는, 해당 파드에 대해 priorityClassName을 `system-cluster-critical`이나 `system-node-critical`로 설정한다. `system-node-critical`은 가장 높은 우선 순위를 가지며, 심지어 `system-cluster-critical`보다도 우선 순위가 높다.
 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,7 @@ content_type: task
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< feature-state for_k8s_version="v1.5" state="alpha" >}}
 | 
					{{< feature-state for_k8s_version="v1.5" state="alpha" >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
구글 컴퓨트 엔진(Google Compute Engine, 이하 GCE)의 `kube-up`이나 `kube-down` 스크립트에 쿠버네티스 컨트롤 플레인 노드를 복제할 수 있다.
 | 
					구글 컴퓨트 엔진(Google Compute Engine, 이하 GCE)의 `kube-up`이나 `kube-down` 스크립트에 쿠버네티스 컨트롤 플레인 노드를 복제할 수 있다. 하지만 이러한 스크립트들은 프로덕션 용도로 사용하기에 적합하지 않으며, 프로젝트의 CI에서만 주로 사용된다.
 | 
				
			||||||
이 문서는 kube-up/down 스크립트를 사용하여 고가용(HA) 컨트롤 플레인을 관리하는 방법과 GCE와 함께 사용하기 위해 HA 컨트롤 플레인을 구현하는 방법에 관해 설명한다.
 | 
					이 문서는 kube-up/down 스크립트를 사용하여 고가용(HA) 컨트롤 플레인을 관리하는 방법과 GCE와 함께 사용하기 위해 HA 컨트롤 플레인을 구현하는 방법에 관해 설명한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -161,7 +161,7 @@ HA 클러스터를 실행 중인 경우, 모든 컨트롤 플레인 노드에서
 | 
				
			||||||
 | 
					
 | 
				
			||||||
빌트인 서명자를 활성화하려면, `--cluster-signing-cert-file` 와 `--cluster-signing-key-file` 플래그를 전달해야 한다.
 | 
					빌트인 서명자를 활성화하려면, `--cluster-signing-cert-file` 와 `--cluster-signing-key-file` 플래그를 전달해야 한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
새 클러스터를 생성하는 경우, kubeadm [구성 파일](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2)을 사용할 수 있다.
 | 
					새 클러스터를 생성하는 경우, kubeadm [구성 파일](/docs/reference/config-api/kubeadm-config.v1beta2/)을 사용할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```yaml
 | 
					```yaml
 | 
				
			||||||
apiVersion: kubeadm.k8s.io/v1beta2
 | 
					apiVersion: kubeadm.k8s.io/v1beta2
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,7 +38,7 @@ weight: 20
 | 
				
			||||||
### 추가 정보
 | 
					### 추가 정보
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- kubelet 마이너 버전을 업그레이드하기 전에 [노드 드레이닝(draining)](/docs/tasks/administer-cluster/safely-drain-node/)이
 | 
					- kubelet 마이너 버전을 업그레이드하기 전에 [노드 드레이닝(draining)](/docs/tasks/administer-cluster/safely-drain-node/)이
 | 
				
			||||||
  필요하다. 컨트롤 플레인 노드의 경우 CoreNDS 파드 또는 기타 중요한 워크로드를 실행할 수 있다.
 | 
					  필요하다. 컨트롤 플레인 노드의 경우 CoreDNS 파드 또는 기타 중요한 워크로드를 실행할 수 있다.
 | 
				
			||||||
- 컨테이너 사양 해시 값이 변경되므로, 업그레이드 후 모든 컨테이너가 다시 시작된다.
 | 
					- 컨테이너 사양 해시 값이 변경되므로, 업그레이드 후 모든 컨테이너가 다시 시작된다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!-- steps -->
 | 
					<!-- steps -->
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					title: "시크릿(Secret) 관리"
 | 
				
			||||||
 | 
					weight: 28
 | 
				
			||||||
 | 
					description: 시크릿을 사용하여 기밀 설정 데이터 관리.
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,198 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					title: 환경 설정 파일을 사용하여 시크릿을 관리
 | 
				
			||||||
 | 
					content_type: task
 | 
				
			||||||
 | 
					weight: 20
 | 
				
			||||||
 | 
					description: 환경 설정 파일을 사용하여 시크릿 오브젝트를 생성.
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- overview -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## {{% heading "prerequisites" %}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{< include "task-tutorial-prereqs.md" >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- steps -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 환경 설정 파일 생성
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					먼저 새 파일에 JSON 이나 YAML 형식으로 시크릿(Secret)에 대한 상세 사항을 기록하고,
 | 
				
			||||||
 | 
					이 파일을 이용하여 해당 시크릿 오브젝트를 생성할 수 있다. 이
 | 
				
			||||||
 | 
					[시크릿](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#secret-v1-core)
 | 
				
			||||||
 | 
					리소스에는 `data` 와 `stringData` 의 두 가지 맵이 포함되어 있다.
 | 
				
			||||||
 | 
					`data` 필드는 base64로 인코딩된 임의의 데이터를 기입하는 데 사용된다.
 | 
				
			||||||
 | 
					`stringData` 필드는 편의를 위해 제공되며, 이를 사용해 시크릿 데이터를 인코딩되지 않은 문자열로
 | 
				
			||||||
 | 
					기입할 수 있다.
 | 
				
			||||||
 | 
					`data` 및 `stringData`은 영숫자,
 | 
				
			||||||
 | 
					`-`, `_` 그리고 `.`로 구성되어야 한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					예를 들어 시크릿에 `data` 필드를 사용하여 두 개의 문자열을 저장하려면 다음과 같이
 | 
				
			||||||
 | 
					문자열을 base64로 변환한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					echo -n 'admin' | base64
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					출력은 다음과 유사하다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					YWRtaW4=
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					echo -n '1f2d1e2e67df' | base64
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					출력은 다음과 유사하다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					MWYyZDFlMmU2N2Rm
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					다음과 같이 시크릿 구성 파일을 작성한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Secret
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: mysecret
 | 
				
			||||||
 | 
					type: Opaque
 | 
				
			||||||
 | 
					data:
 | 
				
			||||||
 | 
					  username: YWRtaW4=
 | 
				
			||||||
 | 
					  password: MWYyZDFlMmU2N2Rm
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					시크릿 오브젝트의 이름은 유효한
 | 
				
			||||||
 | 
					[DNS 서브도메인 이름](/ko/docs/concepts/overview/working-with-objects/names/#dns-서브도메인-이름)이어야 한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{< note >}}
 | 
				
			||||||
 | 
					시크릿 데이터의 직렬화된(serialized) JSON 및 YAML 값은 base64 문자열로 인코딩된다.
 | 
				
			||||||
 | 
					이러한 문자열에는 개행(newline)을 사용할 수 없으므로 생략해야 한다.
 | 
				
			||||||
 | 
					Darwin/macOS에서 `base64` 도구를 사용할 경우, 사용자는 긴 줄을 분할하는 `-b` 옵션을 사용해서는 안 된다.
 | 
				
			||||||
 | 
					반대로, 리눅스 사용자는 `-w` 옵션을 사용할 수 없는 경우 
 | 
				
			||||||
 | 
					`base64` 명령어 또는 `base64 | tr -d '\n'` 파이프라인에 
 | 
				
			||||||
 | 
					`-w 0` 옵션을 *추가해야 한다*.
 | 
				
			||||||
 | 
					{{< /note >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					특정 시나리오의 경우 `stringData` 필드를 대신 사용할 수 있다. 이
 | 
				
			||||||
 | 
					필드를 사용하면 base64로 인코딩되지 않은 문자열을 시크릿에 직접 넣을 수 있으며,
 | 
				
			||||||
 | 
					시크릿이 생성되거나 업데이트될 때 문자열이 인코딩된다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					이에 대한 실제적인 예로,
 | 
				
			||||||
 | 
					시크릿을 사용하여 구성 파일을 저장하는 애플리케이션을 배포하면서,
 | 
				
			||||||
 | 
					배포 프로세스 중에 해당 구성 파일의 일부를 채우려는 경우를 들 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					예를 들어 애플리케이션에서 다음 구성 파일을 사용하는 경우:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					apiUrl: "https://my.api.com/api/v1"
 | 
				
			||||||
 | 
					username: "<user>"
 | 
				
			||||||
 | 
					password: "<password>"
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					다음 정의를 사용하여 이를 시크릿에 저장할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Secret
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: mysecret
 | 
				
			||||||
 | 
					type: Opaque
 | 
				
			||||||
 | 
					stringData:
 | 
				
			||||||
 | 
					  config.yaml: |
 | 
				
			||||||
 | 
					    apiUrl: "https://my.api.com/api/v1"
 | 
				
			||||||
 | 
					    username: <user>
 | 
				
			||||||
 | 
					    password: <password>
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 시크릿 오브젝트 생성
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[`kubectl apply`](/docs/reference/generated/kubectl/kubectl-commands#apply)를 이용하여 시크릿 오브젝트를 생성한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					kubectl apply -f ./secret.yaml
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					출력은 다음과 유사하다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					secret/mysecret created
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 시크릿 확인
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`stringData` 필드는 쓰기 전용 편의 필드이다. 시크릿을 조회할 때 절대 출력되지 않는다.
 | 
				
			||||||
 | 
					예를 들어 다음 명령을 실행하는 경우:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					kubectl get secret mysecret -o yaml
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					출력은 다음과 유사하다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					data:
 | 
				
			||||||
 | 
					  config.yaml: YXBpVXJsOiAiaHR0cHM6Ly9teS5hcGkuY29tL2FwaS92MSIKdXNlcm5hbWU6IHt7dXNlcm5hbWV9fQpwYXNzd29yZDoge3twYXNzd29yZH19
 | 
				
			||||||
 | 
					kind: Secret
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  creationTimestamp: 2018-11-15T20:40:59Z
 | 
				
			||||||
 | 
					  name: mysecret
 | 
				
			||||||
 | 
					  namespace: default
 | 
				
			||||||
 | 
					  resourceVersion: "7225"
 | 
				
			||||||
 | 
					  uid: c280ad2e-e916-11e8-98f2-025000000001
 | 
				
			||||||
 | 
					type: Opaque
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`kubectl get` 및 `kubectl describe` 명령은 기본적으로 `시크릿`의 내용을 표시하지 않는다.
 | 
				
			||||||
 | 
					이는 `시크릿`이 실수로 구경꾼에게 노출되거나
 | 
				
			||||||
 | 
					터미널 로그에 저장되는 것을 방지하기 위한 것이다.
 | 
				
			||||||
 | 
					인코딩된 데이터의 실제 내용을 확인하려면 다음을 참조한다.
 | 
				
			||||||
 | 
					[시크릿 디코딩](/ko/docs/tasks/configmap-secret/managing-secret-using-kubectl/#decoding-secret).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					하나의 필드(예: `username`)가 `data`와 `stringData`에 모두 명시되면, `stringData`에 명시된 값이 사용된다.
 | 
				
			||||||
 | 
					예를 들어 다음과 같은 시크릿인 경우:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Secret
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: mysecret
 | 
				
			||||||
 | 
					type: Opaque
 | 
				
			||||||
 | 
					data:
 | 
				
			||||||
 | 
					  username: YWRtaW4=
 | 
				
			||||||
 | 
					stringData:
 | 
				
			||||||
 | 
					  username: administrator
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					결과는 다음과 같은 시크릿이다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					data:
 | 
				
			||||||
 | 
					  username: YWRtaW5pc3RyYXRvcg==
 | 
				
			||||||
 | 
					kind: Secret
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  creationTimestamp: 2018-11-15T20:46:46Z
 | 
				
			||||||
 | 
					  name: mysecret
 | 
				
			||||||
 | 
					  namespace: default
 | 
				
			||||||
 | 
					  resourceVersion: "7579"
 | 
				
			||||||
 | 
					  uid: 91460ecb-e917-11e8-98f2-025000000001
 | 
				
			||||||
 | 
					type: Opaque
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					여기서 `YWRtaW5pc3RyYXRvcg==`는 `administrator`으로 디코딩된다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 삭제
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					생성한 시크릿을 삭제하려면 다음 명령을 실행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					kubectl delete secret mysecret
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## {{% heading "whatsnext" %}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- [시크릿 개념](/ko/docs/concepts/configuration/secret/)에 대해 자세히 알아보기
 | 
				
			||||||
 | 
					- [`kubectl` 커맨드를 사용하여 시크릿을 관리](/ko/docs/tasks/configmap-secret/managing-secret-using-kubectl/)하는 방법 알아보기
 | 
				
			||||||
 | 
					- [kustomize를 사용하여 시크릿을 관리](/ko/docs/tasks/configmap-secret/managing-secret-using-kustomize/)하는 방법 알아보기
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,156 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					title: kubectl을 사용한 시크릿 관리
 | 
				
			||||||
 | 
					content_type: task
 | 
				
			||||||
 | 
					weight: 10
 | 
				
			||||||
 | 
					description: kubectl 커맨드를 사용하여 시크릿 오브젝트를 생성.
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- overview -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## {{% heading "prerequisites" %}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{< include "task-tutorial-prereqs.md" >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- steps -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 시크릿 생성
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`시크릿`에는 파드가 데이터베이스에 접근하는 데 필요한 사용자 자격 증명이 포함될 수 있다.
 | 
				
			||||||
 | 
					예를 들어 데이터베이스 연결 문자열은 사용자 이름과 암호로 구성된다.
 | 
				
			||||||
 | 
					사용자 이름은 로컬 컴퓨터의 `./username.txt` 파일에, 비밀번호는
 | 
				
			||||||
 | 
					`./password.txt` 파일에 저장할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					echo -n 'admin' > ./username.txt
 | 
				
			||||||
 | 
					echo -n '1f2d1e2e67df' > ./password.txt
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					이 명령에서 `-n` 플래그는 생성된 파일의
 | 
				
			||||||
 | 
					텍스트 끝에 추가 개행 문자가 포함되지 않도록 해 준다. 이는 `kubectl`이 파일을 읽고
 | 
				
			||||||
 | 
					내용을 base64 문자열로 인코딩할 때 개행 문자도 함께 인코딩될 수 있기 때문에 
 | 
				
			||||||
 | 
					중요하다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`kubectl create secret` 명령은 이러한 파일들을 시크릿으로 패키징하고
 | 
				
			||||||
 | 
					API 서버에 오브젝트를 생성한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					kubectl create secret generic db-user-pass \
 | 
				
			||||||
 | 
					  --from-file=./username.txt \
 | 
				
			||||||
 | 
					  --from-file=./password.txt
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					출력은 다음과 유사하다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					secret/db-user-pass created
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					기본 키 이름은 파일 이름이다. 선택적으로 `--from-file=[key=]source`를 사용하여 키 이름을 설정할 수 있다.
 | 
				
			||||||
 | 
					예제:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					kubectl create secret generic db-user-pass \
 | 
				
			||||||
 | 
					  --from-file=username=./username.txt \
 | 
				
			||||||
 | 
					  --from-file=password=./password.txt
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					파일에 포함하는 암호 문자열에서
 | 
				
			||||||
 | 
					특수 문자를 이스케이프하지 않아도 된다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`--from-literal=<key>=<value>` 태그를 사용하여 시크릿 데이터를 제공할 수도 있다.
 | 
				
			||||||
 | 
					이 태그는 여러 키-값 쌍을 제공하기 위해 두 번 이상 지정할 수 있다.
 | 
				
			||||||
 | 
					`$`, `\`, `*`, `=` 및 `!`와 같은 특수 문자는
 | 
				
			||||||
 | 
					[shell](https://en.wikipedia.org/wiki/Shell_(computing))에 해석하고 처리하기 때문에
 | 
				
			||||||
 | 
					이스케이프할 필요가 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					대부분의 셸에서 암호를 이스케이프하는 가장 쉬운 방법은 암호를 작은따옴표(`'`)로 둘러싸는 것이다.
 | 
				
			||||||
 | 
					예를 들어, 비밀번호가 `S!B\*d$zDsb=`인 경우,
 | 
				
			||||||
 | 
					다음 커맨드를 실행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					kubectl create secret generic dev-db-secret \
 | 
				
			||||||
 | 
					  --from-literal=username=devuser \
 | 
				
			||||||
 | 
					  --from-literal=password='S!B\*d$zDsb='
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 시크릿 확인
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					시크릿이 생성되었는지 확인한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					kubectl get secrets
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					출력은 다음과 유사하다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					NAME                  TYPE                                  DATA      AGE
 | 
				
			||||||
 | 
					db-user-pass          Opaque                                2         51s
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					다음 명령을 실행하여 `시크릿`에 대한 상세 사항을 볼 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					kubectl describe secrets/db-user-pass
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					출력은 다음과 유사하다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					Name:            db-user-pass
 | 
				
			||||||
 | 
					Namespace:       default
 | 
				
			||||||
 | 
					Labels:          <none>
 | 
				
			||||||
 | 
					Annotations:     <none>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Type:            Opaque
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Data
 | 
				
			||||||
 | 
					====
 | 
				
			||||||
 | 
					password:    12 bytes
 | 
				
			||||||
 | 
					username:    5 bytes
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`kubectl get` 및 `kubectl describe` 명령은
 | 
				
			||||||
 | 
					기본적으로 `시크릿`의 내용을 표시하지 않는다. 이는 `시크릿`이 실수로 노출되거나
 | 
				
			||||||
 | 
					터미널 로그에 저장되는 것을 방지하기 위한 것이다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 시크릿 디코딩  {#decoding-secret}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					생성한 시크릿을 보려면 다음 명령을 실행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					kubectl get secret db-user-pass -o jsonpath='{.data}'
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					출력은 다음과 유사하다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{"password":"MWYyZDFlMmU2N2Rm","username":"YWRtaW4="}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					이제 `password` 데이터를 디코딩할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					echo 'MWYyZDFlMmU2N2Rm' | base64 --decode
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					출력은 다음과 유사하다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					1f2d1e2e67df
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 삭제
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					생성한 시크릿을 삭제하려면 다음 명령을 실행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					kubectl delete secret db-user-pass
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- discussion -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## {{% heading "whatsnext" %}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- [시크릿 개념](/ko/docs/concepts/configuration/secret/)에 대해 자세히 알아보기
 | 
				
			||||||
 | 
					- [환경 설정 파일을 사용하여 시크릿을 관리](/ko/docs/tasks/configmap-secret/managing-secret-using-config-file/)하는 방법 알아보기
 | 
				
			||||||
 | 
					- [kustomize를 사용하여 시크릿을 관리](/ko/docs/tasks/configmap-secret/managing-secret-using-kustomize/)하는 방법 알아보기
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,139 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					title: kustomize를 사용하여 시크릿 관리
 | 
				
			||||||
 | 
					content_type: task
 | 
				
			||||||
 | 
					weight: 30
 | 
				
			||||||
 | 
					description: kustomization.yaml 파일을 사용하여 시크릿 오브젝트 생성.
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- overview -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					쿠버네티스 v1.14부터 `kubectl`은 
 | 
				
			||||||
 | 
					[Kustomize를 이용한 쿠버네티스 오브젝트의 선언형 관리](/ko/docs/tasks/manage-kubernetes-objects/kustomization/)를 지원한다.
 | 
				
			||||||
 | 
					Kustomize는 시크릿 및 컨피그맵을 생성하기 위한 리소스 생성기를 제공한다.
 | 
				
			||||||
 | 
					Kustomize 생성기는 디렉토리 내의 `kustomization.yaml` 파일에 지정되어야 한다.
 | 
				
			||||||
 | 
					시크릿 생성 후 `kubectl apply`를 통해 API
 | 
				
			||||||
 | 
					서버에 시크릿을 생성할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## {{% heading "prerequisites" %}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{< include "task-tutorial-prereqs.md" >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- steps -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Kustomization 파일 생성
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`kustomization.yaml` 파일에 다른 기존 파일을 참조하는 
 | 
				
			||||||
 | 
					`secretGenerator`를 정의하여 시크릿을 생성할 수 있다.
 | 
				
			||||||
 | 
					예를 들어 다음 kustomization 파일은
 | 
				
			||||||
 | 
					`./username.txt` 및 `./password.txt` 파일을 참조한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					secretGenerator:
 | 
				
			||||||
 | 
					- name: db-user-pass
 | 
				
			||||||
 | 
					  files:
 | 
				
			||||||
 | 
					  - username.txt
 | 
				
			||||||
 | 
					  - password.txt
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`kustomization.yaml` 파일에 리터럴을 명시하여 `secretGenerator`를
 | 
				
			||||||
 | 
					정의할 수도 있다.
 | 
				
			||||||
 | 
					예를 들어 다음 `kustomization.yaml` 파일에는
 | 
				
			||||||
 | 
					각각 `username`과 `password`에 대한 두 개의 리터럴이 포함되어 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					secretGenerator:
 | 
				
			||||||
 | 
					- name: db-user-pass
 | 
				
			||||||
 | 
					  literals:
 | 
				
			||||||
 | 
					  - username=admin
 | 
				
			||||||
 | 
					  - password=1f2d1e2e67df
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`kustomization.yaml` 파일에 `.env` 파일을 명시하여
 | 
				
			||||||
 | 
					`secretGenerator`를 정의할 수도 있다.
 | 
				
			||||||
 | 
					예를 들어 다음 `kustomization.yaml` 파일은
 | 
				
			||||||
 | 
					`.env.secret` 파일에서 데이터를 가져온다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```yaml
 | 
				
			||||||
 | 
					secretGenerator:
 | 
				
			||||||
 | 
					- name: db-user-pass
 | 
				
			||||||
 | 
					  envs:
 | 
				
			||||||
 | 
					  - .env.secret
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					모든 경우에 대해, 값을 base64로 인코딩하지 않아도 된다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 시크릿 생성
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					다음 명령을 실행하여 시크릿을 생성한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					kubectl apply -k .
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					출력은 다음과 유사하다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					secret/db-user-pass-96mffmfh4k created
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					시크릿이 생성되면 시크릿 데이터를 해싱하고
 | 
				
			||||||
 | 
					이름에 해시 값을 추가하여 시크릿 이름이 생성된다. 이렇게 함으로써
 | 
				
			||||||
 | 
					데이터가 수정될 때마다 시크릿이 새롭게 생성된다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 생성된 시크릿 확인
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					시크릿이 생성된 것을 확인할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					kubectl get secrets
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					출력은 다음과 유사하다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					NAME                             TYPE                                  DATA      AGE
 | 
				
			||||||
 | 
					db-user-pass-96mffmfh4k          Opaque                                2         51s
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					다음 명령을 실행하여 시크릿에 대한 상세 사항을 볼 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					kubectl describe secrets/db-user-pass-96mffmfh4k
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					출력은 다음과 유사하다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					Name:            db-user-pass-96mffmfh4k
 | 
				
			||||||
 | 
					Namespace:       default
 | 
				
			||||||
 | 
					Labels:          <none>
 | 
				
			||||||
 | 
					Annotations:     <none>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Type:            Opaque
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Data
 | 
				
			||||||
 | 
					====
 | 
				
			||||||
 | 
					password.txt:    12 bytes
 | 
				
			||||||
 | 
					username.txt:    5 bytes
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`kubectl get` 및 `kubectl describe` 명령은 기본적으로 `시크릿`의 내용을 표시하지 않는다.
 | 
				
			||||||
 | 
					이는 `시크릿`이 실수로 구경꾼에게 노출되는 것을 방지하기 위한 것으로,
 | 
				
			||||||
 | 
					또는 터미널 로그에 저장되지 않는다.
 | 
				
			||||||
 | 
					인코딩된 데이터의 실제 내용을 확인하려면 다음을 참조한다.
 | 
				
			||||||
 | 
					[시크릿 디코딩](/ko/docs/tasks/configmap-secret/managing-secret-using-kubectl/#decoding-secret).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 삭제
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					생성한 시크릿을 삭제하려면 다음 명령을 실행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					kubectl delete secret db-user-pass-96mffmfh4k
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<!-- Optional section; add links to information related to this topic. -->
 | 
				
			||||||
 | 
					## {{% heading "whatsnext" %}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- [시크릿 개념](/ko/docs/concepts/configuration/secret/)에 대해 자세히 알아보기
 | 
				
			||||||
 | 
					- [`kubectl` 커맨드을 사용하여 시크릿 관리](/ko/docs/tasks/configmap-secret/managing-secret-using-kubectl/) 방법 알아보기
 | 
				
			||||||
 | 
					- [환경 설정 파일을 사용하여 시크릿을 관리](/ko/docs/tasks/configmap-secret/managing-secret-using-config-file/)하는 방법 알아보기
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,11 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					title: "kubectl-convert 개요"
 | 
				
			||||||
 | 
					description: >-
 | 
				
			||||||
 | 
					  특정 버전의 쿠버네티스 API로 작성된 매니페스트를 다른 버전으로 변환하는
 | 
				
			||||||
 | 
					  kubectl 플러그인.
 | 
				
			||||||
 | 
					headless: true
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					이것은 쿠버네티스 커맨드 라인 도구인 `kubectl`의 플러그인으로서, 특정 버전의 쿠버네티스 API로 작성된 매니페스트를 다른 버전으로
 | 
				
			||||||
 | 
					변환할 수 있도록 한다. 이것은 매니페스트를 최신 쿠버네티스 릴리스의 사용 중단되지 않은 API로 마이그레이션하는 데 특히 유용하다.
 | 
				
			||||||
 | 
					더 많은 정보는 다음의 [사용 중단되지 않은 API로 마이그레이션](/docs/reference/using-api/deprecation-guide/#migrate-to-non-deprecated-apis)을 참고한다.
 | 
				
			||||||
| 
						 | 
					@ -82,6 +82,7 @@ card:
 | 
				
			||||||
   대상 시스템에 root 접근 권한을 가지고 있지 않더라도, `~/.local/bin` 디렉터리에 kubectl을 설치할 수 있다.
 | 
					   대상 시스템에 root 접근 권한을 가지고 있지 않더라도, `~/.local/bin` 디렉터리에 kubectl을 설치할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   ```bash
 | 
					   ```bash
 | 
				
			||||||
 | 
					   chmod +x kubectl
 | 
				
			||||||
   mkdir -p ~/.local/bin/kubectl
 | 
					   mkdir -p ~/.local/bin/kubectl
 | 
				
			||||||
   mv ./kubectl ~/.local/bin/kubectl
 | 
					   mv ./kubectl ~/.local/bin/kubectl
 | 
				
			||||||
   # 그리고 ~/.local/bin/kubectl을 $PATH에 추가
 | 
					   # 그리고 ~/.local/bin/kubectl을 $PATH에 추가
 | 
				
			||||||
| 
						 | 
					@ -171,7 +172,7 @@ kubectl version --client
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< include "included/verify-kubectl.md" >}}
 | 
					{{< include "included/verify-kubectl.md" >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 선택적 kubectl 구성
 | 
					## 선택적 kubectl 구성 및 플러그인
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 셸 자동 완성 활성화
 | 
					### 셸 자동 완성 활성화
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -184,6 +185,61 @@ kubectl은 Bash 및 Zsh에 대한 자동 완성 지원을 제공하므로 입력
 | 
				
			||||||
{{< tab name="Zsh" include="included/optional-kubectl-configs-zsh.md" />}}
 | 
					{{< tab name="Zsh" include="included/optional-kubectl-configs-zsh.md" />}}
 | 
				
			||||||
{{< /tabs >}}
 | 
					{{< /tabs >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### `kubectl convert` 플러그인 설치
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{< include "included/kubectl-convert-overview.md" >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. 다음 명령으로 최신 릴리스를 다운로드한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ```bash
 | 
				
			||||||
 | 
					   curl -LO https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl-convert
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. 바이너리를 검증한다. (선택 사항)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   kubectl-convert 체크섬(checksum) 파일을 다운로드한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ```bash
 | 
				
			||||||
 | 
					   curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl-convert.sha256"
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   kubectl-convert 바이너리를 체크섬 파일을 통해 검증한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ```bash
 | 
				
			||||||
 | 
					   echo "$(<kubectl-convert.sha256) kubectl-convert" | sha256sum --check
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   검증이 성공한다면, 출력은 다음과 같다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ```console
 | 
				
			||||||
 | 
					   kubectl-convert: OK
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   검증이 실패한다면, `sha256`이 0이 아닌 상태로 종료되며 다음과 유사한 결과를 출력한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ```bash
 | 
				
			||||||
 | 
					   kubectl-convert: FAILED
 | 
				
			||||||
 | 
					   sha256sum: WARNING: 1 computed checksum did NOT match
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   {{< note >}}
 | 
				
			||||||
 | 
					   동일한 버전의 바이너리와 체크섬을 다운로드한다.
 | 
				
			||||||
 | 
					   {{< /note >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. kubectl-convert 설치
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ```bash
 | 
				
			||||||
 | 
					   sudo install -o root -g root -m 0755 kubectl-convert /usr/local/bin/kubectl-convert
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. 플러그인이 정상적으로 설치되었는지 확인한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ```shell
 | 
				
			||||||
 | 
					   kubectl convert --help
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   에러가 출력되지 않는다면, 플러그인이 정상적으로 설치된 것이다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## {{% heading "whatsnext" %}}
 | 
					## {{% heading "whatsnext" %}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< include "included/kubectl-whats-next.md" >}}
 | 
					{{< include "included/kubectl-whats-next.md" >}}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -155,7 +155,7 @@ macOS에서 [Macports](https://macports.org/) 패키지 관리자를 사용하
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< include "included/verify-kubectl.md" >}}
 | 
					{{< include "included/verify-kubectl.md" >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 선택적 kubectl 구성
 | 
					## 선택적 kubectl 구성 및 플러그인
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 셸 자동 완성 활성화
 | 
					### 셸 자동 완성 활성화
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -168,6 +168,82 @@ kubectl은 Bash 및 Zsh에 대한 자동 완성 지원을 제공하므로 입력
 | 
				
			||||||
{{< tab name="Zsh" include="included/optional-kubectl-configs-zsh.md" />}}
 | 
					{{< tab name="Zsh" include="included/optional-kubectl-configs-zsh.md" />}}
 | 
				
			||||||
{{< /tabs >}}
 | 
					{{< /tabs >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### `kubectl convert` 플러그인 설치
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{< include "included/kubectl-convert-overview.md" >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. 다음 명령으로 최신 릴리스를 다운로드한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   {{< tabs name="download_convert_binary_macos" >}}
 | 
				
			||||||
 | 
					   {{< tab name="Intel" codelang="bash" >}}
 | 
				
			||||||
 | 
					   curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl-convert"
 | 
				
			||||||
 | 
					   {{< /tab >}}
 | 
				
			||||||
 | 
					   {{< tab name="Apple Silicon" codelang="bash" >}}
 | 
				
			||||||
 | 
					   curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/arm64/kubectl-convert"
 | 
				
			||||||
 | 
					   {{< /tab >}}
 | 
				
			||||||
 | 
					   {{< /tabs >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. 바이너리를 검증한다. (선택 사항)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   kubectl-convert 체크섬(checksum) 파일을 다운로드한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   {{< tabs name="download_convert_checksum_macos" >}}
 | 
				
			||||||
 | 
					   {{< tab name="Intel" codelang="bash" >}}
 | 
				
			||||||
 | 
					   curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl-convert.sha256"
 | 
				
			||||||
 | 
					   {{< /tab >}}
 | 
				
			||||||
 | 
					   {{< tab name="Apple Silicon" codelang="bash" >}}
 | 
				
			||||||
 | 
					   curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/arm64/kubectl-convert.sha256"
 | 
				
			||||||
 | 
					   {{< /tab >}}
 | 
				
			||||||
 | 
					   {{< /tabs >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   kubectl-convert 바이너리를 체크섬 파일을 통해 검증한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ```bash
 | 
				
			||||||
 | 
					   echo "$(<kubectl-convert.sha256)  kubectl-convert" | shasum -a 256 --check
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   검증이 성공한다면, 출력은 다음과 같다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ```console
 | 
				
			||||||
 | 
					   kubectl-convert: OK
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   검증이 실패한다면, `shasum`이 0이 아닌 상태로 종료되며 다음과 유사한 결과를 출력한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ```bash
 | 
				
			||||||
 | 
					   kubectl-convert: FAILED
 | 
				
			||||||
 | 
					   shasum: WARNING: 1 computed checksum did NOT match
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   {{< note >}}
 | 
				
			||||||
 | 
					   동일한 버전의 바이너리와 체크섬을 다운로드한다.
 | 
				
			||||||
 | 
					   {{< /note >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. kubectl-convert 바이너리를 실행 가능하게 한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ```bash
 | 
				
			||||||
 | 
					   chmod +x ./kubectl-convert
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. kubectl-convert 바이너리를 시스템 `PATH` 의 파일 위치로 옮긴다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ```bash
 | 
				
			||||||
 | 
					   sudo mv ./kubectl /usr/local/bin/kubectl-convert
 | 
				
			||||||
 | 
					   sudo chown root: /usr/local/bin/kubectl-convert
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   {{< note >}}
 | 
				
			||||||
 | 
					   `PATH` 환경 변수 안에 `/usr/local/bin` 이 있는지 확인한다.
 | 
				
			||||||
 | 
					   {{< /note >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. 플러그인이 정상적으로 설치되었는지 확인한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ```shell
 | 
				
			||||||
 | 
					   kubectl convert --help
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   에러가 출력되지 않는다면, 플러그인이 정상적으로 설치된 것이다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## {{% heading "whatsnext" %}}
 | 
					## {{% heading "whatsnext" %}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< include "included/kubectl-whats-next.md" >}}
 | 
					{{< include "included/kubectl-whats-next.md" >}}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -130,7 +130,7 @@ card:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< include "included/verify-kubectl.md" >}}
 | 
					{{< include "included/verify-kubectl.md" >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 선택적 kubectl 구성
 | 
					## 선택적 kubectl 구성 및 플러그인
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 셸 자동 완성 활성화
 | 
					### 셸 자동 완성 활성화
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -140,6 +140,49 @@ kubectl은 Bash 및 Zsh에 대한 자동 완성 지원을 제공하므로 입력
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< include "included/optional-kubectl-configs-zsh.md" >}}
 | 
					{{< include "included/optional-kubectl-configs-zsh.md" >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### `kubectl convert` 플러그인 설치
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{< include "included/kubectl-convert-overview.md" >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. 다음 명령으로 최신 릴리스를 다운로드한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ```powershell
 | 
				
			||||||
 | 
					   curl -LO https://dl.k8s.io/release/{{< param "fullversion" >}}/bin/windows/amd64/kubectl-convert.exe
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. 바이너리를 검증한다. (선택 사항)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   kubectl-convert 체크섬(checksum) 파일을 다운로드한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ```powershell
 | 
				
			||||||
 | 
					   curl -LO https://dl.k8s.io/{{< param "fullversion" >}}/bin/windows/amd64/kubectl-convert.exe.sha256
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   kubectl-convert 바이너리를 체크섬 파일을 통해 검증한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   - 수동으로 `CertUtil` 의 출력과 다운로드한 체크섬 파일을 비교하기 위해서 커맨드 프롬프트를 사용한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     ```cmd
 | 
				
			||||||
 | 
					     CertUtil -hashfile kubectl-convert.exe SHA256
 | 
				
			||||||
 | 
					     type kubectl-convert.exe.sha256
 | 
				
			||||||
 | 
					     ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   - `-eq` 연산자를 통해 `True` 또는 `False` 결과를 얻는 자동 검증을 위해서 PowerShell을 사용한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     ```powershell
 | 
				
			||||||
 | 
					     $($(CertUtil -hashfile .\kubectl-convert.exe SHA256)[1] -replace " ", "") -eq $(type .\kubectl-convert.exe.sha256)
 | 
				
			||||||
 | 
					     ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. 바이너리를 `PATH` 가 설정된 디렉터리에 추가한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. 플러그인이 정상적으로 설치되었는지 확인한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ```shell
 | 
				
			||||||
 | 
					   kubectl convert --help
 | 
				
			||||||
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   에러가 출력되지 않는다면, 플러그인이 정상적으로 설치된 것이다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## {{% heading "whatsnext" %}}
 | 
					## {{% heading "whatsnext" %}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< include "included/kubectl-whats-next.md" >}}
 | 
					{{< include "included/kubectl-whats-next.md" >}}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,8 +25,8 @@ weight: 20
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="row">
 | 
					        <div class="row">
 | 
				
			||||||
            <div class="col-md-12">
 | 
					            <div class="col-md-12">
 | 
				
			||||||
                <a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/" role="button">
 | 
					              <a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/" role="button">홈으로 이동<span class=""></span></a>
 | 
				
			||||||
                    모듈 2로 진행하기<span class="btn__next">›</span></a>
 | 
					                <a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/" role="button">모듈 2로 진행하기 ><span class=""></span></a>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,8 +37,9 @@ weight: 20
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="row">
 | 
					        <div class="row">
 | 
				
			||||||
            <div class="col-md-12">
 | 
					            <div class="col-md-12">
 | 
				
			||||||
                <a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/explore/explore-intro/" role="button">
 | 
					            	<a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/" role="button"> < 모듈 1로 돌아가기<span class=""></span></a>
 | 
				
			||||||
                    모듈 3으로 진행하기<span class="btn__next">›</span></a>
 | 
					            	<a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/" role="button">홈으로 이동<span class=""></span></a>
 | 
				
			||||||
 | 
					                <a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/explore/explore-intro/" role="button">모듈 3으로 진행하기 ><span class=""></span></a>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,8 +29,9 @@ weight: 20
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="row">
 | 
					        <div class="row">
 | 
				
			||||||
            <div class="col-md-12">
 | 
					            <div class="col-md-12">
 | 
				
			||||||
                <a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/expose/expose-intro/" role="button">모듈 4로
 | 
					            	<a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/" role="button">< 모듈 2로 돌아가기<span class="btn"></span></a>
 | 
				
			||||||
                    진행하기<span class="btn__next">›</span></a>
 | 
					            	<a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/" role="button">홈으로 이동<span class=""></span></a>
 | 
				
			||||||
 | 
					                <a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/expose/expose-intro/" role="button">모듈 4로 진행하기 ><span class="btn"></span></a>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -74,11 +74,11 @@ weight: 10
 | 
				
			||||||
        <div class="row">
 | 
					        <div class="row">
 | 
				
			||||||
            <div class="col-md-8">
 | 
					            <div class="col-md-8">
 | 
				
			||||||
                <h2>노드</h2>
 | 
					                <h2>노드</h2>
 | 
				
			||||||
                <p>파드는 언제나 <b>노드</b> 상에서 동작한다. 노드는 쿠버네티스에서 워커 머신을 말하며 클러스터에 따라 가상 또는 물리 머신일 수 있다. 각 노드는 마스터에 의해 관리된다. 하나의 노드는 여러 개의 파드를 가질 수 있고, 쿠버네티스 마스터는 클러스터 내 노드를 통해서 파드에 대한 스케쥴링을 자동으로 처리한다.</p>
 | 
					                <p>파드는 언제나 <b>노드</b> 상에서 동작한다. 노드는 쿠버네티스에서 워커 머신을 말하며 클러스터에 따라 가상 또는 물리 머신일 수 있다. 각 노드는 컨트롤 플레인에 의해 관리된다. 하나의 노드는 여러 개의 파드를 가질 수 있고, 쿠버네티스 컨트롤 플레인은 클러스터 내 노드를 통해서 파드에 대한 스케쥴링을 자동으로 처리한다. 컨트롤 플레인의 자동 스케줄링은 각 노드의 사용 가능한 리소스를 모두 고려합니다.</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                <p>모든 쿠버네티스 노드는 최소한 다음과 같이 동작한다.</p>
 | 
					                <p>모든 쿠버네티스 노드는 최소한 다음과 같이 동작한다.</p>
 | 
				
			||||||
                <ul>
 | 
					                <ul>
 | 
				
			||||||
                    <li>Kubelet은, 쿠버네티스 마스터와 노드 간 통신을 책임지는 프로세스이며, 하나의 머신 상에서 동작하는 파드와 컨테이너를 관리한다.</li>
 | 
					                    <li>Kubelet은, 쿠버네티스 컨트롤 플레인과 노드 간 통신을 책임지는 프로세스이며, 하나의 머신 상에서 동작하는 파드와 컨테이너를 관리한다.</li>
 | 
				
			||||||
                    <li>컨테이너 런타임(도커와 같은)은 레지스트리에서 컨테이너 이미지를 가져와 묶여 있는 것을 풀고 애플리케이션을 동작시키는 책임을 맡는다. </li>
 | 
					                    <li>컨테이너 런타임(도커와 같은)은 레지스트리에서 컨테이너 이미지를 가져와 묶여 있는 것을 풀고 애플리케이션을 동작시키는 책임을 맡는다. </li>
 | 
				
			||||||
                </ul>
 | 
					                </ul>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,9 @@ weight: 20
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="row">
 | 
					        <div class="row">
 | 
				
			||||||
            <div class="col-md-12">
 | 
					            <div class="col-md-12">
 | 
				
			||||||
                <a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/scale/scale-intro/" role="button">모듈 5로 진행하기<span class="btn__next">›</span></a>
 | 
					            	<a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/explore/explore-intro/" role="button">< 모듈 3으로 돌아가기<span class=""></span></a>
 | 
				
			||||||
 | 
					            	<a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/" role="button">홈으로 이동<span class=""></span></a>
 | 
				
			||||||
 | 
					                <a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/scale/scale-intro/" role="button">모듈 5로 진행하기 ><span class=""></span></a>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,8 +26,9 @@ weight: 20
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="row">
 | 
					        <div class="row">
 | 
				
			||||||
            <div class="col-md-12">
 | 
					            <div class="col-md-12">
 | 
				
			||||||
                <a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/update/update-intro/" role="button">
 | 
					            	<a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/expose/expose-interactive/" role="button">< 모듈 4로 돌아가기<span class=""></span></a>
 | 
				
			||||||
                    모듈 6으로 진행하기<span class="btn__next">›</span></a>
 | 
					            	<a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/" role="button">홈으로 이동<span class=""></span></a>
 | 
				
			||||||
 | 
					                <a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/update/update-intro/" role="button">모듈 6으로 진행하기 ><span class=""></span></a>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,8 @@ weight: 20
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="row">
 | 
					        <div class="row">
 | 
				
			||||||
            <div class="col-md-12">
 | 
					            <div class="col-md-12">
 | 
				
			||||||
                <a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/" role="button">쿠버네티스 기초로 돌아가기<span class="btn__next">›</span></a>
 | 
					              <a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/scale/scale-interactive/" role="button">< 모듈 5로 돌아가기<span class=""></span></a>
 | 
				
			||||||
 | 
					              <a class="btn btn-lg btn-success" href="/ko/docs/tutorials/kubernetes-basics/" role="button">쿠버네티스 기초로 돌아가기<span class=""></span></a>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    </main>
 | 
					    </main>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,10 @@ source: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<!-- overview -->
 | 
					<!-- overview -->
 | 
				
			||||||
이 튜토리얼에서는 쿠버네티스와 [Docker](https://www.docker.com/)를 사용하여 간단한 _(운영 수준이 아닌)_ 멀티 티어 웹 애플리케이션을 빌드하고 배포하는 방법을 보여준다. 이 예제는 다음과 같은 구성으로 이루어져 있다.
 | 
					이 튜토리얼에서는 쿠버네티스와 [Docker](https://www.docker.com/)를 사용하여 간단한
 | 
				
			||||||
 | 
					_(운영 수준이 아닌)_ 멀티 티어 웹 애플리케이션을 빌드하고 배포하는 방법을 보여준다.
 | 
				
			||||||
 | 
					이 예제는 다음과 같은 구성으로
 | 
				
			||||||
 | 
					이루어져 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* 방명록 항목을 저장하기 위한 단일 인스턴스 [Redis](https://www.redis.com/)
 | 
					* 방명록 항목을 저장하기 위한 단일 인스턴스 [Redis](https://www.redis.com/)
 | 
				
			||||||
* 여러 개의 웹 프론트엔드 인스턴스
 | 
					* 여러 개의 웹 프론트엔드 인스턴스
 | 
				
			||||||
| 
						 | 
					@ -48,142 +51,157 @@ source: https://cloud.google.com/kubernetes-engine/docs/tutorials/guestbook
 | 
				
			||||||
1. 매니페스트 파일을 다운로드한 디렉터리에서 터미널 창을 시작한다.
 | 
					1. 매니페스트 파일을 다운로드한 디렉터리에서 터미널 창을 시작한다.
 | 
				
			||||||
1. `redis-leader-deployment.yaml` 파일을 이용하여 Redis 디플로이먼트를 생성한다.
 | 
					1. `redis-leader-deployment.yaml` 파일을 이용하여 Redis 디플로이먼트를 생성한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <!--
 | 
					   <!--
 | 
				
			||||||
      로컬에 있는 파일로 테스트하려면 다음과 같이 상대 경로로 기재한다.
 | 
					   로컬에 있는 파일로 테스트하려면 다음과 같이 상대 경로로 기재한다.
 | 
				
			||||||
      kubectl apply -f ./content/en/examples/application/guestbook/redis-leader-deployment.yaml
 | 
					   kubectl apply -f ./content/en/examples/application/guestbook/redis-leader-deployment.yaml
 | 
				
			||||||
      -->
 | 
					   -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl apply -f https://k8s.io/examples/application/guestbook/redis-leader-deployment.yaml
 | 
					   kubectl apply -f https://k8s.io/examples/application/guestbook/redis-leader-deployment.yaml
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 파드의 목록을 질의하여 Redis 파드가 실행 중인지 확인한다.
 | 
					1. 파드의 목록을 질의하여 Redis 파드가 실행 중인지 확인한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl get pods
 | 
					   kubectl get pods
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      결과는 아래와 같은 형태로 나타난다.
 | 
					   결과는 아래와 같은 형태로 나타난다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
      NAME                            READY     STATUS    RESTARTS   AGE
 | 
					   NAME                            READY     STATUS    RESTARTS   AGE
 | 
				
			||||||
      redis-leader-fb76b4755-xjr2n   1/1     Running   0          13s
 | 
					   redis-leader-fb76b4755-xjr2n   1/1     Running   0          13s
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
2. Redis 리더 파드의 로그를 보려면 다음 명령어를 실행한다.
 | 
					2. Redis 리더 파드의 로그를 보려면 다음 명령어를 실행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     ```shell
 | 
					   ```shell
 | 
				
			||||||
     kubectl logs -f deployment/redis-leader
 | 
					   kubectl logs -f deployment/redis-leader
 | 
				
			||||||
     ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Redis 리더 서비스 생성하기
 | 
					### Redis 리더 서비스 생성하기
 | 
				
			||||||
 | 
					
 | 
				
			||||||
방명록 애플리케이션에서 데이터를 쓰려면 Redis와 통신해야 한다. Redis 파드로 트래픽을 프록시하려면 [서비스](/ko/docs/concepts/services-networking/service/)를 생성해야 한다. 서비스는 파드에 접근하기 위한 정책을 정의한다.
 | 
					방명록 애플리케이션에서 데이터를 쓰려면 Redis와 통신해야 한다.
 | 
				
			||||||
 | 
					Redis 파드로 트래픽을 프록시하려면 [서비스](/ko/docs/concepts/services-networking/service/)를 생성해야 한다.
 | 
				
			||||||
 | 
					서비스는 파드에 접근하기 위한 정책을
 | 
				
			||||||
 | 
					정의한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< codenew file="application/guestbook/redis-leader-service.yaml" >}}
 | 
					{{< codenew file="application/guestbook/redis-leader-service.yaml" >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. `redis-leader-service.yaml` 파일을 이용하여 Redis 서비스를 실행한다.
 | 
					1. `redis-leader-service.yaml` 파일을 이용하여 Redis 서비스를 실행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <!--
 | 
					   <!--
 | 
				
			||||||
      로컬에 있는 파일로 테스트하려면 다음과 같이 상대 경로로 기재한다.
 | 
					   로컬에 있는 파일로 테스트하려면 다음과 같이 상대 경로로 기재한다.
 | 
				
			||||||
      kubectl apply -f ./content/en/examples/application/guestbook/redis-leader-service.yaml
 | 
					   kubectl apply -f ./content/en/examples/application/guestbook/redis-leader-service.yaml
 | 
				
			||||||
      -->
 | 
					   -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl apply -f https://k8s.io/examples/application/guestbook/redis-leader-service.yaml
 | 
					   kubectl apply -f https://k8s.io/examples/application/guestbook/redis-leader-service.yaml
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 서비스의 목록을 질의하여 Redis 서비스가 실행 중인지 확인한다.
 | 
					1. 서비스의 목록을 질의하여 Redis 서비스가 실행 중인지 확인한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl get service
 | 
					   kubectl get service
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      결과는 아래와 같은 형태로 나타난다.
 | 
					   결과는 아래와 같은 형태로 나타난다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
      NAME           TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
 | 
					   NAME           TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
 | 
				
			||||||
      kubernetes     ClusterIP   10.0.0.1     <none>        443/TCP    1m
 | 
					   kubernetes     ClusterIP   10.0.0.1     <none>        443/TCP    1m
 | 
				
			||||||
      redis-leader   ClusterIP   10.103.78.24 <none>        6379/TCP   16s
 | 
					   redis-leader   ClusterIP   10.103.78.24 <none>        6379/TCP   16s
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< note >}}
 | 
					{{< note >}}
 | 
				
			||||||
이 매니페스트 파일은 이전에 정의된 레이블과 일치하는 레이블 집합을 가진 `redis-leader`라는 서비스를 생성하므로, 서비스는 네트워크 트래픽을 Redis 파드로 라우팅한다.
 | 
					이 매니페스트 파일은 이전에 정의된 레이블과 일치하는 레이블 집합을 가진
 | 
				
			||||||
 | 
					`redis-leader`라는 서비스를 생성하므로, 서비스는 네트워크 트래픽을
 | 
				
			||||||
 | 
					Redis 파드로 라우팅한다.
 | 
				
			||||||
{{< /note >}}
 | 
					{{< /note >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Redis 팔로워 구성하기
 | 
					### Redis 팔로워 구성하기
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Redis 리더는 단일 파드이지만, 몇 개의 Redis 팔로워 또는 복제본을 추가하여 가용성을 높이고 트래픽 요구를 충족할 수 있다.
 | 
					Redis 리더는 단일 파드이지만, 몇 개의 Redis 팔로워 또는 복제본을 추가하여
 | 
				
			||||||
 | 
					가용성을 높이고 트래픽 요구를 충족할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< codenew file="application/guestbook/redis-follower-deployment.yaml" >}}
 | 
					{{< codenew file="application/guestbook/redis-follower-deployment.yaml" >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. `redis-follower-deployment.yaml` 파일을 이용하여 Redis 서비스를 실행한다.
 | 
					1. `redis-follower-deployment.yaml` 파일을 이용하여 Redis 서비스를 실행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <!---
 | 
					   <!---
 | 
				
			||||||
      로컬에 있는 파일로 테스트하려면 다음과 같이 상대 경로로 기재한다.
 | 
					   로컬에 있는 파일로 테스트하려면 다음과 같이 상대 경로로 기재한다.
 | 
				
			||||||
      kubectl apply -f ./content/en/examples/application/guestbook/redis-follower-deployment.yaml
 | 
					   kubectl apply -f ./content/en/examples/application/guestbook/redis-follower-deployment.yaml
 | 
				
			||||||
      -->
 | 
					   -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl apply -f https://k8s.io/examples/application/guestbook/redis-follower-deployment.yaml
 | 
					   kubectl apply -f https://k8s.io/examples/application/guestbook/redis-follower-deployment.yaml
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 파드의 목록을 질의하여 2개의 Redis 팔로워 레플리카가 실행 중인지 확인한다.
 | 
					1. 파드의 목록을 질의하여 2개의 Redis 팔로워 레플리카가 실행 중인지 확인한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl get pods
 | 
					   kubectl get pods
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      결과는 아래와 같은 형태로 나타난다.
 | 
					   결과는 아래와 같은 형태로 나타난다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
      NAME                             READY   STATUS    RESTARTS   AGE
 | 
					   NAME                             READY   STATUS    RESTARTS   AGE
 | 
				
			||||||
      redis-follower-dddfbdcc9-82sfr   1/1     Running   0          37s
 | 
					   redis-follower-dddfbdcc9-82sfr   1/1     Running   0          37s
 | 
				
			||||||
      redis-follower-dddfbdcc9-qrt5k   1/1     Running   0          38s
 | 
					   redis-follower-dddfbdcc9-qrt5k   1/1     Running   0          38s
 | 
				
			||||||
      redis-leader-fb76b4755-xjr2n     1/1     Running   0          11m
 | 
					   redis-leader-fb76b4755-xjr2n     1/1     Running   0          11m
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Redis 팔로워 서비스 생성하기
 | 
					### Redis 팔로워 서비스 생성하기
 | 
				
			||||||
 | 
					
 | 
				
			||||||
방명록 애플리케이션이 데이터를 읽으려면 Redis 팔로워와 통신해야 한다. Redis 팔로워를 발견 가능(discoverable)하게 만드려면, 새로운 [서비스](/ko/docs/concepts/services-networking/service/)를 구성해야 한다.
 | 
					방명록 애플리케이션이 데이터를 읽으려면 Redis 팔로워와 통신해야 한다.
 | 
				
			||||||
 | 
					Redis 팔로워를 발견 가능(discoverable)하게 만드려면, 새로운
 | 
				
			||||||
 | 
					[서비스](/ko/docs/concepts/services-networking/service/)를 구성해야 한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< codenew file="application/guestbook/redis-follower-service.yaml" >}}
 | 
					{{< codenew file="application/guestbook/redis-follower-service.yaml" >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. `redis-follower-service.yaml` 파일을 이용하여 Redis 서비스를 실행한다.
 | 
					1. `redis-follower-service.yaml` 파일을 이용하여 Redis 서비스를 실행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <!---
 | 
					   <!---
 | 
				
			||||||
      로컬에 있는 파일로 테스트하려면 다음과 같이 상대 경로로 기재한다.
 | 
					   로컬에 있는 파일로 테스트하려면 다음과 같이 상대 경로로 기재한다.
 | 
				
			||||||
      kubectl apply -f ./content/en/examples/application/guestbook/redis-follower-service.yaml
 | 
					   kubectl apply -f ./content/en/examples/application/guestbook/redis-follower-service.yaml
 | 
				
			||||||
      -->
 | 
					   -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl apply -f https://k8s.io/examples/application/guestbook/redis-follower-service.yaml
 | 
					   kubectl apply -f https://k8s.io/examples/application/guestbook/redis-follower-service.yaml
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 서비스의 목록을 질의하여 Redis 서비스가 실행 중인지 확인한다.
 | 
					1. 서비스의 목록을 질의하여 Redis 서비스가 실행 중인지 확인한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl get service
 | 
					   kubectl get service
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      결과는 아래와 같은 형태로 나타난다.
 | 
					   결과는 아래와 같은 형태로 나타난다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
     NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
 | 
					   NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
 | 
				
			||||||
     kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP    3d19h
 | 
					   kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP    3d19h
 | 
				
			||||||
     redis-follower   ClusterIP   10.110.162.42   <none>        6379/TCP   9s
 | 
					   redis-follower   ClusterIP   10.110.162.42   <none>        6379/TCP   9s
 | 
				
			||||||
     redis-leader     ClusterIP   10.103.78.24    <none>        6379/TCP   6m10s
 | 
					   redis-leader     ClusterIP   10.103.78.24    <none>        6379/TCP   6m10s
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< note >}}
 | 
					{{< note >}}
 | 
				
			||||||
이 매니페스트 파일은 이전에 정의된 레이블과 일치하는 레이블 집합을 가진 `redis-follower`라는 서비스를 생성하므로, 서비스는 네트워크 트래픽을 Redis 파드로 라우팅한다.
 | 
					이 매니페스트 파일은 이전에 정의된 레이블과 일치하는 레이블 집합을 가진
 | 
				
			||||||
 | 
					`redis-follower`라는 서비스를 생성하므로, 서비스는 네트워크 트래픽을
 | 
				
			||||||
 | 
					Redis 파드로 라우팅한다.
 | 
				
			||||||
{{< /note >}}
 | 
					{{< /note >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 방명록 프론트엔드를 설정하고 노출하기
 | 
					## 방명록 프론트엔드를 설정하고 노출하기
 | 
				
			||||||
 | 
					
 | 
				
			||||||
방명록을 위한 Redis 저장소를 구성하고 실행했으므로, 이제 방명록 웹 서버를 실행한다. Redis 팔로워와 마찬가지로, 프론트엔드는 쿠버네티스 디플로이먼트(Deployment)를 사용하여 배포된다.
 | 
					방명록을 위한 Redis 저장소를 구성하고 실행했으므로, 이제 방명록 웹 서버를 실행한다.
 | 
				
			||||||
 | 
					Redis 팔로워와 마찬가지로, 프론트엔드는 쿠버네티스 디플로이먼트(Deployment)를
 | 
				
			||||||
 | 
					사용하여 배포된다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
방명록 앱은 PHP 프론트엔드를 사용한다. DB에 대한 요청이 읽기인지 쓰기인지에 따라, Redis 팔로워 또는 리더 서비스와 통신하도록 구성된다. 프론트엔드는 JSON 인터페이스를 노출하고, jQuery-Ajax 기반 UX를 제공한다.
 | 
					방명록 앱은 PHP 프론트엔드를 사용한다. DB에 대한 요청이 읽기인지 쓰기인지에 따라,
 | 
				
			||||||
 | 
					Redis 팔로워 또는 리더 서비스와 통신하도록 구성된다. 프론트엔드는 JSON 인터페이스를
 | 
				
			||||||
 | 
					노출하고,
 | 
				
			||||||
 | 
					jQuery-Ajax 기반 UX를 제공한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 방명록 프론트엔드의 디플로이먼트 생성하기
 | 
					### 방명록 프론트엔드의 디플로이먼트 생성하기
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -191,195 +209,210 @@ Redis 리더는 단일 파드이지만, 몇 개의 Redis 팔로워 또는 복제
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. `frontend-deployment.yaml` 파일을 이용하여 프론트엔드 디플로이먼트를 생성한다.
 | 
					1. `frontend-deployment.yaml` 파일을 이용하여 프론트엔드 디플로이먼트를 생성한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <!--
 | 
					   <!--
 | 
				
			||||||
      로컬에 있는 파일로 테스트하려면 다음과 같이 상대 경로로 기재한다.
 | 
					   로컬에 있는 파일로 테스트하려면 다음과 같이 상대 경로로 기재한다.
 | 
				
			||||||
      kubectl apply -f ./content/en/examples/application/guestbook/frontend-deployment.yaml
 | 
					   kubectl apply -f ./content/en/examples/application/guestbook/frontend-deployment.yaml
 | 
				
			||||||
      -->
 | 
					   -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-deployment.yaml
 | 
					   kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-deployment.yaml
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 파드의 목록을 질의하여 세 개의 프론트엔드 복제본이 실행되고 있는지 확인한다.
 | 
					1. 파드의 목록을 질의하여 세 개의 프론트엔드 복제본이 실행되고 있는지 확인한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl get pods -l app=guestbook -l tier=frontend
 | 
					   kubectl get pods -l app=guestbook -l tier=frontend
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      결과는 아래와 같은 형태로 나타난다.
 | 
					   결과는 아래와 같은 형태로 나타난다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
     NAME                        READY   STATUS    RESTARTS   AGE
 | 
					   NAME                        READY   STATUS    RESTARTS   AGE
 | 
				
			||||||
     frontend-85595f5bf9-5tqhb   1/1     Running   0          47s
 | 
					   frontend-85595f5bf9-5tqhb   1/1     Running   0          47s
 | 
				
			||||||
     frontend-85595f5bf9-qbzwm   1/1     Running   0          47s
 | 
					   frontend-85595f5bf9-qbzwm   1/1     Running   0          47s
 | 
				
			||||||
     frontend-85595f5bf9-zchwc   1/1     Running   0          47s
 | 
					   frontend-85595f5bf9-zchwc   1/1     Running   0          47s
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 프론트엔드 서비스 생성하기
 | 
					### 프론트엔드 서비스 생성하기
 | 
				
			||||||
 | 
					
 | 
				
			||||||
서비스의 기본 유형은 [ClusterIP](/ko/docs/concepts/services-networking/service/#publishing-services-service-types)이기 때문에 생성한 `Redis` 서비스는 컨테이너 클러스터 내에서만 접근할 수 있다. `ClusterIP`는 서비스가 가리키는 파드 집합에 대한 단일 IP 주소를 제공한다. 이 IP 주소는 클러스터 내에서만 접근할 수 있다.
 | 
					서비스의 기본 유형은
 | 
				
			||||||
 | 
					[ClusterIP](/ko/docs/concepts/services-networking/service/#publishing-services-service-types)
 | 
				
			||||||
 | 
					이기 때문에 생성한 `Redis` 서비스는 컨테이너 클러스터 내에서만 접근할 수 있다.
 | 
				
			||||||
 | 
					`ClusterIP`는 서비스가 가리키는 파드 집합에 대한
 | 
				
			||||||
 | 
					단일 IP 주소를 제공한다. 이 IP 주소는 클러스터 내에서만 접근할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
게스트가 방명록에 접근할 수 있도록 하려면, 외부에서 볼 수 있도록 프론트엔드 서비스를 구성해야 한다. 그렇게 하면 클라이언트가 쿠버네티스 클러스터 외부에서 서비스를 요청할 수 있다. 그러나 쿠버네티스 사용자는 `ClusterIP`를 사용하더라도 `kubectl port-forward`를 사용해서 서비스에 접근할 수 있다.
 | 
					게스트가 방명록에 접근할 수 있도록 하려면, 외부에서 볼 수 있도록 프론트엔드
 | 
				
			||||||
 | 
					서비스를 구성해야 한다. 그렇게 하면 클라이언트가 쿠버네티스 클러스터 외부에서
 | 
				
			||||||
 | 
					서비스를 요청할 수 있다. 그러나 쿠버네티스 사용자는 `ClusterIP`를
 | 
				
			||||||
 | 
					사용하더라도 `kubectl port-forward`를 사용해서 서비스에
 | 
				
			||||||
 | 
					접근할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< note >}}
 | 
					{{< note >}}
 | 
				
			||||||
Google Compute Engine 또는 Google Kubernetes Engine과 같은 일부 클라우드 공급자는 외부 로드 밸런서를 지원한다. 클라우드 공급자가 로드 밸런서를 지원하고 이를 사용하려면 `type : LoadBalancer`의 주석을 제거해야 한다.
 | 
					Google Compute Engine 또는 Google Kubernetes Engine
 | 
				
			||||||
 | 
					과 같은 일부 클라우드 공급자는 외부 로드 밸런서를 지원한다. 클라우드 공급자가 로드
 | 
				
			||||||
 | 
					밸런서를 지원하고 이를 사용하려면 `type : LoadBalancer`의 주석을 제거해야 한다.
 | 
				
			||||||
{{< /note >}}
 | 
					{{< /note >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< codenew file="application/guestbook/frontend-service.yaml" >}}
 | 
					{{< codenew file="application/guestbook/frontend-service.yaml" >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. `frontend-service.yaml` 파일을 이용하여 프론트엔드 서비스를 실행한다.
 | 
					1. `frontend-service.yaml` 파일을 이용하여 프론트엔드 서비스를 실행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <!--
 | 
					   <!--
 | 
				
			||||||
      로컬에 있는 파일로 테스트하려면 다음과 같이 상대 경로로 기재한다.
 | 
					   로컬에 있는 파일로 테스트하려면 다음과 같이 상대 경로로 기재한다.
 | 
				
			||||||
      kubectl apply -f ./content/en/examples/application/guestbook/frontend-service.yaml
 | 
					   kubectl apply -f ./content/en/examples/application/guestbook/frontend-service.yaml
 | 
				
			||||||
      -->
 | 
					   -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-service.yaml
 | 
					   kubectl apply -f https://k8s.io/examples/application/guestbook/frontend-service.yaml
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 서비스의 목록을 질의하여 프론트엔드 서비스가 실행 중인지 확인한다.
 | 
					1. 서비스의 목록을 질의하여 프론트엔드 서비스가 실행 중인지 확인한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl get services
 | 
					   kubectl get services
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      결과는 아래와 같은 형태로 나타난다.
 | 
					   결과는 아래와 같은 형태로 나타난다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
     NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
 | 
					   NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
 | 
				
			||||||
     frontend         ClusterIP   10.97.28.230    <none>        80/TCP     19s
 | 
					   frontend         ClusterIP   10.97.28.230    <none>        80/TCP     19s
 | 
				
			||||||
     kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP    3d19h
 | 
					   kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP    3d19h
 | 
				
			||||||
     redis-follower   ClusterIP   10.110.162.42   <none>        6379/TCP   5m48s
 | 
					   redis-follower   ClusterIP   10.110.162.42   <none>        6379/TCP   5m48s
 | 
				
			||||||
     redis-leader     ClusterIP   10.103.78.24    <none>        6379/TCP   11m
 | 
					   redis-leader     ClusterIP   10.103.78.24    <none>        6379/TCP   11m
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### `kubectl port-forward`를 통해 프론트엔드 서비스 확인하기
 | 
					### `kubectl port-forward`를 통해 프론트엔드 서비스 확인하기
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 다음 명령어를 실행해서 로컬 머신의 `8080` 포트를 서비스의 `80` 포트로 전달한다.
 | 
					1. 다음 명령어를 실행해서 로컬 머신의 `8080` 포트를 서비스의 `80` 포트로 전달한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl port-forward svc/frontend 8080:80
 | 
					   kubectl port-forward svc/frontend 8080:80
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      결과는 아래와 같은 형태로 나타난다.
 | 
					   결과는 아래와 같은 형태로 나타난다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
      Forwarding from 127.0.0.1:8080 -> 80
 | 
					   Forwarding from 127.0.0.1:8080 -> 80
 | 
				
			||||||
      Forwarding from [::1]:8080 -> 80
 | 
					   Forwarding from [::1]:8080 -> 80
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 방명록을 보기 위해 브라우저에서 [http://localhost:8080](http://localhost:8080) 페이지를 로드한다.
 | 
					1. 방명록을 보기 위해 브라우저에서 [http://localhost:8080](http://localhost:8080) 페이지를 로드한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### `LoadBalancer`를 통해 프론트엔드 서비스 확인하기
 | 
					### `LoadBalancer`를 통해 프론트엔드 서비스 확인하기
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`frontend-service.yaml` 매니페스트를 `LoadBalancer`와 함께 배포한 경우, 방명록을 보기 위해 IP 주소를 찾아야 한다.
 | 
					`frontend-service.yaml` 매니페스트를 `LoadBalancer`와 함께 배포한 경우,
 | 
				
			||||||
 | 
					방명록을 보기 위해 IP 주소를 찾아야 한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 프론트엔드 서비스의 IP 주소를 얻기 위해 아래 명령어를 실행한다.
 | 
					1. 프론트엔드 서비스의 IP 주소를 얻기 위해 아래 명령어를 실행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl get service frontend
 | 
					   kubectl get service frontend
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      결과는 아래와 같은 형태로 나타난다.
 | 
					   결과는 아래와 같은 형태로 나타난다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
      NAME       TYPE           CLUSTER-IP      EXTERNAL-IP        PORT(S)        AGE
 | 
					   NAME       TYPE           CLUSTER-IP      EXTERNAL-IP        PORT(S)        AGE
 | 
				
			||||||
      frontend   LoadBalancer   10.51.242.136   109.197.92.229     80:32372/TCP   1m
 | 
					   frontend   LoadBalancer   10.51.242.136   109.197.92.229     80:32372/TCP   1m
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. IP 주소를 복사하고, 방명록을 보기 위해 브라우저에서 페이지를 로드한다.
 | 
					1. IP 주소를 복사하고, 방명록을 보기 위해 브라우저에서 페이지를 로드한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{{< note >}}
 | 
					{{< note >}}
 | 
				
			||||||
메시지를 입력하고 'Submit'을 클릭하여 방명록에 글을 작성해 본다. 입력한 메시지가 프론트엔드에 나타난다. 이 메시지는 앞서 생성한 서비스를 통해 데이터가 Redis에 성공적으로 입력되었음을 나타낸다.
 | 
					메시지를 입력하고 'Submit'을 클릭하여 방명록에 글을 작성해 본다.
 | 
				
			||||||
 | 
					입력한 메시지가 프론트엔드에 나타난다. 이 메시지는 앞서 생성한 서비스를
 | 
				
			||||||
 | 
					통해 데이터가 Redis에 성공적으로 입력되었음을 나타낸다.
 | 
				
			||||||
{{< /note >}}
 | 
					{{< /note >}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 웹 프론트엔드 확장하기
 | 
					## 웹 프론트엔드 확장하기
 | 
				
			||||||
 | 
					
 | 
				
			||||||
서버가 디플로이먼트 컨트롤러를 사용하는 서비스로 정의되어 있으므로 필요에 따라 확장 또는 축소할 수 있다.
 | 
					서버가 디플로이먼트 컨트롤러를 사용하는 서비스로 정의되어 있으므로
 | 
				
			||||||
 | 
					필요에 따라 확장 또는 축소할 수 있다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 프론트엔드 파드의 수를 확장하기 위해 아래 명령어를 실행한다.
 | 
					1. 프론트엔드 파드의 수를 확장하기 위해 아래 명령어를 실행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl scale deployment frontend --replicas=5
 | 
					   kubectl scale deployment frontend --replicas=5
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 파드의 목록을 질의하여 실행 중인 프론트엔드 파드의 수를 확인한다.
 | 
					1. 파드의 목록을 질의하여 실행 중인 프론트엔드 파드의 수를 확인한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl get pods
 | 
					   kubectl get pods
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      결과는 아래와 같은 형태로 나타난다.
 | 
					   결과는 아래와 같은 형태로 나타난다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
      NAME                             READY   STATUS    RESTARTS   AGE
 | 
					   NAME                             READY   STATUS    RESTARTS   AGE
 | 
				
			||||||
      frontend-85595f5bf9-5df5m        1/1     Running   0          83s
 | 
					   frontend-85595f5bf9-5df5m        1/1     Running   0          83s
 | 
				
			||||||
      frontend-85595f5bf9-7zmg5        1/1     Running   0          83s
 | 
					   frontend-85595f5bf9-7zmg5        1/1     Running   0          83s
 | 
				
			||||||
      frontend-85595f5bf9-cpskg        1/1     Running   0          15m
 | 
					   frontend-85595f5bf9-cpskg        1/1     Running   0          15m
 | 
				
			||||||
      frontend-85595f5bf9-l2l54        1/1     Running   0          14m
 | 
					   frontend-85595f5bf9-l2l54        1/1     Running   0          14m
 | 
				
			||||||
      frontend-85595f5bf9-l9c8z        1/1     Running   0          14m
 | 
					   frontend-85595f5bf9-l9c8z        1/1     Running   0          14m
 | 
				
			||||||
      redis-follower-dddfbdcc9-82sfr   1/1     Running   0          97m
 | 
					   redis-follower-dddfbdcc9-82sfr   1/1     Running   0          97m
 | 
				
			||||||
      redis-follower-dddfbdcc9-qrt5k   1/1     Running   0          97m
 | 
					   redis-follower-dddfbdcc9-qrt5k   1/1     Running   0          97m
 | 
				
			||||||
      redis-leader-fb76b4755-xjr2n     1/1     Running   0          108m
 | 
					   redis-leader-fb76b4755-xjr2n     1/1     Running   0          108m
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 프론트엔드 파드의 수를 축소하기 위해 아래 명령어를 실행한다.
 | 
					1. 프론트엔드 파드의 수를 축소하기 위해 아래 명령어를 실행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl scale deployment frontend --replicas=2
 | 
					   kubectl scale deployment frontend --replicas=2
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 파드의 목록을 질의하여 실행 중인 프론트엔드 파드의 수를 확인한다.
 | 
					1. 파드의 목록을 질의하여 실행 중인 프론트엔드 파드의 수를 확인한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl get pods
 | 
					   kubectl get pods
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      결과는 아래와 같은 형태로 나타난다.
 | 
					   결과는 아래와 같은 형태로 나타난다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
      NAME                            READY     STATUS    RESTARTS   AGE
 | 
					   NAME                            READY     STATUS    RESTARTS   AGE
 | 
				
			||||||
      frontend-85595f5bf9-cpskg        1/1     Running   0          16m
 | 
					   frontend-85595f5bf9-cpskg        1/1     Running   0          16m
 | 
				
			||||||
      frontend-85595f5bf9-l9c8z        1/1     Running   0          15m
 | 
					   frontend-85595f5bf9-l9c8z        1/1     Running   0          15m
 | 
				
			||||||
      redis-follower-dddfbdcc9-82sfr   1/1     Running   0          98m
 | 
					   redis-follower-dddfbdcc9-82sfr   1/1     Running   0          98m
 | 
				
			||||||
      redis-follower-dddfbdcc9-qrt5k   1/1     Running   0          98m
 | 
					   redis-follower-dddfbdcc9-qrt5k   1/1     Running   0          98m
 | 
				
			||||||
      redis-leader-fb76b4755-xjr2n     1/1     Running   0          109m
 | 
					   redis-leader-fb76b4755-xjr2n     1/1     Running   0          109m
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## {{% heading "cleanup" %}}
 | 
					## {{% heading "cleanup" %}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
디플로이먼트 및 서비스를 삭제하면 실행 중인 모든 파드도 삭제된다. 레이블을 사용하여 하나의 명령어로 여러 자원을 삭제해보자.
 | 
					디플로이먼트 및 서비스를 삭제하면 실행 중인 모든 파드도 삭제된다.
 | 
				
			||||||
 | 
					레이블을 사용하여 하나의 명령어로 여러 자원을 삭제해보자.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 모든 파드, 디플로이먼트, 서비스를 삭제하기 위해 아래 명령어를 실행한다.
 | 
					1. 모든 파드, 디플로이먼트, 서비스를 삭제하기 위해 아래 명령어를 실행한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl delete deployment -l app=redis
 | 
					   kubectl delete deployment -l app=redis
 | 
				
			||||||
      kubectl delete service -l app=redis
 | 
					   kubectl delete service -l app=redis
 | 
				
			||||||
      kubectl delete deployment frontend
 | 
					   kubectl delete deployment frontend
 | 
				
			||||||
      kubectl delete service frontend
 | 
					   kubectl delete service frontend
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      결과는 아래와 같은 형태로 나타난다.
 | 
					   결과는 아래와 같은 형태로 나타난다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
      deployment.apps "redis-follower" deleted
 | 
					   deployment.apps "redis-follower" deleted
 | 
				
			||||||
      deployment.apps "redis-leader" deleted
 | 
					   deployment.apps "redis-leader" deleted
 | 
				
			||||||
      deployment.apps "frontend" deleted
 | 
					   deployment.apps "frontend" deleted
 | 
				
			||||||
      service "frontend" deleted
 | 
					   service "frontend" deleted
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1. 파드의 목록을 질의하여 실행 중인 파드가 없는지 확인한다.
 | 
					1. 파드의 목록을 질의하여 실행 중인 파드가 없는지 확인한다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```shell
 | 
					   ```shell
 | 
				
			||||||
      kubectl get pods
 | 
					   kubectl get pods
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      결과는 아래와 같은 형태로 나타난다.
 | 
					   결과는 아래와 같은 형태로 나타난다.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
      No resources found in default namespace.
 | 
					   No resources found in default namespace.
 | 
				
			||||||
      ```
 | 
					   ```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## {{% heading "whatsnext" %}}
 | 
					## {{% heading "whatsnext" %}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue