Merge pull request #31637 from kubernetes/dev-1.23-ko.1
[ko] 1st Korean localization work for v1.23
This commit is contained in:
commit
fdd25460d8
|
|
@ -30,7 +30,7 @@ Google이 일주일에 수십억 개의 컨테이너들을 운영하게 해준
|
|||
{{% blocks/feature image="suitcase" %}}
|
||||
#### K8s를 어디서나 실행
|
||||
|
||||
쿠버네티스는 오픈소스로서 온-프레미스, 하이브리드, 또는 퍼블릭 클라우드 인프라스트럭처를 활용하는데 자유를 제공하며, 워크로드를 사용자에게 관건이 되는 곳으로 손쉽게 이동시켜 줄 수 있습니다.
|
||||
쿠버네티스는 오픈소스로서 온-프레미스, 하이브리드, 또는 퍼블릭 클라우드 인프라스트럭처를 활용하는 데 자유를 제공하며, 워크로드를 사용자에게 관건이 되는 곳으로 손쉽게 이동시켜 줄 수 있습니다.
|
||||
|
||||
{{% /blocks/feature %}}
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ cid: community
|
|||
|
||||
<div class="community__navbar">
|
||||
|
||||
<a href="https://www.kubernetes.dev/">기여자 커뮤니티</a>
|
||||
<a href="#values">커뮤니티 가치</a>
|
||||
<a href="#conduct">행동 강령 </a>
|
||||
<a href="#videos">비디오</a>
|
||||
|
|
|
|||
|
|
@ -44,10 +44,10 @@ weight: 40
|
|||
### 노드 컨트롤러
|
||||
|
||||
노드 컨트롤러는 클라우드 인프라스트럭처에 새 서버가 생성될 때 {{< glossary_tooltip text="노드" term_id="node" >}}
|
||||
오브젝트를 생성하는 역할을 한다. 노드 컨트롤러는 클라우드 공급자의 사용자
|
||||
오브젝트를 업데이트하는 역할을 한다. 노드 컨트롤러는 클라우드 공급자의 사용자
|
||||
테넌시 내에서 실행되는 호스트에 대한 정보를 가져온다. 노드 컨트롤러는 다음 기능들을 수행한다.
|
||||
|
||||
1. 컨트롤러가 클라우드 공급자 API를 통해 찾아내는 각 서버에 대해 노드 오브젝트를 초기화한다.
|
||||
1. 클라우드 공급자 API를 통해 획득한 해당 서버의 고유 ID를 노드 오브젝트에 업데이트한다.
|
||||
2. 클라우드 관련 정보(예를 들어, 노드가 배포되는 지역과 사용 가능한 리소스(CPU, 메모리 등))를
|
||||
사용해서 노드 오브젝트에 어노테이션과 레이블을 작성한다.
|
||||
3. 노드의 호스트 이름과 네트워크 주소를 가져온다.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,50 @@
|
|||
---
|
||||
title: 컨테이너 런타임 인터페이스(CRI)
|
||||
content_type: concept
|
||||
weight: 50
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
컨테이너 런타임 인터페이스(CRI)는 클러스터 컴포넌트를 다시 컴파일하지 않아도 Kubelet이 다양한
|
||||
컨테이너 런타임을 사용할 수 있도록 하는 플러그인 인터페이스다.
|
||||
|
||||
클러스터의 모든 노드에 동작 중인
|
||||
{{<glossary_tooltip text="컨테이너 런타임" term_id="container-runtime">}}이 존재해야,
|
||||
{{< glossary_tooltip text="kubelet" term_id="kubelet" >}}이
|
||||
{{< glossary_tooltip text="파드" term_id="pod" >}}들과 컨테이너들을
|
||||
구동할 수 있다.
|
||||
|
||||
{{< glossary_definition term_id="container-runtime-interface" length="all" >}}
|
||||
|
||||
<!-- body -->
|
||||
|
||||
## API {#api}
|
||||
|
||||
{{< feature-state for_k8s_version="v1.23" state="stable" >}}
|
||||
|
||||
Kubelet은 gRPC를 통해 컨테이너 런타임과 연결할 때 클라이언트의 역할을 수행한다.
|
||||
런타임과 이미지 서비스 엔드포인트는 컨테이너 런타임 내에서 사용 가능해야 하며,
|
||||
이는 각각 Kubelet 내에서 `--image-service-endpoint`와 `--container-runtime-endpoint`
|
||||
[커맨드라인 플래그](/docs/reference/command-line-tools-reference/kubelet)
|
||||
를 통해 설정할 수 있다.
|
||||
|
||||
쿠버네티스 v{{< skew currentVersion >}}에서는, Kubelet은 CRI `v1`을 사용하는 것을 권장한다.
|
||||
컨테이너 런타임이 CRI `v1` 버전을 지원하지 않는다면,
|
||||
Kubelet은 지원 가능한 이전 지원 버전으로 협상을 시도한다.
|
||||
또한 v{{< skew currentVersion >}} Kubelet은 CRI `v1alpha2`버전도 협상할 수 있지만,
|
||||
해당 버전은 사용 중단(deprecated)으로 간주한다.
|
||||
Kubelet이 지원되는 CRI 버전을 협상할 수 없는 경우,
|
||||
Kubelet은 협상을 포기하고 노드로 등록하지 않는다.
|
||||
|
||||
## 업그레이드
|
||||
|
||||
쿠버네티스를 업그레이드할 때, Kubelet은 컴포넌트의 재시작 시점에서 최신 CRI 버전을 자동으로 선택하려고 시도한다.
|
||||
이 과정이 실패하면 위에서 언급한 대로 이전 버전을 선택하는 과정을 거친다.
|
||||
컨테이너 런타임이 업그레이드되어 gRPC 재다이얼이 필요하다면,
|
||||
컨테이너 런타임도 처음에 선택된 버전을 지원해야 하며,
|
||||
그렇지 못한 경우 재다이얼은 실패하게 될 것이다. 이 과정은 Kubelet의 재시작이 필요하다.
|
||||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
- CRI [프로토콜 정의](https://github.com/kubernetes/cri-api/blob/c75ef5b/pkg/apis/runtime/v1/api.proto)를 자세히 알아보자.
|
||||
|
|
@ -385,7 +385,7 @@ kubelet은 노드의 `.status` 생성과 업데이트 및
|
|||
자세한 내용은
|
||||
[노드의 컨트롤 토폴로지 관리 정책](/docs/tasks/administer-cluster/topology-manager/)을 본다.
|
||||
|
||||
## 그레이스풀(Graceful) 노드 셧다운 {#graceful-node-shutdown}
|
||||
## 그레이스풀(Graceful) 노드 셧다운(shutdown) {#graceful-node-shutdown}
|
||||
|
||||
{{< feature-state state="beta" for_k8s_version="v1.21" >}}
|
||||
|
||||
|
|
@ -402,7 +402,7 @@ Kubelet은 노드가 종료되는 동안 파드가 일반 [파드 종료 프로
|
|||
제어된다.
|
||||
|
||||
기본적으로, 아래 설명된 두 구성 옵션,
|
||||
`ShutdownGracePeriod` 및 `ShutdownGracePeriodCriticalPods` 는 모두 0으로 설정되어 있으므로,
|
||||
`shutdownGracePeriod` 및 `shutdownGracePeriodCriticalPods` 는 모두 0으로 설정되어 있으므로,
|
||||
그레이스풀 노드 셧다운 기능이 활성화되지 않는다.
|
||||
기능을 활성화하려면, 두 개의 kubelet 구성 설정을 적절하게 구성하고 0이 아닌 값으로 설정해야 한다.
|
||||
|
||||
|
|
@ -412,32 +412,116 @@ Kubelet은 노드가 종료되는 동안 파드가 일반 [파드 종료 프로
|
|||
2. 노드에서 실행 중인 [중요(critical) 파드](/ko/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/#파드를-중요-critical-로-표시하기)를 종료시킨다.
|
||||
|
||||
그레이스풀 노드 셧다운 기능은 두 개의 [`KubeletConfiguration`](/docs/tasks/administer-cluster/kubelet-config-file/) 옵션으로 구성된다.
|
||||
* `ShutdownGracePeriod`:
|
||||
* `shutdownGracePeriod`:
|
||||
* 노드가 종료를 지연해야 하는 총 기간을 지정한다. 이것은 모든 일반 및 [중요 파드](/ko/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/#파드를-중요-critical-로-표시하기)의 파드 종료에 필요한 총 유예 기간에 해당한다.
|
||||
* `ShutdownGracePeriodCriticalPods`:
|
||||
* 노드 종료 중에 [중요 파드](/ko/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/#파드를-중요-critical-로-표시하기)를 종료하는 데 사용되는 기간을 지정한다. 이 값은 `ShutdownGracePeriod` 보다 작아야 한다.
|
||||
* `shutdownGracePeriodCriticalPods`:
|
||||
* 노드 종료 중에 [중요 파드](/ko/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/#파드를-중요-critical-로-표시하기)를 종료하는 데 사용되는 기간을 지정한다. 이 값은 `shutdownGracePeriod` 보다 작아야 한다.
|
||||
|
||||
예를 들어, `ShutdownGracePeriod=30s`,
|
||||
`ShutdownGracePeriodCriticalPods=10s` 인 경우, kubelet은 노드 종료를 30초까지
|
||||
예를 들어, `shutdownGracePeriod=30s`,
|
||||
`shutdownGracePeriodCriticalPods=10s` 인 경우, kubelet은 노드 종료를 30초까지
|
||||
지연시킨다. 종료하는 동안 처음 20(30-10)초는 일반 파드의
|
||||
유예 종료에 할당되고, 마지막 10초는
|
||||
[중요 파드](/ko/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/#파드를-중요-critical-로-표시하기)의 종료에 할당된다.
|
||||
|
||||
{{< note >}}
|
||||
그레이스풀 노드 셧다운 과정에서 축출된 파드는 `Failed` 라고 표시된다.
|
||||
`kubectl get pods` 명령을 실행하면 축출된 파드의 상태가 `Shutdown`으로 표시된다.
|
||||
그레이스풀 노드 셧다운 과정에서 축출된 파드는 셧다운(shutdown)된 것으로 표시된다.
|
||||
`kubectl get pods` 명령을 실행하면 축출된 파드의 상태가 `Terminated`으로 표시된다.
|
||||
그리고 `kubectl describe pod` 명령을 실행하면 노드 셧다운으로 인해 파드가 축출되었음을 알 수 있다.
|
||||
|
||||
```
|
||||
Status: Failed
|
||||
Reason: Shutdown
|
||||
Message: Node is shutting, evicting pods
|
||||
Reason: Terminated
|
||||
Message: Pod was terminated in response to imminent node shutdown.
|
||||
```
|
||||
|
||||
실패한 파드 오브젝트는 명시적으로 삭제하거나 [가비지 콜렉션에 의해 정리](/ko/docs/concepts/workloads/pods/pod-lifecycle/#pod-garbage-collection)되기 전까지는 보존된다.
|
||||
이는 갑작스러운 노드 종료의 경우와 비교했을 때 동작에 차이가 있다.
|
||||
{{< /note >}}
|
||||
|
||||
### 파드 우선순위 기반 그레이스풀 노드 셧다운 {#pod-priority-graceful-node-shutdown}
|
||||
|
||||
{{< feature-state state="alpha" for_k8s_version="v1.23" >}}
|
||||
|
||||
그레이스풀 노드 셧다운 시 파드 셧다운 순서에 더 많은 유연성을 제공할 수 있도록,
|
||||
클러스터에 프라이어리티클래스(PriorityClass) 기능이 활성화되어 있으면
|
||||
그레이스풀 노드 셧다운 과정에서 파드의 프라이어리티클래스가 고려된다.
|
||||
이 기능으로 그레이스풀 노드 셧다운 시 파드가 종료되는 순서를 클러스터 관리자가
|
||||
[프라이어리티클래스](/ko/docs/concepts/scheduling-eviction/pod-priority-preemption/#프라이어리티클래스)
|
||||
기반으로 명시적으로 정할 수 있다.
|
||||
|
||||
위에서 기술된 것처럼, [그레이스풀 노드 셧다운](#graceful-node-shutdown) 기능은 파드를
|
||||
중요하지 않은(non-critical) 파드와
|
||||
중요한(critical) 파드 2단계(phase)로 구분하여 종료시킨다.
|
||||
셧다운 시 파드가 종료되는 순서를 명시적으로 더 상세하게 정해야 한다면,
|
||||
파드 우선순위 기반 그레이스풀 노드 셧다운을 사용할 수 있다.
|
||||
|
||||
그레이스풀 노드 셧다운 과정에서 파드 우선순위가 고려되기 때문에,
|
||||
그레이스풀 노드 셧다운이 여러 단계로 일어날 수 있으며,
|
||||
각 단계에서 특정 프라이어리티 클래스의 파드를 종료시킨다.
|
||||
정확한 단계와 단계별 셧다운 시간은 kubelet에 설정할 수 있다.
|
||||
|
||||
다음과 같이 클러스터에 커스텀 파드
|
||||
[프라이어리티 클래스](/ko/docs/concepts/scheduling-eviction/pod-priority-preemption/#프라이어리티클래스)가 있다고
|
||||
가정하자.
|
||||
|
||||
|파드 프라이어리티 클래스 이름|파드 프라이어리티 클래스 값|
|
||||
|-------------------------|------------------------|
|
||||
|`custom-class-a` | 100000 |
|
||||
|`custom-class-b` | 10000 |
|
||||
|`custom-class-c` | 1000 |
|
||||
|`regular/unset` | 0 |
|
||||
|
||||
[kubelet 환경 설정](/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-KubeletConfiguration) 안의
|
||||
`shutdownGracePeriodByPodPriority` 설정은 다음과 같을 수 있다.
|
||||
|
||||
|파드 프라이어리티 클래스 값|종료 대기 시간|
|
||||
|------------------------|---------------|
|
||||
| 100000 |10 seconds |
|
||||
| 10000 |180 seconds |
|
||||
| 1000 |120 seconds |
|
||||
| 0 |60 seconds |
|
||||
|
||||
이를 나타내는 kubelet 환경 설정 YAML은 다음과 같다.
|
||||
|
||||
```yaml
|
||||
shutdownGracePeriodByPodPriority:
|
||||
- priority: 100000
|
||||
shutdownGracePeriodSeconds: 10
|
||||
- priority: 10000
|
||||
shutdownGracePeriodSeconds: 180
|
||||
- priority: 1000
|
||||
shutdownGracePeriodSeconds: 120
|
||||
- priority: 0
|
||||
shutdownGracePeriodSeconds: 60
|
||||
```
|
||||
|
||||
위의 표에 의하면 우선순위 값이 100000 이상인 파드는 종료까지 10초만 주어지며,
|
||||
10000 이상 ~ 100000 미만이면 180초,
|
||||
1000 이상 ~ 10000 미만이면 120초가 주어진다.
|
||||
마지막으로, 다른 모든 파드는 종료까지 60초가 주어질 것이다.
|
||||
|
||||
모든 클래스에 대해 값을 명시할 필요는 없다.
|
||||
예를 들어, 대신 다음과 같은 구성을 사용할 수도 있다.
|
||||
|
||||
|파드 프라이어리티 클래스 값|종료 대기 시간|
|
||||
|------------------------|---------------|
|
||||
| 100000 |300 seconds |
|
||||
| 1000 |120 seconds |
|
||||
| 0 |60 seconds |
|
||||
|
||||
|
||||
위의 경우, custom-class-b에 속하는 파드와 custom-class-c에 속하는 파드는
|
||||
동일한 종료 대기 시간을 갖게 될 것이다.
|
||||
|
||||
특정 범위에 해당되는 파드가 없으면,
|
||||
kubelet은 해당 범위에 해당되는 파드를 위해 기다려 주지 않는다.
|
||||
대신, kubelet은 즉시 다음 프라이어리티 클래스 값 범위로 넘어간다.
|
||||
|
||||
기능이 활성화되어 있지만 환경 설정이 되어 있지 않으면,
|
||||
순서 지정 동작이 수행되지 않을 것이다.
|
||||
|
||||
이 기능을 사용하려면 `GracefulNodeShutdownBasedOnPodPriority` 기능 게이트를 활성화해야 하고,
|
||||
kubelet 환경 설정의 `ShutdownGracePeriodByPodPriority`를
|
||||
파드 프라이어리티 클래스 값과
|
||||
각 값에 대한 종료 대기 시간을 명시하여 지정해야 한다.
|
||||
|
||||
## 스왑(swap) 메모리 관리 {#swap-memory}
|
||||
|
||||
{{< feature-state state="alpha" for_k8s_version="v1.22" >}}
|
||||
|
|
@ -451,6 +535,11 @@ kubelet은 노드에서 스왑을 발견하지 못한 경우 시작과 동시에
|
|||
[구성 설정](/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-KubeletConfiguration)에서 `failSwapOn`가
|
||||
false로 지정되어야 한다.
|
||||
|
||||
{{< warning >}}
|
||||
메모리 스왑 기능이 활성화되면, 시크릿 오브젝트의 내용과 같은
|
||||
tmpfs에 기록되었던 쿠버네티스 데이터가 디스크에 스왑될 수 있다.
|
||||
{{< /warning >}}
|
||||
|
||||
사용자는 또한 선택적으로 `memorySwap.swapBehavior`를 구성할 수 있으며,
|
||||
이를 통해 노드가 스왑 메모리를 사용하는 방식을 명시한다. 예를 들면,
|
||||
|
||||
|
|
|
|||
|
|
@ -45,6 +45,11 @@ content_type: concept
|
|||
## 인프라스트럭처
|
||||
|
||||
* [KubeVirt](https://kubevirt.io/user-guide/#/installation/installation)는 쿠버네티스에서 가상 머신을 실행하기 위한 애드온이다. 일반적으로 베어 메탈 클러스터에서 실행한다.
|
||||
* [node problem detector](https://github.com/kubernetes/node-problem-detector)는
|
||||
리눅스 노드에서 실행되며,
|
||||
시스템 이슈를
|
||||
[이벤트](/docs/reference/kubernetes-api/cluster-resources/event-v1/) 또는
|
||||
[노드 컨디션](/ko/docs/concepts/architecture/nodes/#condition) 형태로 보고한다.
|
||||
|
||||
## 레거시 애드온
|
||||
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ weight: 50
|
|||
VM 내의 프로세스와 동일하다. 이것을 "IP-per-pod(파드별 IP)" 모델이라고
|
||||
한다.
|
||||
|
||||
이것이 어떻게 구현되는 지는 사용 중인 특정 컨테이너 런타임의 세부 사항이다.
|
||||
이것이 어떻게 구현되는 지는 사용 중인 특정 컨테이너 런타임의 세부 사항이다. 비슷하게, 사용자가 선택한 네트워킹 옵션이 [IPv4/IPv6 이중 스택](/ko/docs/concepts/services-networking/dual-stack/)을 지원할 수도 있으며, 구현 방법은 다양할 수 있다.
|
||||
|
||||
`Pod` 로 전달하는 `Node` 자체의 포트(호스트 포트라고 함)를
|
||||
요청할 수 있지만, 이는 매우 틈새 작업이다. 전달이 구현되는 방법은
|
||||
|
|
@ -169,49 +169,6 @@ Coil은 베어메탈에 비해 낮은 오버헤드로 작동하며, 외부 네
|
|||
충족하는 매우 간단한 오버레이 네트워크이다. 많은
|
||||
경우에 쿠버네티스와 플라넬은 성공적으로 적용이 가능하다.
|
||||
|
||||
### Google 컴퓨트 엔진(GCE)
|
||||
|
||||
Google 컴퓨트 엔진 클러스터 구성 스크립트의 경우, [고급
|
||||
라우팅](https://cloud.google.com/vpc/docs/routes)을 사용하여
|
||||
각 VM에 서브넷을 할당한다(기본값은 `/24` - 254개 IP). 해당 서브넷에 바인딩된
|
||||
모든 트래픽은 GCE 네트워크 패브릭에 의해 VM으로 직접 라우팅된다. 이는
|
||||
아웃 바운드 인터넷 접근을 위해 NAT로 구성된 VM에 할당된 "기본"
|
||||
IP 주소에 추가된다. 리눅스 브릿지(`cbr0`)는 해당 서브넷에 존재하도록
|
||||
구성되며, 도커의 `--bridge` 플래그로 전달된다.
|
||||
|
||||
도커는 다음의 설정으로 시작한다.
|
||||
|
||||
```shell
|
||||
DOCKER_OPTS="--bridge=cbr0 --iptables=false --ip-masq=false"
|
||||
```
|
||||
|
||||
이 브릿지는 노드의 `.spec.podCIDR`에 따라 Kubelet(`--network-plugin=kubenet`
|
||||
플래그로 제어되는)에 의해 생성된다.
|
||||
|
||||
도커는 이제 `cbr-cidr` 블록에서 IP를 할당한다. 컨테이너는 `cbr0` 브릿지를
|
||||
통해 서로 `Node` 에 도달할 수 있다. 이러한 IP는 모두 GCE 프로젝트 네트워크
|
||||
내에서 라우팅할 수 있다.
|
||||
|
||||
그러나, GCE 자체는 이러한 IP에 대해 전혀 알지 못하므로, 아웃 바운드 인터넷 트래픽을 위해
|
||||
IP를 NAT하지 않는다. 그것을 달성하기 위해 iptables 규칙을 사용하여
|
||||
GCE 프로젝트 네트워크(10.0.0.0/8) 외부의 IP에 바인딩된 트래픽을
|
||||
마스커레이드(일명 SNAT - 마치 패킷이 `Node` 자체에서 온 것처럼
|
||||
보이게 함)한다.
|
||||
|
||||
```shell
|
||||
iptables -t nat -A POSTROUTING ! -d 10.0.0.0/8 -o eth0 -j MASQUERADE
|
||||
```
|
||||
|
||||
마지막으로 커널에서 IP 포워딩이 활성화되어 있으므로, 커널은 브릿지된 컨테이너에
|
||||
대한 패킷을 처리한다.
|
||||
|
||||
```shell
|
||||
sysctl net.ipv4.ip_forward=1
|
||||
```
|
||||
|
||||
이 모든 것의 결과는 모든 `Pod` 가 서로에게 도달할 수 있고 인터넷으로 트래픽을
|
||||
송신할 수 있다는 것이다.
|
||||
|
||||
### 재규어(Jaguar)
|
||||
|
||||
[재규어](https://gitlab.com/sdnlab/jaguar)는 OpenDaylight 기반의 쿠버네티스 네트워크를 위한 오픈소스 솔루션이다. 재규어는 vxlan을 사용하여 오버레이 네트워크를 제공하고 재규어 CNI 플러그인은 파드별로 하나의 IP 주소를 제공한다.
|
||||
|
|
@ -260,12 +217,6 @@ Multus는 CNI 명세를 구현하는 모든 [레퍼런스 플러그인](https://
|
|||
|
||||
[NSX-T 컨테이너 플러그인(NCP)](https://docs.vmware.com/en/VMware-NSX-T/2.0/nsxt_20_ncp_kubernetes.pdf)은 NSX-T와 쿠버네티스와 같은 컨테이너 오케스트레이터 사이의 통합은 물론, NSX-T와 Pivotal 컨테이너 서비스(PKS) 및 OpenShift와 같은 컨테이너 기반 CaaS/PaaS 플랫폼 간의 통합을 제공한다.
|
||||
|
||||
### OpenVSwitch
|
||||
|
||||
[OpenVSwitch](https://www.openvswitch.org/)는 다소 성숙하지만
|
||||
오버레이 네트워크를 구축하는 복잡한 방법이다. 이것은 네트워킹 분야의 몇몇
|
||||
"대형 벤더"에 의해 승인되었다.
|
||||
|
||||
### OVN(오픈 버추얼 네트워킹)
|
||||
|
||||
OVN은 Open vSwitch 커뮤니티에서 개발한 오픈소스 네트워크
|
||||
|
|
@ -274,10 +225,6 @@ OVN은 Open vSwitch 커뮤니티에서 개발한 오픈소스 네트워크
|
|||
[ovn-kubernetes](https://github.com/openvswitch/ovn-kubernetes)에
|
||||
특정 쿠버네티스 플러그인 및 문서가 있다.
|
||||
|
||||
### 로마나
|
||||
|
||||
[로마나](https://romana.io)는 오버레이 네트워크 없이 쿠버네티스를 배포할 수 있는 오픈소스 네트워크 및 보안 자동화 솔루션이다. 로마나는 쿠버네티스 [네트워크 폴리시](/ko/docs/concepts/services-networking/network-policies/)를 지원하여 네트워크 네임스페이스에서 격리를 제공한다.
|
||||
|
||||
### Weaveworks의 위브넷
|
||||
|
||||
[위브넷](https://www.weave.works/products/weave-net/)은
|
||||
|
|
|
|||
|
|
@ -74,8 +74,7 @@ CPU와 메모리를 통칭하여 *컴퓨트 리소스* 또는 *리소스* 라고
|
|||
수량이다. 이것은
|
||||
[API 리소스](/ko/docs/concepts/overview/kubernetes-api/)와는 다르다. 파드 및
|
||||
[서비스](/ko/docs/concepts/services-networking/service/)와 같은 API 리소스는
|
||||
쿠버네티스 API 서버를 통해 읽고 수정할 수
|
||||
있는 오브젝트이다.
|
||||
쿠버네티스 API 서버를 통해 읽고 수정할 수 있는 오브젝트이다.
|
||||
|
||||
## 파드와 컨테이너의 리소스 요청 및 제한
|
||||
|
||||
|
|
@ -100,9 +99,10 @@ CPU와 메모리를 통칭하여 *컴퓨트 리소스* 또는 *리소스* 라고
|
|||
CPU 리소스에 대한 제한 및 요청은 *cpu* 단위로 측정된다.
|
||||
쿠버네티스의 CPU 1개는 클라우드 공급자용 **vCPU/Core 1개** 와 베어메탈 인텔 프로세서에서의 **1개 하이퍼스레드** 에 해당한다.
|
||||
|
||||
분수의 요청이 허용된다.
|
||||
`0.5` 의 `spec.containers[].resources.requests.cpu` 요청을 가진
|
||||
컨테이너는 CPU 1개를 요구하는 컨테이너의 절반만큼 CPU를 보장한다. `0.1` 이라는 표현은
|
||||
요청량을 소수점 형태로 명시할 수도 있다. 컨테이너의
|
||||
`spec.containers[].resources.requests.cpu`를 `0.5`로 설정한다는 것은,
|
||||
`1.0` CPU를 요청했을 때와 비교하여 절반의 CPU 타임을 요청한다는 의미이다.
|
||||
CPU 자원의 단위와 관련하여, `0.1` 이라는 표현은
|
||||
"백 밀리cpu"로 읽을 수 있는 `100m` 표현과 동일하다. 어떤 사람들은
|
||||
"백 밀리코어"라고 말하는데, 같은 것을 의미하는 것으로 이해된다.
|
||||
`0.1` 과 같이 소수점이 있는 요청은 API에 의해 `100m` 으로 변환되며,
|
||||
|
|
@ -115,12 +115,12 @@ CPU는 항상 절대 수량으로 요청되며, 상대적 수량은 아니다.
|
|||
### 메모리의 의미
|
||||
|
||||
`memory` 에 대한 제한 및 요청은 바이트 단위로 측정된다.
|
||||
E, P, T, G, M, K와 같은 접미사 중 하나를 사용하여 메모리를
|
||||
E, P, T, G, M, k, m(millis) 와 같은 접미사 중 하나를 사용하여 메모리를
|
||||
일반 정수 또는 고정 소수점 숫자로 표현할 수 있다. Ei, Pi, Ti, Gi, Mi, Ki와
|
||||
같은 2의 거듭제곱을 사용할 수도 있다. 예를 들어, 다음은 대략 동일한 값을 나타낸다.
|
||||
|
||||
```shell
|
||||
128974848, 129e6, 129M, 123Mi
|
||||
128974848, 129e6, 129M, 128974848000m, 123Mi
|
||||
```
|
||||
|
||||
다음은 예제이다.
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ DNS 서버는 새로운 `서비스`를 위한 쿠버네티스 API를 Watch하며
|
|||
|
||||
만약 오직 디버깅의 목적으로 포트에 접근해야 한다면, [apiserver proxy](/ko/docs/tasks/access-application-cluster/access-cluster/#수작업으로-apiserver-proxy-url을-구축) 또는 [`kubectl port-forward`](/ko/docs/tasks/access-application-cluster/port-forward-access-application-cluster/)를 사용할 수 있다.
|
||||
|
||||
만약 파드의 포트를 노드에서 명시적으로 노출해야 한다면, `hostPort`에 의존하기 전에 [NodePort](/ko/docs/concepts/services-networking/service/#nodeport) 서비스를 사용하는 것을 고려할 수 있다.
|
||||
만약 파드의 포트를 노드에서 명시적으로 노출해야 한다면, `hostPort`에 의존하기 전에 [NodePort](/ko/docs/concepts/services-networking/service/#type-nodeport) 서비스를 사용하는 것을 고려할 수 있다.
|
||||
|
||||
- `hostPort`와 같은 이유로, `hostNetwork`를 사용하는 것을 피한다.
|
||||
|
||||
|
|
|
|||
|
|
@ -244,7 +244,7 @@ kubectl create secret docker-registry secret-tiger-docker \
|
|||
|
||||
`kubernetes.io/basic-auth` 타입은 기본 인증을 위한 자격 증명을 저장하기
|
||||
위해 제공된다. 이 시크릿 타입을 사용할 때는 시크릿의 `data` 필드가
|
||||
다음의 두 키를 포함해야 한다.
|
||||
다음의 두 키 중 하나를 포함해야 한다.
|
||||
|
||||
- `username`: 인증을 위한 사용자 이름
|
||||
- `password`: 인증을 위한 암호나 토큰
|
||||
|
|
|
|||
|
|
@ -54,13 +54,15 @@ weight: 10
|
|||
컨테이너에 대한 `imagePullPolicy`와 이미지의 태그는
|
||||
[kubelet](/docs/reference/command-line-tools-reference/kubelet/)이 특정 이미지를 풀(다운로드)하려고 할 때 영향을 준다.
|
||||
|
||||
다음은 `imagePullPolicy`에 설정할 수 있는 값의 목록과 효과이다.
|
||||
다음은 `imagePullPolicy`에 설정할 수 있는 값의 목록과
|
||||
효과이다.
|
||||
|
||||
`IfNotPresent`
|
||||
: 이미지가 로컬에 없는 경우에만 내려받는다.
|
||||
|
||||
`Always`
|
||||
: kubelet이 컨테이너를 기동할 때마다, kubelet이 컨테이너 이미지 레지스트리에 이름과 이미지의
|
||||
: kubelet이 컨테이너를 기동할 때마다, kubelet이 컨테이너
|
||||
이미지 레지스트리에 이름과 이미지의
|
||||
[다이제스트](https://docs.docker.com/engine/reference/commandline/pull/#pull-an-image-by-digest-immutable-identifier)가 있는지 질의한다.
|
||||
일치하는 다이제스트를 가진 컨테이너 이미지가 로컬에 있는 경우, kubelet은 캐시된 이미지를 사용한다.
|
||||
이외의 경우, kubelet은 검색된 다이제스트를 가진 이미지를 내려받아서
|
||||
|
|
@ -78,7 +80,8 @@ weight: 10
|
|||
|
||||
{{< note >}}
|
||||
프로덕션 환경에서 컨테이너를 배포하는 경우 `:latest` 태그 사용을 지양해야 하는데,
|
||||
이미지의 어떤 버전이 기동되고 있는지 추적이 어렵고 제대로 롤백하기 어렵게 되기 때문이다.
|
||||
이미지의 어떤 버전이 기동되고 있는지 추적이 어렵고
|
||||
제대로 롤백하기 어렵게 되기 때문이다.
|
||||
|
||||
대신, `v1.42.0`과 같이 의미있는 태그를 명기한다.
|
||||
{{< /note >}}
|
||||
|
|
@ -90,7 +93,8 @@ weight: 10
|
|||
|
||||
이미지 태그를 사용하는 경우, 이미지 레지스트리에서 한 이미지를 나타내는 태그에 코드를 변경하게 되면, 기존 코드와 신규 코드를 구동하는 파드가 섞이게 되고 만다. 이미지 다이제스트를 통해 이미지의 특정 버전을 유일하게 식별할 수 있기 때문에, 쿠버네티스는 매번 해당 이미지 이름과 다이제스트가 명시된 컨테이너를 기동해서 같은 코드를 구동한다. 이미지를 명시하는 것은 구동할 코드를 고정시켜서 레지스트리에서의 변경으로 인해 버전이 섞이는 일이 발생하지 않도록 해준다.
|
||||
|
||||
파드(및 파드 템플릿)가 생성될 때 구동 중인 워크로드가 태그가 아닌 이미지 다이제스트를 통해 정의되도록 조작해주는
|
||||
파드(및 파드 템플릿)가 생성될 때 구동 중인 워크로드가
|
||||
태그가 아닌 이미지 다이제스트를 통해 정의되도록 조작해주는
|
||||
서드-파티 [어드미션 컨트롤러](/docs/reference/access-authn-authz/admission-controllers/)가 있다.
|
||||
이는 레지스트리에서 태그가 변경되는 일이 발생해도
|
||||
구동 중인 워크로드가 모두 같은 코드를 사용하고 있다는 것을 보장하기를 원하는 경우 유용할 것이다.
|
||||
|
|
@ -104,7 +108,9 @@ weight: 10
|
|||
`:latest`인 경우, `imagePullPolicy`는 자동으로 `Always`로 설정된다.
|
||||
- `imagePullPolicy` 필드를 생략하고 컨테이너 이미지의 태그를 명기하지 않은 경우,
|
||||
`imagePullPolicy`는 자동으로 `Always`로 설정된다.
|
||||
- `imagePullPolicy` 필드를 생략하고, 명기한 컨테이너 이미지의 태그가 `:latest`가 아니면, `imagePullPolicy`는 자동으로 `IfNotPresent`로 설정된다.
|
||||
- `imagePullPolicy` 필드를 생략하고,
|
||||
명기한 컨테이너 이미지의 태그가 `:latest`가 아니면,
|
||||
`imagePullPolicy`는 자동으로 `IfNotPresent`로 설정된다.
|
||||
|
||||
{{< note >}}
|
||||
컨테이너의 `imagePullPolicy` 값은 오브젝트가 처음 _created_ 일 때 항상
|
||||
|
|
@ -127,6 +133,7 @@ weight: 10
|
|||
그러면 사용자가 파드를 요청할 때 쿠버네티스가 정책을 `Always`로 설정한다.
|
||||
- [AlwaysPullImages](/docs/reference/access-authn-authz/admission-controllers/#alwayspullimages) 어드미션 컨트롤러를 활성화 한다.
|
||||
|
||||
|
||||
### 이미지풀백오프(ImagePullBackOff)
|
||||
|
||||
kubelet이 컨테이너 런타임을 사용하여 파드의 컨테이너 생성을 시작할 때,
|
||||
|
|
@ -258,6 +265,73 @@ kubectl describe pods/private-image-test-1 | grep 'Failed'
|
|||
프라이빗 레지스트리 키가 `.docker/config.json`에 추가되고 나면 모든 파드는
|
||||
프라이빗 레지스트리의 이미지에 읽기 접근 권한을 가지게 될 것이다.
|
||||
|
||||
### config.json 파일 해석 {#config-json}
|
||||
|
||||
`config.json` 파일의 해석에 있어서, 기존 도커의 구현과 쿠버네티스의 구현에 차이가 있다.
|
||||
도커에서는 `auths` 키에 특정 루트 URL만 기재할 수 있으나,
|
||||
쿠버네티스에서는 glob URL과 접두사-매칭 경로도 기재할 수 있다.
|
||||
이는 곧 다음과 같은 `config.json`도 유효하다는 뜻이다.
|
||||
|
||||
```json
|
||||
{
|
||||
"auths": {
|
||||
"*my-registry.io/images": {
|
||||
"auth": "…"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
루트 URL(`*my-registry.io`)은 다음 문법을 사용하여 매치된다.
|
||||
|
||||
```
|
||||
pattern:
|
||||
{ term }
|
||||
|
||||
term:
|
||||
'*' 구분자가 아닌 모든 문자와 매치됨
|
||||
'?' 구분자가 아닌 문자 1개와 매치됨
|
||||
'[' [ '^' ] { character-range } ']'
|
||||
문자 클래스 (비어 있으면 안 됨))
|
||||
c 문자 c에 매치됨 (c != '*', '?', '\\', '[')
|
||||
'\\' c 문자 c에 매치됨
|
||||
|
||||
character-range:
|
||||
c 문자 c에 매치됨 (c != '\\', '-', ']')
|
||||
'\\' c 문자 c에 매치됨
|
||||
lo '-' hi lo <= c <= hi 인 문자 c에 매치됨
|
||||
```
|
||||
|
||||
이미지 풀 작업 시, 모든 유효한 패턴에 대해 크리덴셜을 CRI 컨테이너 런타임에 제공할 것이다.
|
||||
예를 들어 다음과 같은 컨테이너 이미지 이름은
|
||||
성공적으로 매치될 것이다.
|
||||
|
||||
- `my-registry.io/images`
|
||||
- `my-registry.io/images/my-image`
|
||||
- `my-registry.io/images/another-image`
|
||||
- `sub.my-registry.io/images/my-image`
|
||||
- `a.sub.my-registry.io/images/my-image`
|
||||
|
||||
kubelet은 인식된 모든 크리덴셜을 순차적으로 이용하여 이미지 풀을 수행한다. 즉,
|
||||
`config.json`에 다음과 같이 여러 항목을 기재할 수도 있다.
|
||||
|
||||
```json
|
||||
{
|
||||
"auths": {
|
||||
"my-registry.io/images": {
|
||||
"auth": "…"
|
||||
},
|
||||
"my-registry.io/images/subpath": {
|
||||
"auth": "…"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
이제 컨테이너가 `my-registry.io/images/subpath/my-image`
|
||||
이미지를 풀 해야 한다고 명시하면,
|
||||
kubelet은 크리덴셜을 순차적으로 사용하여 풀을 시도한다.
|
||||
|
||||
### 미리 내려받은 이미지 {#pre-pulled-images}
|
||||
|
||||
{{< note >}}
|
||||
|
|
@ -383,3 +457,4 @@ Kubelet은 모든 `imagePullSecrets` 파일을 하나의 가상 `.docker/config.
|
|||
|
||||
* [OCI 이미지 매니페스트 명세](https://github.com/opencontainers/image-spec/blob/master/manifest.md) 읽어보기.
|
||||
* [컨테이너 이미지 가비지 수집(garbage collection)](/docs/concepts/architecture/garbage-collection/#container-image-garbage-collection)에 대해 배우기.
|
||||
* [프라이빗 레지스트리에서 이미지 받아오기](/ko/docs/tasks/configure-pod-container/pull-image-private-registry)
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ no_list: true
|
|||
웹훅 모델에서 쿠버네티스는 원격 서비스에 네트워크 요청을 한다.
|
||||
*바이너리 플러그인* 모델에서 쿠버네티스는 바이너리(프로그램)를 실행한다.
|
||||
바이너리 플러그인은 kubelet(예:
|
||||
[Flex Volume 플러그인](/ko/docs/concepts/storage/volumes/#flexVolume)과
|
||||
[Flex Volume 플러그인](/ko/docs/concepts/storage/volumes/#flexvolume)과
|
||||
[네트워크 플러그인](/ko/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/))과
|
||||
kubectl에서 사용한다.
|
||||
|
||||
|
|
@ -145,7 +145,7 @@ API를 추가해도 기존 API(예: 파드)의 동작에 직접 영향을 미치
|
|||
|
||||
### 인가
|
||||
|
||||
[인가](/docs/reference/access-authn-authz/webhook/)는 특정 사용자가 API 리소스에서 읽고, 쓰고, 다른 작업을 수행할 수 있는지를 결정한다. 전체 리소스 레벨에서 작동하며 임의의 오브젝트 필드를 기준으로 구별하지 않는다. 빌트인 인증 옵션이 사용자의 요구를 충족시키지 못하면 [인가 웹훅](/docs/reference/access-authn-authz/webhook/)을 통해 사용자가 제공한 코드를 호출하여 인증 결정을 내릴 수 있다.
|
||||
[인가](/docs/reference/access-authn-authz/authorization/)는 특정 사용자가 API 리소스에서 읽고, 쓰고, 다른 작업을 수행할 수 있는지를 결정한다. 전체 리소스 레벨에서 작동하며 임의의 오브젝트 필드를 기준으로 구별하지 않는다. 빌트인 인증 옵션이 사용자의 요구를 충족시키지 못하면 [인가 웹훅](/docs/reference/access-authn-authz/webhook/)을 통해 사용자가 제공한 코드를 호출하여 인증 결정을 내릴 수 있다.
|
||||
|
||||
|
||||
### 동적 어드미션 컨트롤
|
||||
|
|
@ -163,6 +163,8 @@ API를 추가해도 기존 API(예: 파드)의 동작에 직접 영향을 미치
|
|||
Kubelet이 바이너리 플러그인을 호출하여 볼륨을 마운트하도록 함으로써
|
||||
빌트인 지원 없이 볼륨 유형을 마운트 할 수 있다.
|
||||
|
||||
FlexVolume은 쿠버네티스 v1.23부터 사용 중단(deprecated)되었다. Out-of-tree CSI 드라이버가 쿠버네티스에서 볼륨 드라이버를 작성할 때 추천하는 방식이다. 자세한 정보는 [스토리지 업체를 위한 쿠버네티스 볼륨 플러그인 FAQ](https://github.com/kubernetes/community/blob/master/sig-storage/volume-plugin-faq.md#kubernetes-volume-plugin-faq-for-storage-vendors)에서 찾을 수 있다.
|
||||
|
||||
|
||||
### 장치 플러그인
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,8 @@ _선언적(declarative) API_ 를 제공하게 된다.
|
|||
|
||||
쿠버네티스 [선언적 API](/ko/docs/concepts/overview/kubernetes-api/)는
|
||||
책임의 분리를 강제한다. 사용자는 리소스의 의도한 상태를 선언한다.
|
||||
쿠버네티스 컨트롤러는 쿠버네티스 오브젝트의 현재 상태가 선언한 의도한 상태에 동기화 되도록 한다.
|
||||
쿠버네티스 컨트롤러는 쿠버네티스 오브젝트의 현재 상태가
|
||||
선언한 의도한 상태에 동기화 되도록 한다.
|
||||
이는 서버에 무엇을 해야할지 *지시하는* 명령적인 API와는 대조된다.
|
||||
|
||||
클러스터 라이프사이클과 관계없이 실행 중인 클러스터에 커스텀 컨트롤러를 배포하고
|
||||
|
|
@ -146,9 +147,9 @@ CRD 오브젝트의 이름은 유효한
|
|||
|
||||
일반적으로 쿠버네티스 API의 각 리소스에는 REST 요청을 처리하고 오브젝트의 퍼시스턴트 스토리지를 관리하는 코드가 필요하다. 주요 쿠버네티스 API 서버는 *파드* 및 *서비스* 와 같은 빌트인 리소스를 처리하고, 일반적으로 [CRD](#커스텀리소스데피니션)를 통해 커스텀 리소스를 처리할 수 있다.
|
||||
|
||||
[애그리게이션 레이어](/ko/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/)를 사용하면 자체 독립형 API 서버를
|
||||
[애그리게이션 레이어](/ko/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/)를 사용하면 자체 API 서버를
|
||||
작성하고 배포하여 커스텀 리소스에 대한 특수한 구현을 제공할 수 있다.
|
||||
기본 API 서버는 처리하는 커스텀 리소스에 대한 요청을 사용자에게 위임하여
|
||||
주(main) API 서버는 사용자의 커스텀 리소스에 대한 요청을 사용자의 자체 API 서버에 위임하여
|
||||
모든 클라이언트가 사용할 수 있게 한다.
|
||||
|
||||
## 커스텀 리소스를 추가할 방법 선택
|
||||
|
|
|
|||
|
|
@ -197,6 +197,8 @@ service PodResourcesLister {
|
|||
}
|
||||
```
|
||||
|
||||
### `List` gRPC 엔드포인트 {#grpc-endpoint-list}
|
||||
|
||||
`List` 엔드포인트는 실행 중인 파드의 리소스에 대한 정보를 제공하며,
|
||||
독점적으로 할당된 CPU의 ID, 장치 플러그인에 의해 보고된 장치 ID,
|
||||
이러한 장치가 할당된 NUMA 노드의 ID와 같은 세부 정보를 함께 제공한다. 또한, NUMA 기반 머신의 경우, 컨테이너를 위해 예약된 메모리와 hugepage에 대한 정보를 포함한다.
|
||||
|
|
@ -246,10 +248,35 @@ message ContainerDevices {
|
|||
TopologyInfo topology = 3;
|
||||
}
|
||||
```
|
||||
{{< note >}}
|
||||
`List` 엔드포인트의 `ContainerResources` 내부에 있는 cpu_ids은 특정 컨테이너에 할당된
|
||||
독점 CPU들에 해당한다. 만약 공유 풀(shared pool)에 있는 CPU들을 확인(evaluate)하는 것이 목적이라면, 해당 `List`
|
||||
엔드포인트는 다음에 설명된 것과 같이, `GetAllocatableResources` 엔드포인트와 함께 사용되어야
|
||||
한다.
|
||||
1. `GetAllocatableResources`를 호출하여 할당 가능한 모든 CPU 목록을 조회
|
||||
2. 시스템의 모든 `ContainerResources`에서 `GetCpuIds`를 호출
|
||||
3. `GetAllocateableResources` 호출에서 `GetCpuIds` 호출로 얻은 모든 CPU를 빼기
|
||||
{{< /note >}}
|
||||
|
||||
### `GetAllocatableResources` gRPC 엔드포인트 {#grpc-endpoint-getallocatableresources}
|
||||
|
||||
{{< feature-state state="beta" for_k8s_version="v1.23" >}}
|
||||
|
||||
GetAllocatableResources는 워커 노드에서 처음 사용할 수 있는 리소스에 대한 정보를 제공한다.
|
||||
kubelet이 APIServer로 내보내는 것보다 더 많은 정보를 제공한다.
|
||||
|
||||
{{< note >}}
|
||||
`GetAllocatableResources`는 [할당 가능(allocatable)](/docs/tasks/administer-cluster/reserve-compute-resources/#node-allocatable) 리소스를 확인(evaluate)하기 위해서만
|
||||
사용해야 한다. 만약 목적이 free/unallocated 리소스를 확인하기 위한 것이라면
|
||||
List() 엔드포인트와 함께 사용되어야 한다. `GetAllocableResources`로 얻은 결과는 kubelet에
|
||||
노출된 기본 리소스가 변경되지 않는 한 동일하게 유지된다. 이러한 변경은 드물지만, 발생하게 된다면
|
||||
(예를 들면: hotplug/hotunplug, 장치 상태 변경) 클라이언트가 `GetAlloctableResources` 엔드포인트를
|
||||
호출할 것으로 가정한다.
|
||||
그러나 CPU 및/또는 메모리가 갱신된 경우 `GetAllocateableResources` 엔드포인트를 호출하는 것만으로는
|
||||
충분하지 않으며, Kubelet을 다시 시작하여 올바른 리소스 용량과 할당 가능(allocatable) 리소스를 반영해야 한다.
|
||||
{{< /note >}}
|
||||
|
||||
|
||||
```gRPC
|
||||
// AllocatableResourcesResponses에는 kubelet이 알고 있는 모든 장치에 대한 정보가 포함된다.
|
||||
message AllocatableResourcesResponse {
|
||||
|
|
@ -259,6 +286,13 @@ message AllocatableResourcesResponse {
|
|||
}
|
||||
|
||||
```
|
||||
쿠버네티스 v1.23부터, `GetAllocatableResources`가 기본으로 활성화된다.
|
||||
이를 비활성화하려면 `KubeletPodResourcesGetAllocatable` [기능 게이트(feature gate)](/docs/reference/command-line-tools-reference/feature-gates/)를
|
||||
끄면 된다.
|
||||
|
||||
쿠버네티스 v1.23 이전 버전에서 이 기능을 활성화하려면 `kubelet`이 다음 플래그를 가지고 시작되어야 한다.
|
||||
|
||||
`--feature-gates=KubeletPodResourcesGetAllocatable=true`
|
||||
|
||||
`ContainerDevices` 는 장치가 어떤 NUMA 셀과 연관되는지를 선언하는 토폴로지 정보를 노출한다.
|
||||
NUMA 셀은 불분명한(opaque) 정수 ID를 사용하여 식별되며, 이 값은
|
||||
|
|
|
|||
|
|
@ -31,9 +31,7 @@ weight: 30
|
|||
및 실행을 자동화할 수 있고, *또한* 쿠버네티스가 수행하는 방식을
|
||||
자동화할 수 있다.
|
||||
|
||||
쿠버네티스의 {{< glossary_tooltip text="컨트롤러" term_id="controller" >}}
|
||||
개념을 통해 쿠버네티스 코드 자체를 수정하지 않고도 클러스터의 동작을
|
||||
확장할 수 있다.
|
||||
쿠버네티스의 {{< glossary_tooltip text="오퍼레이터 패턴" term_id="operator-pattern" >}} 개념을 통해 쿠버네티스 코드 자체를 수정하지 않고도 {{< glossary_tooltip text="컨트롤러" term_id="controller" >}}를 하나 이상의 사용자 정의 리소스(custom resource)에 연결하여 클러스터의 동작을 확장할 수 있다.
|
||||
오퍼레이터는 [사용자 정의 리소스](/ko/docs/concepts/extend-kubernetes/api-extension/custom-resources/)의
|
||||
컨트롤러 역할을 하는 쿠버네티스 API의 클라이언트이다.
|
||||
|
||||
|
|
|
|||
|
|
@ -227,7 +227,7 @@ spec:
|
|||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
* 만약 당신이 {{< glossary_tooltip text="Helm Charts" term_id="helm-chart" >}}에 익숙하다면, 당신의 쿠버네티스 클러스터에 [Helm을 이용하여 서비스 카탈로그를 설치](/docs/tasks/service-catalog/install-service-catalog-using-helm/)할 수 있다. 다른 방법으로 [SC tool을 이용하여 서비스 카탈로그를 설치](/docs/tasks/service-catalog/install-service-catalog-using-sc/)할 수 있다.
|
||||
* 만약 당신이 {{< glossary_tooltip text="Helm Charts" term_id="helm-chart" >}}에 익숙하다면, 당신의 쿠버네티스 클러스터에 [Helm을 이용하여 서비스 카탈로그를 설치](/docs/tasks/service-catalog/install-service-catalog-using-helm/)할 수 있다. 다른 방법으로 [SC tool을 이용하여 서비스 카탈로그를 설치](/ko/docs/tasks/service-catalog/install-service-catalog-using-sc/)할 수 있다.
|
||||
* [샘플 서비스 브로커](https://github.com/openservicebrokerapi/servicebroker/blob/master/gettingStarted.md#sample-service-brokers) 살펴보기
|
||||
* [kubernetes-sigs/service-catalog](https://github.com/kubernetes-sigs/service-catalog) 프로젝트 탐색
|
||||
* [svc-cat.io](https://svc-cat.io/docs/) 살펴보기
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
---
|
||||
|
||||
|
||||
title: 쿠버네티스 API
|
||||
content_type: concept
|
||||
weight: 30
|
||||
|
|
@ -35,36 +37,39 @@ card:
|
|||
|
||||
완전한 API 상세 내용은 [OpenAPI](https://www.openapis.org/)를 활용해서 문서화했다.
|
||||
|
||||
OpenAPI 규격은 `/openapi/v2` 엔드포인트에서만 제공된다.
|
||||
다음과 같은 요청 헤더를 사용해서 응답 형식을 요청할 수 있다.
|
||||
### OpenAPI V2
|
||||
|
||||
쿠버네티스 API 서버는 `/openapi/v2` 엔드포인트를 통해
|
||||
통합된(aggregated) OpenAPI v2 스펙을 제공한다.
|
||||
요청 헤더에 다음과 같이 기재하여 응답 형식을 지정할 수 있다.
|
||||
|
||||
<table>
|
||||
<caption style="display:none">Valid request header values for OpenAPI v2 queries</caption>
|
||||
<caption style="display:none"> OpenAPI v2 질의에 사용할 수 있는 유효한 요청 헤더 값</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Header</th>
|
||||
<th style="min-width: 50%;">Possible values</th>
|
||||
<th>Notes</th>
|
||||
<th>헤더</th>
|
||||
<th style="min-width: 50%;">사용할 수 있는 값</th>
|
||||
<th>참고</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>Accept-Encoding</code></td>
|
||||
<td><code>gzip</code></td>
|
||||
<td><em>not supplying this header is also acceptable</em></td>
|
||||
<td><em>이 헤더를 제공하지 않는 것도 가능</em></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="3"><code>Accept</code></td>
|
||||
<td><code>application/com.github.proto-openapi.spec.v2@v1.0+protobuf</code></td>
|
||||
<td><em>mainly for intra-cluster use</em></td>
|
||||
<td><em>주로 클러스터 내부 용도로 사용</em></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>application/json</code></td>
|
||||
<td><em>default</em></td>
|
||||
<td><em>기본값</em></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>*</code></td>
|
||||
<td><em>serves </em><code>application/json</code></td>
|
||||
<td><code>JSON으로 응답</em></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
@ -75,6 +80,55 @@ Protobuf에 기반한 직렬화 형식을 구현한다. 이 형식에 대한
|
|||
API 오브젝트를 정의하는 Go 패키지에 들어있는 각각의 스키마에 대한
|
||||
IDL(인터페이스 정의 언어) 파일을 참고한다.
|
||||
|
||||
### OpenAPI V3
|
||||
|
||||
{{< feature-state state="alpha" for_k8s_version="v1.23" >}}
|
||||
|
||||
쿠버네티스 v1.23은 OpenAPI v3 API 발행(publishing)에 대한 초기 지원을 제공한다.
|
||||
이는 알파 기능이며 기본적으로 비활성화되어 있다.
|
||||
kube-apiserver 구성 요소에
|
||||
`OpenAPIV3` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 이용하여
|
||||
이 알파 기능을 활성화할 수 있다.
|
||||
|
||||
이 기능이 활성화되면, 쿠버네티스 API 서버는
|
||||
통합된(aggregated) OpenAPI v3 스펙을 쿠버네티스 그룹 버전별로
|
||||
`/openapi/v3/apis/<group>/<version>` 엔드포인트에 제공한다.
|
||||
사용할 수 있는 요청 헤더는 아래의 표를 참고한다.
|
||||
|
||||
<table>
|
||||
<caption style="display:none"> OpenAPI v3 질의에 사용할 수 있는 유효한 요청 헤더 값</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>헤더</th>
|
||||
<th style="min-width: 50%;">사용할 수 있는 값</th>
|
||||
<th>참고</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>Accept-Encoding</code></td>
|
||||
<td><code>gzip</code></td>
|
||||
<td><em>이 헤더를 제공하지 않는 것도 가능</em></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="3"><code>Accept</code></td>
|
||||
<td><code>application/com.github.proto-openapi.spec.v3@v1.0+protobuf</code></td>
|
||||
<td><em>주로 클러스터 내부 용도로 사용</em></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>application/json</code></td>
|
||||
<td><em>기본값</em></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>*</code></td>
|
||||
<td><code>JSON으로 응답</em></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
`/openapi/v3` 디스커버리 엔드포인트는 사용 가능한 모든
|
||||
그룹/버전의 목록을 제공한다. 이 엔드포인트는 JSON 만을 반환한다.
|
||||
|
||||
## 지속성
|
||||
|
||||
쿠버네티스는 오브젝트의 직렬화된 상태를
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ _스코어링_ 단계에서 스케줄러는 목록에 남아있는 노드의 순
|
|||
* [스케줄러 성능 튜닝](/ko/docs/concepts/scheduling-eviction/scheduler-perf-tuning/)에 대해 읽기
|
||||
* [파드 토폴로지 분배 제약 조건](/ko/docs/concepts/workloads/pods/pod-topology-spread-constraints/)에 대해 읽기
|
||||
* kube-scheduler의 [레퍼런스 문서](/docs/reference/command-line-tools-reference/kube-scheduler/) 읽기
|
||||
* [kube-scheduler 구성(v1beta2)](/docs/reference/config-api/kube-scheduler-config.v1beta2/) 레퍼런스 읽기
|
||||
* [kube-scheduler 구성(v1beta3)](/docs/reference/config-api/kube-scheduler-config.v1beta3/) 레퍼런스 읽기
|
||||
* [멀티 스케줄러 구성하기](/docs/tasks/extend-kubernetes/configure-multiple-schedulers/)에 대해 배우기
|
||||
* [토폴로지 관리 정책](/docs/tasks/administer-cluster/topology-manager/)에 대해 배우기
|
||||
* [파드 오버헤드](/ko/docs/concepts/scheduling-eviction/pod-overhead/)에 대해 배우기
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ kube-scheduler 의 `percentageOfNodesToScore` 설정을 통해
|
|||
마치 100을 설정한 것처럼 작동한다.
|
||||
|
||||
값을 변경하려면,
|
||||
[kube-scheduler 구성 파일](/docs/reference/config-api/kube-scheduler-config.v1beta2/)을
|
||||
[kube-scheduler 구성 파일](/docs/reference/config-api/kube-scheduler-config.v1beta3/)을
|
||||
편집한 다음 스케줄러를 재시작한다.
|
||||
대부분의 경우, 구성 파일은 `/etc/kubernetes/config/kube-scheduler.yaml` 에서 찾을 수 있다.
|
||||
|
||||
|
|
@ -161,4 +161,4 @@ percentageOfNodesToScore: 50
|
|||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
* [kube-scheduler 구성 레퍼런스(v1beta2)](/docs/reference/config-api/kube-scheduler-config.v1beta2/) 확인
|
||||
* [kube-scheduler 구성 레퍼런스(v1beta3)](/docs/reference/config-api/kube-scheduler-config.v1beta3/) 확인
|
||||
|
|
|
|||
|
|
@ -203,7 +203,7 @@ tolerations:
|
|||
* `tolerationSeconds` 가 지정된 테인트를 용인하는 파드는 지정된
|
||||
시간 동안 바인딩된 상태로 유지된다.
|
||||
|
||||
노드 컨트롤러는 특정 조건이 참일 때 자동으로
|
||||
노드 컨트롤러는 특정 컨디션이 참일 때 자동으로
|
||||
노드를 테인트시킨다. 다음은 빌트인 테인트이다.
|
||||
|
||||
* `node.kubernetes.io/not-ready`: 노드가 준비되지 않았다. 이는 NodeCondition
|
||||
|
|
@ -264,19 +264,19 @@ tolerations:
|
|||
|
||||
이렇게 하면 이러한 문제로 인해 데몬셋 파드가 축출되지 않는다.
|
||||
|
||||
## 조건(condition)을 기준으로 노드 테인트하기
|
||||
## 컨디션(condition)을 기준으로 노드 테인트하기
|
||||
|
||||
컨트롤 플레인은 노드 {{<glossary_tooltip text="컨트롤러" term_id="controller">}}를 이용하여
|
||||
[노드 조건](/ko/docs/concepts/scheduling-eviction/node-pressure-eviction/#node-conditions)에 대한 `NoSchedule` 효과를 사용하여 자동으로 테인트를 생성한다.
|
||||
[노드 컨디션](/ko/docs/concepts/scheduling-eviction/node-pressure-eviction/#node-conditions)에 대한 `NoSchedule` 효과를 사용하여 자동으로 테인트를 생성한다.
|
||||
|
||||
스케줄러는 스케줄링 결정을 내릴 때 노드 조건을 확인하는 것이 아니라 테인트를 확인한다.
|
||||
이렇게 하면 노드 조건이 스케줄링에 직접적인 영향을 주지 않는다.
|
||||
예를 들어 `DiskPressure` 노드 조건이 활성화된 경우
|
||||
스케줄러는 스케줄링 결정을 내릴 때 노드 컨디션을 확인하는 것이 아니라 테인트를 확인한다.
|
||||
이렇게 하면 노드 컨디션이 스케줄링에 직접적인 영향을 주지 않는다.
|
||||
예를 들어 `DiskPressure` 노드 컨디션이 활성화된 경우
|
||||
컨트롤 플레인은 `node.kubernetes.io/disk-pressure` 테인트를 추가하고 영향을 받는 노드에 새 파드를 할당하지 않는다.
|
||||
`MemoryPressure` 노드 조건이 활성화되면
|
||||
`MemoryPressure` 노드 컨디션이 활성화되면
|
||||
컨트롤 플레인이 `node.kubernetes.io/memory-pressure` 테인트를 추가한다.
|
||||
|
||||
새로 생성된 파드에 파드 톨러레이션을 추가하여 노드 조건을 무시하도록 할 수 있다.
|
||||
새로 생성된 파드에 파드 톨러레이션을 추가하여 노드 컨디션을 무시하도록 할 수 있다.
|
||||
또한 컨트롤 플레인은 `BestEffort` 이외의
|
||||
{{< glossary_tooltip text="QoS 클래스" term_id="qos-class" >}}를 가지는 파드에
|
||||
`node.kubernetes.io/memory-pressure` 톨러레이션을 추가한다.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
---
|
||||
|
||||
|
||||
|
||||
|
||||
title: 서비스와 애플리케이션 연결하기
|
||||
content_type: concept
|
||||
weight: 30
|
||||
|
|
@ -50,7 +54,7 @@ kubectl get pods -l run=my-nginx -o yaml | grep podIP
|
|||
|
||||
클러스터의 모든 노드로 ssh 접속하고 두 IP로 curl을 할수 있어야 한다. 컨테이너는 노드의 포트 80을 사용하지 *않으며* , 트래픽을 파드로 라우팅하는 특별한 NAT 규칙도 없다는 것을 참고한다. 이것은 동일한 containerPort를 사용해서 동일한 노드에서 여러 nginx 파드를 실행하고 IP를 사용해서 클러스터의 다른 파드나 노드에서 접근할 수 있다는 의미이다. 도커와 마찬가지로 포트는 여전히 호스트 노드의 인터페이스에 게시될 수 있지만, 네트워킹 모델로 인해 포트의 필요성이 크게 줄어든다.
|
||||
|
||||
만약 궁금하다면 [우리가 이것을 달성하는 방법](/ko/docs/concepts/cluster-administration/networking/#쿠버네티스-네트워크-모델의-구현-방법)을 자세히 읽어본다.
|
||||
만약 궁금하다면 [쿠버네티스 네트워킹 모델](/ko/docs/concepts/cluster-administration/networking/#쿠버네티스-네트워크-모델)을 자세히 읽어본다.
|
||||
|
||||
## 서비스 생성하기
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ DNS 쿼리는 그것을 생성하는 파드의 네임스페이스에 따라 다
|
|||
|
||||
DNS 쿼리는 파드의 `/etc/resolv.conf` 를 사용하여 확장될 수 있을 것이다. Kubelet은
|
||||
각 파드에 대해서 파일을 설정한다. 예를 들어, `data` 만을 위한 쿼리는
|
||||
`data.test.cluster.local` 로 확장된다. `search` 옵션의 값은
|
||||
`data.test.svc.cluster.local` 로 확장된다. `search` 옵션의 값은
|
||||
쿼리를 확장하기 위해서 사용된다. DNS 쿼리에 대해 더 자세히 알고 싶은 경우,
|
||||
[`resolv.conf` 설명 페이지.](https://www.man7.org/linux/man-pages/man5/resolv.conf.5.html)를 참고한다.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,9 @@
|
|||
---
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
title: IPv4/IPv6 이중 스택
|
||||
feature:
|
||||
title: IPv4/IPv6 이중 스택
|
||||
|
|
@ -11,7 +16,7 @@ weight: 70
|
|||
|
||||
<!-- overview -->
|
||||
|
||||
{{< feature-state for_k8s_version="v1.21" state="beta" >}}
|
||||
{{< feature-state for_k8s_version="v1.23" state="stable" >}}
|
||||
|
||||
IPv4/IPv6 이중 스택 네트워킹을 사용하면 {{< glossary_tooltip text="파드" term_id="pod" >}}와 {{< glossary_tooltip text="서비스" term_id="service" >}}에 IPv4와 IPv6 주소를 모두 할당할 수 있다.
|
||||
|
||||
|
|
@ -42,8 +47,6 @@ IPv4/IPv6 이중 스택 쿠버네티스 클러스터를 활용하려면 다음
|
|||
|
||||
## IPv4/IPv6 이중 스택 구성
|
||||
|
||||
IPv4/IPv6 이중 스택을 사용하려면, 클러스터의 관련 구성 요소에 대해 `IPv6DualStack` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 활성화한다. (1.21부터 IPv4/IPv6 이중 스택이 기본적으로 활성화된다.)
|
||||
|
||||
IPv4/IPv6 이중 스택을 구성하려면, 이중 스택 클러스터 네트워크 할당을 설정한다.
|
||||
|
||||
* kube-apiserver:
|
||||
|
|
@ -60,9 +63,6 @@ IPv4 CIDR의 예: `10.244.0.0/16` (자신의 주소 범위를 제공하더라도
|
|||
|
||||
IPv6 CIDR의 예: `fdXY:IJKL:MNOP:15::/64` (이 형식으로 표시되지만, 유효한 주소는 아니다 - [RFC 4193](https://tools.ietf.org/html/rfc4193)을 본다.)
|
||||
|
||||
1.21부터, IPv4/IPv6 이중 스택은 기본적으로 활성화된다.
|
||||
필요한 경우 kube-apiserver, kube-controller-manager, kubelet 및 kube-proxy 커맨드 라인에
|
||||
`--feature-gates="IPv6DualStack=false"` 를 지정하여 비활성화할 수 있다.
|
||||
{{< /note >}}
|
||||
|
||||
## 서비스
|
||||
|
|
@ -76,7 +76,7 @@ IPv4, IPv6 또는 둘 다를 사용할 수 있는 {{< glossary_tooltip text="서
|
|||
|
||||
* `SingleStack`: 단일 스택 서비스. 컨트롤 플레인은 첫 번째로 구성된 서비스 클러스터 IP 범위를 사용하여 서비스에 대한 클러스터 IP를 할당한다.
|
||||
* `PreferDualStack`:
|
||||
* 서비스에 IPv4 및 IPv6 클러스터 IP를 할당한다. (클러스터에 `--feature-gates="IPv6DualStack=false"` 가 있는 경우, 이 설정은 `SingleStack` 과 동일한 동작을 따른다.)
|
||||
* 서비스에 IPv4 및 IPv6 클러스터 IP를 할당한다.
|
||||
* `RequireDualStack`: IPv4 및 IPv6 주소 범위 모두에서 서비스 `.spec.ClusterIPs`를 할당한다.
|
||||
* `.spec.ipFamilies` 배열의 첫 번째 요소의 주소 계열을 기반으로 `.spec.ClusterIPs` 목록에서 `.spec.ClusterIP`를 선택한다.
|
||||
|
||||
|
|
@ -119,7 +119,7 @@ IPv4, IPv6 또는 둘 다를 사용할 수 있는 {{< glossary_tooltip text="서
|
|||
|
||||
#### 기존 서비스의 이중 스택 기본값
|
||||
|
||||
이 예제는 서비스가 이미 있는 클러스터에서 이중 스택이 새로 활성화된 경우의 기본 동작을 보여준다. (`--feature-gates="IPv6DualStack=false"` 가 설정되지 않은 경우 기존 클러스터를 1.21로 업그레이드하면 이중 스택이 활성화된다.)
|
||||
이 예제는 서비스가 이미 있는 클러스터에서 이중 스택이 새로 활성화된 경우의 기본 동작을 보여준다. (기존 클러스터를 1.21 이상으로 업그레이드하면 이중 스택이 활성화된다.)
|
||||
|
||||
1. 클러스터에서 이중 스택이 활성화된 경우 기존 서비스 (`IPv4` 또는 `IPv6`)는 컨트롤 플레인이 `.spec.ipFamilyPolicy`를 `SingleStack`으로 지정하고 `.spec.ipFamilies`를 기존 서비스의 주소 계열로 설정한다. 기존 서비스 클러스터 IP는 `.spec.ClusterIPs`에 저장한다.
|
||||
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ weight: 40
|
|||
컨트롤러다.
|
||||
* [Apache APISIX 인그레스 컨트롤러](https://github.com/apache/apisix-ingress-controller)는 [Apache APISIX](https://github.com/apache/apisix) 기반의 인그레스 컨트롤러이다.
|
||||
* [Avi 쿠버네티스 오퍼레이터](https://github.com/vmware/load-balancer-and-ingress-services-for-kubernetes)는 [VMware NSX Advanced Load Balancer](https://avinetworks.com/)을 사용하는 L4-L7 로드 밸런싱을 제공한다.
|
||||
* [BFE Ingress Controller](https://github.com/bfenetworks/ingress-bfe)는 [BFE](https://www.bfe-networks.net) 기반 인그레스 컨트롤러다.
|
||||
* [Citrix 인그레스 컨트롤러](https://github.com/citrix/citrix-k8s-ingress-controller#readme)는
|
||||
Citrix 애플리케이션 딜리버리 컨트롤러에서 작동한다.
|
||||
* [Contour](https://projectcontour.io/)는 [Envoy](https://www.envoyproxy.io/) 기반 인그레스 컨트롤러다.
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ graph LR;
|
|||
인그레스는 외부에서 서비스로 접속이 가능한 URL, 로드 밸런스 트래픽, SSL / TLS 종료 그리고 이름-기반의 가상 호스팅을 제공하도록 구성할 수 있다. [인그레스 컨트롤러](/ko/docs/concepts/services-networking/ingress-controllers)는 일반적으로 로드 밸런서를 사용해서 인그레스를 수행할 책임이 있으며, 트래픽을 처리하는데 도움이 되도록 에지 라우터 또는 추가 프런트 엔드를 구성할 수도 있다.
|
||||
|
||||
인그레스는 임의의 포트 또는 프로토콜을 노출시키지 않는다. HTTP와 HTTPS 이외의 서비스를 인터넷에 노출하려면 보통
|
||||
[Service.Type=NodePort](/ko/docs/concepts/services-networking/service/#nodeport) 또는
|
||||
[Service.Type=NodePort](/ko/docs/concepts/services-networking/service/#type-nodeport) 또는
|
||||
[Service.Type=LoadBalancer](/ko/docs/concepts/services-networking/service/#loadbalancer) 유형의 서비스를 사용한다.
|
||||
|
||||
## 전제 조건들
|
||||
|
|
@ -219,20 +219,98 @@ Events: <none>
|
|||
|
||||
{{< codenew file="service/networking/external-lb.yaml" >}}
|
||||
|
||||
IngressClass 리소스에는 선택적인 파라미터 필드가 있다. 이 클래스에 대한
|
||||
추가 구현 별 구성을 참조하는데 사용할 수 있다.
|
||||
인그레스클래스의 `.spec.parameters` 필드를 사용하여
|
||||
해당 인그레스클래스와 연관있는 환경 설정을 제공하는 다른 리소스를 참조할 수 있다.
|
||||
|
||||
#### 네임스페이스 범위의 파라미터
|
||||
사용 가능한 파라미터의 상세한 타입은
|
||||
인그레스클래스의 `.spec.parameters` 필드에 명시한 인그레스 컨트롤러의 종류에 따라 다르다.
|
||||
|
||||
{{< feature-state for_k8s_version="v1.22" state="beta" >}}
|
||||
### 인그레스클래스 범위
|
||||
|
||||
`Parameters` 필드에는 인그레스 클래스 구성을 위해 네임스페이스 별 리소스를 참조하는 데
|
||||
사용할 수 있는 `scope` 및 `namespace` 필드가 있다.
|
||||
`Scope` 필드의 기본값은 `Cluster` 이다. 즉, 기본값은 클러스터 범위의
|
||||
리소스이다. `Scope` 를 `Namespace` 로 설정하고 `Namespace` 필드를
|
||||
설정하면 특정 네임스페이스의 파라미터 리소스를 참조한다.
|
||||
인그레스 컨트롤러의 종류에 따라, 클러스터 범위로 설정한 파라미터의 사용이 가능할 수도 있고,
|
||||
또는 한 네임스페이스에서만 사용 가능할 수도 있다.
|
||||
|
||||
{{< codenew file="service/networking/namespaced-params.yaml" >}}
|
||||
{{< tabs name="tabs_ingressclass_parameter_scope" >}}
|
||||
{{% tab name="클러스터" %}}
|
||||
인그레스클래스 파라미터의 기본 범위는 클러스터 범위이다.
|
||||
|
||||
`.spec.parameters` 필드만 설정하고 `.spec.parameters.scope` 필드는 지정하지 않거나,
|
||||
`.spec.parameters.scope` 필드를 `Cluster`로 지정하면,
|
||||
인그레스클래스는 클러스터 범위의 리소스를 참조한다.
|
||||
파라미터의 `kind`(+`apiGroup`)는
|
||||
클러스터 범위의 API (커스텀 리소스일 수도 있음) 를 참조하며,
|
||||
파라미터의 `name`은
|
||||
해당 API에 대한 특정 클러스터 범위 리소스를 가리킨다.
|
||||
|
||||
예시는 다음과 같다.
|
||||
```yaml
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: IngressClass
|
||||
metadata:
|
||||
name: external-lb-1
|
||||
spec:
|
||||
controller: example.com/ingress-controller
|
||||
parameters:
|
||||
# 이 인그레스클래스에 대한 파라미터는 "external-config-1" 라는
|
||||
# ClusterIngressParameter(API 그룹 k8s.example.net)에 기재되어 있다.
|
||||
# 이 정의는 쿠버네티스가
|
||||
# 클러스터 범위의 파라미터 리소스를 검색하도록 한다.
|
||||
scope: Cluster
|
||||
apiGroup: k8s.example.net
|
||||
kind: ClusterIngressParameter
|
||||
name: external-config-1
|
||||
```
|
||||
{{% /tab %}}
|
||||
{{% tab name="네임스페이스" %}}
|
||||
{{< feature-state for_k8s_version="v1.23" state="stable" >}}
|
||||
|
||||
`.spec.parameters` 필드를 설정하고
|
||||
`.spec.parameters.scope` 필드를 `Namespace`로 지정하면,
|
||||
인그레스클래스는 네임스페이스 범위의 리소스를 참조한다.
|
||||
사용하고자 하는 파라미터가 속한 네임스페이스를
|
||||
`.spec.parameters` 의 `namespace` 필드에 설정해야 한다.
|
||||
|
||||
파라미터의 `kind`(+`apiGroup`)는
|
||||
네임스페이스 범위의 API (예: 컨피그맵) 를 참조하며,
|
||||
파라미터의 `name`은
|
||||
`namespace`에 명시한 네임스페이스의 특정 리소스를 가리킨다.
|
||||
|
||||
네임스페이스 범위의 파라미터를 이용하여,
|
||||
클러스터 운영자가 워크로드에 사용되는 환경 설정(예: 로드 밸런서 설정, API 게이트웨이 정의)에 대한 제어를 위임할 수 있다.
|
||||
클러스터 범위의 파라미터를 사용했다면 다음 중 하나에 해당된다.
|
||||
|
||||
- 다른 팀의 새로운 환경 설정 변경을 적용하려고 할 때마다
|
||||
클러스터 운영 팀이 매번 승인을 해야 한다. 또는,
|
||||
- 애플리케이션 팀이 클러스터 범위 파라미터 리소스를 변경할 수 있게 하는
|
||||
[RBAC](/docs/reference/access-authn-authz/rbac/) 롤, 바인딩 등의 특별 접근 제어를
|
||||
클러스터 운영자가 정의해야 한다.
|
||||
|
||||
인그레스클래스 API 자신은 항상 클러스터 범위이다.
|
||||
|
||||
네임스페이스 범위의 파라미터를 참조하는 인그레스클래스 예시가
|
||||
다음과 같다.
|
||||
```yaml
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: IngressClass
|
||||
metadata:
|
||||
name: external-lb-2
|
||||
spec:
|
||||
controller: example.com/ingress-controller
|
||||
parameters:
|
||||
# 이 인그레스클래스에 대한 파라미터는
|
||||
# "external-configuration" 환경 설정 네임스페이스에 있는
|
||||
# "external-config" 라는 IngressParameter(API 그룹 k8s.example.com)에 기재되어 있다.
|
||||
scope: Namespace
|
||||
apiGroup: k8s.example.com
|
||||
kind: IngressParameter
|
||||
namespace: external-configuration
|
||||
name: external-config
|
||||
```
|
||||
|
||||
{{% /tab %}}
|
||||
{{< /tabs >}}
|
||||
|
||||
### 사용중단(Deprecated) 어노테이션
|
||||
|
||||
|
|
@ -559,12 +637,12 @@ Events:
|
|||
사용자는 인그레스 리소스를 직접적으로 포함하지 않는 여러가지 방법으로 서비스를 노출할 수 있다.
|
||||
|
||||
* [Service.Type=LoadBalancer](/ko/docs/concepts/services-networking/service/#loadbalancer) 사용.
|
||||
* [Service.Type=NodePort](/ko/docs/concepts/services-networking/service/#nodeport) 사용.
|
||||
* [Service.Type=NodePort](/ko/docs/concepts/services-networking/service/#type-nodeport) 사용.
|
||||
|
||||
|
||||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
* [인그레스 API](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#ingress-v1beta1-networking-k8s-io)에 대해 배우기
|
||||
* [인그레스](/docs/reference/kubernetes-api/service-resources/ingress-v1/) API에 대해 배우기
|
||||
* [인그레스 컨트롤러](/ko/docs/concepts/services-networking/ingress-controllers/)에 대해 배우기
|
||||
* [NGINX 컨트롤러로 Minikube에서 인그레스 구성하기](/ko/docs/tasks/access-application-cluster/ingress-minikube/)
|
||||
|
|
|
|||
|
|
@ -68,6 +68,6 @@ kube-proxy는 `spec.internalTrafficPolicy` 의 설정에 따라서 라우팅되
|
|||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
* [토폴로지 인식 힌트 활성화](/ko/docs/tasks/administer-cluster/enabling-topology-aware-hints/)에 대해서 읽기
|
||||
* [토폴로지 인식 힌트](/docs/concepts/services-networking/topology-aware-hints/)에 대해서 읽기
|
||||
* [서비스 외부 트래픽 정책](/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip)에 대해서 읽기
|
||||
* [서비스와 애플리케이션 연결하기](/ko/docs/concepts/services-networking/connect-applications-service/) 읽기
|
||||
|
|
|
|||
|
|
@ -550,7 +550,7 @@ API에서 `엔드포인트` 레코드를 생성하고, DNS 구성을 수정하
|
|||
* `ClusterIP`: 서비스를 클러스터-내부 IP에 노출시킨다. 이 값을 선택하면
|
||||
클러스터 내에서만 서비스에 도달할 수 있다. 이것은
|
||||
`ServiceTypes`의 기본 값이다.
|
||||
* [`NodePort`](#nodeport): 고정 포트 (`NodePort`)로 각 노드의 IP에 서비스를
|
||||
* [`NodePort`](#type-nodeport): 고정 포트 (`NodePort`)로 각 노드의 IP에 서비스를
|
||||
노출시킨다. `NodePort` 서비스가 라우팅되는 `ClusterIP` 서비스가
|
||||
자동으로 생성된다. `<NodeIP>:<NodePort>`를 요청하여,
|
||||
클러스터 외부에서
|
||||
|
|
@ -568,7 +568,7 @@ API에서 `엔드포인트` 레코드를 생성하고, DNS 구성을 수정하
|
|||
[인그레스](/ko/docs/concepts/services-networking/ingress/)를 사용하여 서비스를 노출시킬 수도 있다. 인그레스는 서비스 유형이 아니지만, 클러스터의 진입점 역할을 한다. 동일한 IP 주소로 여러 서비스를
|
||||
노출시킬 수 있기 때문에 라우팅 규칙을 단일 리소스로 통합할 수 있다.
|
||||
|
||||
### NodePort 유형 {#nodeport}
|
||||
### NodePort 유형 {#type-nodeport}
|
||||
|
||||
`type` 필드를 `NodePort`로 설정하면, 쿠버네티스 컨트롤 플레인은
|
||||
`--service-node-port-range` 플래그로 지정된 범위에서 포트를 할당한다 (기본값 : 30000-32767).
|
||||
|
|
|
|||
|
|
@ -10,14 +10,13 @@ feature:
|
|||
title: 스토리지 오케스트레이션
|
||||
description: >
|
||||
로컬 스토리지, <a href="https://cloud.google.com/storage/">GCP</a>나 <a href="https://aws.amazon.com/products/storage/">AWS</a>와 같은 퍼블릭 클라우드 공급자 또는 NFS, iSCSI, Gluster, Ceph, Cinder나 Flocker와 같은 네트워크 스토리지 시스템에서 원하는 스토리지 시스템을 자동으로 마운트한다.
|
||||
|
||||
content_type: concept
|
||||
weight: 20
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
이 페이지는 쿠버네티스의 _퍼시스턴트 볼륨_ 의 현재 상태를 설명한다. [볼륨](/ko/docs/concepts/storage/volumes/)에 대해 익숙해지는 것을 추천한다.
|
||||
이 페이지에서는 쿠버네티스의 _퍼시스턴트 볼륨_ 에 대해 설명한다. [볼륨](/ko/docs/concepts/storage/volumes/)에 대해 익숙해지는 것을 추천한다.
|
||||
|
||||
<!-- body -->
|
||||
|
||||
|
|
@ -221,19 +220,19 @@ spec:
|
|||
|
||||
{{< feature-state for_k8s_version="v1.11" state="beta" >}}
|
||||
|
||||
이제 퍼시스턴트볼륨클레임(PVC) 확장 지원이 기본적으로 활성화되어 있다. 다음 유형의
|
||||
퍼시스턴트볼륨클레임(PVC) 확장 지원은 기본적으로 활성화되어 있다. 다음 유형의
|
||||
볼륨을 확장할 수 있다.
|
||||
|
||||
* gcePersistentDisk
|
||||
* azureDisk
|
||||
* azureFile
|
||||
* awsElasticBlockStore
|
||||
* Cinder
|
||||
* cinder (deprecated)
|
||||
* {{< glossary_tooltip text="csi" term_id="csi" >}}
|
||||
* flexVolume (deprecated)
|
||||
* gcePersistentDisk
|
||||
* glusterfs
|
||||
* rbd
|
||||
* Azure File
|
||||
* Azure Disk
|
||||
* Portworx
|
||||
* FlexVolumes
|
||||
* {{< glossary_tooltip text="CSI" term_id="csi" >}}
|
||||
* portworxVolume
|
||||
|
||||
스토리지 클래스의 `allowVolumeExpansion` 필드가 true로 설정된 경우에만 PVC를 확장할 수 있다.
|
||||
|
||||
|
|
@ -270,7 +269,7 @@ CSI 볼륨 확장 지원은 기본적으로 활성화되어 있지만 볼륨 확
|
|||
경우에만 파일시스템의 크기가 조정된다. 파일시스템 확장은 파드가 시작되거나
|
||||
파드가 실행 중이고 기본 파일시스템이 온라인 확장을 지원할 때 수행된다.
|
||||
|
||||
FlexVolumes는 `RequiresFSResize` 기능으로 드라이버가 `true`로 설정된 경우 크기 조정을 허용한다.
|
||||
FlexVolumes(쿠버네티스 v1.23부터 사용 중단됨)는 드라이버의 `RequiresFSResize` 기능이 `true`로 설정된 경우 크기 조정을 허용한다.
|
||||
FlexVolume은 파드 재시작 시 크기를 조정할 수 있다.
|
||||
|
||||
#### 사용 중인 퍼시스턴트볼륨클레임 크기 조정
|
||||
|
|
@ -299,6 +298,11 @@ EBS 볼륨 확장은 시간이 많이 걸리는 작업이다. 또한 6시간마
|
|||
|
||||
#### 볼륨 확장 시 오류 복구
|
||||
|
||||
사용자가 기반 스토리지 시스템이 제공할 수 있는 것보다 더 큰 사이즈를 지정하면, 사용자 또는 클러스터 관리자가 조치를 취하기 전까지 PVC 확장을 계속 시도한다. 이는 바람직하지 않으며 따라서 쿠버네티스는 이러한 오류 상황에서 벗어나기 위해 다음과 같은 방법을 제공한다.
|
||||
|
||||
{{< tabs name="recovery_methods" >}}
|
||||
{{% tab name="클러스터 관리자 접근 권한을 이용하여 수동으로" %}}
|
||||
|
||||
기본 스토리지 확장에 실패하면, 클러스터 관리자가 수동으로 퍼시스턴트 볼륨 클레임(PVC) 상태를 복구하고 크기 조정 요청을 취소할 수 있다. 그렇지 않으면, 컨트롤러가 관리자 개입 없이 크기 조정 요청을 계속해서 재시도한다.
|
||||
|
||||
1. 퍼시스턴트볼륨클레임(PVC)에 바인딩된 퍼시스턴트볼륨(PV)을 `Retain` 반환 정책으로 표시한다.
|
||||
|
|
@ -307,6 +311,30 @@ EBS 볼륨 확장은 시간이 많이 걸리는 작업이다. 또한 6시간마
|
|||
4. PV 보다 작은 크기로 PVC를 다시 만들고 PVC의 `volumeName` 필드를 PV 이름으로 설정한다. 이것은 새 PVC를 기존 PV에 바인딩해야 한다.
|
||||
5. PV의 반환 정책을 복원하는 것을 잊지 않는다.
|
||||
|
||||
{{% /tab %}}
|
||||
{{% tab name="더 작은 크기로의 확장을 요청하여" %}}
|
||||
{{% feature-state for_k8s_version="v1.23" state="alpha" %}}
|
||||
|
||||
{{< note >}}
|
||||
PVC 확장 실패의 사용자에 의한 복구는 쿠버네티스 1.23부터 제공되는 알파 기능이다. 이 기능이 작동하려면 `RecoverVolumeExpansionFailure` 기능이 활성화되어 있어야 한다. 더 많은 정보는 [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/) 문서를 참조한다.
|
||||
{{< /note >}}
|
||||
|
||||
클러스터에 `ExpandPersistentVolumes`와 `RecoverVolumeExpansionFailure`
|
||||
기능 게이트가 활성화되어 있는 상태에서 PVC 확장이 실패하면
|
||||
이전에 요청했던 값보다 작은 크기로의 확장을 재시도할 수 있다.
|
||||
더 작은 크기를 지정하여 확장 시도를 요청하려면,
|
||||
이전에 요청했던 값보다 작은 크기로 PVC의 `.spec.resources` 값을 수정한다.
|
||||
이는 총 용량 제한(capacity constraint)으로 인해 큰 값으로의 확장이 실패한 경우에 유용하다.
|
||||
만약 확장이 실패했다면, 또는 실패한 것 같다면, 기반 스토리지 공급자의 용량 제한보다 작은 값으로 확장을 재시도할 수 있다.
|
||||
`.status.resizeStatus`와 PVC의 이벤트를 감시하여 리사이즈 작업의 상태를 모니터할 수 있다.
|
||||
|
||||
참고:
|
||||
이전에 요청했던 값보다 작은 크기를 요청했더라도,
|
||||
새로운 값이 여전히 `.status.capacity`보다 클 수 있다.
|
||||
쿠버네티스는 PVC를 현재 크기보다 더 작게 축소하는 것은 지원하지 않는다.
|
||||
{{% /tab %}}
|
||||
{{% /tabs %}}
|
||||
|
||||
|
||||
## 퍼시스턴트 볼륨의 유형
|
||||
|
||||
|
|
@ -318,7 +346,6 @@ EBS 볼륨 확장은 시간이 많이 걸리는 작업이다. 또한 6시간마
|
|||
* [`cephfs`](/ko/docs/concepts/storage/volumes/#cephfs) - CephFS 볼륨
|
||||
* [`csi`](/ko/docs/concepts/storage/volumes/#csi) - 컨테이너 스토리지 인터페이스 (CSI)
|
||||
* [`fc`](/ko/docs/concepts/storage/volumes/#fc) - Fibre Channel (FC) 스토리지
|
||||
* [`flexVolume`](/ko/docs/concepts/storage/volumes/#flexVolume) - FlexVolume
|
||||
* [`gcePersistentDisk`](/ko/docs/concepts/storage/volumes/#gcepersistentdisk) - GCE Persistent Disk
|
||||
* [`glusterfs`](/ko/docs/concepts/storage/volumes/#glusterfs) - Glusterfs 볼륨
|
||||
* [`hostPath`](/ko/docs/concepts/storage/volumes/#hostpath) - HostPath 볼륨
|
||||
|
|
@ -336,6 +363,8 @@ EBS 볼륨 확장은 시간이 많이 걸리는 작업이다. 또한 6시간마
|
|||
|
||||
* [`cinder`](/ko/docs/concepts/storage/volumes/#cinder) - Cinder (오픈스택 블록 스토리지)
|
||||
(v1.18에서 **사용 중단**)
|
||||
* [`flexVolume`](/ko/docs/concepts/storage/volumes/#flexvolume) - FlexVolume
|
||||
(v1.23에서 **사용 중단**)
|
||||
* [`flocker`](/ko/docs/concepts/storage/volumes/#flocker) - Flocker 스토리지
|
||||
(v1.22에서 **사용 중단**)
|
||||
* [`quobyte`](/ko/docs/concepts/storage/volumes/#quobyte) - Quobyte 볼륨
|
||||
|
|
@ -417,9 +446,12 @@ spec:
|
|||
`ReadWriteOnce`
|
||||
: 하나의 노드에서 해당 볼륨이 읽기-쓰기로 마운트 될 수 있다. ReadWriteOnce 접근 모드에서도 파트가 동일 노드에서 구동되는 경우에는 복수의 파드에서 볼륨에 접근할 수 있다.
|
||||
|
||||
`ReadWriteMany`
|
||||
`ReadOnlyMany`
|
||||
: 볼륨이 다수의 노드에서 읽기 전용으로 마운트 될 수 있다.
|
||||
|
||||
`ReadWriteMany`
|
||||
: 볼륨이 다수의 노드에서 읽기-쓰기로 마운트 될 수 있다.
|
||||
|
||||
`ReadWriteOncePod`
|
||||
: 볼륨이 단일 파드에서 읽기-쓰기로 마운트될 수 있다. 전체 클러스터에서 단 하나의 파드만 해당 PVC를 읽거나 쓸 수 있어야하는 경우 ReadWriteOncePod 접근 모드를 사용한다. 이 기능은 CSI 볼륨과 쿠버네티스 버전 1.22+ 에서만 지원된다.
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
title: 스토리지 용량
|
||||
content_type: concept
|
||||
weight: 45
|
||||
weight: 70
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
|
@ -16,7 +16,6 @@ weight: 45
|
|||
예를 들어, 일부 노드에서 NAS(Network Attached Storage)에 접근할 수 없는 경우가 있을 수 있으며,
|
||||
또는 각 노드에 종속적인 로컬 스토리지를 사용하는 경우일 수도 있다.
|
||||
|
||||
{{< feature-state for_k8s_version="v1.19" state="alpha" >}}
|
||||
{{< feature-state for_k8s_version="v1.21" state="beta" >}}
|
||||
|
||||
이 페이지에서는 쿠버네티스가 어떻게 스토리지 용량을 추적하고
|
||||
|
|
|
|||
|
|
@ -470,14 +470,14 @@ parameters:
|
|||
|
||||
vSphere 스토리지 클래스에는 두 가지 유형의 프로비저닝 도구가 있다.
|
||||
|
||||
- [CSI 프로비저닝 도구](#csi-프로비저닝-도구): `csi.vsphere.vmware.com`
|
||||
- [CSI 프로비저닝 도구](#vsphere-provisioner-csi): `csi.vsphere.vmware.com`
|
||||
- [vCP 프로비저닝 도구](#vcp-프로비저닝-도구): `kubernetes.io/vsphere-volume`
|
||||
|
||||
인-트리 프로비저닝 도구는 [사용 중단](/blog/2019/12/09/kubernetes-1-17-feature-csi-migration-beta/#why-are-we-migrating-in-tree-plugins-to-csi)되었다. CSI 프로비저닝 도구에 대한 자세한 내용은 [쿠버네티스 vSphere CSI 드라이버](https://vsphere-csi-driver.sigs.k8s.io/) 및 [vSphereVolume CSI 마이그레이션](/ko/docs/concepts/storage/volumes/#csi-마이그레이션)을 참고한다.
|
||||
|
||||
#### CSI 프로비저닝 도구 {#vsphere-provisioner-csi}
|
||||
|
||||
vSphere CSI 스토리지클래스 프로비저닝 도구는 Tanzu 쿠버네티스 클러스터에서 작동한다. 예시는 [vSphere CSI 리포지터리](https://raw.githubusercontent.com/kubernetes-sigs/vsphere-csi-driver/master/example/vanilla-k8s-file-driver/example-sc.yaml)를 참조한다.
|
||||
vSphere CSI 스토리지클래스 프로비저닝 도구는 Tanzu 쿠버네티스 클러스터에서 작동한다. 예시는 [vSphere CSI 리포지터리](https://github.com/kubernetes-sigs/vsphere-csi-driver/blob/master/example/vanilla-k8s-RWM-filesystem-volumes/example-sc.yaml)를 참조한다.
|
||||
|
||||
#### vCP 프로비저닝 도구
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,12 @@
|
|||
---
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
title: CSI 볼륨 복제하기
|
||||
content_type: concept
|
||||
weight: 30
|
||||
weight: 60
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
title: 볼륨 스냅샷 클래스
|
||||
content_type: concept
|
||||
weight: 30
|
||||
weight: 41 # just after volume snapshots
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
|
|
|||
|
|
@ -1,7 +1,14 @@
|
|||
---
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
title: 볼륨 스냅샷
|
||||
content_type: concept
|
||||
weight: 20
|
||||
weight: 40
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
|
|
|||
|
|
@ -44,12 +44,21 @@ weight: 10
|
|||
|
||||
볼륨을 사용하려면, `.spec.volumes` 에서 파드에 제공할 볼륨을 지정하고
|
||||
`.spec.containers[*].volumeMounts` 의 컨테이너에 해당 볼륨을 마운트할 위치를 선언한다.
|
||||
컨테이너의 프로세스는 도커 이미지와 볼륨으로 구성된 파일시스템
|
||||
뷰를 본다. [도커 이미지](https://docs.docker.com/userguide/dockerimages/)는
|
||||
파일시스템 계층의 루트에 있다. 볼륨은 이미지 내에 지정된 경로에
|
||||
마운트된다. 볼륨은 다른 볼륨에 마운트할 수 없거나 다른 볼륨에 대한 하드 링크를
|
||||
가질 수 없다. 파드 구성의 각 컨테이너는 각 볼륨을 마운트할 위치를 독립적으로
|
||||
지정해야 한다.
|
||||
컨테이너의 프로세스는
|
||||
{{< glossary_tooltip text="컨테이너 이미지" term_id="image" >}}의 최초 내용물과
|
||||
컨테이너 안에 마운트된 볼륨(정의된 경우에 한함)으로 구성된 파일시스템을 보게 된다.
|
||||
프로세스는 컨테이너 이미지의 최초 내용물에 해당되는 루트 파일시스템을
|
||||
보게 된다.
|
||||
쓰기가 허용된 경우, 해당 파일시스템에 쓰기 작업을 하면
|
||||
추후 파일시스템에 접근할 때 변경된 내용을 보게 될 것이다.
|
||||
볼륨은 이미지의 [특정 경로](#using-subpath)에
|
||||
마운트된다.
|
||||
파드에 정의된 각 컨테이너에 대해,
|
||||
컨테이너가 사용할 각 볼륨을 어디에 마운트할지 명시해야 한다.
|
||||
|
||||
볼륨은 다른 볼륨 안에 마운트될 수 없다
|
||||
(하지만, [서브패스 사용](#using-subpath)에서 관련 메커니즘을 확인한다).
|
||||
또한, 볼륨은 다른 볼륨에 있는 내용물을 가리키는 하드 링크를 포함할 수 없다.
|
||||
|
||||
## 볼륨 유형들 {#volume-types}
|
||||
|
||||
|
|
@ -802,142 +811,7 @@ spec:
|
|||
### projected
|
||||
|
||||
`Projected` 볼륨은 여러 기존 볼륨 소스를 동일한 디렉터리에 매핑한다.
|
||||
|
||||
현재, 다음 유형의 볼륨 소스를 프로젝티드한다.
|
||||
|
||||
* [`secret`](#secret)
|
||||
* [`downwardAPI`](#downwardapi)
|
||||
* [`configMap`](#configmap)
|
||||
* `serviceAccountToken`
|
||||
|
||||
모든 소스는 파드와 동일한 네임스페이스에 있어야 한다. 더 자세한 내용은
|
||||
[올인원 볼륨 디자인 문서](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node/all-in-one-volume.md)를 본다.
|
||||
|
||||
#### 시크릿, 다운워드 API 그리고 컨피그맵이 있는 구성 예시 {#example-configuration-secret-downwardapi-configmap}
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: volume-test
|
||||
spec:
|
||||
containers:
|
||||
- name: container-test
|
||||
image: busybox
|
||||
volumeMounts:
|
||||
- name: all-in-one
|
||||
mountPath: "/projected-volume"
|
||||
readOnly: true
|
||||
volumes:
|
||||
- name: all-in-one
|
||||
projected:
|
||||
sources:
|
||||
- secret:
|
||||
name: mysecret
|
||||
items:
|
||||
- key: username
|
||||
path: my-group/my-username
|
||||
- downwardAPI:
|
||||
items:
|
||||
- path: "labels"
|
||||
fieldRef:
|
||||
fieldPath: metadata.labels
|
||||
- path: "cpu_limit"
|
||||
resourceFieldRef:
|
||||
containerName: container-test
|
||||
resource: limits.cpu
|
||||
- configMap:
|
||||
name: myconfigmap
|
||||
items:
|
||||
- key: config
|
||||
path: my-group/my-config
|
||||
```
|
||||
|
||||
#### 구성 예시: 기본값이 아닌 소유권 모드 설정의 시크릿 {#example-configuration-secrets-nondefault-permission-mode}
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: volume-test
|
||||
spec:
|
||||
containers:
|
||||
- name: container-test
|
||||
image: busybox
|
||||
volumeMounts:
|
||||
- name: all-in-one
|
||||
mountPath: "/projected-volume"
|
||||
readOnly: true
|
||||
volumes:
|
||||
- name: all-in-one
|
||||
projected:
|
||||
sources:
|
||||
- secret:
|
||||
name: mysecret
|
||||
items:
|
||||
- key: username
|
||||
path: my-group/my-username
|
||||
- secret:
|
||||
name: mysecret2
|
||||
items:
|
||||
- key: password
|
||||
path: my-group/my-password
|
||||
mode: 511
|
||||
```
|
||||
|
||||
각각의 projected 볼륨 소스는 `source` 아래 사양 목록에 있다.
|
||||
파라미터는 두 가지 예외를 제외하고 거의 동일하다.
|
||||
|
||||
* 시크릿의 경우 `secretName` 필드는 컨피그맵 이름과 일치하도록
|
||||
`name` 으로 변경되었다.
|
||||
* `defaultMode` 는 각각의 볼륨 소스에 대해 projected 수준에서만
|
||||
지정할 수 있다. 그러나 위에서 설명한 것처럼 각각의 개별 projection 에 대해 `mode`
|
||||
를 명시적으로 설정할 수 있다.
|
||||
|
||||
`TokenRequestProjection` 기능이 활성화 되면, 현재
|
||||
[서비스 어카운트](/docs/reference/access-authn-authz/authentication/#service-account-tokens)에
|
||||
대한 토큰을 파드의 지정된 경로에 주입할 수 있다. 예를 들면 다음과 같다.
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: sa-token-test
|
||||
spec:
|
||||
containers:
|
||||
- name: container-test
|
||||
image: busybox
|
||||
volumeMounts:
|
||||
- name: token-vol
|
||||
mountPath: "/service-account"
|
||||
readOnly: true
|
||||
volumes:
|
||||
- name: token-vol
|
||||
projected:
|
||||
sources:
|
||||
- serviceAccountToken:
|
||||
audience: api
|
||||
expirationSeconds: 3600
|
||||
path: token
|
||||
```
|
||||
|
||||
예시 파드에 주입된 서비스 어카운트 토큰이 포함된 projected 볼륨이
|
||||
있다. 이 토큰은 파드의 컨테이너에서 쿠버네티스 API 서버에 접근하는데
|
||||
사용할 수 있다. `audience` 필드는 토큰에 의도하는 대상을
|
||||
포함한다. 토큰 수령은 토큰 대상에 지정된 식별자로 자신을 식별해야 하며,
|
||||
그렇지 않으면 토큰을 거부해야 한다. 이 필드는
|
||||
선택 사항이며 기본값은 API 서버의 식별자이다.
|
||||
|
||||
`expirationSeconds` 는 서비스 어카운트 토큰의 예상 유효
|
||||
기간이다. 기본값은 1시간이며 최소 10분(600초)이어야 한다. 관리자는
|
||||
API 서버에 대해 `--service-account-max-token-expiration` 옵션을 지정해서
|
||||
최대 값을 제한할 수도 있다. `path` 필드는 projected 볼륨의 마운트 위치에 대한
|
||||
상대 경로를 지정한다.
|
||||
|
||||
{{< note >}}
|
||||
projected 볼륨 소스를 [`subPath`](#subpath-사용하기) 볼륨으로 마운트해서 사용하는 컨테이너는
|
||||
해당 볼륨 소스의 업데이트를 수신하지 않는다.
|
||||
{{< /note >}}
|
||||
더 자세한 사항은 [projected volumes](/docs/concepts/storage/projected-volumes/)를 참고한다.
|
||||
|
||||
### quobyte (사용 중단됨) {#quobyte}
|
||||
|
||||
|
|
@ -975,6 +849,38 @@ RBD는 읽기-쓰기 모드에서 단일 고객만 마운트할 수 있다.
|
|||
더 자세한 내용은 [RBD 예시](https://github.com/kubernetes/examples/tree/master/volumes/rbd)를
|
||||
참고한다.
|
||||
|
||||
#### RBD CSI 마이그레이션 {#rbd-csi-migration}
|
||||
|
||||
{{< feature-state for_k8s_version="v1.23" state="alpha" >}}
|
||||
|
||||
`RBD`를 위한 `CSIMigration` 기능이 활성화되어 있으면,
|
||||
사용 중이 트리 내(in-tree) 플러그인의 모든 플러그인 동작을
|
||||
`rbd.csi.ceph.com` {{< glossary_tooltip text="CSI" term_id="csi" >}}
|
||||
드라이버로 리다이렉트한다.
|
||||
이 기능을 사용하려면, 클러스터에
|
||||
[Ceph CSI 드라이버](https://github.com/ceph/ceph-csi)가 설치되어 있고
|
||||
`CSIMigration`, `CSIMigrationRBD`
|
||||
[기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)가 활성화되어 있어야 한다.
|
||||
|
||||
{{< note >}}
|
||||
|
||||
스토리지를 관리하는 쿠버네티스 클러스터 관리자는,
|
||||
RBD CSI 드라이버로의 마이그레이션을 시도하기 전에
|
||||
다음의 선행 사항을 완료해야 한다.
|
||||
|
||||
* 쿠버네티스 클러스터에 Ceph CSI 드라이버 (`rbd.csi.ceph.com`) v3.5.0
|
||||
이상을 설치해야 한다.
|
||||
* CSI 드라이버가 동작하기 위해 `clusterID` 필드가 필수이지만
|
||||
트리 내(in-tree) 스토리지클래스는 `monitors` 필드가 필수임을 감안하여,
|
||||
쿠버네티스 저장소 관리자는 monitors 값의
|
||||
해시(예: `#echo -n '<monitors_string>' | md5sum`)
|
||||
기반으로 clusterID를 CSI 컨피그맵 내에 만들고
|
||||
이 clusterID 환경 설정 아래에 monitors 필드를 유지해야 한다.
|
||||
* 또한, 트리 내(in-tree) 스토리지클래스의
|
||||
`adminId` 값이 `admin`이 아니면, 트리 내(in-tree) 스토리지클래스의
|
||||
`adminSecretName` 값이 `adminId` 파라미터 값의
|
||||
base64 값으로 패치되어야 하며, 아니면 이 단계를 건너뛸 수 있다.
|
||||
|
||||
### secret
|
||||
|
||||
`secret` 볼륨은 암호와 같은 민감한 정보를 파드에 전달하는데
|
||||
|
|
@ -1144,6 +1050,16 @@ vSphere CSI 드라이버에서 생성된 새 볼륨은 이러한 파라미터를
|
|||
|
||||
`vsphereVolume` 플러그인이 컨트롤러 관리자와 kubelet에 의해 로드되지 않도록 기능을 비활성화하려면, `InTreePluginvSphereUnregister` 기능 플래그를 `true` 로 설정해야 한다. 이를 위해서는 모든 워커 노드에 `csi.vsphere.vmware.com` {{< glossary_tooltip text="CSI" term_id="csi" >}} 드라이버를 설치해야 한다.
|
||||
|
||||
#### Portworx CSI 마이그레이션
|
||||
{{< feature-state for_k8s_version="v1.23" state="alpha" >}}
|
||||
|
||||
Portworx를 위한 `CSIMigration` 기능이 쿠버네티스 1.23에 추가되었지만
|
||||
알파 상태이기 때문에 기본적으로는 비활성화되어 있다.
|
||||
이 기능은 사용 중이 트리 내(in-tree) 플러그인의 모든 플러그인 동작을
|
||||
`pxd.portworx.com` CSI 드라이버로 리다이렉트한다.
|
||||
이 기능을 사용하려면, 클러스터에 [Portworx CSI 드라이버](https://docs.portworx.com/portworx-install-with-kubernetes/storage-operations/csi/)가
|
||||
설치되어 있고, kube-controller-manager와 kubelet에 `CSIMigrationPortworx=true`로 설정해야 한다.
|
||||
|
||||
## subPath 사용하기 {#using-subpath}
|
||||
|
||||
때로는 단일 파드에서 여러 용도의 한 볼륨을 공유하는 것이 유용하다.
|
||||
|
|
@ -1239,8 +1155,7 @@ spec:
|
|||
## 아웃-오브-트리(out-of-tree) 볼륨 플러그인
|
||||
|
||||
아웃-오브-트리 볼륨 플러그인에는
|
||||
{{< glossary_tooltip text="컨테이너 스토리지 인터페이스" term_id="csi" >}}(CSI) 그리고
|
||||
FlexVolume이 포함된다. 이러한 플러그인을 사용하면 스토리지 벤더들은 플러그인 소스 코드를 쿠버네티스 리포지터리에
|
||||
{{< glossary_tooltip text="컨테이너 스토리지 인터페이스" term_id="csi" >}}(CSI) 그리고 FlexVolume(사용 중단됨)이 포함된다. 이러한 플러그인을 사용하면 스토리지 벤더들은 플러그인 소스 코드를 쿠버네티스 리포지터리에
|
||||
추가하지 않고도 사용자 정의 스토리지 플러그인을 만들 수 있다.
|
||||
|
||||
이전에는 모든 볼륨 플러그인이 "인-트리(in-tree)"에 있었다. "인-트리" 플러그인은 쿠버네티스 핵심 바이너리와
|
||||
|
|
@ -1373,13 +1288,21 @@ CSI 드라이버로 전환할 때 기존 스토리지 클래스, 퍼시스턴트
|
|||
|
||||
### flexVolume
|
||||
|
||||
FlexVolume은 버전 1.2(CSI 이전) 이후 쿠버네티스에 존재하는
|
||||
아웃-오브-트리 플러그인 인터페이스이다. 이것은 exec 기반 모델을 사용해서 드라이버에
|
||||
접속한다. FlexVolume 드라이버 바이너리 파일은 각각의 노드와 일부 경우에 컨트롤 플레인 노드의
|
||||
미리 정의된 볼륨 플러그인 경로에 설치해야 한다.
|
||||
{{< feature-state for_k8s_version="v1.23" state="deprecated" >}}
|
||||
|
||||
FlexVolume은 스토리지 드라이버와 인터페이싱하기 위해 exec 기반 모델을 사용하는 아웃-오브-트리 플러그인 인터페이스이다.
|
||||
FlexVolume 드라이버 바이너리 파일은 각 노드의 미리 정의된 볼륨 플러그인 경로에 설치되어야 하며,
|
||||
일부 경우에는 컨트롤 플레인 노드에도 설치되어야 한다.
|
||||
|
||||
파드는 `flexvolume` 인-트리 볼륨 플러그인을 통해 FlexVolume 드라이버와 상호 작용한다.
|
||||
더 자세한 내용은 [FlexVolume](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-storage/flexvolume.md) 예제를 참고한다.
|
||||
더 자세한 내용은 FlexVolume [README](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-storage/flexvolume.md#readme) 문서를 참고한다.
|
||||
|
||||
{{< note >}}
|
||||
FlexVolume은 사용 중단되었다. 쿠버네티스에 외부 스토리지를 연결하려면 아웃-오브-트리 CSI 드라이버를 사용하는 것을 권장한다.
|
||||
|
||||
FlexVolume 드라이버 메인테이너는 CSI 드라이버를 구현하고 사용자들이 FlexVolume 드라이버에서 CSI로 마이그레이트할 수 있도록 지원해야 한다.
|
||||
FlexVolume 사용자는 워크로드가 동등한 CSI 드라이버를 사용하도록 이전해야 한다.
|
||||
{{< /note >}}
|
||||
|
||||
## 마운트 전파(propagation)
|
||||
|
||||
|
|
|
|||
|
|
@ -17,8 +17,6 @@ _크론잡은_ 반복 일정에 따라 {{< glossary_tooltip term_id="job" text="
|
|||
하나의 크론잡 오브젝트는 _크론탭_ (크론 테이블) 파일의 한 줄과 같다.
|
||||
크론잡은 잡을 [크론](https://ko.wikipedia.org/wiki/Cron) 형식으로 쓰여진 주어진 일정에 따라 주기적으로 동작시킨다.
|
||||
|
||||
추가로, 크론잡 스케줄은 타임존(timezone) 처리를 지원해서, 크론잡 스케줄 시작 부분에 "CRON_TZ=<time zone>"을 추가해서 타임존을 명기할 수 있으며, 항상 `CRON_TZ`를 설정하는 것을 권장한다.
|
||||
|
||||
{{< caution >}}
|
||||
모든 **크론잡** `일정:` 시간은
|
||||
{{< glossary_tooltip term_id="kube-controller-manager" text="kube-controller-manager" >}}의 시간대를 기준으로 한다.
|
||||
|
|
@ -28,6 +26,16 @@ kube-controller-manager 컨테이너에 설정된 시간대는
|
|||
크론잡 컨트롤러가 사용하는 시간대로 결정한다.
|
||||
{{< /caution >}}
|
||||
|
||||
{{< caution >}}
|
||||
[v1 CronJob API](/docs/reference/kubernetes-api/workload-resources/cron-job-v1/)은
|
||||
위에서 설명한 타임존 설정을 공식적으로 지원하지는 않는다.
|
||||
|
||||
`CRON_TZ` 또는 `TZ` 와 같은 변수를 설정하는 것은 쿠버네티스 프로젝트에서 공식적으로 지원하지는 않는다.
|
||||
`CRON_TZ` 또는 `TZ` 와 같은 변수를 설정하는 것은
|
||||
크론탭을 파싱하고 다음 잡 생성 시간을 계산하는 내부 라이브러리의 구현 상세사항이다.
|
||||
프로덕션 클러스터에서는 사용을 권장하지 않는다.
|
||||
{{< /caution >}}
|
||||
|
||||
크론잡 리소스에 대한 매니페스트를 생성할 때에는 제공하는 이름이
|
||||
유효한 [DNS 서브도메인 이름](/ko/docs/concepts/overview/working-with-objects/names/#dns-서브도메인-이름)이어야 한다.
|
||||
이름은 52자 이하여야 한다. 이는 크론잡 컨트롤러는 제공된 잡 이름에
|
||||
|
|
@ -55,16 +63,15 @@ kube-controller-manager 컨테이너에 설정된 시간대는
|
|||
### 크론 스케줄 문법
|
||||
|
||||
```
|
||||
# ┌────────────────── 타임존 (옵션)
|
||||
# | ┌───────────── 분 (0 - 59)
|
||||
# | │ ┌───────────── 시 (0 - 23)
|
||||
# | │ │ ┌───────────── 일 (1 - 31)
|
||||
# | │ │ │ ┌───────────── 월 (1 - 12)
|
||||
# | │ │ │ │ ┌───────────── 요일 (0 - 6) (일요일부터 토요일까지;
|
||||
# | │ │ │ │ │ 특정 시스템에서는 7도 일요일)
|
||||
# | │ │ │ │ │
|
||||
# | │ │ │ │ │
|
||||
# CRON_TZ=UTC * * * * *
|
||||
# ┌───────────── 분 (0 - 59)
|
||||
# │ ┌───────────── 시 (0 - 23)
|
||||
# │ │ ┌───────────── 일 (1 - 31)
|
||||
# │ │ │ ┌───────────── 월 (1 - 12)
|
||||
# │ │ │ │ ┌───────────── 요일 (0 - 6) (일요일부터 토요일까지;
|
||||
# │ │ │ │ │ 특정 시스템에서는 7도 일요일)
|
||||
# │ │ │ │ │
|
||||
# │ │ │ │ │
|
||||
# * * * * *
|
||||
```
|
||||
|
||||
|
||||
|
|
@ -78,9 +85,9 @@ kube-controller-manager 컨테이너에 설정된 시간대는
|
|||
|
||||
|
||||
|
||||
예를 들면, 다음은 해당 작업이 매주 금요일 자정에 시작되어야 하고, 매월 13일 자정(UTC 기준)에도 시작되어야 한다는 뜻이다.
|
||||
예를 들면, 다음은 해당 작업이 매주 금요일 자정에 시작되어야 하고, 매월 13일 자정에도 시작되어야 한다는 뜻이다.
|
||||
|
||||
`CRON_TZ=UTC 0 0 13 * 5`
|
||||
`0 0 13 * 5`
|
||||
|
||||
크론잡 스케줄 표현을 생성하기 위해서 [crontab.guru](https://crontab.guru/)와 같은 웹 도구를 사용할 수도 있다.
|
||||
|
||||
|
|
@ -144,6 +151,8 @@ Cannot determine if job needs to be started. Too many missed start time (> 100).
|
|||
* 크론잡을 생성하고 다루기 위한 지침 및
|
||||
크론잡 매니페스트의 예제로
|
||||
[크론잡으로 자동화된 작업 실행](/ko/docs/tasks/job/automated-tasks-with-cron-jobs/)를 읽는다.
|
||||
* 실패했거나 완료된 잡을 자동으로 정리하도록 하려면,
|
||||
[완료된 잡을 자동으로 정리](/ko/docs/concepts/workloads/controllers/job/#clean-up-finished-jobs-automatically)를 확인한다.
|
||||
* `CronJob`은 쿠버네티스 REST API의 일부이다.
|
||||
{{< api-reference page="workload-resources/cron-job-v1" >}}
|
||||
오브젝트 정의를 읽고 쿠버네티스 크론잡 API에 대해 이해한다.
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ _디플로이먼트(Deployment)_ 는 {{< glossary_tooltip text="파드" term_id=
|
|||
* 디플로이먼트의 PodTemplateSpec을 업데이트해서 [파드의 새로운 상태를 선언한다](#디플로이먼트-업데이트). 새 레플리카셋이 생성되면, 디플로이먼트는 파드를 기존 레플리카셋에서 새로운 레플리카셋으로 속도를 제어하며 이동하는 것을 관리한다. 각각의 새로운 레플리카셋은 디플로이먼트의 수정 버전에 따라 업데이트한다.
|
||||
* 만약 디플로이먼트의 현재 상태가 안정적이지 않은 경우 [디플로이먼트의 이전 버전으로 롤백](#디플로이먼트-롤백)한다. 각 롤백은 디플로이먼트의 수정 버전에 따라 업데이트한다.
|
||||
* [더 많은 로드를 위해 디플로이먼트의 스케일 업](#디플로이먼트-스케일링).
|
||||
* [디플로이먼트 일시 중지](#디플로이먼트의-일시-중지와-재개)로 PodTemplateSpec에 여러 수정 사항을 적용하고, 새로운 롤아웃의 시작을 재개한다.
|
||||
* [디플로이먼트 롤아웃 일시 중지](#디플로이먼트의-일시-중지와-재개)로 PodTemplateSpec에 여러 수정 사항을 적용하고, 재개하여 새로운 롤아웃을 시작한다.
|
||||
* 롤아웃이 막혀있는지를 나타내는 [디플로이먼트 상태를 이용](#디플로이먼트-상태).
|
||||
* 더 이상 필요 없는 [이전 레플리카셋 정리](#정책-초기화).
|
||||
|
||||
|
|
@ -697,12 +697,16 @@ nginx-deployment-1989198191 7 7 0 7m
|
|||
nginx-deployment-618515232 11 11 11 7m
|
||||
```
|
||||
|
||||
## 디플로이먼트의 일시 중지와 재개
|
||||
## 디플로이먼트 롤아웃 일시 중지와 재개 {#pausing-and-resuming-a-deployment}
|
||||
|
||||
하나 이상의 업데이트를 트리거하기 전에 디플로이먼트를 일시 중지한 다음 다시 시작할 수 있다.
|
||||
이렇게 하면 불필요한 롤아웃을 트리거하지 않고 일시 중지와 재개 사이에 여러 수정 사항을 적용할 수 있다.
|
||||
디플로이먼트를 업데이트할 때 (또는 계획할 때),
|
||||
하나 이상의 업데이트를 트리거하기 전에 해당 디플로이먼트에 대한 롤아웃을 일시 중지할 수 있다.
|
||||
변경 사항을 적용할 준비가 되면, 디플로이먼트 롤아웃을 재개한다.
|
||||
이러한 방법으로, 불필요한 롤아웃을 트리거하지 않고
|
||||
롤아웃 일시 중지와 재개 사이에 여러 수정 사항을 적용할 수 있다.
|
||||
|
||||
* 예를 들어, 생성된 디플로이먼트의 경우
|
||||
|
||||
디플로이먼트 상세 정보를 가져온다.
|
||||
```shell
|
||||
kubectl get deploy
|
||||
|
|
@ -753,7 +757,7 @@ nginx-deployment-618515232 11 11 11 7m
|
|||
REVISION CHANGE-CAUSE
|
||||
1 <none>
|
||||
```
|
||||
* 롤아웃 상태를 가져와서 디플로이먼트 업데이트가 성공적인지 확인한다.
|
||||
* 기존 레플리카셋이 변경되지 않았는지 확인하기 위해 롤아웃 상태를 출력한다.
|
||||
```shell
|
||||
kubectl get rs
|
||||
```
|
||||
|
|
@ -774,10 +778,10 @@ nginx-deployment-618515232 11 11 11 7m
|
|||
deployment.apps/nginx-deployment resource requirements updated
|
||||
```
|
||||
|
||||
디플로이먼트를 일시 중지하기 전의 초기 상태는 해당 기능을 지속한다.
|
||||
그러나 디플로이먼트가 일시 중지한 상태에서는 디플로이먼트의 새 업데이트에 영향을 주지 않는다.
|
||||
디플로이먼트 롤아웃을 일시 중지하기 전 디플로이먼트의 초기 상태는 해당 기능을 지속한다.
|
||||
그러나 디플로이먼트 롤아웃이 일시 중지한 상태에서는 디플로이먼트의 새 업데이트에 영향을 주지 않는다.
|
||||
|
||||
* 결국, 디플로이먼트를 재개하고 새로운 레플리카셋이 새로운 업데이트를 제공하는 것을 관찰한다.
|
||||
* 결국, 디플로이먼트 롤아웃을 재개하고 새로운 레플리카셋이 새로운 업데이트를 제공하는 것을 관찰한다.
|
||||
```shell
|
||||
kubectl rollout resume deployment/nginx-deployment
|
||||
```
|
||||
|
|
@ -911,8 +915,8 @@ deployment.apps/nginx-deployment patched
|
|||
{{< /note >}}
|
||||
|
||||
{{< note >}}
|
||||
만약 디플로이먼트를 일시 중지하면 쿠버네티스는 지정된 데드라인과 비교하여 진행 상황을 확인하지 않는다.
|
||||
롤아웃 중에 디플로이먼트를 안전하게 일시 중지하고, 데드라인을 넘기도록 하는 조건을 트리거하지 않고
|
||||
만약 디플로이먼트 롤아웃을 일시 중지하면 쿠버네티스는 지정된 데드라인과 비교하여 진행 상황을 확인하지 않는다.
|
||||
롤아웃 중에 디플로이먼트 롤아웃을 안전하게 일시 중지하고, 데드라인을 넘기도록 하는 조건을 트리거하지 않고
|
||||
재개할 수 있다.
|
||||
{{< /note >}}
|
||||
|
||||
|
|
@ -1052,8 +1056,7 @@ echo $?
|
|||
|
||||
`.spec.template` 과 `.spec.selector` 은 `.spec` 에서 유일한 필수 필드이다.
|
||||
|
||||
`.spec.template` 는 [파드 템플릿](/ko/docs/concepts/workloads/pods/#파드-템플릿)이다.
|
||||
이것은 {{< glossary_tooltip text="파드" term_id="pod" >}}와 정확하게 동일한 스키마를 가지고 있고, 중첩된 것을 제외하면 `apiVersion` 과 `kind` 를 가지고 있지 않는다.
|
||||
`.spec.template` 는 [파드 템플릿](/ko/docs/concepts/workloads/pods/#파드-템플릿)이다. 이것은 {{< glossary_tooltip text="파드" term_id="pod" >}}와 정확하게 동일한 스키마를 가지고 있고, 중첩된 것을 제외하면 `apiVersion` 과 `kind` 를 가지고 있지 않는다.
|
||||
|
||||
파드에 필요한 필드 외에 디플로이먼트 파드 템플릿은 적절한 레이블과 적절한 재시작 정책을 명시해야 한다.
|
||||
레이블의 경우 다른 컨트롤러와 겹치지 않도록 해야 한다. 자세한 것은 [셀렉터](#셀렉터)를 참조한다.
|
||||
|
|
@ -1065,6 +1068,18 @@ echo $?
|
|||
|
||||
`.spec.replicas` 은 필요한 파드의 수를 지정하는 선택적 필드이다. 이것의 기본값은 1이다.
|
||||
|
||||
예를 들어 `kubectl scale deployment deployment --replicas=X` 명령으로
|
||||
디플로이먼트의 크기를 수동으로 조정한 뒤,
|
||||
매니페스트를 이용하여 디플로이먼트를 업데이트하면(예: `kubectl apply -f deployment.yaml` 실행),
|
||||
수동으로 설정했던 디플로이먼트의 크기가 오버라이드된다.
|
||||
|
||||
[HorizontalPodAutoscaler](/ko/docs/tasks/run-application/horizontal-pod-autoscale/)(또는 수평 스케일링을 위한 유사 API)가
|
||||
디플로이먼트 크기를 관리하고 있다면, `.spec.replicas` 를 설정해서는 안 된다.
|
||||
|
||||
대신, 쿠버네티스
|
||||
{{< glossary_tooltip text="컨트롤 플레인" term_id="control-plane" >}}이
|
||||
`.spec.replicas` 필드를 자동으로 관리한다.
|
||||
|
||||
### 셀렉터
|
||||
|
||||
`.spec.selector` 는 디플로이먼트의 대상이 되는 파드에 대해 [레이블 셀렉터](/ko/docs/concepts/overview/working-with-objects/labels/)를
|
||||
|
|
|
|||
|
|
@ -25,7 +25,8 @@ weight: 50
|
|||
|
||||
잡을 사용하면 여러 파드를 병렬로 실행할 수도 있다.
|
||||
|
||||
잡을 스케줄에 따라 구동하고 싶은 경우(단일 작업이든, 여러 작업의 병렬 수행이든), [크론잡(CronJob)](/ko/docs/concepts/workloads/controllers/cron-jobs/)을 참고한다.
|
||||
잡을 스케줄에 따라 구동하고 싶은 경우(단일 작업이든, 여러 작업의 병렬 수행이든),
|
||||
[크론잡(CronJob)](/ko/docs/concepts/workloads/controllers/cron-jobs/)을 참고한다.
|
||||
|
||||
<!-- body -->
|
||||
|
||||
|
|
@ -206,6 +207,7 @@ _작업 큐_ 잡은 `.spec.completions` 를 설정하지 않은 상태로 두고
|
|||
있다면, 잡에 속한 파드는 DNS를 이용하여 서로를 디스커버 하기 위해 사전에 결정된
|
||||
호스트네임을 사용할 수 있다.
|
||||
- 컨테이너화된 태스크의 경우, `JOB_COMPLETION_INDEX` 환경 변수.
|
||||
|
||||
각 인덱스에 대해 성공적으로 완료된 파드가 하나 있으면 작업이 완료된 것으로
|
||||
간주된다. 이 모드를 사용하는 방법에 대한 자세한 내용은
|
||||
[정적 작업 할당을 사용한 병렬 처리를 위해 인덱싱된 잡](/docs/tasks/job/indexed-parallel-processing-static/)을 참고한다.
|
||||
|
|
@ -249,7 +251,7 @@ _작업 큐_ 잡은 `.spec.completions` 를 설정하지 않은 상태로 두고
|
|||
|
||||
{{< note >}}
|
||||
만약 잡에 `restartPolicy = "OnFailure"` 가 있는 경우 잡 백오프 한계에
|
||||
도달하면 잡을 실행 중인 컨테이너가 종료된다. 이로 인해 잡 실행 파일의 디버깅이
|
||||
도달하면 잡을 실행 중인 파드가 종료된다. 이로 인해 잡 실행 파일의 디버깅이
|
||||
더 어려워질 수 있다. 디버깅하거나 로깅 시스템을 사용해서 실패한 작업의 결과를 실수로 손실되지 않도록
|
||||
하려면 `restartPolicy = "Never"` 로 설정하는 것을 권장한다.
|
||||
{{< /note >}}
|
||||
|
|
@ -344,6 +346,25 @@ spec:
|
|||
삭제되도록 할 수 있다. 만약 필드를 설정하지 않으면, 이 잡이 완료된
|
||||
후에 TTL 컨트롤러에 의해 정리되지 않는다.
|
||||
|
||||
{{< note >}}
|
||||
`ttlSecondsAfterFinished` 필드를 설정하는 것을 권장하는데,
|
||||
이는 관리되지 않는 잡(직접 생성한,
|
||||
크론잡 등 다른 워크로드 API를 통해 간접적으로 생성하지 않은 잡)의
|
||||
기본 삭제 정책이 `orphanDependents`(관리되지 않는 잡이 완전히 삭제되어도
|
||||
해당 잡에 의해 생성된 파드를 남겨둠)이기 때문이다.
|
||||
삭제된 잡의 파드가 실패하거나 완료된 뒤
|
||||
{{< glossary_tooltip text="컨트롤 플레인" term_id="control-plane" >}}이 언젠가
|
||||
[가비지 콜렉션](/ko/docs/concepts/workloads/pods/pod-lifecycle/#pod-garbage-collection)을 한다고 해도,
|
||||
이렇게 남아 있는 파드는 클러스터의 성능을 저하시키거나
|
||||
최악의 경우에는 이 성능 저하로 인해 클러스터가 중단될 수도 있다.
|
||||
|
||||
[리밋 레인지(Limit Range)](/ko/docs/concepts/policy/limit-range/)와
|
||||
[리소스 쿼터](/ko/docs/concepts/policy/resource-quotas/)를 사용하여
|
||||
특정 네임스페이스가 사용할 수 있는 자원량을 제한할 수
|
||||
있다.
|
||||
{{< /note >}}
|
||||
|
||||
|
||||
## 잡 패턴
|
||||
|
||||
잡 오브젝트를 사용해서 신뢰할 수 있는 파드의 병렬 실행을 지원할 수 있다. 잡 오브젝트는 과학
|
||||
|
|
@ -415,8 +436,11 @@ spec:
|
|||
잡이 생성되면, 잡 컨트롤러는 잡의 요구 사항을 충족하기 위해
|
||||
즉시 파드 생성을 시작하고 잡이 완료될 때까지
|
||||
계속한다. 그러나, 잡의 실행을 일시적으로 중단하고 나중에
|
||||
다시 시작할 수도 있다. 잡을 일시 중지하려면, 잡의 `.spec.suspend` 필드를 true로
|
||||
업데이트할 수 있다. 나중에, 다시 재개하려면, false로 업데이트한다.
|
||||
재개하거나, 잡을 중단 상태로 생성하고 언제 시작할지를
|
||||
커스텀 컨트롤러가 나중에 결정하도록 하고 싶을 수도 있다.
|
||||
|
||||
잡을 일시 중지하려면, 잡의 `.spec.suspend` 필드를 true로
|
||||
업데이트할 수 있다. 이후에, 다시 재개하려면, false로 업데이트한다.
|
||||
`.spec.suspend` 로 설정된 잡을 생성하면 일시 중지된 상태로
|
||||
생성된다.
|
||||
|
||||
|
|
@ -501,6 +525,32 @@ Events:
|
|||
파드가 생성되지 않았지만, 잡이 재개되자마자 파드 생성이 다시
|
||||
시작되었음을 알 수 있다.
|
||||
|
||||
### 가변적 스케줄링 지시
|
||||
|
||||
{{< feature-state for_k8s_version="v1.23" state="beta" >}}
|
||||
|
||||
{{< note >}}
|
||||
이 기능을 사용하려면,
|
||||
[API 서버](/docs/reference/command-line-tools-reference/kube-apiserver/)에
|
||||
`JobMutableNodeSchedulingDirectives` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 활성화해야 한다.
|
||||
이 기능은 기본적으로 활성화되어 있다.
|
||||
{{< /note >}}
|
||||
|
||||
병렬 잡에서 대부분의 경우 파드를 특정 제약 조건 하에서 실행하고 싶을 것이다.
|
||||
(예를 들면 동일 존에서 실행하거나, 또는 GPU 모델 x 또는 y를 사용하지만 둘을 혼합하지는 않는 등)
|
||||
|
||||
[suspend](#suspending-a-job) 필드는 이러한 목적을 달성하기 위한 첫 번째 단계이다.
|
||||
이 필드를 사용하면 커스텀 큐(queue) 컨트롤러가 잡이 언제 시작될지를 결정할 수 있다.
|
||||
그러나, 잡이 재개된 이후에는, 커스텀 큐 컨트롤러는 잡의 파드가 실제로 어디에 할당되는지에 대해서는 영향을 주지 않는다.
|
||||
|
||||
이 기능을 이용하여 잡이 실행되기 전에 잡의 스케줄링 지시를 업데이트할 수 있으며,
|
||||
이를 통해 커스텀 큐 컨트롤러가 파드 배치에 영향을 줌과 동시에
|
||||
노드로의 파드 실제 할당 작업을 kube-scheduler로부터 경감시켜 줄 수 있도록 한다.
|
||||
이는 이전에 재개된 적이 없는 중지된 잡에 대해서만 허용된다.
|
||||
|
||||
잡의 파드 템플릿 필드 중, 노드 어피니티(node affinity), 노드 셀렉터(node selector),
|
||||
톨러레이션(toleration), 레이블(label), 어노테이션(annotation)은 업데이트가 가능하다.
|
||||
|
||||
### 자신의 파드 셀렉터를 지정하기
|
||||
|
||||
일반적으로 잡 오브젝트를 생성할 때 `.spec.selector` 를 지정하지 않는다.
|
||||
|
|
@ -570,17 +620,17 @@ spec:
|
|||
|
||||
### 종료자(finalizers)를 이용한 잡 추적
|
||||
|
||||
{{< feature-state for_k8s_version="v1.22" state="alpha" >}}
|
||||
{{< feature-state for_k8s_version="v1.23" state="beta" >}}
|
||||
|
||||
{{< note >}}
|
||||
이 기능을 이용하기 위해서는
|
||||
[API 서버](/docs/reference/command-line-tools-reference/kube-apiserver/)와
|
||||
[컨트롤러 매니저](/docs/reference/command-line-tools-reference/kube-controller-manager/)에 대해
|
||||
`JobTrackingWithFinalizers` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 활성화해야 한다.
|
||||
기본적으로는 비활성화되어 있다.
|
||||
기본적으로는 활성화되어 있다.
|
||||
|
||||
이 기능이 활성화되면, 컨트롤 플레인은 아래에 설명할 동작을 이용하여 새로운 잡이 생성되는지 추적한다.
|
||||
기존에 존재하던 잡은 영향을 받지 않는다.
|
||||
이 기능이 활성화되기 이전에 생성된 잡은 영향을 받지 않는다.
|
||||
사용자가 느낄 수 있는 유일한 차이점은 컨트롤 플레인이 잡 종료를 좀 더 정확하게 추적할 수 있다는 것이다.
|
||||
{{< /note >}}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,11 @@
|
|||
---
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
title: 스테이트풀셋
|
||||
content_type: concept
|
||||
weight: 30
|
||||
|
|
@ -67,13 +74,14 @@ metadata:
|
|||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: nginx # has to match .spec.template.metadata.labels
|
||||
app: nginx # .spec.template.metadata.labels 와 일치해야 한다
|
||||
serviceName: "nginx"
|
||||
replicas: 3 # by default is 1
|
||||
replicas: 3 # 기본값은 1
|
||||
minReadySeconds: 10 # 기본값은 0
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: nginx # has to match .spec.selector.matchLabels
|
||||
app: nginx # .spec.selector.matchLabels 와 일치해야 한다
|
||||
spec:
|
||||
terminationGracePeriodSeconds: 10
|
||||
containers:
|
||||
|
|
@ -105,9 +113,24 @@ spec:
|
|||
스테이트풀셋 오브젝트의 이름은 유효한
|
||||
[DNS 서브도메인 이름](/ko/docs/concepts/overview/working-with-objects/names/#dns-서브도메인-이름)이어야 한다.
|
||||
|
||||
## 파드 셀렉터
|
||||
### 파드 셀렉터
|
||||
|
||||
스테이트풀셋의 `.spec.selector` 필드는 `.spec.template.metadata.labels` 레이블과 일치하도록 설정해야 한다. 쿠버네티스 1.8 이전에서는 생략시에 `.spec.selector` 필드가 기본 설정 되었다. 1.8 과 이후 버전에서는 파드 셀렉터를 명시하지 않으면 스테이트풀셋 생성시 유효성 검증 오류가 발생하는 결과가 나오게 된다.
|
||||
스테이트풀셋의 `.spec.selector` 필드는 `.spec.template.metadata.labels` 레이블과 일치하도록 설정해야 한다. 1.8 버전 이상에서는, 해당되는 파드 셀렉터를 찾지 못하면 스테이트풀셋 생성 과정에서 검증 오류가 발생한다.
|
||||
|
||||
### 볼륨 클레임 템플릿
|
||||
|
||||
`.spec.volumeClaimTemplates` 를 설정하여, 퍼시스턴트볼륨 프로비저너에 의해 프로비전된 [퍼시스턴트볼륨](/ko/docs/concepts/storage/persistent-volumes/)을 이용하는 안정적인 스토리지를 제공할 수 있다.
|
||||
|
||||
|
||||
### 최소 준비 시간 초 {#minimum-ready-seconds}
|
||||
|
||||
{{< feature-state for_k8s_version="v1.23" state="beta" >}}
|
||||
|
||||
`.spec.minReadySeconds` 는 파드가 '사용 가능(available)'이라고 간주될 수 있도록 파드의 모든 컨테이너가
|
||||
문제 없이 실행되어야 하는 최소 시간(초)을 나타내는 선택적인 필드이다. 이 기능은 베타이며 기본적으로 활성화되어
|
||||
있음에 유의한다. 이 기능을 사용하지 않으려면 StatefulSetMinReadySeconds 플래그를 설정 해제한다.
|
||||
이 필드의 기본값은 0이다(이 경우, 파드가 Ready 상태가 되면 바로 사용 가능하다고 간주된다.)
|
||||
파드가 언제 사용 가능하다고 간주되는지에 대한 자세한 정보는 [컨테이너 프로브(probe)](/ko/docs/concepts/workloads/pods/pod-lifecycle/#컨테이너-프로브-probe)를 참고한다.
|
||||
|
||||
## 파드 신원
|
||||
|
||||
|
|
@ -166,9 +189,7 @@ N개의 레플리카가 있는 스테이트풀셋은 스테이트풀셋에 있
|
|||
|
||||
### 안정된 스토리지
|
||||
|
||||
쿠버네티스는 각 VolumeClaimTemplate마다 하나의 [퍼시스턴트 볼륨](/ko/docs/concepts/storage/persistent-volumes/)을
|
||||
생성한다. 위의 nginx 예시에서 각 파드는 `my-storage-class` 라는 스토리지 클래스와
|
||||
1 Gib의 프로비전된 스토리지를 가지는 단일 퍼시스턴트 볼륨을 받게 된다. 만약 스토리지 클래스가
|
||||
쿠버네티스는 각 VolumeClaimTemplate마다 하나의 [퍼시스턴트 볼륨](/ko/docs/concepts/storage/persistent-volumes/)을 생성한다. 위의 nginx 예시에서 각 파드는 `my-storage-class` 라는 스토리지 클래스와 1 Gib의 프로비전된 스토리지를 가지는 단일 퍼시스턴트 볼륨을 받게 된다. 만약 스토리지 클래스가
|
||||
명시되지 않은 경우, 기본 스토리지 클래스가 사용된다. 파드가 노드에서 스케줄 혹은 재스케줄이 되면
|
||||
파드의 `volumeMounts` 는 퍼시스턴트 볼륨 클레임과 관련된 퍼시스턴트 볼륨이 마운트 된다.
|
||||
참고로, 파드 퍼시스턴트 볼륨 클레임과 관련된 퍼시스턴트 볼륨은
|
||||
|
|
@ -279,37 +300,114 @@ web-0이 실패할 경우 web-1은 web-0이 Running 및 Ready 상태가
|
|||
실행하려고 시도한 모든 파드를 삭제해야 한다.
|
||||
그러면 스테이트풀셋은 되돌린 템플릿을 사용해서 파드를 다시 생성하기 시작한다.
|
||||
|
||||
### 최소 준비 시간 초 {#minimum-ready-seconds}
|
||||
|
||||
{{< feature-state for_k8s_version="v1.22" state="alpha" >}}
|
||||
## 퍼시스턴트볼륨클레임 유보
|
||||
|
||||
`.spec.minReadySeconds`는 새로 생성된 파드가 사용가능하다고 간주되도록
|
||||
컨테이너가 충돌되지 않고 준비되는 최소 시간 초를 지정하는 선택적 필드이다.
|
||||
기본값은 0이다(파드는 준비되는 대로 사용 가능한 것으로 간주된다).
|
||||
파드가 준비가 되는 시기에 대해 더 자세히 알아보고 싶다면,
|
||||
[컨테이너 프로브](/ko/docs/concepts/workloads/pods/pod-lifecycle/#container-probes)를 참고한다.
|
||||
{{< feature-state for_k8s_version="v1.23" state="alpha" >}}
|
||||
|
||||
이 필드는 `StatefulSetMinReadySeconds` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 사용하도록 설정한 경우에만 작동한다.
|
||||
선택적 필드인 `.spec.persistentVolumeClaimRetentionPolicy` 는
|
||||
스테이트풀셋의 생애주기동안 PVC를 삭제할 것인지,
|
||||
삭제한다면 어떻게 삭제하는지를 관리한다.
|
||||
이 필드를 사용하려면 `StatefulSetAutoDeletePVC` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 활성화해야 한다.
|
||||
활성화 시, 각 스테이트풀셋에 대해 두 가지 정책을 설정할 수 있다.
|
||||
|
||||
`whenDeleted`
|
||||
: 스테이트풀셋이 삭제될 때 적용될 볼륨 유보 동작을 설정한다.
|
||||
|
||||
`whenScaled`
|
||||
: 스테이트풀셋의 레플리카 수가 줄어들 때, 예를 들면 스테이트풀셋을 스케일 다운할 때
|
||||
적용될 볼륨 유보 동작을 설정한다.
|
||||
|
||||
설정 가능한 각 정책에 대해, 그 값을 `Delete` 또는 `Retain` 으로 설정할 수 있다.
|
||||
|
||||
`Delete`
|
||||
: `volumeClaimTemplate` 스테이트풀셋으로부터 생성된 PVC는 정책에 영향을 받는 각 파드에 대해 삭제된다.
|
||||
`whenDeleted` 가 이 값으로 설정되어 있으면
|
||||
`volumeClaimTemplate` 으로부터 생성된 모든 PVC는 파드가 삭제된 뒤에 삭제된다.
|
||||
`whenScaled` 가 이 값으로 설정되어 있으면
|
||||
스케일 다운된 파드 레플리카가 삭제된 뒤, 삭제된 파드에 해당되는 PVC만 삭제된다.
|
||||
|
||||
`Retain` (기본값)
|
||||
: 파드가 삭제되어도 `volumeClaimTemplate` 으로부터 생성된 PVC는 영향을 받지 않는다.
|
||||
이는 이 신기능이 도입되기 전의 기본 동작이다.
|
||||
|
||||
이러한 정책은 파드의 삭제가 스테이트풀셋 삭제 또는 스케일 다운으로 인한 것일 때**에만** 적용됨에 유의한다.
|
||||
예를 들어, 스테이트풀셋의 파드가 노드 실패로 인해 실패했고,
|
||||
컨트롤 플레인이 대체 파드를 생성했다면, 스테이트풀셋은 기존 PVC를 유지한다.
|
||||
기존 볼륨은 영향을 받지 않으며,
|
||||
새 파드가 실행될 노드에 클러스터가 볼륨을 연결(attach)한다.
|
||||
|
||||
정책의 기본값은 `Retain` 이며, 이는 이 신기능이 도입되기 전의 스테이트풀셋 기본 동작이다.
|
||||
|
||||
다음은 정책 예시이다.
|
||||
|
||||
```yaml
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
...
|
||||
spec:
|
||||
persistentVolumeClaimRetentionPolicy:
|
||||
whenDeleted: Retain
|
||||
whenScaled: Delete
|
||||
...
|
||||
```
|
||||
|
||||
스테이트풀셋 {{<glossary_tooltip text="컨트롤러" term_id="controller">}}는 자신이 소유한 PVC에
|
||||
[소유자 정보(reference)](/docs/concepts/overview/working-with-objects/owners-dependents/#owner-references-in-object-specifications)를
|
||||
추가하며, 파드가 종료된 이후에는 {{<glossary_tooltip text="가비지 콜렉터" term_id="garbage-collection">}}가 이 정보를 삭제한다.
|
||||
이로 인해 PVC가 삭제되기 전에
|
||||
(그리고 유보 정책에 따라, 매칭되는 기반 PV와 볼륨이 삭제되기 전에)
|
||||
파드가 모든 볼륨을 깨끗하게 언마운트할 수 있다.
|
||||
`whenDeleted` 정책을 `Delete` 로 설정하면,
|
||||
해당 스테이트풀셋에 연결된 모든 PVC에 스테이트풀셋 인스턴스의 소유자 정보가 기록된다.
|
||||
|
||||
`whenScaled` 정책은 파드가 스케일 다운되었을 때에만 PVC를 삭제하며,
|
||||
파드가 다른 원인으로 삭제되면 PVC를 삭제하지 않는다.
|
||||
조정 상황 발생 시, 스테이트풀셋 컨트롤러는 목표 레플리카 수와 클러스터 상의 실제 파드 수를 비교한다.
|
||||
레플리카 카운트보다 큰 ID를 갖는 스테이트풀셋 파드는 부적격 판정을 받으며 삭제 대상으로 표시된다.
|
||||
`whenScaled` 정책이 `Delete` 이면, 부적격 파드는 삭제되기 전에,
|
||||
연결된 스테이트풀셋 템플릿 PVC의 소유자로 지정된다.
|
||||
이로 인해, 부적격 파드가 종료된 이후에만 PVC가 가비지 콜렉트된다.
|
||||
|
||||
이는 곧 만약 컨트롤러가 강제 종료되어 재시작되면,
|
||||
파드의 소유자 정보가 정책에 적합하게 업데이트되기 전에는 어떤 파드도 삭제되지 않을 것임을 의미한다.
|
||||
만약 컨트롤러가 다운된 동안 부적격 파드가 강제로 삭제되면,
|
||||
컨트롤러가 강제 종료된 시점에 따라 소유자 정보가 설정되었을 수도 있고 설정되지 않았을 수도 있다.
|
||||
소유자 정보가 업데이트되기까지 몇 번의 조정 절차가 필요할 수 있으며,
|
||||
따라서 일부 부적격 파드는 소유자 정보 설정을 완료하고 나머지는 그러지 못했을 수 있다.
|
||||
이러한 이유로, 컨트롤러가 다시 켜져서 파드를 종료하기 전에
|
||||
소유자 정보를 검증할 때까지 기다리는 것을 추천한다.
|
||||
이것이 불가능하다면, 관리자는 PVC의 소유자 정보를 확인하여 파드가 강제 삭제되었을 때 해당되는 오브젝트가 삭제되도록 해야 한다.
|
||||
|
||||
### 레플리카
|
||||
|
||||
`.spec.replicas` 은 필요한 파드의 수를 지정하는 선택적 필드이다. 기본값은 1이다.
|
||||
|
||||
예를 들어 `kubectl scale deployment deployment --replicas=X` 명령으로
|
||||
디플로이먼트의 크기를 수동으로 조정한 뒤,
|
||||
매니페스트를 이용하여 디플로이먼트를 업데이트하면(예: `kubectl apply -f deployment.yaml` 실행),
|
||||
수동으로 설정했던 디플로이먼트의 크기가
|
||||
오버라이드된다.
|
||||
|
||||
[HorizontalPodAutoscaler](/ko/docs/tasks/run-application/horizontal-pod-autoscale/)(또는 수평 스케일링을 위한 유사 API)가
|
||||
디플로이먼트 크기를 관리하고 있다면, `.spec.replicas` 를 설정해서는 안 된다.
|
||||
대신, 쿠버네티스
|
||||
{{< glossary_tooltip text="컨트롤 플레인" term_id="control-plane" >}}이
|
||||
`.spec.replicas` 필드를 자동으로 관리한다.
|
||||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
|
||||
* [스테이트풀 애플리케이션의 배포](/ko/docs/tutorials/stateful-application/basic-stateful-set/)의 예시를 따른다.
|
||||
* [카산드라와 스테이트풀셋 배포](/ko/docs/tutorials/stateful-application/cassandra/)의 예시를 따른다.
|
||||
* [레플리케이티드(replicated) 스테이트풀 애플리케이션 실행하기](/docs/tasks/run-application/run-replicated-stateful-application/)의 예시를 따른다.
|
||||
|
||||
* [파드](/ko/docs/concepts/workloads/pods)에 대해 배운다.
|
||||
* 스테이트풀셋을 사용하는 방법을 알아본다.
|
||||
* [스테이트풀셋 애플리케이션 배포](/ko/docs/tutorials/stateful-application/basic-stateful-set/) 예제를 따라한다.
|
||||
* [스테이트풀셋으로 카산드라 배포](/ko/docs/tutorials/stateful-application/cassandra/) 예제를 따라한다.
|
||||
* [복제된 스테이트풀셋 애플리케이션 구동하기](/docs/tasks/run-application/run-replicated-stateful-application/) 예제를 따라한다.
|
||||
* [스테이트풀셋 확장하기](/docs/tasks/run-application/scale-stateful-set/)에 대해 배운다.
|
||||
* [스테이트풀셋 확장하기](/ko/docs/tasks/run-application/scale-stateful-set/)에 대해 배운다.
|
||||
* [스테이트풀셋을 삭제하면](/ko/docs/tasks/run-application/delete-stateful-set/) 어떤 일이 수반되는지를 배운다.
|
||||
* [스토리지의 볼륨을 사용하는 파드 구성](/ko/docs/tasks/configure-pod-container/configure-volume-storage/)을 하는 방법을 배운다.
|
||||
* [스토리지로 퍼시스턴트볼륨(PersistentVolume)을 사용하도록 파드 설정](/docs/tasks/configure-pod-container/configure-persistent-volume-storage/)하는 방법을 배운다.
|
||||
* `StatefulSet`은 쿠버네티스 REST API의 상위-수준 리소스이다.
|
||||
스테이트풀셋 API에 대해 이해하기 위해
|
||||
{{< api-reference page="workload-resources/stateful-set-v1" >}}
|
||||
오브젝트 정의를 읽는다.
|
||||
{{< api-reference page="workload-resources/stateful-set-v1" >}} 오브젝트 정의를 읽는다.
|
||||
* [PodDisruptionBudget](/ko/docs/concepts/workloads/pods/disruptions/)과
|
||||
이를 사용해서 어떻게 중단 중에 애플리케이션 가용성을 관리할 수 있는지에 대해 읽는다.
|
||||
|
|
|
|||
|
|
@ -1,51 +1,48 @@
|
|||
---
|
||||
title: 완료된 리소스를 위한 TTL 컨트롤러
|
||||
|
||||
|
||||
title: 완료된 잡 자동 정리
|
||||
content_type: concept
|
||||
weight: 70
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
{{< feature-state for_k8s_version="v1.21" state="beta" >}}
|
||||
{{< feature-state for_k8s_version="v1.23" state="stable" >}}
|
||||
|
||||
TTL 컨트롤러는 실행이 완료된 리소스 오브젝트의 수명을
|
||||
제한하는 TTL (time to live) 메커니즘을 제공한다. TTL 컨트롤러는 현재
|
||||
{{< glossary_tooltip text="잡(Job)" term_id="job" >}}만
|
||||
처리하며, 파드와 커스텀 리소스와 같이 실행을 완료할 다른 리소스를
|
||||
처리하도록 확장될 수 있다.
|
||||
|
||||
이 기능은 현재 베타이고 기본적으로 활성화되어 있다.
|
||||
kube-apiserver와 kube-controller-manager에서 `TTLAfterFinished`
|
||||
[기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 이용하여 비활성화할 수 있다.
|
||||
완료-이후-TTL(TTL-after-finished) {{<glossary_tooltip text="컨트롤러" term_id="controller">}}는
|
||||
실행이 완료된 리소스 오브젝트의 수명을 제한하는
|
||||
TTL (time to live) 메커니즘을 제공한다.
|
||||
TTL 컨트롤러는 {{< glossary_tooltip text="잡" term_id="job" >}}만을 제어한다.
|
||||
|
||||
<!-- body -->
|
||||
|
||||
## TTL 컨트롤러
|
||||
## 완료-이후-TTL 컨트롤러
|
||||
|
||||
현재의 TTL 컨트롤러는 잡만 지원한다. 클러스터 운영자는
|
||||
완료-이후-TTL 컨트롤러는 잡만을 지원한다. 클러스터 운영자는
|
||||
[예시](/ko/docs/concepts/workloads/controllers/job/#완료된-잡을-자동으로-정리)
|
||||
와 같이 `.spec.ttlSecondsAfterFinished` 필드를 명시하여
|
||||
완료된 잡(`완료` 또는 `실패`)을 자동으로 정리하기 위해 이 기능을 사용할 수 있다.
|
||||
리소스의 작업이 완료된 TTL 초(sec) 후 (다른 말로는, TTL이 만료되었을 때),
|
||||
TTL 컨트롤러는 해당 리소스가 정리될 수 있다고 가정한다.
|
||||
TTL 컨트롤러가 리소스를 정리할때 리소스를 연속적으로 삭제한다. 이는
|
||||
의존하는 오브젝트도 해당 리소스와 함께 삭제되는 것을 의미한다. 리소스가 삭제되면 완료자(finalizers)와
|
||||
잡의 작업이 완료된 TTL 초(sec) 후 (다른 말로는, TTL이 만료되었을 때),
|
||||
완료-이후-TTL 컨트롤러는 해당 잡이 정리될 수 있다고 가정한다.
|
||||
완료-이후-TTL 컨트롤러가 잡을 정리할때 잡을 연속적으로 삭제한다. 이는
|
||||
의존하는 오브젝트도 해당 잡과 함께 삭제되는 것을 의미한다. 잡이 삭제되면 완료자(finalizers)와
|
||||
같은 라이프 사이클 보증이 적용 된다.
|
||||
|
||||
TTL 초(sec)는 언제든지 설정이 가능하다. 여기에 잡 필드 중
|
||||
`.spec.ttlSecondsAfterFinished` 를 설정하는 몇 가지 예시가 있다.
|
||||
|
||||
* 작업이 완료된 다음, 일정 시간 후에 자동으로 잡이 정리될 수 있도록
|
||||
리소스 메니페스트에 이 필드를 지정한다.
|
||||
* 이미 완료된 기존 리소스에 이 새 기능을 적용하기 위해서 이 필드를
|
||||
잡 메니페스트에 이 필드를 지정한다.
|
||||
* 이미 완료된 기존 잡에 이 새 기능을 적용하기 위해서 이 필드를
|
||||
설정한다.
|
||||
* [어드미션 웹후크 변형](/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks)
|
||||
을 사용해서
|
||||
리소스 생성시 이 필드를 동적으로 설정 한다. 클러스터 관리자는 이것을
|
||||
사용해서 완료된 리소스에 대해 TTL 정책을 적용할 수 있다.
|
||||
* 리소스가 완료된 이후에
|
||||
잡 생성시 이 필드를 동적으로 설정 한다. 클러스터 관리자는 이것을
|
||||
사용해서 완료된 잡에 대해 TTL 정책을 적용할 수 있다.
|
||||
* 잡이 완료된 이후에
|
||||
[어드미션 웹후크 변형](/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks)
|
||||
을 사용해서 이 필드를 동적으로 설정하고, 리소스의 상태,
|
||||
을 사용해서 이 필드를 동적으로 설정하고, 잡의 상태,
|
||||
레이블 등에 따라 다른 TTL 값을 선택한다.
|
||||
|
||||
## 경고
|
||||
|
|
@ -53,21 +50,19 @@ TTL 초(sec)는 언제든지 설정이 가능하다. 여기에 잡 필드 중
|
|||
### TTL 초(sec) 업데이트
|
||||
|
||||
TTL 기간은, 예를 들어 잡의 `.spec.ttlSecondsAfterFinished` 필드는
|
||||
리소스를 생성하거나 완료한 후에 수정할 수 있다. 그러나, 잡을
|
||||
잡을 생성하거나 완료한 후에 수정할 수 있다. 그러나, 잡을
|
||||
삭제할 수 있게 되면(TTL이 만료된 경우) 시스템은 TTL을 연장하기
|
||||
위한 업데이트가 성공적인 API 응답을 리턴하더라도
|
||||
작업이 유지되도록 보장하지 않는다.
|
||||
|
||||
### 시간 차이(Skew)
|
||||
|
||||
TTL 컨트롤러는 쿠버네티스 리소스에
|
||||
완료-이후-TTL 컨트롤러는 쿠버네티스 잡에
|
||||
저장된 타임스탬프를 사용해서 TTL의 만료 여부를 결정하기 때문에, 이 기능은 클러스터 간의
|
||||
시간 차이에 민감하며, 시간 차이에 의해서 TTL 컨트롤러가 잘못된 시간에 리소스
|
||||
시간 차이에 민감하며, 시간 차이에 의해서 완료-이후-TTL 컨트롤러가 잘못된 시간에 잡
|
||||
오브젝트를 정리하게 될 수 있다.
|
||||
|
||||
쿠버네티스에서는 시간 차이를 피하기 위해 모든 노드
|
||||
([#6159](https://github.com/kubernetes/kubernetes/issues/6159#issuecomment-93844058)를 본다)
|
||||
에서 NTP를 실행해야 한다. 시계가 항상 정확한 것은 아니지만, 그 차이는
|
||||
시계가 항상 정확한 것은 아니지만, 그 차이는
|
||||
아주 작아야 한다. 0이 아닌 TTL을 설정할때는 이 위험에 대해 유의해야 한다.
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -128,8 +128,8 @@ Eviction API는 한 번에 1개(2개의 파드가 아닌)의 파드의 자발적
|
|||
기반으로 계산한다. 컨트롤 플레인은 파드의 `.metadata.ownerReferences` 를 검사하여
|
||||
소유하는 워크로드 리소스를 발견한다.
|
||||
|
||||
PDB는 [비자발적 중단](#자발적-중단과-비자발적-중단)이 발생하는 것을 막을 수는 없지만,
|
||||
버짓이 차감된다.
|
||||
[비자발적 중단](#자발적-중단과-비자발적-중단)은 PDB로는 막을 수 없지만,
|
||||
버짓은 차감된다.
|
||||
|
||||
애플리케이션의 롤링 업그레이드로 파드가 삭제되거나 사용할 수 없는 경우 중단 버짓에 영향을 준다.
|
||||
그러나 워크로드 리소스(디플로이먼트, 스테이트풀셋과 같은)는
|
||||
|
|
|
|||
|
|
@ -1,4 +1,7 @@
|
|||
---
|
||||
|
||||
|
||||
|
||||
title: 임시(Ephemeral) 컨테이너
|
||||
content_type: concept
|
||||
weight: 80
|
||||
|
|
@ -6,22 +9,13 @@ weight: 80
|
|||
|
||||
<!-- overview -->
|
||||
|
||||
{{< feature-state state="alpha" for_k8s_version="v1.22" >}}
|
||||
{{< feature-state state="beta" for_k8s_version="v1.23" >}}
|
||||
|
||||
이 페이지는 임시 컨테이너에 대한 개요를 제공한다.
|
||||
이 특별한 유형의 컨테이너는 트러블슈팅과 같은 사용자가 시작한 작업을 완료하기 위해
|
||||
기존 {{< glossary_tooltip text="파드" term_id="pod" >}}에서 임시적으로 실행된다.
|
||||
임시 컨테이너는 애플리케이션을 빌드하는 경우보다는 서비스 점검과 같은 경우에 더 적합하다.
|
||||
|
||||
{{< warning >}}
|
||||
임시 컨테이너 기능은 알파 상태이며,
|
||||
프로덕션 클러스터에는 적합하지 않다.
|
||||
[쿠버네티스 사용 중단(deprecation) 정책](/docs/reference/using-api/deprecation-policy/)에 따라
|
||||
이 알파 기능은 향후 크게 변경되거나, 완전히 제거될 수 있다.
|
||||
{{< /warning >}}
|
||||
|
||||
|
||||
|
||||
<!-- body -->
|
||||
|
||||
## 임시 컨테이너 이해하기
|
||||
|
|
|
|||
|
|
@ -17,8 +17,8 @@ weight: 30
|
|||
결정한다.
|
||||
|
||||
쿠버네티스 API에서 파드는 명세와 실제 상태를 모두 가진다.
|
||||
파드 오브젝트의 상태는 일련의 [파드 조건](#파드의-조건)으로 구성된다.
|
||||
사용자의 애플리케이션에 유용한 경우, 파드의 조건 데이터에
|
||||
파드 오브젝트의 상태는 일련의 [파드 컨디션](#파드의-컨디션)으로 구성된다.
|
||||
사용자의 애플리케이션에 유용한 경우, 파드의 컨디션 데이터에
|
||||
[사용자 정의 준비성 정보](#pod-readiness-gate)를 삽입할 수도 있다.
|
||||
|
||||
파드는 파드의 수명 중 한 번만 [스케줄](/ko/docs/concepts/scheduling-eviction/)된다.
|
||||
|
|
@ -150,26 +150,26 @@ Never이다. 기본값은 Always이다.
|
|||
컨테이너를 재시작한다. 컨테이너가 10분 동안 아무런 문제없이 실행되면,
|
||||
kubelet은 해당 컨테이너의 재시작 백오프 타이머를 재설정한다.
|
||||
|
||||
## 파드의 조건
|
||||
## 파드의 컨디션
|
||||
|
||||
파드는 하나의 PodStatus를 가지며,
|
||||
그것은 파드가 통과했거나 통과하지 못한 조건에 대한
|
||||
그것은 파드가 통과했거나 통과하지 못한
|
||||
[PodConditions](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podcondition-v1-core) 배열을 가진다.
|
||||
|
||||
* `PodScheduled`: 파드가 노드에 스케줄되었다.
|
||||
* `ContainersReady`: 파드의 모든 컨테이너가 준비되었다.
|
||||
* `Initialized`: 모든 [초기화 컨테이너](/ko/docs/concepts/workloads/pods/init-containers/)가
|
||||
성공적으로 시작되었다.
|
||||
성공적으로 완료(completed)되었다.
|
||||
* `Ready`: 파드는 요청을 처리할 수 있으며 일치하는 모든 서비스의 로드
|
||||
밸런싱 풀에 추가되어야 한다.
|
||||
|
||||
필드 이름 | 설명
|
||||
:--------------------|:-----------
|
||||
`type` | 이 파드 조건의 이름이다.
|
||||
`status` | 가능한 값이 "`True`", "`False`", 또는 "`Unknown`"으로, 해당 조건이 적용 가능한지 여부를 나타낸다.
|
||||
`lastProbeTime` | 파드 조건이 마지막으로 프로브된 시간의 타임스탬프이다.
|
||||
`type` | 이 파드 컨디션의 이름이다.
|
||||
`status` | 가능한 값이 "`True`", "`False`", 또는 "`Unknown`"으로, 해당 컨디션이 적용 가능한지 여부를 나타낸다.
|
||||
`lastProbeTime` | 파드 컨디션이 마지막으로 프로브된 시간의 타임스탬프이다.
|
||||
`lastTransitionTime` | 파드가 한 상태에서 다른 상태로 전환된 마지막 시간에 대한 타임스탬프이다.
|
||||
`reason` | 조건의 마지막 전환에 대한 이유를 나타내는 기계가 판독 가능한 UpperCamelCase 텍스트이다.
|
||||
`reason` | 컨디션의 마지막 전환에 대한 이유를 나타내는 기계가 판독 가능한 UpperCamelCase 텍스트이다.
|
||||
`message` | 마지막 상태 전환에 대한 세부 정보를 나타내는 사람이 읽을 수 있는 메시지이다.
|
||||
|
||||
|
||||
|
|
@ -179,11 +179,11 @@ kubelet은 해당 컨테이너의 재시작 백오프 타이머를 재설정한
|
|||
|
||||
애플리케이션은 추가 피드백 또는 신호를 PodStatus: _Pod readiness_
|
||||
와 같이 주입할 수 있다. 이를 사용하기 위해, kubelet이 파드의 준비성을 평가하기
|
||||
위한 추가적인 조건들을 파드의 `spec` 내 `readinessGate` 필드를 통해서 지정할 수 있다.
|
||||
위한 추가적인 컨디션들을 파드의 `spec` 내 `readinessGate` 필드를 통해서 지정할 수 있다.
|
||||
|
||||
준비성 게이트는 파드에 대한 `status.condition` 필드의 현재
|
||||
상태에 따라 결정된다. 만약 쿠버네티스가 `status.conditions` 필드에서 해당하는
|
||||
조건을 찾지 못한다면, 그 조건의 상태는
|
||||
컨디션을 찾지 못한다면, 그 컨디션의 상태는
|
||||
기본 값인 "`False`"가 된다.
|
||||
|
||||
여기 예제가 있다.
|
||||
|
|
@ -220,70 +220,100 @@ status:
|
|||
{{< glossary_tooltip term_id="operator-pattern" text="오퍼레이터">}}의
|
||||
`PATCH` 액션을 필요로 한다.
|
||||
[쿠버네티스 클라이언트 라이브러리](/ko/docs/reference/using-api/client-libraries/)를
|
||||
사용해서 파드 준비성에 대한 사용자 지정 파드 조건을 설정하는 코드를 작성할 수 있다.
|
||||
사용해서 파드 준비성에 대한 사용자 지정 파드 컨디션을 설정하는 코드를 작성할 수 있다.
|
||||
|
||||
사용자 지정 조건을 사용하는 파드의 경우, 다음 두 조건이 모두 적용되는
|
||||
사용자 지정 컨디션을 사용하는 파드의 경우, 다음 두 컨디션이 모두 적용되는
|
||||
경우에 **만** 해당 파드가 준비된 것으로 평가된다.
|
||||
|
||||
* 파드 내의 모든 컨테이너들이 준비 상태이다.
|
||||
* `readinessGates`에 지정된 모든 조건들이 `True` 이다.
|
||||
* `readinessGates`에 지정된 모든 컨디션들이 `True` 이다.
|
||||
|
||||
파드의 컨테이너가 Ready 이나 적어도 한 개의 사용자 지정 조건이 빠졌거나 `False` 이면,
|
||||
kubelet은 파드의 [조건](#파드의-조건)을 `ContainerReady` 로 설정한다.
|
||||
파드의 컨테이너가 Ready 이나 적어도 한 개의 사용자 지정 컨디션이 빠졌거나 `False` 이면,
|
||||
kubelet은 파드의 [컨디션](#파드의-컨디션)을 `ContainerReady` 로 설정한다.
|
||||
|
||||
## 컨테이너 프로브(probe)
|
||||
|
||||
[프로브](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#probe-v1-core)는
|
||||
_프로브_ 는
|
||||
컨테이너에서 [kubelet](/docs/reference/command-line-tools-reference/kubelet/)에 의해
|
||||
주기적으로 수행되는 진단(diagnostic)이다.
|
||||
진단을 수행하기 위해서,
|
||||
kubelet은 컨테이너에 의해서 구현된
|
||||
[핸들러](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#handler-v1-core)를 호출한다.
|
||||
핸들러에는 다음과 같이 세 가지 타입이 있다.
|
||||
kubelet은 컨테이너 안에서 코드를 실행하거나,
|
||||
또는 네트워크 요청을 전송한다.
|
||||
|
||||
* [ExecAction](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#execaction-v1-core)은
|
||||
컨테이너 내에서 지정된 명령어를 실행한다.
|
||||
### 체크 메커니즘 {#probe-check-methods}
|
||||
|
||||
프로브를 사용하여 컨테이너를 체크하는 방법에는 4가지가 있다.
|
||||
각 프로브는 다음의 4가지 메커니즘 중 단 하나만을 정의해야 한다.
|
||||
|
||||
`exec`
|
||||
: 컨테이너 내에서 지정된 명령어를 실행한다.
|
||||
명령어가 상태 코드 0으로 종료되면 진단이 성공한 것으로 간주한다.
|
||||
|
||||
* [TCPSocketAction](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#tcpsocketaction-v1-core)은
|
||||
지정된 포트에서 컨테이너의 IP주소에 대해 TCP 검사를 수행한다.
|
||||
포트가 활성화되어 있다면 진단이 성공한 것으로 간주한다.
|
||||
`grpc`
|
||||
: [gRPC](https://grpc.io/)를 사용하여
|
||||
원격 프로시저 호출을 수행한다.
|
||||
체크 대상이 [gRPC 헬스 체크](https://grpc.io/grpc/core/md_doc_health-checking.html)를 구현해야 한다.
|
||||
응답의 `status` 가 `SERVING` 이면
|
||||
진단이 성공했다고 간주한다.
|
||||
gRPC 프로브는 알파 기능이며
|
||||
`GRPCContainerProbe` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를
|
||||
활성화해야 사용할 수 있다.
|
||||
|
||||
* [HTTPGetAction](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#httpgetaction-v1-core)은
|
||||
지정한 포트 및 경로에서 컨테이너의 IP주소에
|
||||
대한 HTTP `GET` 요청을 수행한다. 응답의 상태 코드가 200 이상 400 미만이면
|
||||
`httpGet`
|
||||
: 지정한 포트 및 경로에서 컨테이너의 IP주소에 대한
|
||||
HTTP `GET` 요청을 수행한다.
|
||||
응답의 상태 코드가 200 이상 400 미만이면
|
||||
진단이 성공한 것으로 간주한다.
|
||||
|
||||
`tcpSocket`
|
||||
: 지정된 포트에서 컨테이너의 IP주소에 대해 TCP 검사를 수행한다.
|
||||
포트가 활성화되어 있다면 진단이 성공한 것으로 간주한다.
|
||||
원격 시스템(컨테이너)가 연결을 연 이후 즉시 닫는다면,
|
||||
이 또한 진단이 성공한 것으로 간주한다.
|
||||
|
||||
### 프로브 결과
|
||||
|
||||
각 probe는 다음 세 가지 결과 중 하나를 가진다.
|
||||
|
||||
* `Success`: 컨테이너가 진단을 통과함.
|
||||
* `Failure`: 컨테이너가 진단에 실패함.
|
||||
* `Unknown`: 진단 자체가 실패하였으므로 아무런 액션도 수행되면 안됨.
|
||||
`Success`
|
||||
: 컨테이너가 진단을 통과함.
|
||||
|
||||
`Failure`
|
||||
: 컨테이너가 진단에 실패함.
|
||||
|
||||
`Unknown`
|
||||
: 진단 자체가 실패함(아무런 조치를 수행해서는 안 되며, kubelet이
|
||||
추가 체크를 수행할 것이다)
|
||||
|
||||
### 프로브 종류
|
||||
|
||||
kubelet은 실행 중인 컨테이너들에 대해서 선택적으로 세 가지 종류의 프로브를 수행하고
|
||||
그에 반응할 수 있다.
|
||||
|
||||
* `livenessProbe`: 컨테이너가 동작 중인지 여부를 나타낸다. 만약
|
||||
`livenessProbe`
|
||||
: 컨테이너가 동작 중인지 여부를 나타낸다. 만약
|
||||
활성 프로브(liveness probe)에 실패한다면, kubelet은 컨테이너를 죽이고, 해당 컨테이너는
|
||||
[재시작 정책](#restart-policy)의 대상이 된다. 만약 컨테이너가
|
||||
활성 프로브를 제공하지 않는 경우, 기본 상태는 `Success`이다.
|
||||
활성 프로브를 제공하지 않는 경우, 기본 상태는 `Success` 이다.
|
||||
|
||||
* `readinessProbe`: 컨테이너가 요청을 처리할 준비가 되었는지 여부를 나타낸다.
|
||||
`readinessProbe`
|
||||
: 컨테이너가 요청을 처리할 준비가 되었는지 여부를 나타낸다.
|
||||
만약 준비성 프로브(readiness probe)가 실패한다면, 엔드포인트 컨트롤러는
|
||||
파드에 연관된 모든 서비스들의 엔드포인트에서 파드의 IP주소를 제거한다. 준비성 프로브의
|
||||
초기 지연 이전의 기본 상태는 `Failure`이다. 만약 컨테이너가 준비성 프로브를
|
||||
지원하지 않는다면, 기본 상태는 `Success`이다.
|
||||
초기 지연 이전의 기본 상태는 `Failure` 이다. 만약 컨테이너가 준비성 프로브를
|
||||
지원하지 않는다면, 기본 상태는 `Success` 이다.
|
||||
|
||||
* `startupProbe`: 컨테이너 내의 애플리케이션이 시작되었는지를 나타낸다.
|
||||
`startupProbe`
|
||||
: 컨테이너 내의 애플리케이션이 시작되었는지를 나타낸다.
|
||||
스타트업 프로브(startup probe)가 주어진 경우, 성공할 때까지 다른 나머지 프로브는
|
||||
활성화되지 않는다. 만약 스타트업 프로브가 실패하면, kubelet이 컨테이너를 죽이고,
|
||||
컨테이너는 [재시작 정책](#restart-policy)에 따라 처리된다. 컨테이너에 스타트업
|
||||
프로브가 없는 경우, 기본 상태는 `Success`이다.
|
||||
프로브가 없는 경우, 기본 상태는 `Success` 이다.
|
||||
|
||||
활성, 준비성 및 스타트업 프로브를 설정하는 방법에 대한 추가적인 정보는,
|
||||
[활성, 준비성 및 스타트업 프로브 설정하기](/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/)를 참조하면 된다.
|
||||
|
||||
### 언제 활성 프로브를 사용해야 하는가?
|
||||
#### 언제 활성 프로브를 사용해야 하는가?
|
||||
|
||||
{{< feature-state for_k8s_version="v1.0" state="stable" >}}
|
||||
|
||||
|
|
@ -295,7 +325,7 @@ kubelet은 실행 중인 컨테이너들에 대해서 선택적으로 세 가지
|
|||
프로브가 실패한 후 컨테이너가 종료되거나 재시작되길 원한다면, 활성 프로브를
|
||||
지정하고, `restartPolicy`를 항상(Always) 또는 실패 시(OnFailure)로 지정한다.
|
||||
|
||||
### 언제 준비성 프로브를 사용해야 하는가?
|
||||
#### 언제 준비성 프로브를 사용해야 하는가?
|
||||
|
||||
{{< feature-state for_k8s_version="v1.0" state="stable" >}}
|
||||
|
||||
|
|
@ -329,7 +359,7 @@ failed 애플리케이션과 시동 중에 아직 데이터를 처리하고 있
|
|||
남아 있다.
|
||||
{{< /note >}}
|
||||
|
||||
### 언제 스타트업 프로브를 사용해야 하는가?
|
||||
#### 언제 스타트업 프로브를 사용해야 하는가?
|
||||
|
||||
{{< feature-state for_k8s_version="v1.20" state="stable" >}}
|
||||
|
||||
|
|
@ -458,6 +488,6 @@ API에서 즉시 파드를 제거하므로 동일한 이름으로 새로운 파
|
|||
|
||||
* [컨테이너 라이프사이클 훅](/ko/docs/concepts/containers/container-lifecycle-hooks/)에 대해 자세히 알아보자.
|
||||
|
||||
* API의 파드 / 컨테이너 상태에 대한 자세한 내용은 [PodStatus](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podstatus-v1-core)
|
||||
그리고
|
||||
[ContainerStatus](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#containerstatus-v1-core)를 참고한다.
|
||||
* API의 파드와 컨테이너 상태에 대한 자세한 내용은
|
||||
파드의 [`.status`](/docs/reference/kubernetes-api/workload-resources/pod-v1/#PodStatus)에 대해 다루는
|
||||
API 레퍼런스 문서를 참고한다.
|
||||
|
|
|
|||
|
|
@ -234,6 +234,8 @@ graph BT
|
|||
|
||||
스케줄러는 신규 파드에 `spec.nodeSelector` 또는 `spec.affinity.nodeAffinity`가 정의되어 있는 경우, 부합하지 않는 노드들을 차이(skew) 계산에서 생략한다.
|
||||
|
||||
### 예시: TopologySpreadConstraints와 노드 어피니티
|
||||
|
||||
zoneA 에서 zoneC에 걸쳐있고, 5개의 노드를 가지는 클러스터가 있다고 가정한다.
|
||||
|
||||
{{<mermaid>}}
|
||||
|
|
@ -349,12 +351,14 @@ defaultConstraints:
|
|||
비활성화된다.
|
||||
|
||||
{{< note >}}
|
||||
`PodTopologySpread` 플러그인은 분배 제약 조건에 지정된 토폴로지 키가
|
||||
없는 노드에 점수를 매기지 않는다.
|
||||
이로 인해 기본 토폴로지 제약을 사용하는 경우의
|
||||
레거시 `SelectorSpread` 플러그인과는 기본 정책이 다를 수 있다.
|
||||
|
||||
노드에 `kubernetes.io/hostname` 및 `topology.kubernetes.io/zone`
|
||||
레이블 세트 **둘 다**가 설정되지 않을 것으로 예상되는 경우, 쿠버네티스 기본값을 사용하는
|
||||
대신 자체 제약 조건을 정의한다.
|
||||
|
||||
`PodTopologySpread` 플러그인은 분배 제약 조건에 지정된 토폴로지 키가
|
||||
없는 노드에 점수를 매기지 않는다.
|
||||
{{< /note >}}
|
||||
|
||||
클러스터에 기본 파드 분배 제약 조건을 사용하지 않으려면,
|
||||
|
|
|
|||
|
|
@ -13,8 +13,6 @@ weight: 98
|
|||
이해한다고 가정한다. 또한 기여하기 위한 더 많은 방법에 대해 배울 준비가 되었다고 가정한다. 이러한
|
||||
작업 중 일부에는 Git 커맨드 라인 클라이언트와 다른 도구를 사용해야 한다.
|
||||
|
||||
|
||||
|
||||
<!-- body -->
|
||||
|
||||
## 개선 제안
|
||||
|
|
@ -29,8 +27,8 @@ website 스타일, 풀 리퀘스트 리뷰와 병합
|
|||
프로세스 또는 문서 작성의 다른 측면을 개선하기 위한 아이디어가 있을 수 있다. 투명성을 극대화하려면,
|
||||
이러한 유형의 제안을 SIG Docs 회의나
|
||||
[kubernetes-sig-docs 메일링리스트](https://groups.google.com/forum/#!forum/kubernetes-sig-docs)에서 논의해야 한다.
|
||||
또한, 현재의 작업 방식과 과거의 결정이 왜 획기적인 변경을
|
||||
제안하기 전에 결정되었는지에 대한 맥락을 이해하는 데 실제로
|
||||
또한, 획기적인 변경을 제안하기 전에, 현재의 작업 방식과 과거의 결정이
|
||||
어떻게 정해졌는지에 대한 맥락을 이해하는 데 실제로
|
||||
도움이 될 수 있다. 현재의 문서 작업이 어떻게 진행되는지에 대한 질문의
|
||||
답변을 얻는 가장 빠른 방법은 [kubernetes.slack.com](https://kubernetes.slack.com)의
|
||||
`#sig-docs` 슬랙 채널에 문의하는 것이다.
|
||||
|
|
@ -84,7 +82,7 @@ SIG Docs [승인자](/ko/docs/contribute/participate/roles-and-responsibilities/
|
|||
새로운 기여자 홍보대사의 책임은 다음과 같다.
|
||||
|
||||
- [#sig-docs 슬랙 채널](https://kubernetes.slack.com)에서 새로운 기여자의 질문을 모니터링한다.
|
||||
- PR 랭글러와 협력하여 새로운 기여자에게 좋은 첫 이슈를 파악한다.
|
||||
- PR 랭글러와 협력하여 새로운 기여자에게 [좋은 첫 이슈](https://kubernetes.dev/docs/guide/help-wanted/#good-first-issue)를 파악한다.
|
||||
- 문서 리포지터리에 대한 처음 몇 번의 PR을 통해 새로운 기여자를 멘토링한다.
|
||||
- 새로운 기여자가 쿠버네티스 멤버가 되기 위해 필요한 보다 복잡한 PR을 작성하도록 지원한다.
|
||||
- 쿠버네티스 멤버 가입을 위해 [기여자를 후원](/ko/docs/contribute/advanced/#새로운-기여자-후원)한다.
|
||||
|
|
|
|||
|
|
@ -56,12 +56,14 @@ prior to submitting new content. The information details follow.
|
|||
|
||||
- 마크다운(Markdown)으로 쿠버네티스 문서를 작성하고
|
||||
[Hugo](https://gohugo.io/)를 사용하여 쿠버네티스 사이트를 구축한다.
|
||||
- 쿠버네티스 문서는 마크다운 스펙으로 [CommonMark](https://commonmark.org/)를 사용한다.
|
||||
- 소스는 [GitHub](https://github.com/kubernetes/website)에 있다.
|
||||
쿠버네티스 문서는 `/content/ko/docs/` 에서 찾을 수 있다.
|
||||
일부 참조 문서는 `update-imported-docs/` 디렉터리의 스크립트를 이용하여
|
||||
자동으로 생성된다.
|
||||
- [페이지 템플릿](/docs/contribute/style/page-content-types/)은
|
||||
Hugo에서 문서 콘텐츠의 프리젠테이션을 제어한다.
|
||||
- [페이지 콘텐츠 타입](/docs/contribute/style/page-content-types/)은
|
||||
Hugo에서 문서 콘텐츠가 표시되는 방식을 기술한다.
|
||||
- 쿠버네티스 문서 기여 시 [Docsy shortcodes](https://www.docsy.dev/docs/adding-content/shortcodes/) 또는 [custom Hugo shortcodes](/docs/contribute/style/hugo-shortcodes/)를 사용할 수 있다.
|
||||
- 표준 Hugo 단축코드(shortcode) 이외에도 설명서에서 여러
|
||||
[사용자 정의 Hugo 단축코드](/docs/contribute/style/hugo-shortcodes/)를 사용하여
|
||||
콘텐츠 표시를 제어한다.
|
||||
|
|
|
|||
|
|
@ -26,9 +26,16 @@ PR 랭글러는 일주일 간 매일 다음의 일을 해야 한다.
|
|||
- 내용을 확인해야 하는 경우, PR에 코멘트를 달고 자세한 내용을 요청한다.
|
||||
- 관련 `sig/` 레이블을 할당한다.
|
||||
- 필요한 경우, 파일의 머리말(front matter)에 있는 `reviewers:` 블록의 리뷰어를 할당한다.
|
||||
- PR에 `@kubernetes/<sig>-pr-reviews` 코멘트를 남겨 [SIG](https://github.com/kubernetes/community/blob/master/sig-list.md)에 리뷰를 요청할 수도 있다.
|
||||
- PR을 병합하려면 승인을 위한 `approve` 코멘트를 사용한다. 준비가 되면 PR을 병합한다.
|
||||
- 병합하기 전에 PR은 다른 멤버의 `/lgtm` 코멘트를 받아야 한다.
|
||||
- [스타일 지침]을 충족하지 않지만 기술적으로는 정확한 PR은 수락하는 것을 고려한다. 스타일 문제를 해결하는 `good first issue` 레이블의 새로운 이슈를 올리면 된다.
|
||||
- [스타일 지침](/docs/contribute/style/style-guide/)을 충족하지 않지만
|
||||
기술적으로는 정확한 PR은 수락하는 쪽으로 고려한다.
|
||||
변경 사항을 승인하면, 스타일 이슈에 대한 새 이슈를 연다.
|
||||
보통 이러한 스타일 수정 이슈는 [좋은 첫 이슈](https://kubernetes.dev/docs/guide/help-wanted/#good-first-issue)로 지정할 수 있다.
|
||||
- 스타일 수정 이슈를 좋은 첫 이슈로 표시하면 비교적 쉬운 작업을 공급하여
|
||||
새로운 기여자가 참여하는 것을 장려할 수 있다.
|
||||
|
||||
### 랭글러를 위해 도움이 되는 GitHub 쿼리
|
||||
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@ PR에서 사용할 수 있는 명령의 전체 목록을 보려면
|
|||
`priority/important-longterm` | 6개월 이내에 이 작업을 수행한다.
|
||||
`priority/backlog` | 무기한 연기할 수 있다. 자원이 있을 때 수행한다.
|
||||
`priority/awaiting-more-evidence` | 잠재적으로 좋은 이슈에 대해 잊지 않도록 표시한다.
|
||||
`help` 또는 `good first issue` | 쿠버네티스나 SIG Docs 경험이 거의 없는 사람에게 적합하다. 자세한 내용은 [도움이 필요함 및 좋은 첫 번째 이슈 레이블](https://github.com/kubernetes/community/blob/master/contributors/guide/help-wanted.md)을 참고한다.
|
||||
`help` 또는 `good first issue` | 쿠버네티스나 SIG Docs 경험이 거의 없는 사람에게 적합하다. 자세한 내용은 [도움이 필요함 및 좋은 첫 번째 이슈 레이블](https://kubernetes.dev/docs/guide/help-wanted/)을 참고한다.
|
||||
|
||||
{{< /table >}}
|
||||
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@ TCP/UDP 스트림 포워딩이나 백-엔드 집합에 걸쳐서 라운드-로
|
|||
* [kube-scheduler 프로파일](/ko/docs/reference/scheduling/config/#여러-프로파일)
|
||||
|
||||
* 컨트롤 플레인과 워커 노드에서 꼭 열어야 하는
|
||||
[포트와 프로토콜](/docs/reference/ports-and-protocols/) 리스트
|
||||
[포트와 프로토콜](/ko/docs/reference/ports-and-protocols/) 리스트
|
||||
## API 설정
|
||||
|
||||
이 섹션은 쿠버네티스 구성요소 또는 도구를 환경설정하는 데에 사용되는
|
||||
|
|
@ -73,10 +73,10 @@ TCP/UDP 스트림 포워딩이나 백-엔드 집합에 걸쳐서 라운드-로
|
|||
사용/관리하는 데에 중요하지만, 이들 API의 대부분은 아직 API 서버가
|
||||
제공하지 않는다.
|
||||
|
||||
* [kube-apiserver 환경설정 (v1alpha1)](/docs/reference/config-api/apiserver-config.v1alpha1/)
|
||||
* [kube-apiserver 환경설정 (v1beta1)](/docs/reference/config-api/apiserver-config.v1beta1/)
|
||||
* [kubelet 환경설정 (v1beta1)](/docs/reference/config-api/kubelet-config.v1beta1/)
|
||||
* [kube-scheduler 환경설정 (v1beta1)](/docs/reference/config-api/kube-scheduler-config.v1beta1/)
|
||||
* [kube-scheduler 환경설정 (v1beta2)](/docs/reference/config-api/kube-scheduler-config.v1beta2/)
|
||||
* [kube-scheduler 환경설정 (v1beta3)](/docs/reference/config-api/kube-scheduler-config.v1beta3/)
|
||||
* [kube-scheduler 정책 레퍼런스 (v1)](/docs/reference/config-api/kube-scheduler-policy-config.v1/)
|
||||
* [kube-proxy 환경설정 (v1alpha1)](/docs/reference/config-api/kube-proxy-config.v1alpha1/)
|
||||
* [`audit.k8s.io/v1` API](/docs/reference/config-api/apiserver-audit.v1/)
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ kubectl auth can-i list secrets --namespace dev --as dave
|
|||
no
|
||||
```
|
||||
|
||||
유사하게, `dev` 네임스페이스의 `dev-sa` 서비스 어카운트가
|
||||
유사하게, `dev` 네임스페이스의 `dev-sa` 서비스어카운트가
|
||||
`target` 네임스페이스의 파드 목록을 볼 수 있는지 확인하려면 다음을 실행한다.
|
||||
|
||||
```bash
|
||||
|
|
|
|||
|
|
@ -71,20 +71,23 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
| `CSIMigration` | `false` | 알파 | 1.14 | 1.16 |
|
||||
| `CSIMigration` | `true` | 베타 | 1.17 | |
|
||||
| `CSIMigrationAWS` | `false` | 알파 | 1.14 | |
|
||||
| `CSIMigrationAWS` | `false` | 베타 | 1.17 | |
|
||||
| `CSIMigrationAWS` | `false` | 베타 | 1.17 | 1.22 |
|
||||
| `CSIMigrationAWS` | `true` | 베타 | 1.23 | |
|
||||
| `CSIMigrationAzureDisk` | `false` | 알파 | 1.15 | 1.18 |
|
||||
| `CSIMigrationAzureDisk` | `false` | 베타 | 1.19 | |
|
||||
| `CSIMigrationAzureDisk` | `false` | 베타 | 1.19 | 1.22 |
|
||||
| `CSIMigrationAzureDisk` | `true` | 베타 | 1.23 | |
|
||||
| `CSIMigrationAzureFile` | `false` | 알파 | 1.15 | 1.19 |
|
||||
| `CSIMigrationAzureFile` | `false` | 베타 | 1.21 | |
|
||||
| `CSIMigrationGCE` | `false` | 알파 | 1.14 | 1.16 |
|
||||
| `CSIMigrationGCE` | `false` | 베타 | 1.17 | |
|
||||
| `CSIMigrationGCE` | `false` | 베타 | 1.17 | 1.22 |
|
||||
| `CSIMigrationGCE` | `true` | 베타 | 1.23 | |
|
||||
| `CSIMigrationOpenStack` | `false` | 알파 | 1.14 | 1.17 |
|
||||
| `CSIMigrationOpenStack` | `true` | 베타 | 1.18 | |
|
||||
| `CSIMigrationvSphere` | `false` | 베타 | 1.19 | |
|
||||
| `CSIMigrationPortworx` | `false` | 알파 | 1.23 | |
|
||||
| `CSIMigrationRBD` | `false` | 알파 | 1.23 | |
|
||||
| `CSIStorageCapacity` | `false` | 알파 | 1.19 | 1.20 |
|
||||
| `CSIStorageCapacity` | `true` | 베타 | 1.21 | |
|
||||
| `CSIVolumeFSGroupPolicy` | `false` | 알파 | 1.19 | 1.19 |
|
||||
| `CSIVolumeFSGroupPolicy` | `true` | 베타 | 1.20 | |
|
||||
| `CSIVolumeHealth` | `false` | 알파 | 1.21 | |
|
||||
| `CSRDuration` | `true` | 베타 | 1.22 | |
|
||||
| `ConfigurableFSGroupPolicy` | `false` | 알파 | 1.18 | 1.19 |
|
||||
|
|
@ -92,6 +95,7 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
| `ControllerManagerLeaderMigration` | `false` | 알파 | 1.21 | 1.21 |
|
||||
| `ControllerManagerLeaderMigration` | `true` | 베타 | 1.22 | |
|
||||
| `CustomCPUCFSQuotaPeriod` | `false` | 알파 | 1.12 | |
|
||||
| `CustomResourceValidationExpressions` | `false` | 알파 | 1.23 | |
|
||||
| `DaemonSetUpdateSurge` | `false` | 알파 | 1.21 | 1.21 |
|
||||
| `DaemonSetUpdateSurge` | `true` | 베타 | 1.22 | |
|
||||
| `DefaultPodTopologySpread` | `false` | 알파 | 1.19 | 1.19 |
|
||||
|
|
@ -108,7 +112,8 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
| `EfficientWatchResumption` | `true` | 베타 | 1.21 | |
|
||||
| `EndpointSliceTerminatingCondition` | `false` | 알파 | 1.20 | 1.21 |
|
||||
| `EndpointSliceTerminatingCondition` | `true` | 베타 | 1.22 | |
|
||||
| `EphemeralContainers` | `false` | 알파 | 1.16 | |
|
||||
| `EphemeralContainers` | `false` | 알파 | 1.16 | 1.22 |
|
||||
| `EphemeralContainers` | `true` | 베타 | 1.23 | |
|
||||
| `ExpandCSIVolumes` | `false` | 알파 | 1.14 | 1.15 |
|
||||
| `ExpandCSIVolumes` | `true` | 베타 | 1.16 | |
|
||||
| `ExpandedDNSConfig` | `false` | 알파 | 1.22 | |
|
||||
|
|
@ -117,25 +122,24 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
| `ExpandPersistentVolumes` | `false` | 알파 | 1.8 | 1.10 |
|
||||
| `ExpandPersistentVolumes` | `true` | 베타 | 1.11 | |
|
||||
| `ExperimentalHostUserNamespaceDefaulting` | `false` | 베타 | 1.5 | |
|
||||
| `GenericEphemeralVolume` | `false` | 알파 | 1.19 | 1.20 |
|
||||
| `GenericEphemeralVolume` | `true` | 베타 | 1.21 | |
|
||||
| `GracefulNodeShutdown` | `false` | 알파 | 1.20 | 1.20 |
|
||||
| `GracefulNodeShutdown` | `true` | 베타 | 1.21 | |
|
||||
| `GRPCContainerProbe` | `false` | 알파 | 1.23 | |
|
||||
| `HPAContainerMetrics` | `false` | 알파 | 1.20 | |
|
||||
| `HPAScaleToZero` | `false` | 알파 | 1.16 | |
|
||||
| `IdentifyPodOS` | `false` | 알파 | 1.23 | |
|
||||
| `IndexedJob` | `false` | 알파 | 1.21 | 1.21 |
|
||||
| `IndexedJob` | `true` | 베타 | 1.22 | |
|
||||
| `IngressClassNamespacedParams` | `false` | 알파 | 1.21 | 1.21 |
|
||||
| `IngressClassNamespacedParams` | `true` | 베타 | 1.22 | |
|
||||
| `InTreePluginAWSUnregister` | `false` | 알파 | 1.21 | |
|
||||
| `InTreePluginAzureDiskUnregister` | `false` | 알파 | 1.21 | |
|
||||
| `InTreePluginAzureFileUnregister` | `false` | 알파 | 1.21 | |
|
||||
| `InTreePluginGCEUnregister` | `false` | 알파 | 1.21 | |
|
||||
| `InTreePluginOpenStackUnregister` | `false` | 알파 | 1.21 | |
|
||||
| `InTreePluginvSphereUnregister` | `false` | 알파 | 1.21 | |
|
||||
| `IPv6DualStack` | `false` | 알파 | 1.15 | 1.20 |
|
||||
| `IPv6DualStack` | `true` | 베타 | 1.21 | |
|
||||
| `JobTrackingWithFinalizers` | `false` | 알파 | 1.22 | |
|
||||
| `JobMutableNodeSchedulingDirectives` | `true` | 베타 | 1.23 | |
|
||||
| `JobReadyPods` | `false` | 알파 | 1.23 | |
|
||||
| `JobTrackingWithFinalizers` | `false` | 알파 | 1.22 | 1.22 |
|
||||
| `JobTrackingWithFinalizers` | `true` | 베타 | 1.23 | |
|
||||
| `KubeletCredentialProviders` | `false` | 알파 | 1.20 | |
|
||||
| `KubeletInUserNamespace` | `false` | 알파 | 1.22 | |
|
||||
| `KubeletPodResourcesGetAllocatable` | `false` | 알파 | 1.21 | |
|
||||
|
|
@ -159,7 +163,8 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
| `PodAffinityNamespaceSelector` | `true` | 베타 | 1.22 | |
|
||||
| `PodOverhead` | `false` | 알파 | 1.16 | 1.17 |
|
||||
| `PodOverhead` | `true` | 베타 | 1.18 | |
|
||||
| `PodSecurity` | `false` | 알파 | 1.22 | |
|
||||
| `PodSecurity` | `false` | 알파 | 1.22 | 1.22 |
|
||||
| `PodSecurity` | `true` | 베타 | 1.23 | |
|
||||
| `PreferNominatedNode` | `false` | 알파 | 1.21 | 1.21 |
|
||||
| `PreferNominatedNode` | `true` | 베타 | 1.22 | |
|
||||
| `ProbeTerminationGracePeriod` | `false` | 알파 | 1.21 | 1.21 |
|
||||
|
|
@ -168,6 +173,7 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
| `ProxyTerminatingEndpoints` | `false` | 알파 | 1.22 | |
|
||||
| `QOSReserved` | `false` | 알파 | 1.11 | |
|
||||
| `ReadWriteOncePod` | `false` | 알파 | 1.22 | |
|
||||
| `RecoverVolumeExpansionFailure` | `false` | 알파 | 1.23 | |
|
||||
| `RemainingItemCount` | `false` | 알파 | 1.15 | 1.15 |
|
||||
| `RemainingItemCount` | `true` | 베타 | 1.16 | |
|
||||
| `RemoveSelfLink` | `false` | 알파 | 1.16 | 1.19 |
|
||||
|
|
@ -183,22 +189,22 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
| `ServiceLoadBalancerClass` | `true` | 베타 | 1.22 | |
|
||||
| `SizeMemoryBackedVolumes` | `false` | 알파 | 1.20 | 1.21 |
|
||||
| `SizeMemoryBackedVolumes` | `true` | 베타 | 1.22 | |
|
||||
| `StatefulSetMinReadySeconds` | `false` | 알파 | 1.22 | |
|
||||
| `StatefulSetMinReadySeconds` | `false` | 알파 | 1.22 | 1.22 |
|
||||
| `StatefulSetMinReadySeconds` | `true` | 베타 | 1.23 | |
|
||||
| `StorageVersionAPI` | `false` | 알파 | 1.20 | |
|
||||
| `StorageVersionHash` | `false` | 알파 | 1.14 | 1.14 |
|
||||
| `StorageVersionHash` | `true` | 베타 | 1.15 | |
|
||||
| `SuspendJob` | `false` | 알파 | 1.21 | 1.21 |
|
||||
| `SuspendJob` | `true` | 베타 | 1.22 | |
|
||||
| `TTLAfterFinished` | `false` | 알파 | 1.12 | 1.20 |
|
||||
| `TTLAfterFinished` | `true` | 베타 | 1.21 | |
|
||||
| `TopologyAwareHints` | `false` | 알파 | 1.21 | |
|
||||
| `TopologyAwareHints` | `false` | 알파 | 1.21 | 1.22 |
|
||||
| `TopologyAwareHints` | `true` | 베타 | 1.23 | |
|
||||
| `TopologyManager` | `false` | 알파 | 1.16 | 1.17 |
|
||||
| `TopologyManager` | `true` | 베타 | 1.18 | |
|
||||
| `VolumeCapacityPriority` | `false` | 알파 | 1.21 | - |
|
||||
| `WinDSR` | `false` | 알파 | 1.14 | |
|
||||
| `WinOverlay` | `false` | 알파 | 1.14 | 1.19 |
|
||||
| `WinOverlay` | `true` | 베타 | 1.20 | |
|
||||
| `WindowsHostProcessContainers` | `false` | 알파 | 1.22 | |
|
||||
| `WindowsHostProcessContainers` | `false` | 베타 | 1.23 | |
|
||||
{{< /table >}}
|
||||
|
||||
### GA 또는 사용 중단된 기능을 위한 기능 게이트
|
||||
|
|
@ -227,6 +233,7 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
| `BoundServiceAccountTokenVolume` | `false` | 알파 | 1.13 | 1.20 |
|
||||
| `BoundServiceAccountTokenVolume` | `true` | 베타 | 1.21 | 1.21 |
|
||||
| `BoundServiceAccountTokenVolume` | `true` | GA | 1.22 | - |
|
||||
| `ConfigurableFSGroupPolicy` | `true` | GA | 1.23 | |
|
||||
| `CRIContainerLogRotation` | `false` | 알파 | 1.10 | 1.10 |
|
||||
| `CRIContainerLogRotation` | `true` | 베타 | 1.11 | 1.20 |
|
||||
| `CRIContainerLogRotation` | `true` | GA | 1.21 | - |
|
||||
|
|
@ -257,6 +264,9 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
| `CSIServiceAccountToken` | `false` | 알파 | 1.20 | 1.20 |
|
||||
| `CSIServiceAccountToken` | `true` | 베타 | 1.21 | 1.21 |
|
||||
| `CSIServiceAccountToken` | `true` | GA | 1.22 | |
|
||||
| `CSIVolumeFSGroupPolicy` | `false` | 알파 | 1.19 | 1.19 |
|
||||
| `CSIVolumeFSGroupPolicy` | `true` | 베타 | 1.20 | 1.22 |
|
||||
| `CSIVolumeFSGroupPolicy` | `true` | GA | 1.23 | |
|
||||
| `CronJobControllerV2` | `false` | 알파 | 1.20 | 1.20 |
|
||||
| `CronJobControllerV2` | `true` | 베타 | 1.21 | 1.21 |
|
||||
| `CronJobControllerV2` | `true` | GA | 1.22 | - |
|
||||
|
|
@ -311,6 +321,9 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
| `ExternalPolicyForExternalIP` | `true` | GA | 1.18 | - |
|
||||
| `GCERegionalPersistentDisk` | `true` | 베타 | 1.10 | 1.12 |
|
||||
| `GCERegionalPersistentDisk` | `true` | GA | 1.13 | - |
|
||||
| `GenericEphemeralVolume` | `false` | 알파 | 1.19 | 1.20 |
|
||||
| `GenericEphemeralVolume` | `true` | 베타 | 1.21 | 1.22 |
|
||||
| `GenericEphemeralVolume` | `true` | GA | 1.23 | - |
|
||||
| `HugePageStorageMediumSize` | `false` | 알파 | 1.18 | 1.18 |
|
||||
| `HugePageStorageMediumSize` | `true` | 베타 | 1.19 | 1.21 |
|
||||
| `HugePageStorageMediumSize` | `true` | GA | 1.22 | - |
|
||||
|
|
@ -325,8 +338,14 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
| `ImmutableEphemeralVolumes` | `false` | 알파 | 1.18 | 1.18 |
|
||||
| `ImmutableEphemeralVolumes` | `true` | 베타 | 1.19 | 1.20 |
|
||||
| `ImmutableEphemeralVolumes` | `true` | GA | 1.21 | |
|
||||
| `IngressClassNamespacedParams` | `false` | 알파 | 1.21 | 1.21 |
|
||||
| `IngressClassNamespacedParams` | `true` | 베타 | 1.22 | 1.22 |
|
||||
| `IngressClassNamespacedParams` | `true` | GA | 1.23 | - |
|
||||
| `Initializers` | `false` | 알파 | 1.7 | 1.13 |
|
||||
| `Initializers` | - | 사용중단 | 1.14 | - |
|
||||
| `IPv6DualStack` | `false` | 알파 | 1.15 | 1.20 |
|
||||
| `IPv6DualStack` | `true` | 베타 | 1.21 | 1.22 |
|
||||
| `IPv6DualStack` | `true` | GA | 1.23 | - |
|
||||
| `KubeletConfigFile` | `false` | 알파 | 1.8 | 1.9 |
|
||||
| `KubeletConfigFile` | - | 사용중단 | 1.10 | - |
|
||||
| `KubeletPluginsWatcher` | `false` | 알파 | 1.11 | 1.11 |
|
||||
|
|
@ -356,6 +375,7 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
| `PersistentLocalVolumes` | `false` | 알파 | 1.7 | 1.9 |
|
||||
| `PersistentLocalVolumes` | `true` | 베타 | 1.10 | 1.13 |
|
||||
| `PersistentLocalVolumes` | `true` | GA | 1.14 | - |
|
||||
| `PodAndContainerStatsFromCRI` | `false` | 알파 | 1.23 | |
|
||||
| `PodDisruptionBudget` | `false` | 알파 | 1.3 | 1.4 |
|
||||
| `PodDisruptionBudget` | `true` | 베타 | 1.5 | 1.20 |
|
||||
| `PodDisruptionBudget` | `true` | GA | 1.21 | - |
|
||||
|
|
@ -435,6 +455,9 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
| `SupportPodPidsLimit` | `true` | GA | 1.20 | - |
|
||||
| `Sysctls` | `true` | 베타 | 1.11 | 1.20 |
|
||||
| `Sysctls` | `true` | GA | 1.21 | |
|
||||
| `TTLAfterFinished` | `false` | 알파 | 1.12 | 1.20 |
|
||||
| `TTLAfterFinished` | `true` | 베타 | 1.21 | 1.22 |
|
||||
| `TTLAfterFinished` | `true` | GA | 1.23 | - |
|
||||
| `TaintBasedEvictions` | `false` | 알파 | 1.6 | 1.12 |
|
||||
| `TaintBasedEvictions` | `true` | 베타 | 1.13 | 1.17 |
|
||||
| `TaintBasedEvictions` | `true` | GA | 1.18 | - |
|
||||
|
|
@ -615,6 +638,13 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
GCE-PD 인-트리 플러그인에서 PD CSI 플러그인으로 라우팅할 수 있다. 노드에
|
||||
PD CSI 플러그인이 설치 및 구성이 되어 있지 않은 경우 인-트리 GCE 플러그인으로 폴백을
|
||||
지원한다. CSIMigration 기능 플래그가 필요하다.
|
||||
- `CSIMigrationRBD`: RBD 트리 내(in-tree) 플러그인으로 가는 볼륨 작업을
|
||||
Ceph RBD CSI 플러그인으로 라우트하는 심(shim)과 변환 로직을 활성화한다.
|
||||
클러스터에 CSIMigration 및 CSIMigrationRBD 기능 플래그가 활성화되어 있어야 하고,
|
||||
Ceph CSI 플러그인이 설치 및 설정되어 있어야 한다.
|
||||
이 플래그는 트리 내(in-tree) RBD 플러그인 등록을 금지시키는
|
||||
`InTreePluginRBDUnregister` 기능 플래그에 의해
|
||||
사용 중단되었다.
|
||||
- `CSIMigrationGCEComplete`: kubelet 및 볼륨 컨트롤러에서 GCE-PD
|
||||
인-트리 플러그인 등록을 중지하고 shim 및 변환 로직을 통해 볼륨 작업을 GCE-PD
|
||||
인-트리 플러그인에서 PD CSI 플러그인으로 라우팅할 수 있다.
|
||||
|
|
@ -641,6 +671,9 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
CSIMigrationvSphere 기능 플래그가 활성화되고 vSphere CSI 플러그인이
|
||||
클러스터의 모든 노드에 설치 및 구성이 되어 있어야 한다. 이 플래그는 인-트리 vsphere 플러그인의 등록을 막는 `InTreePluginvSphereUnregister` 기능 플래그로 인해
|
||||
더 이상 사용되지 않는다.
|
||||
- `CSIMigrationPortworx`: Portworx 트리 내(in-tree) 플러그인으로 가는 볼륨 작업을
|
||||
Portworx CSI 플러그인으로 라우트하는 심(shim)과 변환 로직을 활성화한다.
|
||||
Portworx CSI 드라이버가 설치 및 설정되어 있어야 하며, kube-controller-manager와 kubelet 환경 설정 내에 `CSIMigrationPortworx=true` 기능 게이트가 활성화되어 있어야 한다.
|
||||
- `CSINodeInfo`: csi.storage.k8s.io에서 CSINodeInfo API 오브젝트와 관련된 모든 로직을 활성화한다.
|
||||
- `CSIPersistentVolume`: [CSI (Container Storage Interface)](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/storage/container-storage-interface.md)
|
||||
호환 볼륨 플러그인을 통해 프로비저닝된 볼륨을 감지하고
|
||||
|
|
@ -669,6 +702,7 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
동일한 컨트롤러의 버전 1이 선택된다.
|
||||
- `CustomCPUCFSQuotaPeriod`: [kubelet config](/docs/tasks/administer-cluster/kubelet-config-file/)에서
|
||||
`cpuCFSQuotaPeriod` 를 노드가 변경할 수 있도록 한다.
|
||||
- `CustomResourceValidationExpressions`: `x-kubernetes-validations` 확장 기능으로 작성된 검증 규칙을 기반으로 커스텀 리소스를 검증하는 표현 언어 검증(expression language validation)을 CRD에 활성화한다.
|
||||
- `CustomPodDNS`: `dnsConfig` 속성을 사용하여 파드의 DNS 설정을 사용자 정의할 수 있다.
|
||||
자세한 내용은 [파드의 DNS 설정](/ko/docs/concepts/services-networking/dns-pod-service/#pod-dns-config)을
|
||||
확인한다.
|
||||
|
|
@ -758,7 +792,8 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
파드를 정상적으로 종료하려고 시도한다. 자세한 내용은
|
||||
[Graceful Node Shutdown](/ko/docs/concepts/architecture/nodes/#그레이스풀-graceful-노드-셧다운)을
|
||||
참조한다.
|
||||
- `HPAContainerMetrics`: `HorizontalPodAutoscaler`를 활성화하여 대상 파드의
|
||||
- `GRPCContainerProbe`: 활성 프로브(Liveness Probe), 준비성 프로브(Readiness Probe), 스타트업 프로브(Startup Probe)에 대해 gRPC 프로브를 활성화한다. [활성/준비성/스타트업 프로브 구성하기](/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-a-grpc-liveness-probe)를 참조한다.
|
||||
- `HPAContainerMetrics`: `HorizontalPodAutoscaler` 를 활성화하여 대상 파드의
|
||||
개별 컨테이너 메트릭을 기반으로 확장한다.
|
||||
- `HPAScaleToZero`: 사용자 정의 또는 외부 메트릭을 사용할 때 `HorizontalPodAutoscaler` 리소스에 대해
|
||||
`minReplicas` 를 0으로 설정한다.
|
||||
|
|
@ -769,6 +804,8 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
- `HyperVContainer`: 윈도우 컨테이너를 위한
|
||||
[Hyper-V 격리](https://docs.microsoft.com/ko-kr/virtualization/windowscontainers/manage-containers/hyperv-container)
|
||||
기능을 활성화한다.
|
||||
- `IdentifyPodOS`: 파드 OS 필드를 지정할 수 있게 한다. 이를 통해 API 서버 관리 시 파드의 OS를 정석적인 방법으로 알 수 있다.
|
||||
쿠버네티스 {{< skew currentVersion >}}에서, `pod.spec.os.name` 에 사용할 수 있는 값은 `windows` 와 `linux` 이다.
|
||||
- `ImmutableEphemeralVolumes`: 안정성과 성능 향상을 위해 개별 시크릿(Secret)과 컨피그맵(ConfigMap)을
|
||||
변경할 수 없는(immutable) 것으로 표시할 수 있다.
|
||||
- `InTreePluginAWSUnregister`: kubelet 및 볼륨 컨트롤러에 aws-ebs 인-트리
|
||||
|
|
@ -792,6 +829,13 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
비동기 조정을 허용한다.
|
||||
- `IPv6DualStack`: IPv6을 위한 [이중 스택](/ko/docs/concepts/services-networking/dual-stack/)
|
||||
기능을 활성화한다.
|
||||
- `JobMutableNodeSchedulingDirectives`: [잡](/ko/docs/concepts/workloads/controllers/job/)의
|
||||
파드 템플릿에 있는 노드 스케줄링 지시를 업데이트할 수 있게 한다.
|
||||
- `JobReadyPods`: 파드 [컨디션](/ko/docs/concepts/workloads/pods/pod-lifecycle/#파드의-조건)이
|
||||
`Ready`인 파드의 수를 추적하는 기능을 활성화한다.
|
||||
`Ready`인 파드의 수는 [잡](/ko/docs/concepts/workloads/controllers/job/) 상태의
|
||||
[status](/docs/reference/kubernetes-api/workload-resources/job-v1/#JobStatus)
|
||||
필드에 기록된다.
|
||||
- `JobTrackingWithFinalizers`: 클러스터에 무제한으로 남아 있는 파드에 의존하지 않고
|
||||
[잡](/ko/docs/concepts/workloads/controllers/job)의 완료를 추적할 수 있다.
|
||||
잡 컨트롤러는 완료된 파드를 추적하기 위해
|
||||
|
|
@ -851,6 +895,8 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
[파드 삭제 비용](/ko/docs/concepts/workloads/controllers/replicaset/#파드-삭제-비용) 기능을 활성화한다.
|
||||
- `PersistentLocalVolumes`: 파드에서 `local` 볼륨 유형의 사용을 활성화한다.
|
||||
`local` 볼륨을 요청하는 경우 파드 어피니티를 지정해야 한다.
|
||||
- `PodAndContainerStatsFromCRI`: kubelet이 컨테이너와 파드 통계(stat) 정보를 cAdvisor가 아니라
|
||||
CRI 컨테이너 런타임으로부터 수집하도록 설정한다.
|
||||
- `PodDisruptionBudget`: [PodDisruptionBudget](/docs/tasks/run-application/configure-pdb/) 기능을 활성화한다.
|
||||
- `PodAffinityNamespaceSelector`: [파드 어피니티 네임스페이스 셀렉터](/ko/docs/concepts/scheduling-eviction/assign-pod-node/#네임스페이스-셀렉터) 기능과
|
||||
[CrossNamespacePodAffinity](/ko/docs/concepts/policy/resource-quotas/#네임스페이스-간-파드-어피니티-쿼터) 쿼터 범위 기능을 활성화한다.
|
||||
|
|
@ -880,6 +926,10 @@ kubelet과 같은 컴포넌트의 기능 게이트를 설정하려면, 기능
|
|||
(현재 메모리만 해당).
|
||||
- `ReadWriteOncePod`: `ReadWriteOncePod` 퍼시스턴트 볼륨 엑세스 모드를
|
||||
사용한다.
|
||||
- `RecoverVolumeExpansionFailure`: 이전에 실패했던 볼륨 확장으로부터 복구할 수 있도록,
|
||||
사용자가 PVC를 더 작은 크기로 변경할 수 있도록 한다.
|
||||
[볼륨 확장 시 오류 복구](/ko/docs/concepts/storage/persistent-volumes/#볼륨-확장-시-오류-복구)에서
|
||||
자세한 사항을 확인한다.
|
||||
- `RemainingItemCount`: API 서버가
|
||||
[청크(chunking) 목록 요청](/docs/reference/using-api/api-concepts/#retrieving-large-results-sets-in-chunks)에 대한
|
||||
응답에서 남은 항목 수를 표시하도록 허용한다.
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,22 @@
|
|||
---
|
||||
title: 컨테이너 런타임 인터페이스(Container Runtime Interface)
|
||||
id: container-runtime-interface
|
||||
date: 2022-01-10
|
||||
full_link: /ko/docs/concepts/architecture/cri/
|
||||
short_description: >
|
||||
Kubelet과 컨테이너 런타임 사이의 통신을 위한 주요 프로토콜이다.
|
||||
|
||||
aka:
|
||||
tags:
|
||||
- cri
|
||||
---
|
||||
|
||||
Kubelet과 컨테이너 런타임 사이의 통신을 위한 주요 프로토콜이다.
|
||||
|
||||
<!--more-->
|
||||
|
||||
쿠버네티스 컨테이너 런타임 인터페이스(CRI)는
|
||||
[클러스터 컴포넌트](/ko/docs/concepts/overview/components/#노드-컴포넌트)
|
||||
{{< glossary_tooltip text="kubelet" term_id="kubelet" >}}과
|
||||
{{< glossary_tooltip text="container runtime" term_id="container-runtime" >}} 사이의
|
||||
통신을 위한 주요 [gRPC](https://grpc.io) 프로토콜을 정의한다.
|
||||
|
|
@ -14,6 +14,11 @@ tags:
|
|||
- operation
|
||||
---
|
||||
|
||||
[파드 중단](/ko/docs/concepts/workloads/pods/disruptions/)은 노드에 있는 파드가 자발적 또는 비자발적으로 종료되는 절차이다.
|
||||
[파드 중단](/ko/docs/concepts/workloads/pods/disruptions/)은
|
||||
노드에 있는 파드가 자발적 또는 비자발적으로 종료되는 절차이다.
|
||||
|
||||
자발적 중단은 애플리케이션 소유자 또는 클러스터 관리자가 의도적으로 시작한다. 비자발적 중단은 의도하지 않은 것이며, 노드의 리소스 부족과 같은 피할 수 없는 문제 또는 우발적인 삭제로 인해 트리거될 수 있다.
|
||||
<!--more-->
|
||||
|
||||
자발적 중단은 애플리케이션 소유자 또는 클러스터 관리자가 의도적으로 시작한다.
|
||||
비자발적 중단은 의도하지 않은 것이며,
|
||||
노드의 리소스 부족과 같은 피할 수 없는 문제 또는 우발적인 삭제로 인해 트리거가 될 수 있다.
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ aka:
|
|||
tags:
|
||||
- core-object
|
||||
---
|
||||
SI 접미사를 사용하는 작거나 큰 숫자의 정수(whole-number) 표현.
|
||||
[SI](https://en.wikipedia.org/wiki/International_System_of_Units) 접미사를 사용하는 작거나 큰 숫자의 정수(whole-number) 표현.
|
||||
|
||||
<!--more-->
|
||||
|
||||
|
|
@ -19,9 +19,8 @@ tags:
|
|||
큰 숫자는 킬로(kilo), 메가(mega), 또는 기가(giga)
|
||||
단위로 표시할 수 있다.
|
||||
|
||||
|
||||
예를 들어, 숫자 `1.5`는 `1500m`으로, 숫자 `1000`은 `1k`로, `1000000`은
|
||||
`1M`으로 표시할 수 있다. 또한, 이진 표기법 접미사도 명시 가능하므로,
|
||||
`1M`으로 표시할 수 있다. 또한, [이진 표기법](https://en.wikipedia.org/wiki/Binary_prefix) 접미사도 명시 가능하므로,
|
||||
숫자 2048은 `2Ki`로 표기될 수 있다.
|
||||
|
||||
허용되는 10진수(10의 거듭 제곱) 단위는 `m` (밀리), `k` (킬로, 의도적인 소문자),
|
||||
|
|
|
|||
|
|
@ -15,4 +15,4 @@ tags:
|
|||
|
||||
<!--more-->
|
||||
|
||||
민감한 정보를 사용하는 방식에 대해 더 세밀하게 제어할 수 있으며, 유휴 상태의 [암호화](/docs/tasks/administer-cluster/encrypt-data/#ensure-all-secrets-are-encrypted)를 포함하여 우발적인 노출 위험을 줄인다. {{< glossary_tooltip text="파드(Pod)" term_id="pod" >}}는 시크릿을 마운트된 볼륨의 파일로 참조하거나, 파드의 이미지를 풀링하는 kubelet이 시크릿을 참조한다. 시크릿은 기밀 데이터에 적합하고 [컨피그맵](/docs/tasks/configure-pod-container/configure-pod-configmap/)은 기밀이 아닌 데이터에 적합하다.
|
||||
민감한 정보를 사용하는 방식에 대해 더 세밀하게 제어할 수 있으며, 우발적인 노출 위험을 줄인다. 시크릿 값은 기본적으로 base64 문자열로 인코딩되어 암호화되지 않은 채로 저장되지만, [안전하게 암호화](/docs/tasks/administer-cluster/encrypt-data/#ensure-all-secrets-are-encrypted)되도록 설정할 수 있다. {{< glossary_tooltip text="파드" term_id="pod" >}}는 볼륨 마운트 내의 파일 형태로 시크릿에 접근하며, 시크릿은 또한 kubelet이 파드를 위해 이미지를 풀링할 때에도 사용될 수 있다. 시크릿은 기밀 데이터를 다루는 용도로 적합하며, [컨피그맵](/docs/tasks/configure-pod-container/configure-pod-configmap/)은 기밀이 아닌 데이터를 다루는 용도로 적합하다.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,9 @@
|
|||
---
|
||||
title: kubectl 치트 시트
|
||||
|
||||
|
||||
|
||||
|
||||
content_type: concept
|
||||
card:
|
||||
name: reference
|
||||
|
|
@ -215,7 +219,7 @@ kubectl get pods -o json | jq -c 'path(..)|[.[]|tostring]|join(".")'
|
|||
|
||||
# 모든 파드에 대해 ENV를 생성한다(각 파드에 기본 컨테이너가 있고, 기본 네임스페이스가 있고, `env` 명령어가 동작한다고 가정).
|
||||
# `env` 뿐만 아니라 다른 지원되는 명령어를 모든 파드에 실행할 때에도 참고할 수 있다.
|
||||
for pod in $(kubectl get po --output=jsonpath={.items..metadata.name}); do echo $pod && kubectl exec -it $pod env; done
|
||||
for pod in $(kubectl get po --output=jsonpath={.items..metadata.name}); do echo $pod && kubectl exec -it $pod -- env; done
|
||||
```
|
||||
|
||||
## 리소스 업데이트
|
||||
|
|
@ -286,10 +290,10 @@ kubectl scale --replicas=5 rc/foo rc/bar rc/baz # 여러 개
|
|||
|
||||
```bash
|
||||
kubectl delete -f ./pod.json # pod.json에 지정된 유형 및 이름을 사용하여 파드 삭제
|
||||
kubectl delete pod unwanted --now # 유예 시간 없이 즉시 파드 삭제
|
||||
kubectl delete pod,service baz foo # "baz", "foo"와 동일한 이름을 가진 파드와 서비스 삭제
|
||||
kubectl delete pods,services -l name=myLabel # name=myLabel 라벨을 가진 파드와 서비스 삭제
|
||||
kubectl delete pods,services -l name=myLabel --include-uninitialized # 초기화되지 않은 것을 포함하여, name=myLabel 라벨을 가진 파드와 서비스 삭제
|
||||
kubectl -n my-ns delete pod,svc --all # 초기화되지 않은 것을 포함하여, my-ns 네임스페이스 내 모든 파드와 서비스 삭제
|
||||
kubectl -n my-ns delete pod,svc --all # my-ns 네임스페이스 내 모든 파드와 서비스 삭제
|
||||
# awk pattern1 또는 pattern2에 매칭되는 모든 파드 삭제
|
||||
kubectl get pods -n mynamespace --no-headers=true | awk '/pattern1|pattern2/{print $1}' | xargs kubectl delete -n mynamespace pod
|
||||
```
|
||||
|
|
@ -307,8 +311,7 @@ kubectl logs -f my-pod # 실시간 스트림 파드
|
|||
kubectl logs -f my-pod -c my-container # 실시간 스트림 파드 로그(stdout, 멀티-컨테이너 경우)
|
||||
kubectl logs -f -l name=myLabel --all-containers # name이 myLabel인 모든 파드의 로그 스트리밍 (stdout)
|
||||
kubectl run -i --tty busybox --image=busybox -- sh # 대화형 셸로 파드를 실행
|
||||
kubectl run nginx --image=nginx -n
|
||||
mynamespace # 특정 네임스페이스에서 nginx 파드 실행
|
||||
kubectl run nginx --image=nginx -n mynamespace # mynamespace 네임스페이스에서 nginx 파드 1개 실행
|
||||
kubectl run nginx --image=nginx # nginx 파드를 실행하고 해당 스펙을 pod.yaml 파일에 기록
|
||||
--dry-run=client -o yaml > pod.yaml
|
||||
|
||||
|
|
@ -320,6 +323,24 @@ kubectl exec my-pod -c my-container -- ls / # 기존 파드에서 명령
|
|||
kubectl top pod POD_NAME --containers # 특정 파드와 해당 컨테이너에 대한 메트릭 표시
|
||||
kubectl top pod POD_NAME --sort-by=cpu # 지정한 파드에 대한 메트릭을 표시하고 'cpu' 또는 'memory'별로 정렬
|
||||
```
|
||||
## 컨테이너로/컨테이너에서 파일과 디렉터리 복사
|
||||
|
||||
```bash
|
||||
kubectl cp /tmp/foo_dir my-pod:/tmp/bar_dir # 로컬 디렉토리 /tmp/foo_dir 를 현재 네임스페이스의 my-pod 파드 안의 /tmp/bar_dir 로 복사
|
||||
kubectl cp /tmp/foo my-pod:/tmp/bar -c my-container # 로컬 파일 /tmp/foo 를 my-pod 파드의 my-container 컨테이너 안의 /tmp/bar 로 복사
|
||||
kubectl cp /tmp/foo my-namespace/my-pod:/tmp/bar # 로컬 파일 /tmp/foo 를 my-namespace 네임스페이스의 my-pod 파드 안의 /tmp/bar 로 복사
|
||||
kubectl cp my-namespace/my-pod:/tmp/foo /tmp/bar # my-namespace 네임스페이스의 my-pod 파드 안의 파일 /tmp/foo 를 로컬의 /tmp/bar 로 복사
|
||||
```
|
||||
{{< note >}}
|
||||
`kubectl cp` 명령을 사용하려면 컨테이너 이미지에 'tar' 바이너리가 포함되어 있어야 한다. 'tar'가 없으면, `kubectl cp`는 실패할 것이다.
|
||||
심볼릭 링크, 와일드카드 확장, 파일 모드 보존과 같은 고급 사용 사례에 대해서는 `kubectl exec` 를 고려해 볼 수 있다.
|
||||
{{< /note >}}
|
||||
|
||||
```bash
|
||||
tar cf - /tmp/foo | kubectl exec -i -n my-namespace my-pod -- tar xf - -C /tmp/bar # 로컬 파일 /tmp/foo 를 my-namespace 네임스페이스의 my-pod 파드 안의 /tmp/bar 로 복사
|
||||
kubectl exec -n my-namespace my-pod -- tar cf - /tmp/foo | tar xf - -C /tmp/bar # my-namespace 네임스페이스의 my-pod 파드 안의 파일 /tmp/foo 를 로컬의 /tmp/bar 로 복사
|
||||
```
|
||||
|
||||
|
||||
## 디플로이먼트, 서비스와 상호 작용
|
||||
```bash
|
||||
|
|
|
|||
|
|
@ -91,6 +91,7 @@ kubectl [command] [TYPE] [NAME] [flags]
|
|||
* `KUBERNETES_SERVICE_HOST` 환경 변수가 설정되어 있고,
|
||||
* `KUBERNETES_SERVICE_PORT` 환경 변수가 설정되어 있고,
|
||||
* kubectl 명령에 네임스페이스를 명시하지 않으면
|
||||
|
||||
kubectl은 자신이 클러스터 내부에서 실행되고 있다고 가정한다.
|
||||
kubectl은 해당 서비스어카운트의 네임스페이스(파드의 네임스페이스와 동일하다)를 인식하고 해당 네임스페이스에 대해 동작한다.
|
||||
이는 클러스터 외부에서 실행되었을 때와는 다른데,
|
||||
|
|
|
|||
|
|
@ -36,10 +36,9 @@ Go에 의해 정의된 `runtime.GOOS` 값을 kubelet이 읽어서 이 레이블
|
|||
|
||||
적용 대상: 네임스페이스
|
||||
|
||||
`NamespaceDefaultLabelName` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)가
|
||||
활성화되어 있으면,
|
||||
쿠버네티스 API 서버가 모든 네임스페이스에 이 레이블을 적용한다.
|
||||
레이블의 값은 네임스페이스의 이름으로 적용된다.
|
||||
({{< glossary_tooltip text="컨트롤 플레인" term_id="control-plane" >}}의 일부인)
|
||||
쿠버네티스 API 서버가 이 레이블을 모든 네임스페이스에 설정한다.
|
||||
레이블의 값은 네임스페이스의 이름으로 적용된다. 이 레이블의 값을 변경할 수는 없다.
|
||||
|
||||
레이블 {{< glossary_tooltip text="셀렉터" term_id="selector" >}}를 이용하여 특정 네임스페이스를 지정하고 싶다면
|
||||
이 레이블이 유용할 수 있다.
|
||||
|
|
@ -63,6 +62,16 @@ kubelet이 호스트네임을 읽어서 이 레이블의 값으로 채운다. `k
|
|||
이 레이블은 토폴로지 계층의 일부로도 사용된다. [`topology.kubernetes.io/zone`](#topologykubernetesiozone)에서 세부 사항을 확인한다.
|
||||
|
||||
|
||||
## kubernetes.io/change-cause {#change-cause}
|
||||
|
||||
예시: `kubernetes.io/change-cause=kubectl edit --record deployment foo`
|
||||
|
||||
적용 대상: 모든 오브젝트
|
||||
|
||||
이 어노테이션은 어떤 오브젝트가 왜 변경되었는지 그 이유를 담는다.
|
||||
|
||||
어떤 오브젝트를 변경할 수도 있는 `kubectl` 명령에 `--record` 플래그를 사용하면 이 레이블이 추가된다.
|
||||
|
||||
## controller.kubernetes.io/pod-deletion-cost {#pod-deletion-cost}
|
||||
|
||||
예시: `controller.kubernetes.io/pod-deletion-cost=10`
|
||||
|
|
@ -426,3 +435,19 @@ kubelet이 "외부" 클라우드 공급자에 의해 실행되었다면 노드
|
|||
|
||||
더 많은 정보는 [네임스페이스에서 파드 보안 적용](/docs/concepts/security/pod-security-admission)을
|
||||
참고한다.
|
||||
|
||||
## seccomp.security.alpha.kubernetes.io/pod (사용 중단됨) {#seccomp-security-alpha-kubernetes-io-pod}
|
||||
|
||||
이 어노테이션은 쿠버네티스 v1.19부터 사용 중단되었으며 v1.25에서는 작동하지 않을 것이다.
|
||||
파드의 보안 설정을 지정하려면, 파드 스펙에 `securityContext` 필드를 추가한다.
|
||||
파드의 `.spec` 내의 [`securityContext`](/docs/reference/kubernetes-api/workload-resources/pod-v1/#security-context) 필드는 파드 수준 보안 속성을 정의한다.
|
||||
[파드의 보안 컨텍스트를 설정](/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod)하면,
|
||||
해당 설정이 파드 내의 모든 컨테이너에 적용된다.
|
||||
|
||||
## container.seccomp.security.alpha.kubernetes.io/[이름] {#container-seccomp-security-alpha-kubernetes-io}
|
||||
|
||||
이 어노테이션은 쿠버네티스 v1.19부터 사용 중단되었으며 v1.25에서는 작동하지 않을 것이다.
|
||||
[seccomp를 이용하여 컨테이너의 syscall 제한하기](/docs/tutorials/clusters/seccomp/) 튜토리얼에서
|
||||
seccomp 프로파일을 파드 또는 파드 내 컨테이너에 적용하는 단계를 확인한다.
|
||||
튜토리얼에서는 쿠버네티스에 seccomp를 설정하기 위해 사용할 수 있는 방법을 소개하며,
|
||||
이는 파드의 `.spec` 내에 `securityContext` 를 설정함으로써 가능하다.
|
||||
|
|
|
|||
|
|
@ -18,8 +18,8 @@ weight: 20
|
|||
각 단계는 익스텐션 포인트(extension point)를 통해 노출된다. 플러그인은 이러한
|
||||
익스텐션 포인트 중 하나 이상을 구현하여 스케줄링 동작을 제공한다.
|
||||
|
||||
KubeSchedulerConfiguration ([v1beta1](/docs/reference/config-api/kube-scheduler-config.v1beta1/)
|
||||
또는 [v1beta2](/docs/reference/config-api/kube-scheduler-config.v1beta2/))
|
||||
KubeSchedulerConfiguration ([v1beta2](/docs/reference/config-api/kube-scheduler-config.v1beta2/)
|
||||
또는 [v1beta3](/docs/reference/config-api/kube-scheduler-config.v1beta3/))
|
||||
구조에 맞게 파일을 작성하고,
|
||||
`kube-scheduler --config <filename>`을 실행하여
|
||||
스케줄링 프로파일을 지정할 수 있다.
|
||||
|
|
@ -78,6 +78,8 @@ clientConnection:
|
|||
플러그인은 적어도 하나 이상 필요하다.
|
||||
1. `postBind`: 파드가 바인드된 후 호출되는
|
||||
정보성 익스텐션 포인트이다.
|
||||
1. `multiPoint`: 이 필드는 플러그인들의 모든 적용 가능한 익스텐션 포인트에 대해
|
||||
플러그인들을 동시에 활성화하거나 비활성화할 수 있게 하는 환경 설정 전용 필드이다.
|
||||
|
||||
각 익스텐션 포인트에 대해 특정 [기본 플러그인](#스케줄링-플러그인)을 비활성화하거나
|
||||
자체 플러그인을 활성화할 수 있다. 예를 들면, 다음과 같다.
|
||||
|
|
@ -101,7 +103,7 @@ profiles:
|
|||
모든 기본 플러그인을 비활성화할 수 있다. 원하는 경우, 플러그인 순서를 재정렬하는 데
|
||||
사용할 수도 있다.
|
||||
|
||||
### 스케줄링 플러그인
|
||||
### 스케줄링 플러그인 {#scheduling-plugins}
|
||||
|
||||
기본적으로 활성화된 다음의 플러그인은 이들 익스텐션 포인트 중
|
||||
하나 이상을 구현한다.
|
||||
|
|
@ -179,30 +181,6 @@ profiles:
|
|||
볼륨 제한이 충족될 수 있는지 확인한다.
|
||||
익스텐션 포인트: `filter`.
|
||||
|
||||
다음 플러그인은 더 이상 사용되지 않으며 `v1beta1`에서만
|
||||
사용할 수 있다.
|
||||
|
||||
- `NodeResourcesLeastAllocated`: 리소스 할당이 낮은 노드를
|
||||
선호한다.
|
||||
Extension points: `score`.
|
||||
- `NodeResourcesMostAllocated`: 리소스 할당이 많은 노드를
|
||||
선호한다.
|
||||
익스텐션 포인트: `score`.
|
||||
- `RequestedToCapacityRatio`: 할당된 리소스의 구성된 기능에 따라 노드를
|
||||
선호한다.
|
||||
익스텐션 포인트: `score`.
|
||||
- `NodeLabel`: 설정된 {{< glossary_tooltip text="레이블" term_id="label" >}}에 따라
|
||||
노드를 필터링하거나 스코어링한다.
|
||||
익스텐션 포인트: `Filter`, `Score`.
|
||||
- `ServiceAffinity`: {{< glossary_tooltip text="서비스" term_id="service" >}}에
|
||||
속한 파드가 구성된 레이블로 정의된 노드 집합에 맞는지
|
||||
확인한다. 이 플러그인은 또한 서비스에 속한 파드를 노드 간에
|
||||
분산하는 것을 선호한다.
|
||||
익스텐션 포인트: `preFilter`, `filter`, `score`.
|
||||
- `NodePreferAvoidPods`: 노드 주석 `scheduler.alpha.kubernetes.io/preferAvoidPods`에 따라
|
||||
노드의 우선 순위를 지정한다.
|
||||
익스텐션 포인트: `score`.
|
||||
|
||||
### 여러 프로파일
|
||||
|
||||
둘 이상의 프로파일을 실행하도록 `kube-scheduler` 를 구성할 수 있다.
|
||||
|
|
@ -251,6 +229,186 @@ profiles:
|
|||
단 하나만 가질 수 있기 때문이다.
|
||||
{{< /note >}}
|
||||
|
||||
### 다수의 익스텐션 포인트에 플러그인 적용하기 {#multipoint}
|
||||
|
||||
`kubescheduler.config.k8s.io/v1beta3` 부터,
|
||||
다수의 익스텐션 포인트에 대해 플러그인을 쉽게 활성화하거나
|
||||
비활성화할 수 있게 하는 프로파일 환경 설정 `multiPoint` 가 추가되었다.
|
||||
이를 사용하여 사용자와 관리자가 커스텀 프로파일을 사용할 때 환경 설정을 간소화할 수 있다.
|
||||
|
||||
`preScore`, `score`, `preFilter`, `filter` 익스텐션 포인트가 있는 `MyPlugin` 이라는 플러그인이 있다고 가정하자.
|
||||
모든 사용 가능한 익스텐션 포인트에 대해 `MyPlugin` 을 활성화하려면,
|
||||
다음과 같은 프로파일 환경 설정을 사용한다.
|
||||
|
||||
```yaml
|
||||
apiVersion: kubescheduler.config.k8s.io/v1beta3
|
||||
kind: KubeSchedulerConfiguration
|
||||
profiles:
|
||||
- schedulerName: multipoint-scheduler
|
||||
plugins:
|
||||
multiPoint:
|
||||
enabled:
|
||||
- name: MyPlugin
|
||||
```
|
||||
|
||||
위의 예시는 아래와 같이 모든 익스텐션 포인트에 대해 `MyPlugin` 을 수동으로 활성화하는 것과
|
||||
동일한 효과를 갖는다.
|
||||
|
||||
```yaml
|
||||
apiVersion: kubescheduler.config.k8s.io/v1beta3
|
||||
kind: KubeSchedulerConfiguration
|
||||
profiles:
|
||||
- schedulerName: non-multipoint-scheduler
|
||||
plugins:
|
||||
preScore:
|
||||
enabled:
|
||||
- name: MyPlugin
|
||||
score:
|
||||
enabled:
|
||||
- name: MyPlugin
|
||||
preFilter:
|
||||
enabled:
|
||||
- name: MyPlugin
|
||||
filter:
|
||||
enabled:
|
||||
- name: MyPlugin
|
||||
```
|
||||
|
||||
여기서 `multiPoint` 를 사용했을 때의 이점은,
|
||||
추후 `MyPlugin` 이 다른 익스텐션 포인트에 대한 구현을 추가했을 때,
|
||||
새로운 익스텐션에 대해서도 `multiPoint` 환경 설정이 자동으로 활성화될 것이라는 점이다.
|
||||
|
||||
`disabled` 필드를 사용하여, `MultiPoint` 확장으로부터 특정 익스텐션 포인트를 제외할 수 있다.
|
||||
기본 플러그인을 비활성화하거나, 기본이 아닌(non-default) 플러그인을 비활성화하거나,
|
||||
와일드카드(`'*'`)를 사용하여 모든 플러그인을 비활성화할 수 있다.
|
||||
다음은 `Score` 와 `PreScore` 에 대해 비활성화하는 예시이다.
|
||||
|
||||
```yaml
|
||||
apiVersion: kubescheduler.config.k8s.io/v1beta3
|
||||
kind: KubeSchedulerConfiguration
|
||||
profiles:
|
||||
- schedulerName: non-multipoint-scheduler
|
||||
plugins:
|
||||
multiPoint:
|
||||
enabled:
|
||||
- name: 'MyPlugin'
|
||||
preScore:
|
||||
disabled:
|
||||
- name: '*'
|
||||
score:
|
||||
disabled:
|
||||
- name: '*'
|
||||
```
|
||||
|
||||
`v1beta3` 에서, `MultiPoint` 필드를 통해 내부적으로 모든 [기본 플러그인](#scheduling-plugins)이 활성화된다.
|
||||
그러나, 개별 익스텐션 포인트에 대해 기본값(예: 순서, Score 가중치)을 유연하게 재설정하는 것도 여전히 가능하다.
|
||||
예를 들어, 2개의 Score 플러그인 `DefaultScore1` 과 `DefaultScore2` 가 있고
|
||||
각각의 가중치가 `1` 이라고 하자.
|
||||
이 때, 다음과 같이 가중치를 다르게 설정하여 순서를 바꿀 수 있다.
|
||||
|
||||
```yaml
|
||||
apiVersion: kubescheduler.config.k8s.io/v1beta3
|
||||
kind: KubeSchedulerConfiguration
|
||||
profiles:
|
||||
- schedulerName: multipoint-scheduler
|
||||
plugins:
|
||||
score:
|
||||
enabled:
|
||||
- name: 'DefaultScore2'
|
||||
weight: 5
|
||||
```
|
||||
|
||||
이 예제에서, 이 플러그인들을 `MultiPoint` 에 명시할 필요는 없는데,
|
||||
이는 이 플러그인들이 기본 플러그인이기 때문이다.
|
||||
그리고 `Score` 에는 `DefaultScore2` 플러그인만 명시되었다.
|
||||
이는 익스텐션 포인트를 명시하여 설정된 플러그인은 언제나 `MultiPoint` 플러그인보다 우선순위가 높기 때문이다.
|
||||
결론적으로, 위의 예시에서는 두 플러그인을 모두 명시하지 않고도 두 플러그인의 순서를 조정하였다.
|
||||
|
||||
`MultiPoint` 플러그인을 설정할 때, 일반적인 우선 순위는 다음과 같다.
|
||||
1. 명시된 익스텐션 포인트가 먼저 실행되며, 여기에 명시된 환경 설정은 다른 모든 곳에 설정된 내용보다 우선한다.
|
||||
2. `MultiPoint` 및 플러그인 설정을 통해 수동으로 구성된 플러그인
|
||||
3. 기본 플러그인 및 기본 플러그인의 기본 설정
|
||||
|
||||
위의 우선 순위를 설명하기 위해, 다음과 같은 예시를 가정한다.
|
||||
| 플러그인 | 익스텐션 포인트 |
|
||||
|---|---|
|
||||
|`DefaultQueueSort`|`QueueSort`|
|
||||
|`CustomQueueSort`|`QueueSort`|
|
||||
|`DefaultPlugin1`|`Score`, `Filter`|
|
||||
|`DefaultPlugin2`|`Score`|
|
||||
|`CustomPlugin1`|`Score`, `Filter`|
|
||||
|`CustomPlugin2`|`Score`, `Filter`|
|
||||
|
||||
이들 플러그인에 대한 유효한 예시 환경 설정은 다음과 같다.
|
||||
|
||||
```yaml
|
||||
apiVersion: kubescheduler.config.k8s.io/v1beta3
|
||||
kind: KubeSchedulerConfiguration
|
||||
profiles:
|
||||
- schedulerName: multipoint-scheduler
|
||||
plugins:
|
||||
multiPoint:
|
||||
enabled:
|
||||
- name: 'CustomQueueSort'
|
||||
- name: 'CustomPlugin1'
|
||||
weight: 3
|
||||
- name: 'CustomPlugin2'
|
||||
disabled:
|
||||
- name: 'DefaultQueueSort'
|
||||
filter:
|
||||
disabled:
|
||||
- name: 'DefaultPlugin1'
|
||||
score:
|
||||
enabled:
|
||||
- name: 'DefaultPlugin2'
|
||||
```
|
||||
|
||||
명시한 익스텐션 포인트 내에 `MultiPoint` 플러그인을 재정의해도 에러가 발생하지 않음에 유의한다.
|
||||
명시한 익스텐션 포인트의 우선 순위가 더 높으므로,
|
||||
이 재정의는 무시되고 로그에만 기록된다.
|
||||
|
||||
대부분의 환경 설정을 한 곳에서 관리하는 것 말고도, 이 예시는 다음과 같은 내용을 포함한다.
|
||||
* 커스텀 `queueSort` 플러그인을 활성화하고 기존의 기본 플러그인을 비활성화한다
|
||||
* `CustomPlugin1` 과 `CustomPlugin2` 플러그인을 활성화하며, 이 플러그인에 연결된 모든 익스텐션 포인트를 위해 이 플러그인들이 먼저 실행된다
|
||||
* `filter` 에 대해서만 `DefaultPlugin1` 을 비활성화한다
|
||||
* `score` 에 대해, `DefaultPlugin2` 플러그인이 (심지어 커스텀 플러그인보다도) 가장 먼저 실행되도록 순서를 조정한다
|
||||
|
||||
`multiPoint` 필드가 없는 `v1beta3` 이전 버전의 환경 설정에서는, 위의 스니펫을 다음과 같이 표현할 수 있다.
|
||||
```yaml
|
||||
apiVersion: kubescheduler.config.k8s.io/v1beta2
|
||||
kind: KubeSchedulerConfiguration
|
||||
profiles:
|
||||
- schedulerName: multipoint-scheduler
|
||||
plugins:
|
||||
|
||||
# 기본 QueueSort 플러그인을 비활성화한다
|
||||
queueSort:
|
||||
enabled:
|
||||
- name: 'CustomQueueSort'
|
||||
disabled:
|
||||
- name: 'DefaultQueueSort'
|
||||
|
||||
# 커스텀 Filter 플러그인을 활성화한다
|
||||
filter:
|
||||
enabled:
|
||||
- name: 'CustomPlugin1'
|
||||
- name: 'CustomPlugin2'
|
||||
- name: 'DefaultPlugin2'
|
||||
disabled:
|
||||
- name: 'DefaultPlugin1'
|
||||
|
||||
# 커스텀 score 플러그인을 활성화하고 순서를 조정한다
|
||||
score:
|
||||
enabled:
|
||||
- name: 'DefaultPlugin2'
|
||||
weight: 1
|
||||
- name: 'DefaultPlugin1'
|
||||
weight: 3
|
||||
```
|
||||
|
||||
다소 복잡한 예시를 통해, 익스텐션 포인트를 설정함에 있어서 `MultiPoint` 환경 설정의 유연성과
|
||||
기존 방법과의 끊김없는 통합을 확인할 수 있다.
|
||||
|
||||
## 스케줄러 설정 전환
|
||||
|
||||
{{< tabs name="tab_with_md" >}}
|
||||
|
|
@ -284,8 +442,14 @@ profiles:
|
|||
|
||||
* v1beta2 설정 파일에서 활성화된 플러그인은 해당 플러그인의 기본 설정값보다 v1beta2 설정 파일의 값이 우선 적용된다.
|
||||
|
||||
* 스케줄러 healthz와 metrics 바인드 주소에 대해 `host` 또는 `port`가 잘못 설정되면 검증 실패를 유발한다.
|
||||
* 스케줄러 healthz와 metrics 바인드 주소에 대해 `host` 또는 `port` 가 잘못 설정되면 검증 실패를 유발한다.
|
||||
{{% /tab %}}
|
||||
|
||||
{{% tab name="v1beta2 → v1beta3" %}}
|
||||
* 세 플러그인의 가중치 기본값이 다음과 같이 증가한다.
|
||||
* `InterPodAffinity`: 1 에서 2 로
|
||||
* `NodeAffinity`: 1 에서 2 로
|
||||
* `TaintToleration`: 1 에서 3 으로
|
||||
{{% /tab %}}
|
||||
{{< /tabs >}}
|
||||
|
||||
|
|
@ -293,5 +457,5 @@ profiles:
|
|||
|
||||
* [kube-scheduler 레퍼런스](/docs/reference/command-line-tools-reference/kube-scheduler/) 읽어보기
|
||||
* [스케줄링](/ko/docs/concepts/scheduling-eviction/kube-scheduler/)에 대해 알아보기
|
||||
* [kube-scheduler 설정 (v1beta1)](/docs/reference/config-api/kube-scheduler-config.v1beta1/) 레퍼런스 읽어보기
|
||||
* [kube-scheduler 설정 (v1beta2)](/docs/reference/config-api/kube-scheduler-config.v1beta2/) 레퍼런스 읽어보기
|
||||
* [kube-scheduler 설정 (v1beta3)](/docs/reference/config-api/kube-scheduler-config.v1beta3/) 레퍼런스 읽어보기
|
||||
|
|
|
|||
|
|
@ -1,102 +1,20 @@
|
|||
---
|
||||
title: 스케줄링 정책
|
||||
content_type: concept
|
||||
weight: 10
|
||||
sitemap:
|
||||
priority: 0.2 # Scheduling priorities are deprecated
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
스케줄링 정책을 사용하여 {{< glossary_tooltip text="kube-scheduler" term_id="kube-scheduler" >}}가 각각 노드를 필터링하고 스코어링(scoring)하기 위해 실행하는 *단정(predicates)* 및 *우선순위(priorities)* 를 지정할 수 있다.
|
||||
쿠버네티스 v1.23 이전 버전에서는, *단정(predicates)* 및 *우선순위(priorities)* 프로세스를 지정하기 위해 스케줄링 정책을 사용할 수 있다.
|
||||
예를 들어, `kube-scheduler --policy-config-file <filename>` 또는 `kube-scheduler --policy-configmap <ConfigMap>` 명령을 실행하여 스케줄링 정책을 설정할 수 있다.
|
||||
|
||||
`kube-scheduler --policy-config-file <filename>` 또는 `kube-scheduler --policy-configmap <ConfigMap>`을 실행하고 [정책 유형](/docs/reference/config-api/kube-scheduler-policy-config.v1/)을 사용하여 스케줄링 정책을 설정할 수 있다.
|
||||
|
||||
<!-- body -->
|
||||
|
||||
## 단정 {#predicates}
|
||||
|
||||
다음의 *단정* 은 필터링을 구현한다.
|
||||
|
||||
- `PodFitsHostPorts`: 파드가 요청하는 파드의 포트에 대해 노드에 사용할 수 있는
|
||||
포트(네트워크 프로토콜 종류)가 있는지 확인한다.
|
||||
|
||||
- `PodFitsHost`: 파드가 호스트 이름으로 특정 노드를 지정하는지 확인한다.
|
||||
|
||||
- `PodFitsResources`: 파드의 요구 사항을 충족할 만큼 노드에 사용할 수 있는
|
||||
리소스(예: CPU 및 메모리)가 있는지 확인한다.
|
||||
|
||||
- `MatchNodeSelector`: 파드의 노드 {{< glossary_tooltip text="셀렉터" term_id="selector" >}}가
|
||||
노드의 {{< glossary_tooltip text="레이블" term_id="label" >}}과 일치하는지 확인한다.
|
||||
|
||||
- `NoVolumeZoneConflict`: 해당 스토리지에 대한 장애 영역 제한이 주어지면
|
||||
파드가 요청하는 {{< glossary_tooltip text="볼륨" term_id="volume" >}}을 노드에서 사용할 수 있는지
|
||||
평가한다.
|
||||
|
||||
- `NoDiskConflict`: 요청하는 볼륨과 이미 마운트된 볼륨으로 인해
|
||||
파드가 노드에 적합한지 평가한다.
|
||||
|
||||
- `MaxCSIVolumeCount`: 연결해야 하는 {{< glossary_tooltip text="CSI" term_id="csi" >}} 볼륨의 수와
|
||||
구성된 제한을 초과하는지 여부를 결정한다.
|
||||
|
||||
- `PodToleratesNodeTaints`: 파드의 {{< glossary_tooltip text="톨러레이션" term_id="toleration" >}}이
|
||||
노드의 {{< glossary_tooltip text="테인트" term_id="taint" >}}를 용인할 수 있는지 확인한다.
|
||||
|
||||
- `CheckVolumeBinding`: 파드가 요청한 볼륨에 적합할 수 있는지 평가한다.
|
||||
이는 바인딩된 {{< glossary_tooltip text="PVC" term_id="persistent-volume-claim" >}}와
|
||||
바인딩되지 않은 PVC 모두에 적용된다.
|
||||
|
||||
## 우선순위 {#priorities}
|
||||
|
||||
다음의 *우선순위* 는 스코어링을 구현한다.
|
||||
|
||||
- `SelectorSpreadPriority`: 동일한 {{< glossary_tooltip text="서비스" term_id="service" >}},
|
||||
{{< glossary_tooltip text="스테이트풀셋(StatefulSet)" term_id="statefulset" >}} 또는
|
||||
{{< glossary_tooltip text="레플리카셋(ReplicaSet)" term_id="replica-set" >}}에 속하는
|
||||
파드를 고려하여, 파드를 여러 호스트에 파드를 분산한다.
|
||||
|
||||
- `InterPodAffinityPriority`: 선호된
|
||||
[파드간 어피니티와 안티-어피니티](/ko/docs/concepts/scheduling-eviction/assign-pod-node/#파드간-어피니티와-안티-어피니티)를 구현한다.
|
||||
|
||||
- `LeastRequestedPriority`: 요청된 리소스가 적은 노드를 선호한다. 즉,
|
||||
노드에 배치되는 파드가 많고, 해당 파드가 사용하는 리소스가
|
||||
많을수록 이 정책이 부여하는 순위가 낮아진다.
|
||||
|
||||
- `MostRequestedPriority`: 요청된 리소스가 가장 많은 노드를 선호한다.
|
||||
이 정책은 전체 워크로드 세트를 실행하는 데 필요한 최소 노드 수에 스케줄된
|
||||
파드를 맞춘다.
|
||||
|
||||
- `RequestedToCapacityRatioPriority`: 기본 리소스 스코어링 기능을 사용하여 ResourceAllocationPriority에 기반한 requestedToCapacity를 생성한다.
|
||||
|
||||
- `BalancedResourceAllocation`: 균형 잡힌 리소스 사용의 노드를 선호한다.
|
||||
|
||||
- `NodePreferAvoidPodsPriority`: 노드 어노테이션 `scheduler.alpha.kubernetes.io/preferAvoidPods`에 따라
|
||||
노드의 우선순위를 지정한다. 이를 사용하여 두 개의 다른 파드가
|
||||
동일한 노드에서 실행되면 안된다는 힌트를 줄 수 있다.
|
||||
|
||||
- `NodeAffinityPriority`: PreferredDuringSchedulingIgnoredDuringExecution에 표시된 노드 어피니티 스케줄링
|
||||
설정에 따라 노드의 우선순위를 지정한다.
|
||||
이에 대한 자세한 내용은 [노드에 파드 할당하기](/ko/docs/concepts/scheduling-eviction/assign-pod-node/)에서 확인할 수 있다.
|
||||
|
||||
- `TaintTolerationPriority`: 노드에서 용인할 수 없는 테인트 수를 기반으로,
|
||||
모든 노드의 우선순위 목록을 준비한다. 이 정책은 해당 목록을
|
||||
고려하여 노드의 순위를 조정한다.
|
||||
|
||||
- `ImageLocalityPriority`: 해당 파드의
|
||||
{{< glossary_tooltip text="컨테이너 이미지" term_id="image" >}}가 이미 로컬로 캐시된
|
||||
노드를 선호한다.
|
||||
|
||||
- `ServiceSpreadingPriority`: 특정 서비스에 대해, 이 정책은 해당 서비스에 대한
|
||||
파드가 서로 다른 노드에서 실행되는 것을 목표로 한다. 해당 서비스에 대한
|
||||
파드가 이미 할당되지 않은 노드에 스케줄링하는 것을 선호한다. 전반적인 결과는
|
||||
서비스가 단일 노드 장애에 대해 더 탄력적이라는 것이다.
|
||||
|
||||
- `EqualPriority`: 모든 노드에 동일한 가중치를 부여한다.
|
||||
|
||||
- `EvenPodsSpreadPriority`: 선호된
|
||||
[파드 토폴로지 분배 제약 조건](/ko/docs/concepts/workloads/pods/pod-topology-spread-constraints/)을 구현한다.
|
||||
이러한 스케줄링 정책은 쿠버네티스 v1.23 버전부터 지원되지 않는다. 관련된 플래그인 `policy-config-file`, `policy-configmap`, `policy-configmap-namespace`, `use-legacy-policy-config` 플래그도 지원되지 않는다. 대신, 비슷한 효과를 얻기 위해 [스케줄러 구성](/ko/docs/reference/scheduling/config/)을 사용한다.
|
||||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
* [스케줄링](/ko/docs/concepts/scheduling-eviction/kube-scheduler/)에 대해 배우기
|
||||
* [kube-scheduler 프로파일](/docs/reference/scheduling/profiles/)에 대해 배우기
|
||||
* [kube-scheduler configuration 레퍼런스 (v1beta2)](/docs/reference/config-api/kube-scheduler-config.v1beta2) 읽어보기
|
||||
* [kube-scheduler configuration 레퍼런스 (v1beta3)](/docs/reference/config-api/kube-scheduler-config.v1beta3) 읽어보기
|
||||
* [kube-scheduler Policy 레퍼런스 (v1)](/docs/reference/config-api/kube-scheduler-policy-config.v1/) 읽어보기
|
||||
|
|
|
|||
|
|
@ -49,3 +49,19 @@ Kompose의 용도
|
|||
* 도커 컴포즈 파일을 쿠버네티스 오브젝트로 변환
|
||||
* 로컬 도커 개발 환경에서 나의 애플리케이션을 쿠버네티스를 통해 관리하도록 이전
|
||||
* V1 또는 V2 도커 컴포즈 `yaml` 파일 또는 [분산 애플리케이션 번들](https://docs.docker.com/compose/bundles/)을 변환
|
||||
|
||||
## Kui
|
||||
|
||||
[`Kui`](https://github.com/kubernetes-sigs/kui)는 입력으로 일반적인 `kubectl` 커맨드 라인 요청을 받고
|
||||
출력으로 그래픽적인 응답을 제공하는 GUI 도구이다.
|
||||
|
||||
Kui는 입력으로 일반적인 `kubectl` 커맨드 라인 요청을 받고 출력으로 그래픽적인 응답을 제공한다.
|
||||
Kui는 ASCII 표 대신 정렬 가능한 표를 GUI로 제공한다.
|
||||
|
||||
Kui를 사용하면 다음의 작업이 가능하다.
|
||||
|
||||
* 자동으로 생성되어 길이가 긴 리소스 이름을 클릭하여 복사할 수 있다.
|
||||
* `kubectl` 명령을 입력하면 실행되는 모습을 볼 수 있으며, `kubectl` 보다 더 빠른 경우도 있다.
|
||||
* {{< glossary_tooltip text="잡" term_id="job">}}을 조회하여
|
||||
실행 형상을 워터폴 그림으로 확인한다.
|
||||
* 탭이 있는 UI를 이용하여 클러스터의 자원을 클릭 동작으로 확인할 수 있다.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
---
|
||||
title: 클라이언트 라이브러리
|
||||
|
||||
|
||||
content_type: concept
|
||||
weight: 30
|
||||
---
|
||||
|
|
@ -35,7 +37,6 @@ API 호출 또는 요청/응답 타입을 직접 구현할 필요는 없다.
|
|||
| JavaScript | [github.com/kubernetes-client/javascript](https://github.com/kubernetes-client/javascript) | [둘러보기](https://github.com/kubernetes-client/javascript/tree/master/examples)
|
||||
| Python | [github.com/kubernetes-client/python/](https://github.com/kubernetes-client/python/) | [둘러보기](https://github.com/kubernetes-client/python/tree/master/examples)
|
||||
|
||||
|
||||
## 커뮤니티에 의해 관리되는 클라이언트 라이브러리
|
||||
|
||||
{{% thirdparty-content %}}
|
||||
|
|
@ -70,7 +71,6 @@ API 호출 또는 요청/응답 타입을 직접 구현할 필요는 없다.
|
|||
| Python | [github.com/tomplus/kubernetes_asyncio](https://github.com/tomplus/kubernetes_asyncio) |
|
||||
| Python | [github.com/Frankkkkk/pykorm](https://github.com/Frankkkkk/pykorm) |
|
||||
| Ruby | [github.com/abonas/kubeclient](https://github.com/abonas/kubeclient) |
|
||||
| Ruby | [github.com/Ch00k/kuber](https://github.com/Ch00k/kuber) |
|
||||
| Ruby | [github.com/k8s-ruby/k8s-ruby](https://github.com/k8s-ruby/k8s-ruby) |
|
||||
| Ruby | [github.com/kontena/k8s-client](https://github.com/kontena/k8s-client) |
|
||||
| Rust | [github.com/clux/kube-rs](https://github.com/clux/kube-rs) |
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
---
|
||||
title: 쿠버네티스 API 헬스(health) 엔드포인트
|
||||
|
||||
|
||||
content_type: concept
|
||||
weight: 50
|
||||
---
|
||||
|
|
@ -18,11 +20,11 @@ weight: 50
|
|||
`/readyz` 엔드포인트는 `--shutdown-delay-duration` [플래그](/docs/reference/command-line-tools-reference/kube-apiserver) 옵션을 사용하여 정상적(graceful)으로 셧다운할 수 있다.
|
||||
API 서버의 `healthz`/`livez`/`readyz` 를 사용하는 머신은 HTTP 상태 코드에 의존해야 한다.
|
||||
상태 코드 200은 호출된 엔드포인트에 따라 API 서버의 `healthy`/`live`/`ready` 상태를 나타낸다.
|
||||
아래 표시된 더 자세한 옵션은 운영자가 클러스터나 특정 API 서버의 상태를 디버깅하는데 사용할 수 있다.
|
||||
아래 표시된 더 자세한 옵션은 운영자가 클러스터를 디버깅하거나 특정 API 서버의 상태를 이해하는 데 사용할 수 있다.
|
||||
|
||||
다음의 예시는 헬스 API 엔드포인트와 상호 작용할 수 있는 방법을 보여준다.
|
||||
|
||||
모든 엔드포인트는 `verbose` 파라미터를 사용하여 검사 항목과 상태를 출력할 수 있다.
|
||||
모든 엔드포인트에 대해, `verbose` 파라미터를 사용하여 검사 항목과 상태를 출력할 수 있다.
|
||||
이는 운영자가 머신 사용을 위한 것이 아닌, API 서버의 현재 상태를 디버깅하는데 유용하다.
|
||||
|
||||
```shell
|
||||
|
|
@ -91,7 +93,7 @@ curl -k 'https://localhost:6443/readyz?verbose&exclude=etcd'
|
|||
|
||||
{{< feature-state state="alpha" >}}
|
||||
|
||||
각 개별 헬스 체크는 HTTP 엔드포인트를 노출하고 개별적으로 체크가 가능하다.
|
||||
각 개별 헬스 체크는 HTTP 엔드포인트를 노출하며 개별적으로 체크할 수 있다.
|
||||
개별 체크를 위한 스키마는 `/livez/<healthcheck-name>` 이고, 여기서 `livez` 와 `readyz` 는 API 서버의 활성 상태 또는 준비 상태인지를 확인할 때 사용한다.
|
||||
`<healthcheck-name>` 경로 위에서 설명한 `verbose` 플래그를 사용해서 찾을 수 있고, `[+]` 와 `ok` 사이의 경로를 사용한다.
|
||||
이러한 개별 헬스 체크는 머신에서 사용되서는 안되며, 운영자가 시스템의 현재 상태를 디버깅하는데 유용하다.
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ sudo sysctl --system
|
|||
자세한 내용은 [네트워크 플러그인 요구 사항](/ko/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#네트워크-플러그인-요구-사항) 페이지를 참고한다.
|
||||
|
||||
## 필수 포트 확인 {#check-required-ports}
|
||||
[필수 포트들](/docs/reference/ports-and-protocols/)은
|
||||
[필수 포트들](/ko/docs/reference/ports-and-protocols/)은
|
||||
쿠버네티스 컴포넌트들이 서로 통신하기 위해서 열려 있어야
|
||||
한다. 다음과 같이 telnet 명령을 이용하여 포트가 열려 있는지 확인해 볼 수 있다.
|
||||
|
||||
|
|
@ -243,7 +243,7 @@ sudo mkdir -p $DOWNLOAD_DIR
|
|||
crictl 설치(kubeadm / Kubelet 컨테이너 런타임 인터페이스(CRI)에 필요)
|
||||
|
||||
```bash
|
||||
CRICTL_VERSION="v1.17.0"
|
||||
CRICTL_VERSION="v1.22.0"
|
||||
ARCH="amd64"
|
||||
curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-${ARCH}.tar.gz" | sudo tar -C $DOWNLOAD_DIR -xz
|
||||
```
|
||||
|
|
|
|||
|
|
@ -38,8 +38,8 @@ Kubespray는 [Ansible](https://docs.ansible.com/) 플레이북, [인벤토리](h
|
|||
* 타겟 서버들은 docker 이미지를 풀(pull) 하기 위해 반드시 인터넷에 접속할 수 있어야 한다. 아니라면, 추가적인 설정을 해야 한다 ([오프라인 환경 확인하기](https://github.com/kubernetes-sigs/kubespray/blob/master/docs/offline-environment.md))
|
||||
* 타겟 서버들의 **IPv4 포워딩**이 활성화되어야 한다
|
||||
* **SSH 키**가 인벤토리의 모든 서버들에 복사되어야 한다
|
||||
* **방화벽은 관리되지 않는다**. 사용자가 예전 방식대로 고유한 규칙을 구현해야 한다. 디플로이먼트 과정에서의 문제를 방지하려면 방화벽을 비활성화해야 한다
|
||||
* 만약 kubespray가 루트가 아닌 사용자 계정에서 실행되었다면, 타겟 서버에서 알맞은 권한 확대 방법이 설정되어야 한다. 그 뒤 `ansible_become` 플래그나 커맨드 파라미터들, `--become` 또는 `-b` 가 명시되어야 한다
|
||||
* **방화벽은 kubespray에 의해 관리되지 않는다**. 사용자는 필요에 따라 적절한 규칙을 구현해야 한다. 디플로이먼트 과정에서의 문제를 방지하려면 방화벽을 비활성화해야 한다
|
||||
* 만약 kubespray가 루트가 아닌 사용자 계정에서 실행되었다면, 타겟 서버에서 알맞은 권한 확대 방법이 설정되어야 하며, `ansible_become` 플래그나 커맨드 파라미터들, `--become` 또는 `-b` 가 명시되어야 한다
|
||||
|
||||
Kubespray는 환경에 맞는 프로비저닝을 돕기 위해 아래와 같은 서비스를 제공한다:
|
||||
|
||||
|
|
|
|||
|
|
@ -998,7 +998,7 @@ PodSecurityContext 필드는 윈도우에서 작동하지 않는다. 참조를
|
|||
|
||||
쿠버네티스 클러스터 트러블슈팅을 위한 기본
|
||||
도움말은 이
|
||||
[섹션](/docs/tasks/debug-application-cluster/troubleshooting/)에서 먼저 찾아야 한다. 이
|
||||
[섹션](/ko/docs/tasks/debug-application-cluster/troubleshooting/)에서 먼저 찾아야 한다. 이
|
||||
섹션에는 몇 가지 추가 윈도우 관련 트러블슈팅 도움말이 포함되어 있다.
|
||||
로그는 쿠버네티스에서 트러블슈팅하는데 중요한 요소이다. 다른
|
||||
기여자로부터 트러블슈팅 지원을 구할 때마다 이를 포함해야
|
||||
|
|
|
|||
|
|
@ -1,4 +1,9 @@
|
|||
---
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
title: 쿠버네티스에서 윈도우 컨테이너 스케줄링을 위한 가이드
|
||||
content_type: concept
|
||||
weight: 75
|
||||
|
|
@ -155,7 +160,21 @@ GMSA로 구성한 컨테이너는 GMSA로 구성된 신원을 들고 있는 동
|
|||
노드셀렉터(nodeSelector)의 조합을 이용해야 한다.
|
||||
이것은 윈도우 사용자에게만 부담을 줄 것으로 보인다. 아래는 권장되는 방식의 개요인데,
|
||||
이것의 주요 목표 중에 하나는 이 방식이 기존 리눅스 워크로드와 호환되어야 한다는 것이다.
|
||||
{{< note >}}
|
||||
`IdentifyPodOS` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)가 활성화되어 있으면,
|
||||
파드의 컨테이너가 어떤 운영 체제용인지를 파드의 `.spec.os.name`에 설정할 수 있다(그리고 설정해야 한다).
|
||||
리눅스 컨테이너를 실행하는 파드에는 `.spec.os.name`을 `linux`로 설정한다.
|
||||
윈도우 컨테이너를 실행하는 파드에는 `.spec.os.name`을
|
||||
`windows`로 설정한다.
|
||||
|
||||
스케줄러는 파드를 노드에 할당할 때 `.spec.os.name` 필드의 값을 사용하지 않는다.
|
||||
컨트롤 플레인이 파드를 적절한 운영 체제가 실행되고 있는 노드에 배치하도록 하려면,
|
||||
[파드를 노드에 할당](/ko/docs/concepts/scheduling-eviction/assign-pod-node/)하는
|
||||
일반적인 쿠버네티스 메카니즘을 사용해야 한다.
|
||||
`.spec.os.name` 필드는 윈도우 파드의 스케줄링에는 영향을 미치지 않기 때문에,
|
||||
윈도우 파드가 적절한 윈도우 노드에 할당되도록 하려면 테인트,
|
||||
톨러레이션 및 노드 셀렉터가 여전히 필요하다.
|
||||
{{< /note >}}
|
||||
### 특정 OS 워크로드를 적절한 컨테이너 호스트에서 처리하도록 보장하기
|
||||
|
||||
사용자는 테인트와 톨러레이션을 이용하여 윈도우 컨테이너가 적절한 호스트에서 스케줄링되기를 보장할 수 있다.
|
||||
|
|
|
|||
|
|
@ -214,117 +214,9 @@ apiserver의 인증서 제공을 검증하는데 사용되어야 한다.
|
|||
|
||||
## 클러스터에서 실행되는 서비스로 접근
|
||||
|
||||
이전 장은 쿠버네티스 API server 접속에 대한 내용을 다루었다. 이번 장은
|
||||
쿠버네티스 클러스터 상에서 실행되는 다른 서비스로의 연결을 다룰 것이다.
|
||||
이전 섹션에서는 쿠버네티스 API 서버에 연결하는 방법을 소개하였다. 쿠버네티스 클러스터에서 실행되는 다른 서비스에 연결하는 방법은 [클러스터 접근](/ko/docs/tasks/access-application-cluster/access-cluster/) 페이지를 참조한다.
|
||||
|
||||
쿠버네티스에서, [노드](/ko/docs/concepts/architecture/nodes/),
|
||||
[파드](/ko/docs/concepts/workloads/pods/) 및 [서비스](/ko/docs/concepts/services-networking/service/)는 모두
|
||||
고유한 IP를 가진다. 당신의 데스크탑 PC와 같은 클러스터 외부 장비에서는
|
||||
클러스터 상의 노드 IP, 파드 IP, 서비스 IP로 라우팅되지 않아서 접근을
|
||||
할 수 없을 것이다.
|
||||
|
||||
### 통신을 위한 방식들
|
||||
|
||||
클러스터 외부에서 노드, 파드 및 서비스에 접속하기 위한 몇 가지 옵션이 있다.
|
||||
|
||||
- 공인 IP를 통해 서비스에 접근.
|
||||
- 클러스터 외부에서 접근할 수 있도록 `NodePort` 또는 `LoadBalancer` 타입의
|
||||
서비스를 사용한다. [서비스](/ko/docs/concepts/services-networking/service/)와
|
||||
[kubectl expose](/docs/reference/generated/kubectl/kubectl-commands/#expose) 문서를 참조한다.
|
||||
- 클러스터 환경에 따라, 서비스는 회사 네트워크에만 노출되기도 하며,
|
||||
인터넷에 노출되는 경우도 있다. 이 경우 노출되는 서비스의 보안 여부를 고려해야 한다.
|
||||
해당 서비스는 자체적으로 인증을 수행하는가?
|
||||
- 파드는 서비스 뒤에 위치시킨다. 레플리카들의 집합에서 특정 파드 하나에 debugging 같은 목적으로 접근하려면
|
||||
해당 파드에 고유의 레이블을 붙이고 셀렉터에 해당 레이블을 선택하는 신규 서비스를 생성한다.
|
||||
- 대부분의 경우에는 애플리케이션 개발자가 노드 IP를 통해 직접 노드에
|
||||
접근할 필요는 없다.
|
||||
- Proxy Verb를 사용하여 서비스, 노드, 파드에 접근.
|
||||
- 원격 서비스에 접근하기에 앞서 apiserver의 인증과 인가를 받아야 한다.
|
||||
서비스가 인터넷에 노출하기에 보안이 충분하지 않거나 노드 IP 상의 포트에
|
||||
접근을 하려고 하거나 debugging을 하려면 이를 사용한다.
|
||||
- 어떤 web 애플리케이션에서는 프록시가 문제를 일으킬 수 있다.
|
||||
- HTTP/HTTPS에서만 동작한다.
|
||||
- [여기](#수작업으로-apiserver-proxy-url들을-구축)에서 설명하고 있다.
|
||||
- 클러스터 내 노드 또는 파드에서 접근.
|
||||
- 파드를 실행한 다음, [kubectl exec](/docs/reference/generated/kubectl/kubectl-commands/#exec)를 사용하여 해당 파드의 셸로 접속한다.
|
||||
해당 셸에서 다른 노드, 파드, 서비스에 연결한다.
|
||||
- 어떤 클러스터는 클러스터 내의 노드에 ssh 접속을 허용하기도 한다. 이런 클러스터에서는
|
||||
클러스터 서비스에 접근도 가능하다. 이는 비표준 방식으로 특정 클러스터에서는 동작하지만
|
||||
다른 클러스터에서는 동작하지 않을 수 있다. 브라우저와 다른 도구들이 설치되지 않았거나 설치되었을 수 있다. 클러스터 DNS가 동작하지 않을 수도 있다.
|
||||
|
||||
### 빌트인 서비스 검색
|
||||
|
||||
일반적으로 kube-system에 의해 클러스터에 실행되는 몇 가지 서비스가 있다.
|
||||
`kubectl cluster-info` 커맨드로 이 서비스의 리스트를 볼 수 있다.
|
||||
|
||||
```shell
|
||||
kubectl cluster-info
|
||||
```
|
||||
|
||||
결괏값은 다음과 같을 것이다.
|
||||
|
||||
```
|
||||
Kubernetes master is running at https://104.197.5.247
|
||||
elasticsearch-logging is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy
|
||||
kibana-logging is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/kibana-logging/proxy
|
||||
kube-dns is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/kube-dns/proxy
|
||||
grafana is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
|
||||
heapster is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/monitoring-heapster/proxy
|
||||
```
|
||||
|
||||
이는 각 서비스에 접근하기 위한 proxy-verb URL을 보여준다.
|
||||
예를 들어 위 클러스터는 클러스터 수준의 logging(Elasticsearch 사용)이 활성화되었으므로 적절한 인증을 통과하여
|
||||
`https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/`로 접근할 수 있다. 예를 들어 kubectl proxy로
|
||||
`http://localhost:8080/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/`를 통해 logging에 접근할 수도 있다.
|
||||
(인증을 통과하는 방법이나 kubectl proxy를 사용하는 것은 [쿠버네티스 API를 사용해서 클러스터에 접근하기](/ko/docs/tasks/administer-cluster/access-cluster-api/)을 참조한다.)
|
||||
|
||||
#### 수작업으로 apiserver proxy URL을 구축
|
||||
|
||||
위에서 언급한 것처럼 서비스의 proxy URL을 검색하는 데 `kubectl cluster-info` 커맨드를 사용할 수 있다. 서비스 endpoint, 접미사, 매개변수를 포함하는 proxy URL을 생성하려면 해당 서비스에
|
||||
`http://`*`kubernetes_master_address`*`/api/v1/namespaces/`*`namespace_name`*`/services/`*`service_name[:port_name]`*`/proxy` 형식의 proxy URL을 덧붙인다.
|
||||
|
||||
당신이 포트에 이름을 지정하지 않았다면 URL에 *port_name* 을 지정할 필요는 없다. 이름이 있는 포트와 이름이 없는 포트 모두에 대하여, *port_name* 이 들어갈 자리에 포트 번호를 기재할 수도 있다.
|
||||
|
||||
기본적으로 API server는 http를 사용하여 서비스를 프록시한다. https를 사용하려면 다음과 같이 서비스 네임의 접두사에 `https:`를 붙인다.
|
||||
`http://`*`kubernetes_master_address`*`/api/v1/namespaces/`*`namespace_name`*`/services/`*`https:service_name:[port_name]`*`/proxy`
|
||||
|
||||
URL의 네임 부분에 지원되는 양식은 다음과 같다.
|
||||
|
||||
* `<service_name>` - http를 사용하여 기본값 또는 이름이 없는 포트로 프록시한다.
|
||||
* `<service_name>:<port_name>` - http를 사용하여 지정된 포트 이름 또는 포트 번호로 프록시한다.
|
||||
* `https:<service_name>:` - https를 사용하여 기본값 또는 이름이 없는 포트로 프록시한다. (마지막 콜론:에 주의)
|
||||
* `https:<service_name>:<port_name>` - https를 사용하여 지정된 포트 이름 또는 포트 번호로 프록시한다.
|
||||
|
||||
##### 예제들
|
||||
|
||||
* Elasticsearch 서비스 endpoint `_search?q=user:kimchy`에 접근하려면 `http://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_search?q=user:kimchy`를 사용할 수 있다.
|
||||
* Elasticsearch 클러스터 상태 정보 `_cluster/health?pretty=true`에 접근하려면 `https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_cluster/health?pretty=true`를 사용할 수 있다.
|
||||
|
||||
```json
|
||||
{
|
||||
"cluster_name" : "kubernetes_logging",
|
||||
"status" : "yellow",
|
||||
"timed_out" : false,
|
||||
"number_of_nodes" : 1,
|
||||
"number_of_data_nodes" : 1,
|
||||
"active_primary_shards" : 5,
|
||||
"active_shards" : 5,
|
||||
"relocating_shards" : 0,
|
||||
"initializing_shards" : 0,
|
||||
"unassigned_shards" : 5
|
||||
}
|
||||
```
|
||||
|
||||
### 클러스터 상에서 실행되는 서비스에 웹브라우저를 사용하여 접근
|
||||
|
||||
브라우저의 주소창에 apiserver proxy url을 넣을 수도 있다. 하지만
|
||||
|
||||
- 웹브라우저는 일반적으로 토큰을 전달할 수 없으므로 basic (password) auth를 사용해야 할 것이다. basic auth를 수용할 수 있도록 apiserver를 구성할 수 있지만,
|
||||
당신의 클러스터가 basic auth를 수용할 수 있도록 구성되어 있지 않을 수도 있다.
|
||||
- 몇몇 web app은 동작하지 않을 수도 있다. 특히 proxy path prefix를 인식하지 않는 방식으로 url을
|
||||
구성하는 client side javascript를 가진 web app은 동작하지 않을 수 있다.
|
||||
|
||||
## 요청 redirect
|
||||
## redirect 요청하기
|
||||
|
||||
redirect 기능은 deprecated되고 제거 되었다. 대신 (아래의) 프록시를 사용하기를 바란다.
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ weight: 70
|
|||
|
||||
이 작업은
|
||||
지원되는 환경이 필요한
|
||||
[외부 로드밸런서가 있는 서비스](/docs/tasks/access-application-cluster/create-external-load-balancer/)를 사용한다. 만약, 이를 지원하지 않는 환경이라면, [노드포트](/ko/docs/concepts/services-networking/service/#nodeport) 서비스 타입을
|
||||
[외부 로드밸런서가 있는 서비스](/docs/tasks/access-application-cluster/create-external-load-balancer/)를 사용한다. 만약, 이를 지원하지 않는 환경이라면, [노드포트](/ko/docs/concepts/services-networking/service/#type-nodeport) 서비스 타입을
|
||||
대신 사용할 수 있다.
|
||||
|
||||
<!-- lessoncontent -->
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ jsonpath에서 `.items[*]` 부분은 생략해야 하는데, 이는 명령어가
|
|||
반복하여 출력할 수 있다.
|
||||
|
||||
```shell
|
||||
kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\
|
||||
kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\
|
||||
sort
|
||||
```
|
||||
|
||||
|
|
@ -80,7 +80,7 @@ sort
|
|||
명령어 결과값은 `app=nginx` 레이블에 일치하는 파드만 출력한다.
|
||||
|
||||
```shell
|
||||
kubectl get pods --all-namespaces -o=jsonpath="{.items[*].spec.containers[*].image}" -l app=nginx
|
||||
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" -l app=nginx
|
||||
```
|
||||
|
||||
## 파드 네임스페이스로 필터링된 컨테이너 이미지 목록 보기
|
||||
|
|
|
|||
|
|
@ -86,7 +86,17 @@ heapster is running at https://104.197.5.247/api/v1/namespaces/kube-system/servi
|
|||
위에서 언급한 것처럼, `kubectl cluster-info` 명령을 사용하여 서비스의 프록시 URL을 검색한다. 서비스 엔드포인트, 접미사 및 매개 변수를 포함하는 프록시 URL을 작성하려면, 서비스의 프록시 URL에 추가하면 된다.
|
||||
`http://`*`kubernetes_master_address`*`/api/v1/namespaces/`*`namespace_name`*`/services/`*`[https:]service_name[:port_name]`*`/proxy`
|
||||
|
||||
포트에 대한 이름을 지정하지 않은 경우, URL에 *port_name* 을 지정할 필요가 없다.
|
||||
포트에 대한 이름을 지정하지 않은 경우, URL에 *port_name* 을 지정할 필요가 없다. 또한, 이름이 지정된 포트와 지정되지 않은 포트 모두에 대해, *port_name* 자리에 포트 번호를 기재할 수도 있다.
|
||||
|
||||
기본적으로, API 서버는 서비스로의 프록시를 HTTP로 제공한다. HTTPS를 사용하려면, 서비스 이름 앞에 `https:`를 추가한다.
|
||||
`http://<쿠버네티스_컨트롤_플레인_주소>/api/v1/namespaces/<네임스페이스_이름>/services/<서비스_이름>/proxy`
|
||||
|
||||
URL에서 `<서비스_이름>`이 지원하는 형식은 다음과 같다.
|
||||
|
||||
* `<서비스_이름>` - 기본 포트 또는 이름이 지정되지 않은 포트로 http를 사용하여 프록시
|
||||
* `<서비스_이름>:<포트_이름>` - 기재된 포트 이름 또는 포트 번호로 http를 사용하여 프록시
|
||||
* `https:<서비스_이름>:` - 기본 포트 또는 이름이 지정되지 않은 포트로 https를 사용하여 프록시(맨 끝의 콜론에 유의)
|
||||
* `https:<서비스_이름>:<포트_이름>` - 기재된 포트 이름 또는 포트 번호로 https를 사용하여 프록시
|
||||
|
||||
##### 예제
|
||||
|
||||
|
|
|
|||
|
|
@ -1,38 +0,0 @@
|
|||
---
|
||||
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/)를 참고
|
||||
|
|
@ -1,224 +0,0 @@
|
|||
---
|
||||
|
||||
|
||||
title: 고가용성 쿠버네티스 클러스터 컨트롤 플레인 설정하기
|
||||
content_type: task
|
||||
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
{{< feature-state for_k8s_version="v1.5" state="alpha" >}}
|
||||
|
||||
구글 컴퓨트 엔진(Google Compute Engine, 이하 GCE)의 `kube-up`이나 `kube-down` 스크립트에 쿠버네티스 컨트롤 플레인 노드를 복제할 수 있다. 하지만 이러한 스크립트들은 프로덕션 용도로 사용하기에 적합하지 않으며, 프로젝트의 CI에서만 주로 사용된다.
|
||||
이 문서는 kube-up/down 스크립트를 사용하여 고가용(HA) 컨트롤 플레인을 관리하는 방법과 GCE와 함께 사용하기 위해 HA 컨트롤 플레인을 구현하는 방법에 관해 설명한다.
|
||||
|
||||
|
||||
|
||||
|
||||
## {{% heading "prerequisites" %}}
|
||||
|
||||
|
||||
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
|
||||
|
||||
|
||||
|
||||
<!-- steps -->
|
||||
|
||||
## HA 호환 클러스터 시작
|
||||
|
||||
새 HA 호환 클러스터를 생성하려면, `kube-up` 스크립트에 다음 플래그를 설정해야 한다.
|
||||
|
||||
* `MULTIZONE=true` - 서버의 기본 영역(zone)과 다른 영역에서 컨트롤 플레인 kubelet이 제거되지 않도록 한다.
|
||||
여러 영역에서 컨트롤 플레인 노드를 실행(권장됨)하려는 경우에 필요하다.
|
||||
|
||||
* `ENABLE_ETCD_QUORUM_READ=true` - 모든 API 서버에서 읽은 내용이 최신 데이터를 반환하도록 하기 위한 것이다.
|
||||
true인 경우, Etcd의 리더 복제본에서 읽는다.
|
||||
이 값을 true로 설정하는 것은 선택 사항이다. 읽기는 더 안정적이지만 느리게 된다.
|
||||
|
||||
선택적으로, 첫 번째 컨트롤 플레인 노드가 생성될 GCE 영역을 지정할 수 있다.
|
||||
다음 플래그를 설정한다.
|
||||
|
||||
* `KUBE_GCE_ZONE=zone` - 첫 번째 컨트롤 플레인 노드가 실행될 영역.
|
||||
|
||||
다음 샘플 커맨드는 europe-west1-b GCE 영역에 HA 호환 클러스터를 구성한다.
|
||||
|
||||
```shell
|
||||
MULTIZONE=true KUBE_GCE_ZONE=europe-west1-b ENABLE_ETCD_QUORUM_READS=true ./cluster/kube-up.sh
|
||||
```
|
||||
|
||||
위의 커맨드는 하나의 컨트롤 플레인 노드를 포함하는 클러스터를 생성한다.
|
||||
그러나 후속 커맨드로 새 컨트롤 플레인 노드를 추가할 수 있다.
|
||||
|
||||
## 새 컨트롤 플레인 노드 추가
|
||||
|
||||
HA 호환 클러스터를 생성했다면, 여기에 컨트롤 플레인 노드를 추가할 수 있다.
|
||||
`kube-up` 스크립트에 다음 플래그를 사용하여 컨트롤 플레인 노드를 추가한다.
|
||||
|
||||
* `KUBE_REPLICATE_EXISTING_MASTER=true` - 기존 컨트롤 플레인 노드의 복제본을
|
||||
만든다.
|
||||
|
||||
* `KUBE_GCE_ZONE=zone` - 컨트롤 플레인 노드가 실행될 영역.
|
||||
반드시 다른 컨트롤 플레인 노드가 존재하는 영역과 동일한 지역(region)에 있어야 한다.
|
||||
|
||||
HA 호환 클러스터를 시작할 때, 상속되는 `MULTIZONE`이나 `ENABLE_ETCD_QUORUM_READS` 플래그를 따로
|
||||
설정할 필요는 없다.
|
||||
|
||||
다음 샘플 커맨드는 기존 HA 호환 클러스터에서
|
||||
컨트롤 플레인 노드를 복제한다.
|
||||
|
||||
```shell
|
||||
KUBE_GCE_ZONE=europe-west1-c KUBE_REPLICATE_EXISTING_MASTER=true ./cluster/kube-up.sh
|
||||
```
|
||||
|
||||
## 컨트롤 플레인 노드 제거
|
||||
|
||||
다음 플래그가 있는 `kube-down` 스크립트를 사용하여 HA 클러스터에서 컨트롤 플레인 노드를 제거할 수 있다.
|
||||
|
||||
* `KUBE_DELETE_NODES=false` - kubelet을 삭제하지 않기 위한 것이다.
|
||||
|
||||
* `KUBE_GCE_ZONE=zone` - 컨트롤 플레인 노드가 제거될 영역.
|
||||
|
||||
* `KUBE_REPLICA_NAME=replica_name` - (선택) 제거할 컨트롤 플레인 노드의 이름.
|
||||
명시하지 않으면, 해당 영역의 모든 복제본이 제거된다.
|
||||
|
||||
다음 샘플 커맨드는 기존 HA 클러스터에서 컨트롤 플레인 노드를 제거한다.
|
||||
|
||||
```shell
|
||||
KUBE_DELETE_NODES=false KUBE_GCE_ZONE=europe-west1-c ./cluster/kube-down.sh
|
||||
```
|
||||
|
||||
## 동작에 실패한 컨트롤 플레인 노드 처리
|
||||
|
||||
HA 클러스터의 컨트롤 플레인 노드 중 하나가 동작에 실패하면,
|
||||
클러스터에서 해당 노드를 제거하고 동일한 영역에 새 컨트롤 플레인
|
||||
노드를 추가하는 것이 가장 좋다.
|
||||
다음 샘플 커맨드로 이 과정을 시연한다.
|
||||
|
||||
1. 손상된 복제본을 제거한다.
|
||||
|
||||
```shell
|
||||
KUBE_DELETE_NODES=false KUBE_GCE_ZONE=replica_zone KUBE_REPLICA_NAME=replica_name ./cluster/kube-down.sh
|
||||
```
|
||||
|
||||
<ol start="2"><li>기존 복제본을 대신할 새 노드를 추가한다.</li></ol>
|
||||
|
||||
```shell
|
||||
KUBE_GCE_ZONE=replica-zone KUBE_REPLICATE_EXISTING_MASTER=true ./cluster/kube-up.sh
|
||||
```
|
||||
|
||||
## HA 클러스터에서 컨트롤 플레인 노드 복제에 관한 모범 사례
|
||||
|
||||
* 다른 영역에 컨트롤 플레인 노드를 배치하도록 한다. 한 영역이 동작에 실패하는 동안,
|
||||
해당 영역에 있는 컨트롤 플레인 노드도 모두 동작에 실패할 것이다.
|
||||
영역 장애를 극복하기 위해 노드를 여러 영역에 배치한다
|
||||
(더 자세한 내용은 [멀티 영역](/ko/docs/setup/best-practices/multiple-zones/)를 참조한다).
|
||||
|
||||
* 두 개의 노드로 구성된 컨트롤 플레인은 사용하지 않는다. 두 개의 노드로 구성된
|
||||
컨트롤 플레인에서의 합의를 위해서는 지속적 상태(persistent state) 변경 시 두 컨트롤 플레인 노드가 모두 정상적으로 동작 중이어야 한다.
|
||||
결과적으로 두 컨트롤 플레인 노드 모두 필요하고, 둘 중 한 컨트롤 플레인 노드에만 장애가 발생해도
|
||||
클러스터의 심각한 장애 상태를 초래한다.
|
||||
따라서 HA 관점에서는 두 개의 노드로 구성된 컨트롤 플레인은
|
||||
단일 노드로 구성된 컨트롤 플레인보다도 못하다.
|
||||
|
||||
* 컨트롤 플레인 노드를 추가하면, 클러스터의 상태(Etcd)도 새 인스턴스로 복사된다.
|
||||
클러스터가 크면, 이 상태를 복제하는 시간이 오래 걸릴 수 있다.
|
||||
이 작업은 [etcd 관리 가이드](https://etcd.io/docs/v2.3/admin_guide/#member-migration)에 기술한 대로
|
||||
Etcd 데이터 디렉터리를 마이그레이션하여 속도를 높일 수 있다.
|
||||
(향후에 Etcd 데이터 디렉터리 마이그레이션 지원 추가를 고려 중이다)
|
||||
|
||||
|
||||
|
||||
<!-- discussion -->
|
||||
|
||||
## 구현 지침
|
||||
|
||||

|
||||
|
||||
### 개요
|
||||
위의 그림은 3개의 컨트롤 플레인 노드와 컴포넌트를 고가용 클러스터로 구성한 형상을 보여준다. 해당 컨트롤 플레인 노드의 컴포넌트들은 다음의 방법을 차용하고 있다.
|
||||
|
||||
- etcd: 인스턴스는 합의(consensus)를 통해서 클러스터링되어 있다.
|
||||
|
||||
- 컨트롤러들, 스케줄러, 클러스터 오토-스케일러: 리스(lease) 메커니즘을 통해 클러스터에서 각각 단 하나의 인스턴스만 활성화될 것이다.
|
||||
|
||||
- 애드-온(add-on) 메니저: 애드-온들이 동기화를 유지하도록 각각 독립적으로 동작한다.
|
||||
|
||||
추가적으로, API 서버들 앞에서 동작하는 로드 밸런서는 내부와 외부 트래픽을 컨트롤 플레인 노드들로 연결(route)한다.
|
||||
각 컨트롤 플레인 노드는 다음 모드에서 다음 구성 요소를 실행한다.
|
||||
|
||||
* Etcd 인스턴스: 모든 인스턴스는 합의를 사용하여 함께 클러스터화 한다.
|
||||
|
||||
* API 서버: 각 서버는 내부 Etcd와 통신한다. 클러스터의 모든 API 서버가 가용하게 된다.
|
||||
|
||||
* 컨트롤러, 스케줄러, 클러스터 오토스케일러: 임대 방식을 이용한다. 각 인스턴스 중 하나만이 클러스터에서 활성화된다.
|
||||
|
||||
* 애드온 매니저: 각 매니저는 애드온의 동기화를 유지하려고 독립적으로 작업한다.
|
||||
|
||||
또한 API 서버 앞단에 외부/내부 트래픽을 라우팅하는 로드 밸런서가 있을 것이다.
|
||||
|
||||
### 로드 밸런싱
|
||||
|
||||
두 번째 컨트롤 플레인 노드를 배치할 때, 두 개의 복제본에 대한 로드 밸런서가 생성될 것이고, 첫 번째 복제본의 IP 주소가 로드 밸런서의 IP 주소로 승격된다.
|
||||
비슷하게 끝에서 두 번째의 컨트롤 플레인 노드를 제거한 후에는 로드 밸런서가 제거되고
|
||||
해당 IP 주소는 마지막으로 남은 복제본에 할당된다.
|
||||
로드 밸런서 생성 및 제거는 복잡한 작업이며, 이를 전파하는 데 시간(~20분)이 걸릴 수 있다.
|
||||
|
||||
### 컨트롤 플레인 서비스와 Kubelet
|
||||
|
||||
쿠버네티스 서비스에서 최신의 쿠버네티스 API 서버 목록을 유지하는 대신,
|
||||
시스템은 모든 트래픽을 외부 IP 주소로 보낸다.
|
||||
|
||||
* 단일 노드 컨트롤 플레인의 경우, IP 주소는 단일 컨트롤 플레인 노드를 가리킨다.
|
||||
|
||||
* 고가용성 컨트롤 플레인의 경우, IP 주소는 컨트롤 플레인 노드 앞의 로드밸런서를 가리킨다.
|
||||
|
||||
마찬가지로 Kubelet은 외부 IP 주소를 사용하여 컨트롤 플레인과 통신한다.
|
||||
|
||||
### 컨트롤 플레인 노드 인증서
|
||||
|
||||
쿠버네티스는 각 컨트롤 플레인 노드의 외부 퍼블릭 IP 주소와 내부 IP 주소를 대상으로 TLS 인증서를 발급한다.
|
||||
컨트롤 플레인 노드의 임시 퍼블릭 IP 주소에 대한 인증서는 없다.
|
||||
임시 퍼블릭 IP 주소를 통해 컨트롤 플레인 노드에 접근하려면, TLS 검증을 건너뛰어야 한다.
|
||||
|
||||
### etcd 클러스터화
|
||||
|
||||
etcd를 클러스터로 구축하려면, etcd 인스턴스간 통신에 필요한 포트를 열어야 한다(클러스터 내부 통신용).
|
||||
이러한 배포를 안전하게 하기 위해, etcd 인스턴스간의 통신은 SSL을 이용하여 승인한다.
|
||||
|
||||
### API 서버 신원
|
||||
|
||||
{{< feature-state state="alpha" for_k8s_version="v1.20" >}}
|
||||
|
||||
API 서버 식별 기능은
|
||||
[기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)에
|
||||
의해 제어되며 기본적으로 활성화되지 않는다.
|
||||
{{< glossary_tooltip text="API 서버" term_id="kube-apiserver" >}}
|
||||
시작 시 `APIServerIdentity` 라는 기능 게이트를 활성화하여 API 서버 신원을 활성화할 수 있다.
|
||||
|
||||
```shell
|
||||
kube-apiserver \
|
||||
--feature-gates=APIServerIdentity=true \
|
||||
# …다른 플래그는 평소와 같다.
|
||||
```
|
||||
|
||||
부트스트랩 중에 각 kube-apiserver는 고유한 ID를 자신에게 할당한다. ID는
|
||||
`kube-apiserver-{UUID}` 형식이다. 각 kube-apiserver는
|
||||
_kube-system_ {{< glossary_tooltip text="네임스페이스" term_id="namespace">}}에
|
||||
[임대](/docs/reference/generated/kubernetes-api/{{< param "version" >}}//#lease-v1-coordination-k8s-io)를 생성한다.
|
||||
임대 이름은 kube-apiserver의 고유 ID이다. 임대에는
|
||||
`k8s.io/component=kube-apiserver` 라는 레이블이 있다. 각 kube-apiserver는
|
||||
`IdentityLeaseRenewIntervalSeconds` (기본값은 10초)마다 임대를 새로 갱신한다. 각
|
||||
kube-apiserver는 `IdentityLeaseDurationSeconds` (기본값은 3600초)마다
|
||||
모든 kube-apiserver 식별 ID 임대를 확인하고,
|
||||
`IdentityLeaseDurationSeconds` 이상 갱신되지 않은 임대를 삭제한다.
|
||||
`IdentityLeaseRenewIntervalSeconds` 및 `IdentityLeaseDurationSeconds`는
|
||||
kube-apiserver 플래그 `identity-lease-renew-interval-seconds`
|
||||
및 `identity-lease-duration-seconds`로 구성된다.
|
||||
|
||||
이 기능을 활성화하는 것은 HA API 서버 조정과 관련된 기능을
|
||||
사용하기 위한 전제조건이다(예: `StorageVersionAPI` 기능 게이트).
|
||||
|
||||
## 추가 자료
|
||||
|
||||
[자동화된 HA 마스터 배포 - 제안 문서](https://git.k8s.io/community/contributors/design-proposals/cluster-lifecycle/ha_master.md)
|
||||
|
|
@ -1,4 +1,9 @@
|
|||
---
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
title: 윈도우 노드 추가
|
||||
min-kubernetes-server-version: 1.17
|
||||
content_type: tutorial
|
||||
|
|
|
|||
|
|
@ -78,10 +78,6 @@ OS 패키지 관리자를 사용하여 쿠버네티스의 최신 패치 릴리
|
|||
apt-mark unhold kubeadm && \
|
||||
apt-get update && apt-get install -y kubeadm={{< skew currentVersion >}}.x-00 && \
|
||||
apt-mark hold kubeadm
|
||||
-
|
||||
# apt-get 버전 1.1부터 다음 방법을 사용할 수도 있다
|
||||
apt-get update && \
|
||||
apt-get install -y --allow-change-held-packages kubeadm={{< skew currentVersion >}}.x-00
|
||||
{{% /tab %}}
|
||||
{{% tab name="CentOS, RHEL 또는 Fedora" %}}
|
||||
# {{< skew currentVersion >}}.x-0에서 x를 최신 패치 버전으로 바꾼다.
|
||||
|
|
@ -175,10 +171,6 @@ sudo kubeadm upgrade apply
|
|||
apt-mark unhold kubelet kubectl && \
|
||||
apt-get update && apt-get install -y kubelet={{< skew currentVersion >}}.x-00 kubectl={{< skew currentVersion >}}.x-00 && \
|
||||
apt-mark hold kubelet kubectl
|
||||
-
|
||||
# apt-get 버전 1.1부터 다음 방법을 사용할 수도 있다
|
||||
apt-get update && \
|
||||
apt-get install -y --allow-change-held-packages kubelet={{< skew currentVersion >}}.x-00 kubectl={{< skew currentVersion >}}.x-00
|
||||
{{% /tab %}}
|
||||
{{% tab name="CentOS, RHEL 또는 Fedora" %}}
|
||||
# {{< skew currentVersion >}}.x-0에서 x를 최신 패치 버전으로 바꾼다
|
||||
|
|
@ -218,10 +210,6 @@ sudo systemctl restart kubelet
|
|||
apt-mark unhold kubeadm && \
|
||||
apt-get update && apt-get install -y kubeadm={{< skew currentVersion >}}.x-00 && \
|
||||
apt-mark hold kubeadm
|
||||
-
|
||||
# apt-get 버전 1.1부터 다음 방법을 사용할 수도 있다
|
||||
apt-get update && \
|
||||
apt-get install -y --allow-change-held-packages kubeadm={{< skew currentVersion >}}.x-00
|
||||
{{% /tab %}}
|
||||
{{% tab name="CentOS, RHEL 또는 Fedora" %}}
|
||||
# {{< skew currentVersion >}}.x-0에서 x를 최신 패치 버전으로 바꾼다
|
||||
|
|
@ -256,10 +244,6 @@ sudo systemctl restart kubelet
|
|||
apt-mark unhold kubelet kubectl && \
|
||||
apt-get update && apt-get install -y kubelet={{< skew currentVersion >}}.x-00 kubectl={{< skew currentVersion >}}.x-00 && \
|
||||
apt-mark hold kubelet kubectl
|
||||
-
|
||||
# apt-get 버전 1.1부터 다음 방법을 사용할 수도 있다
|
||||
apt-get update && \
|
||||
apt-get install -y --allow-change-held-packages kubelet={{< skew currentVersion >}}.x-00 kubectl={{< skew currentVersion >}}.x-00
|
||||
{{% /tab %}}
|
||||
{{% tab name="CentOS, RHEL 또는 Fedora" %}}
|
||||
# {{< skew currentVersion >}}.x-0에서 x를 최신 패치 버전으로 바꾼다
|
||||
|
|
|
|||
|
|
@ -10,8 +10,20 @@ content_type: task
|
|||
{{< feature-state for_k8s_version="v1.21" state="stable" >}}
|
||||
|
||||
이 문서는 쿠버네티스 클러스터에서 {{< glossary_tooltip term_id="sysctl" >}} 인터페이스를 사용하여
|
||||
커널 파라미터를 어떻게 구성하고, 사용하는지를 설명한다.
|
||||
커널 파라미터를 어떻게 구성하고, 사용하는지를
|
||||
설명한다.
|
||||
|
||||
{{< note >}}
|
||||
쿠버네티스 버전 1.23부터, kubelet은 `/` 또는 `.`를
|
||||
sysctl 이름의 구분자로 사용하는 것을 지원한다.
|
||||
예를 들어, 동일한 sysctl 이름을 `kernel.shm_rmid_forced`와 같이 마침표를 구분자로 사용하여 나타내거나
|
||||
`kernel/shm_rmid_forced`와 같이 슬래시를 구분자로 사용하여 나타낼 수 있다.
|
||||
sysctl 파라미터 변환에 대한 세부 사항은
|
||||
리눅스 맨페이지 프로젝트의
|
||||
[sysctl.d(5)](https://man7.org/linux/man-pages/man5/sysctl.d.5.html) 페이지를 참고한다.
|
||||
파드와 파드시큐리티폴리시(PodSecurityPolicy)에 대해 sysctl을 설정하는 기능에서는
|
||||
아직 슬래시 구분자를 지원하지 않는다.
|
||||
{{< /note >}}
|
||||
## {{% heading "prerequisites" %}}
|
||||
|
||||
|
||||
|
|
@ -20,6 +32,7 @@ content_type: task
|
|||
일부 단계에서는 실행 중인 클러스터의 kubelet에서
|
||||
커맨드 라인 옵션을 재구성할 필요가 있다.
|
||||
|
||||
|
||||
<!-- steps -->
|
||||
|
||||
## 모든 sysctl 파라미터 나열
|
||||
|
|
@ -52,12 +65,13 @@ sysctl은 _safe_ sysctl과 _unsafe_ sysctl로 구성되어 있다. _safe_ sysctl
|
|||
허용하지 않아야 한다
|
||||
|
||||
아직까지 대부분 _네임스페이스된_ sysctl은 _safe_ sysctl로 고려되지 않았다.
|
||||
>>> 다음 sysctl은 _safe_ 명령을 지원한다.
|
||||
다음 sysctl은 _safe_ 명령을 지원한다.
|
||||
|
||||
- `kernel.shm_rmid_forced`,
|
||||
- `net.ipv4.ip_local_port_range`,
|
||||
- `net.ipv4.tcp_syncookies`,
|
||||
- `net.ipv4.ping_group_range` (Kubernetes 1.18 이후).
|
||||
- `net.ipv4.ping_group_range` (쿠버네티스 1.18 이후),
|
||||
- `net.ipv4.ip_unprivileged_port_start` (쿠버네티스 1.22 이후).
|
||||
|
||||
{{< note >}}
|
||||
`net.ipv4.tcp_syncookies` 예시는 리눅스 커널 버전 4.4 또는 이하에서 네임스페이스되지 않는다.
|
||||
|
|
@ -112,10 +126,13 @@ _네임스페이스_ sysctl만 이 방법을 사용할 수 있다.
|
|||
이를 설정해야 한다면, 각 노드의 OS에서 수동으로 구성하거나
|
||||
특권있는 컨테이너의 데몬셋을 사용하여야 한다.
|
||||
|
||||
네임스페이스 sysctl을 구성하기 위해서 파드 securityContext를 사용한다. securityContext는 동일한 파드의 모든 컨테이너에 적용된다.
|
||||
네임스페이스 sysctl을 구성하기 위해서 파드 securityContext를 사용한다.
|
||||
securityContext는 동일한 파드의 모든 컨테이너에 적용된다.
|
||||
|
||||
이 예시는 safe sysctl `kernel.shm_rmid_forced`와 두 개의 unsafe sysctl인
|
||||
`net.core.somaxconn` 과 `kernel.msgmax` 를 설정하기 위해 파드 securityContext를 사용한다.
|
||||
스펙에 따르면 _safe_ sysctl과 _unsafe_ sysctl 간
|
||||
차이는 없다.
|
||||
|
||||
{{< warning >}}
|
||||
파라미터의 영향을 파악한 후에만 운영체제가
|
||||
|
|
|
|||
|
|
@ -96,11 +96,10 @@ hostPath 퍼시스턴트볼륨의 설정 파일은 아래와 같다.
|
|||
|
||||
설정 파일에 클러스터 노드의 `/mnt/data` 에 볼륨이 있다고
|
||||
지정한다. 또한 설정에서 볼륨 크기를 10 기가바이트로 지정하고 단일 노드가
|
||||
읽기-쓰기 모드로 볼륨을 마운트할 수 있는 `ReadWriteOnce` 접근 모드를
|
||||
지정한다. 여기서는
|
||||
읽기-쓰기 모드로 볼륨을 마운트할 수 있는 `ReadWriteOnce` 접근 모드를 지정한다. 여기서는
|
||||
퍼시스턴트볼륨클레임의 [스토리지클래스 이름](/ko/docs/concepts/storage/persistent-volumes/#클래스)을
|
||||
`manual` 로 정의하며, 퍼시스턴트볼륨클레임의 요청을
|
||||
이 퍼시스턴트볼륨에 바인딩하는데 사용한다.
|
||||
이 퍼시스턴트볼륨에 바인딩하는 데 사용한다.
|
||||
|
||||
퍼시스턴트볼륨을 생성한다.
|
||||
|
||||
|
|
@ -237,8 +236,14 @@ sudo rmdir /mnt/data
|
|||
|
||||
이제 사용자 노드에서 셸을 종료해도 된다.
|
||||
|
||||
## 하나의 퍼시스턴트볼륨을 두 경로에 마운트하기
|
||||
|
||||
{{< codenew file="pods/storage/pv-duplicate.yaml" >}}
|
||||
|
||||
하나의 퍼시스턴트볼륨을 nginx 컨테이너의 두 경로에 마운트할 수 있다.
|
||||
|
||||
`/usr/share/nginx/html` - 정적 웹사이트 용
|
||||
`/etc/nginx/nginx.conf` - 기본 환경 설정 용
|
||||
|
||||
<!-- discussion -->
|
||||
|
||||
|
|
|
|||
|
|
@ -6,29 +6,36 @@ weight: 100
|
|||
|
||||
<!-- overview -->
|
||||
|
||||
이 페이지는 프라이빗 도커 레지스트리나 리포지터리로부터 이미지를 받아오기 위해 시크릿(Secret)을
|
||||
이 페이지는 프라이빗 컨테이너 레지스트리나 리포지터리로부터 이미지를 받아오기 위해
|
||||
{{< glossary_tooltip text="시크릿(Secret)" term_id="secret" >}}을
|
||||
사용하는 파드를 생성하는 방법을 보여준다.
|
||||
|
||||
{{% thirdparty-content single="true" %}}
|
||||
|
||||
## {{% heading "prerequisites" %}}
|
||||
|
||||
* {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
|
||||
* {{< include "task-tutorial-prereqs.md" >}}
|
||||
|
||||
* 이 실습을 수행하기 위해,
|
||||
[도커 ID](https://docs.docker.com/docker-id/)와 비밀번호가 필요하다.
|
||||
* 이 실습을 수행하기 위해, `docker` 명령줄 도구와
|
||||
[도커 ID](https://docs.docker.com/docker-id/) 및 비밀번호가 필요하다.
|
||||
|
||||
<!-- steps -->
|
||||
|
||||
## 도커 로그인
|
||||
## 도커 허브 로그인
|
||||
|
||||
노트북에 프라이빗 이미지를 받아오기 위하여 레지스트리 인증을 필수로 수행해야 한다.
|
||||
|
||||
`docker` 도구를 사용하여 도커 허브에 로그인한다. 자세한 정보는
|
||||
[도커 ID 계정](https://docs.docker.com/docker-id/#log-in)의 _로그 인_ 섹션을 참조한다.
|
||||
|
||||
```shell
|
||||
docker login
|
||||
```
|
||||
|
||||
프롬프트가 나타나면, 도커 사용자 이름(username)과 비밀번호(password)를 입력하자.
|
||||
프롬프트가 나타나면, 도커 ID를 입력한 다음, 사용하려는 자격증명(액세스 토큰,
|
||||
또는 도커 ID의 비밀번호)을 입력한다.
|
||||
|
||||
로그인 프로세스는 권한 토큰 정보를 가지고 있는 `config.json` 파일을 생성하거나 업데이트 한다.
|
||||
로그인 프로세스를 수행하면 권한 토큰 정보를 가지고 있는 `config.json` 파일이 생성되거나 업데이트된다. [쿠버네티스가 이 파일을 어떻게 해석하는지](/ko/docs/concepts/containers/images#config-json) 참고한다.
|
||||
|
||||
`config.json` 파일을 확인하자.
|
||||
|
||||
|
|
@ -171,14 +178,14 @@ janedoe:xxxxxxxxxxx
|
|||
|
||||
## 시크릿을 사용하는 파드 생성하기
|
||||
|
||||
다음은 `regcred` 에 있는 도커 자격 증명에 접근해야 하는 파드의 구성 파일이다.
|
||||
다음은 `regcred` 에 있는 도커 자격 증명에 접근해야 하는 예제 파드의 매니페스트이다.
|
||||
|
||||
{{< codenew file="pods/private-reg-pod.yaml" >}}
|
||||
|
||||
아래의 파일을 다운로드받는다.
|
||||
위 파일을 컴퓨터에 다운로드한다.
|
||||
|
||||
```shell
|
||||
wget -O my-private-reg-pod.yaml https://k8s.io/examples/pods/private-reg-pod.yaml
|
||||
curl -L -O my-private-reg-pod.yaml https://k8s.io/examples/pods/private-reg-pod.yaml
|
||||
```
|
||||
|
||||
`my-private-reg-pod.yaml` 파일 안에서, `<your-private-image>` 값을 다음과 같은 프라이빗 저장소 안의 이미지 경로로 변경한다.
|
||||
|
|
@ -200,9 +207,9 @@ kubectl get pod private-reg
|
|||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
* [시크릿](/ko/docs/concepts/configuration/secret/)에 대해 더 배워 보기.
|
||||
* [시크릿](/ko/docs/concepts/configuration/secret/)에 대해 더 배워 보기
|
||||
* 또는 {{< api-reference page="config-and-storage-resources/secret-v1" >}} API 레퍼런스 읽어보기
|
||||
* [프라이빗 레지스트리 사용](/ko/docs/concepts/containers/images/#프라이빗-레지스트리-사용)에 대해 더 배워 보기.
|
||||
* [서비스 어카운트에 풀 시크릿(pull secret) 추가하기](/docs/tasks/configure-pod-container/configure-service-account/#add-imagepullsecrets-to-a-service-account)에 대해 더 배워 보기.
|
||||
* [kubectl create secret docker-registry](/docs/reference/generated/kubectl/kubectl-commands/#-em-secret-docker-registry-em-)에 대해 읽어보기.
|
||||
* [시크릿](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#secret-v1-core)에 대해 읽어보기.
|
||||
* [PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core)의 `imagePullSecrets` 필드에 대해 읽어보기.
|
||||
* 파드의 [컨테이너 정의](/docs/reference/kubernetes-api/workload-resources/pod-v1/#containers)의 `imagePullSecrets` 필드에 대해 읽어보기
|
||||
|
|
|
|||
|
|
@ -0,0 +1,124 @@
|
|||
---
|
||||
|
||||
|
||||
title: 클러스터 트러블슈팅
|
||||
content_type: concept
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
이 문서는 클러스터 트러블슈팅에 대해 설명한다. 사용자가 겪고 있는 문제의 근본 원인으로서 사용자의 애플리케이션을
|
||||
이미 배제했다고 가정한다.
|
||||
애플리케이션 디버깅에 대한 팁은 [애플리케이션 트러블슈팅 가이드](/docs/tasks/debug-application-cluster/debug-application/)를 참조한다.
|
||||
자세한 내용은 [트러블슈팅 문서](/ko/docs/tasks/debug-application-cluster/troubleshooting/)를 참조한다.
|
||||
|
||||
<!-- body -->
|
||||
|
||||
## 클러스터 나열하기
|
||||
|
||||
클러스터에서 가장 먼저 디버그해야 할 것은 노드가 모두 올바르게 등록되었는지 여부이다.
|
||||
|
||||
다음을 실행한다.
|
||||
|
||||
```shell
|
||||
kubectl get nodes
|
||||
```
|
||||
|
||||
그리고 보일 것으로 예상되는 모든 노드가 존재하고 모두 `Ready` 상태인지 확인한다.
|
||||
|
||||
클러스터의 전반적인 상태에 대한 자세한 정보를 얻으려면 다음을 실행할 수 있다.
|
||||
|
||||
```shell
|
||||
kubectl cluster-info dump
|
||||
```
|
||||
## 로그 보기
|
||||
|
||||
현재로서는 클러스터를 더 깊이 파고들려면 관련 머신에서 로그 확인이 필요하다. 관련 로그 파일
|
||||
위치는 다음과 같다. (systemd 기반 시스템에서는 `journalctl`을 대신 사용해야 할 수도 있다.)
|
||||
|
||||
### 마스터
|
||||
|
||||
* `/var/log/kube-apiserver.log` - API 서버, API 제공을 담당
|
||||
* `/var/log/kube-scheduler.log` - 스케줄러, 스케줄 결정을 담당
|
||||
* `/var/log/kube-controller-manager.log` - 레플리케이션 컨트롤러를 담당하는 컨트롤러
|
||||
|
||||
### 워커 노드
|
||||
|
||||
* `/var/log/kubelet.log` - Kubelet, 노드에서 컨테이너 실행을 담당
|
||||
* `/var/log/kube-proxy.log` - Kube Proxy, 서비스 로드밸런싱을 담당
|
||||
|
||||
## 클러스터 장애 모드의 일반적인 개요
|
||||
|
||||
아래에 일부 오류 상황 예시 및 문제를 완화하기 위해 클러스터 설정을 조정하는 방법을 나열한다.
|
||||
|
||||
### 근본 원인
|
||||
|
||||
- VM(들) 종료
|
||||
- 클러스터 내 또는 클러스터와 사용자 간의 네트워크 분할
|
||||
- 쿠버네티스 소프트웨어의 충돌
|
||||
- 데이터 손실 또는 퍼시스턴트 스토리지 사용 불가 (e.g. GCE PD 또는 AWS EBS 볼륨)
|
||||
- 운영자 오류, 예를 들면 잘못 구성된 쿠버네티스 소프트웨어 또는 애플리케이션 소프트웨어
|
||||
|
||||
### 특정 시나리오
|
||||
|
||||
- API 서버 VM 종료 또는 API 서버 충돌
|
||||
- 다음의 현상을 유발함
|
||||
- 새로운 파드, 서비스, 레플리케이션 컨트롤러를 중지, 업데이트 또는 시작할 수 없다.
|
||||
- 쿠버네티스 API에 의존하지 않는 기존 파드 및 서비스는 계속 정상적으로 작동할 것이다.
|
||||
- API 서버 백업 스토리지 손실
|
||||
- 다음의 현상을 유발함
|
||||
- API 서버가 구동되지 않을 것이다.
|
||||
- kubelet에 도달할 수 없게 되지만, kubelet이 여전히 동일한 파드를 계속 실행하고 동일한 서비스 프록시를 제공할 것이다.
|
||||
- API 서버를 재시작하기 전에, 수동으로 복구하거나 API서버 상태를 재생성해야 한다.
|
||||
- 지원 서비스 (노드 컨트롤러, 레플리케이션 컨트롤러 매니저, 스케쥴러 등) VM 종료 또는 충돌
|
||||
- 현재 그것들은 API 서버와 같은 위치에 있기 때문에 API 서버와 비슷한 상황을 겪을 것이다.
|
||||
- 미래에는 이들도 복제본을 가질 것이며 API서버와 별도로 배치될 수도 있다.
|
||||
- 지원 서비스들은 상태(persistent state)를 자체적으로 유지하지는 않는다.
|
||||
- 개별 노드 (VM 또는 물리적 머신) 종료
|
||||
- 다음의 현상을 유발함
|
||||
- 해당 노드의 파드가 실행을 중지
|
||||
- 네트워크 분할
|
||||
- 다음의 현상을 유발함
|
||||
- 파티션 A는 파티션 B의 노드가 다운되었다고 생각한다. 파티션 B는 API 서버가 다운되었다고 생각한다. (마스터 VM이 파티션 A에 있다고 가정)
|
||||
- Kubelet 소프트웨어 오류
|
||||
- 다음의 현상을 유발함
|
||||
- 충돌한 kubelet은 노드에서 새 파드를 시작할 수 없다.
|
||||
- kubelet이 파드를 삭제할 수도 있고 삭제하지 않을 수도 있다.
|
||||
- 노드는 비정상으로 표시된다.
|
||||
- 레플리케이션 컨트롤러는 다른 곳에서 새 파드를 시작한다.
|
||||
- 클러스터 운영자 오류
|
||||
- 다음의 현상을 유발함
|
||||
- 파드, 서비스 등의 손실
|
||||
- API 서버 백업 저장소 분실
|
||||
- API를 읽을 수 없는 사용자
|
||||
- 기타
|
||||
|
||||
### 완화
|
||||
|
||||
- 조치: IaaS VM을 위한 IaaS 공급자의 자동 VM 다시 시작 기능을 사용한다.
|
||||
- 다음을 완화할 수 있음: API 서버 VM 종료 또는 API 서버 충돌
|
||||
- 다음을 완화할 수 있음: 지원 서비스 VM 종료 또는 충돌
|
||||
|
||||
- 조치: API 서버+etcd가 있는 VM에 IaaS 제공자의 안정적인 스토리지(예: GCE PD 또는 AWS EBS 볼륨)를 사용한다.
|
||||
- 다음을 완화할 수 있음: API 서버 백업 스토리지 손실
|
||||
|
||||
- 조치: [고가용성](/docs/setup/production-environment/tools/kubeadm/high-availability/) 구성을 사용한다.
|
||||
- 다음을 완화할 수 있음: 컨트롤 플레인 노드 종료 또는 컨트롤 플레인 구성 요소(스케줄러, API 서버, 컨트롤러 매니저) 충돌
|
||||
- 동시에 발생하는 하나 이상의 노드 또는 구성 요소 오류를 허용한다.
|
||||
- 다음을 완화할 수 있음: API 서버 백업 스토리지(i.e., etcd의 데이터 디렉터리) 손실
|
||||
- 고가용성 etcd 구성을 사용하고 있다고 가정
|
||||
|
||||
- 조치: API 서버 PD/EBS 볼륨의 주기적인 스냅샷
|
||||
- 다음을 완화할 수 있음: API 서버 백업 스토리지 손실
|
||||
- 다음을 완화할 수 있음: 일부 운영자 오류 사례
|
||||
- 다음을 완화할 수 있음: 일부 쿠버네티스 소프트웨어 오류 사례
|
||||
|
||||
- 조치: 파드 앞에 레플리케이션 컨트롤러와 서비스 사용
|
||||
- 다음을 완화할 수 있음: 노드 종료
|
||||
- 다음을 완화할 수 있음: Kubelet 소프트웨어 오류
|
||||
|
||||
- 조치: 예기치 않은 재시작을 허용하도록 설계된 애플리케이션(컨테이너)
|
||||
- 다음을 완화할 수 있음: 노드 종료
|
||||
- 다음을 완화할 수 있음: Kubelet 소프트웨어 오류
|
||||
|
||||
|
||||
|
|
@ -73,24 +73,16 @@ kubectl exec -it cassandra -- sh
|
|||
|
||||
## 임시(ephemeral) 디버그 컨테이너를 사용해서 디버깅하기 {#ephemeral-container}
|
||||
|
||||
{{< feature-state state="alpha" for_k8s_version="v1.18" >}}
|
||||
{{< feature-state state="beta" for_k8s_version="v1.23" >}}
|
||||
|
||||
컨테이너가 크래시 됐거나 [distroless 이미지](https://github.com/GoogleContainerTools/distroless)처럼
|
||||
컨테이너 이미지에 디버깅 도구를 포함하고 있지 않아
|
||||
`kubectl exec`가 충분하지 않을 경우에는
|
||||
컨테이너가 크래시 됐거나
|
||||
[distroless 이미지](https://github.com/GoogleContainerTools/distroless)처럼
|
||||
컨테이너 이미지에 디버깅 도구를 포함하고 있지 않아 `kubectl exec`로는 충분하지 않은 경우에는
|
||||
{{< glossary_tooltip text="임시(Ephemeral) 컨테이너" term_id="ephemeral-container" >}}를 사용하는 것이
|
||||
인터랙티브한 트러블슈팅에 유용하다. `kubectl` `v1.18`
|
||||
버전부터는 임시 컨테이너를 생성할 수 있는 알파 단계의
|
||||
명령어가 있다.
|
||||
인터랙티브한 트러블슈팅에 유용하다.
|
||||
|
||||
### 임시 컨테이너를 사용한 디버깅 예시 {#ephemeral-container-example}
|
||||
|
||||
{{< note >}}
|
||||
이 섹션에서 소개하는 예시를 사용하기 위해서는
|
||||
여러분의 클러스터에 `EphemeralContainers` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)가
|
||||
활성화되어 있어야 하고 `kubectl`의 버전이 v1.18 이상이어야 한다.
|
||||
{{< /note >}}
|
||||
|
||||
`kubectl debug` 명령어를 사용해서 동작 중인 파드에 임시 컨테이너를 추가할 수 있다.
|
||||
먼저, 다음과 같이 파드를 추가한다.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,7 @@
|
|||
---
|
||||
|
||||
|
||||
|
||||
title: 리소스 메트릭 파이프라인
|
||||
content_type: concept
|
||||
---
|
||||
|
|
@ -62,3 +65,12 @@ kubelet은 비율 계산에 사용할 윈도우를 선택한다.
|
|||
|
||||
[설계 문서](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/instrumentation/metrics-server.md)에서
|
||||
메트릭 서버에 대해 자세하게 배울 수 있다.
|
||||
|
||||
### 요약(Summary) API 소스
|
||||
[Kubelet](/docs/reference/command-line-tools-reference/kubelet/)은 노드, 볼륨, 파드, 컨테이너 수준의 통계를 수집하며,
|
||||
소비자(consumer)가 읽을 수 있도록 이를
|
||||
[요약 API](https://github.com/kubernetes/kubernetes/blob/7d309e0104fedb57280b261e5677d919cb2a0e2d/staging/src/k8s.io/kubelet/pkg/apis/stats/v1alpha1/types.go)에 기록한다.
|
||||
|
||||
1.23 이전에는 이러한 자원들은 기본적으로 [cAdvisor](https://github.com/google/cadvisor)에 의해 수집되었다.
|
||||
그러나, 1.23에서 `PodAndContainerStatsFromCRI` 기능 게이트가 추가되면서, 컨테이너 및 파드 수준 통계를 CRI 구현에서 수집할 수 있게 되었다.
|
||||
참고: 이를 위해서는 CRI 구현에서도 이 기능을 지원해야 한다(containerd >= 1.6.0, CRI-O >= 1.23.0).
|
||||
|
|
|
|||
|
|
@ -0,0 +1,107 @@
|
|||
---
|
||||
|
||||
|
||||
|
||||
content_type: concept
|
||||
title: 트러블슈팅하기
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
때때로 문제가 발생할 수 있다. 이 가이드는 이러한 상황을 해결하기 위해 작성되었다. 문제 해결에는
|
||||
다음 두 가지를 참고해 볼 수 있다.
|
||||
|
||||
* [애플리케이션 트러블슈팅하기](/docs/tasks/debug-application-cluster/debug-application/) - 쿠버네티스에
|
||||
코드를 배포하였지만 제대로 동작하지 않는 사용자들에게 유용한 가이드이다.
|
||||
* [클러스터 트러블슈팅하기](/ko/docs/tasks/debug-application-cluster/debug-cluster/) - 쿠버네티스 클러스터에
|
||||
문제를 겪고 있는 클러스터 관리자 혹은 기분이 나쁜 사람들에게 유용한 가이드이다.
|
||||
|
||||
여러분이 현재 사용중인 릴리스에 대한 알려진 이슈들을 다음의 [릴리스](https://github.com/kubernetes/kubernetes/releases)
|
||||
페이지에서 확인해 볼 수도 있다.
|
||||
|
||||
<!-- body -->
|
||||
|
||||
## 도움 받기
|
||||
|
||||
여러분의 문제가 위에 소개된 어떠한 가이드로도 해결할 수 없다면,
|
||||
쿠버네티스 커뮤니티로부터 도움을 받을 수 있는 다양한 방법들을 시도해 볼 수 있다.
|
||||
|
||||
### 질문
|
||||
|
||||
이 사이트의 문서들은 다양한 질문들에 대한 답변을 제공할 수 있도록 구성되어 있다.
|
||||
[개념](/ko/docs/concepts/)은 쿠버네티스의 아키텍처와 각 컴포넌트들이 어떻게 동작하는지에 대해 설명하고,
|
||||
[시작하기](/ko/docs/setup/)는 쿠버네티스를 시작하는 데 유용한 지침들을 제공한다.
|
||||
[태스크](/ko/docs/tasks/)는 흔히 사용되는 작업들을 수행하는 방법에 대해 소개하고,
|
||||
[튜토리얼](/ko/docs/tutorials/)은 실무, 산업 특화 혹은 종단간 개발에 특화된 시나리오를 통해 차근차근 설명한다.
|
||||
[레퍼런스](/ko/docs/reference/) 섹션에서는
|
||||
[쿠버네티스 API](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/)와
|
||||
[`kubectl`](/ko/docs/reference/kubectl/overview/)과 같은 커맨드 라인 인터페이스(CLI)에 대한
|
||||
상세한 설명을 다룬다.
|
||||
|
||||
## 도와주세요! 내 질문이 다뤄지지 않았어요! 도움이 필요해요!
|
||||
|
||||
### 스택 오버플로우
|
||||
|
||||
여러분들이 겪고 있는 문제와 동일한 문제에 대한 도움을 위해 커뮤니티의 다른 사람들이 이미
|
||||
질문을 올렸을 수 있다. 쿠버네티스 팀은
|
||||
[쿠버네티스 태그가 등록된 글](https://stackoverflow.com/questions/tagged/kubernetes)들을 모니터링하고 있다.
|
||||
발생한 문제와 도움이 되는 질문이 없다면,
|
||||
[새로운 질문](https://stackoverflow.com/questions/ask?tags=kubernetes)을 올려라!
|
||||
|
||||
### 슬랙
|
||||
|
||||
쿠버네티스 슬랙의 `#kubernetes-users` 채널을 통해 쿠버네티스 커뮤니티의 여러 사람들을 접할 수도 있다.
|
||||
쿠버네티스 슬랙을 사용하기 위해서는 등록이 필요한데, 다음을 통해 [채널 초대 요청](https://slack.kubernetes.io)을 할 수 있다.
|
||||
(누구나 가입할 수 있다). 슬랙 채널은 여러분이 어떠한 질문을 할 수 있도록 언제나 열려있다.
|
||||
가입하고 나면 여러분의 웹 브라우저나 슬랙 앱을 통해 [쿠버네티스 슬랙](https://kubernetes.slack.com)
|
||||
에 참여할 수 있다.
|
||||
|
||||
쿠버네티스 슬랙에 참여하게 된다면, 다양한 주제의 흥미와 관련된 여러 채널들에 대해
|
||||
살펴본다. 가령, 쿠버네티스를 처음 접하는 사람이라면
|
||||
[`#kubernetes-novice`](https://kubernetes.slack.com/messages/kubernetes-novice) 채널에 가입할 수 있다. 혹은, 만약 당신이 개발자라면
|
||||
[`#kubernetes-dev`](https://kubernetes.slack.com/messages/kubernetes-dev) 채널에 가입할 수 있다.
|
||||
|
||||
또한 각 국가 및 사용 언어별 채널들이 여럿 존재한다. 사용하는 언어로 도움을 받거나 정보를
|
||||
얻기 위해서는 다음의 채널에 참가한다.
|
||||
|
||||
{{< table caption="국가 / 언어별 슬랙 채널" >}}
|
||||
국가 | 채널
|
||||
:---------|:------------
|
||||
China(중국) | [`#cn-users`](https://kubernetes.slack.com/messages/cn-users), [`#cn-events`](https://kubernetes.slack.com/messages/cn-events)
|
||||
Finland(핀란드) | [`#fi-users`](https://kubernetes.slack.com/messages/fi-users)
|
||||
France(프랑스) | [`#fr-users`](https://kubernetes.slack.com/messages/fr-users), [`#fr-events`](https://kubernetes.slack.com/messages/fr-events)
|
||||
Germany(독일) | [`#de-users`](https://kubernetes.slack.com/messages/de-users), [`#de-events`](https://kubernetes.slack.com/messages/de-events)
|
||||
India(인도) | [`#in-users`](https://kubernetes.slack.com/messages/in-users), [`#in-events`](https://kubernetes.slack.com/messages/in-events)
|
||||
Italy(이탈리아) | [`#it-users`](https://kubernetes.slack.com/messages/it-users), [`#it-events`](https://kubernetes.slack.com/messages/it-events)
|
||||
Japan(일본) | [`#jp-users`](https://kubernetes.slack.com/messages/jp-users), [`#jp-events`](https://kubernetes.slack.com/messages/jp-events)
|
||||
Korea(한국) | [`#kr-users`](https://kubernetes.slack.com/messages/kr-users)
|
||||
Netherlands(네덜란드) | [`#nl-users`](https://kubernetes.slack.com/messages/nl-users)
|
||||
Norway(노르웨이) | [`#norw-users`](https://kubernetes.slack.com/messages/norw-users)
|
||||
Poland(폴란드) | [`#pl-users`](https://kubernetes.slack.com/messages/pl-users)
|
||||
Russia(러시아) | [`#ru-users`](https://kubernetes.slack.com/messages/ru-users)
|
||||
Spain(스페인) | [`#es-users`](https://kubernetes.slack.com/messages/es-users)
|
||||
Sweden(스웨덴) | [`#se-users`](https://kubernetes.slack.com/messages/se-users)
|
||||
Turkey(터키) | [`#tr-users`](https://kubernetes.slack.com/messages/tr-users), [`#tr-events`](https://kubernetes.slack.com/messages/tr-events)
|
||||
{{< /table >}}
|
||||
|
||||
### 포럼
|
||||
|
||||
공식 쿠버네티스 포럼에 참여하는 것도 추천되는 방법이다. [discuss.kubernetes.io](https://discuss.kubernetes.io).
|
||||
|
||||
### 버그와 기능 추가 요청
|
||||
|
||||
만약 여러분이 버그처럼 보이는 것을 발견했거나, 기능 추가 요청을 하기 위해서는
|
||||
[GitHub 이슈 트래킹 시스템](https://github.com/kubernetes/kubernetes/issues)을 사용한다.
|
||||
|
||||
이슈를 작성하기 전에는, 여러분의 이슈가 기존 이슈에서 이미
|
||||
다뤄졌는지 검색해 본다.
|
||||
|
||||
버그를 보고하는 경우에는, 해당 문제를 어떻게 재현할 수 있는지에 관련된 상세한 정보를 포함한다.
|
||||
포함되어야 하는 정보들은 다음과 같다.
|
||||
|
||||
* 쿠버네티스 버전: `kubectl version`
|
||||
* 클라우드 프로바이더, OS 배포판, 네트워크 구성, 및 도커 버전
|
||||
* 문제를 재현하기 위한 절차
|
||||
|
||||
|
||||
|
||||
|
|
@ -11,7 +11,11 @@ Konnectivity 서비스는 컨트롤 플레인에 클러스터 통신을 위한 T
|
|||
|
||||
## {{% heading "prerequisites" %}}
|
||||
|
||||
{{< include "task-tutorial-prereqs.md" >}}
|
||||
쿠버네티스 클러스터가 있어야 하며, kubectl 명령줄 도구가
|
||||
클러스터와 통신하도록 설정되어 있어야 한다. 컨트롤 플레인 호스트가 아닌
|
||||
두 개 이상의 노드로 구성된 클러스터에서 이 튜토리얼을 수행하는 것을 권장한다.
|
||||
클러스터가 없다면, [minikube](https://minikube.sigs.k8s.io/docs/tutorials/multi_node/)를
|
||||
이용하여 생성할 수 있다.
|
||||
|
||||
<!-- steps -->
|
||||
|
||||
|
|
@ -24,16 +28,9 @@ Konnectivity 서비스는 컨트롤 플레인에 클러스터 통신을 위한 T
|
|||
Konnectivity 서비스를 사용하고 네트워크 트래픽을 클러스터 노드로 보내도록
|
||||
API 서버를 구성해야 한다.
|
||||
|
||||
1. `ServiceAccountTokenVolumeProjection` [기능 게이트(feature gate)](/ko/docs/reference/command-line-tools-reference/feature-gates/)가
|
||||
활성화되어 있는지
|
||||
확인한다. kube-apiserver에 다음과 같은 플래그를 제공하여
|
||||
[서비스 어카운트 토큰 볼륨 보호](/docs/tasks/configure-pod-container/configure-service-account/#service-account-token-volume-projection)를
|
||||
활성화할 수 있다.
|
||||
```
|
||||
--service-account-issuer=api
|
||||
--service-account-signing-key-file=/etc/kubernetes/pki/sa.key
|
||||
--api-audiences=system:konnectivity-server
|
||||
```
|
||||
1. [Service Account Token Volume Projection](/docs/tasks/configure-pod-container/configure-service-account/#service-account-token-volume-projection)
|
||||
기능이 활성화되어 있는지 확인한다.
|
||||
쿠버네티스 v1.20부터는 기본적으로 활성화되어 있다.
|
||||
1. `admin/konnectivity/egress-selector-configuration.yaml`과 같은 송신 구성 파일을 생성한다.
|
||||
1. API 서버의 `--egress-selector-config-file` 플래그를
|
||||
API 서버 송신 구성 파일의 경로로 설정한다.
|
||||
|
|
|
|||
|
|
@ -178,13 +178,13 @@ kubectl delete job -l jobgroup=jobexample
|
|||
|
||||
|
||||
```liquid
|
||||
{%- set params = [{ "name": "apple", "url": "http://dbpedia.org/resource/Apple", },
|
||||
{% set params = [{ "name": "apple", "url": "http://dbpedia.org/resource/Apple", },
|
||||
{ "name": "banana", "url": "http://dbpedia.org/resource/Banana", },
|
||||
{ "name": "cherry", "url": "http://dbpedia.org/resource/Cherry" }]
|
||||
%}
|
||||
{%- for p in params %}
|
||||
{%- set name = p["name"] %}
|
||||
{%- set url = p["url"] %}
|
||||
{% for p in params %}
|
||||
{% set name = p["name"] %}
|
||||
{% set url = p["url"] %}
|
||||
---
|
||||
apiVersion: batch/v1
|
||||
kind: Job
|
||||
|
|
@ -204,7 +204,7 @@ spec:
|
|||
image: busybox
|
||||
command: ["sh", "-c", "echo Processing URL {{ url }} && sleep 5"]
|
||||
restartPolicy: Never
|
||||
{%- endfor %}
|
||||
{% endfor %}
|
||||
```
|
||||
|
||||
위의 템플릿은 파이썬 딕셔너리(dicts)로 구성된 항목(1-4행)을 사용하여 각 잡 오브젝트에 대해
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
|
||||
|
||||
min-kubernetes-server-version: v1.20
|
||||
min-kubernetes-server-version: v1.23
|
||||
title: IPv4/IPv6 이중 스택 검증
|
||||
content_type: task
|
||||
---
|
||||
|
|
@ -21,6 +21,9 @@ content_type: task
|
|||
|
||||
{{< version-check >}}
|
||||
|
||||
{{< note >}}
|
||||
v1.23 이전 버전에서도 검증을 수행할 수 있지만 GA 기능으로만 제공되며, v1.23부터 공식적으로 지원된다.
|
||||
{{< /note >}}
|
||||
|
||||
|
||||
<!-- steps -->
|
||||
|
|
|
|||
|
|
@ -4,42 +4,59 @@
|
|||
|
||||
|
||||
|
||||
title: Horizontal Pod Autoscaler 연습
|
||||
title: HorizontalPodAutoscaler 연습
|
||||
content_type: task
|
||||
weight: 100
|
||||
min-kubernetes-server-version: 1.23
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
Horizontal Pod Autoscaler는
|
||||
CPU 사용량(또는 베타 지원의 다른 애플리케이션 지원 메트릭)을 관찰하여
|
||||
레플리케이션 컨트롤러, 디플로이먼트, 레플리카셋(ReplicaSet) 또는 스테이트풀셋(StatefulSet)의 파드 개수를 자동으로 스케일한다.
|
||||
[HorizontalPodAutoscaler](/ko/docs/tasks/run-application/horizontal-pod-autoscale/)(약어: HPA)는
|
||||
워크로드 리소스(예: {{< glossary_tooltip text="디플로이먼트" term_id="deployment" >}} 또는
|
||||
{{< glossary_tooltip text="스테이트풀셋" term_id="statefulset" >}})를
|
||||
자동으로 업데이트하며,
|
||||
워크로드의 크기를 수요에 맞게
|
||||
자동으로 스케일링하는 것을 목표로 한다.
|
||||
|
||||
이 문서는 php-apache 서버를 대상으로 Horizontal Pod Autoscaler를 동작해보는 예제이다.
|
||||
Horizontal Pod Autoscaler 동작과 관련된 더 많은 정보를 위해서는
|
||||
[Horizontal Pod Autoscaler 사용자 가이드](/ko/docs/tasks/run-application/horizontal-pod-autoscale/)를 참고하기 바란다.
|
||||
수평 스케일링은 부하 증가에 대해
|
||||
{{< glossary_tooltip text="파드" term_id="pod" >}}를 더 배치하는 것을 뜻한다.
|
||||
이는 _수직_ 스케일링(쿠버네티스에서는,
|
||||
해당 워크로드를 위해 이미 실행 중인 파드에
|
||||
더 많은 자원(예: 메모리 또는 CPU)를 할당하는 것)과는 다르다.
|
||||
|
||||
부하량이 줄어들고, 파드의 수가 최소 설정값 이상인 경우,
|
||||
HorizontalPodAutoscaler는 워크로드 리소스(디플로이먼트, 스테이트풀셋,
|
||||
또는 다른 비슷한 리소스)에게 스케일 다운을 지시한다.
|
||||
|
||||
이 문서는 예제 웹 앱의 크기를 자동으로 조절하도록
|
||||
HorizontalPodAutoscaler를 설정하는 예시를 다룬다.
|
||||
이 예시 워크로드는 PHP 코드를 실행하는 아파치 httpd이다.
|
||||
|
||||
## {{% heading "prerequisites" %}}
|
||||
|
||||
이 예제는 버전 1.2 또는 이상의 쿠버네티스 클러스터와 kubectl을 필요로 한다.
|
||||
[메트릭 서버](https://github.com/kubernetes-sigs/metrics-server) 모니터링을 클러스터에 배포하여
|
||||
[메트릭 API](https://github.com/kubernetes/metrics)를 통해 메트릭을 제공해야 한다.
|
||||
Horizontal Pod Autoscaler가 메트릭을 수집할때 해당 API를 사용한다. 메트릭-서버를 배포하는 방법에 대해 배우려면,
|
||||
[메트릭-서버 문서](https://github.com/kubernetes-sigs/metrics-server#deployment)를 참고한다.
|
||||
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} 이전 버전의
|
||||
쿠버네티스를 사용하고 있다면, 해당 버전의 문서를
|
||||
참고한다([사용 가능한 문서의 버전](/ko/docs/home/supported-doc-versions/) 참고).
|
||||
|
||||
Horizontal Pod Autoscaler에 다양한 자원 메트릭을 적용하고자 하는 경우,
|
||||
버전 1.6 또는 이상의 쿠버네티스 클러스터와 kubectl를 사용해야 한다. 사용자 정의 메트릭을 사용하기 위해서는, 클러스터가
|
||||
사용자 정의 메트릭 API를 제공하는 API 서버와 통신할 수 있어야 한다.
|
||||
마지막으로 쿠버네티스 오브젝트와 관련이 없는 메트릭을 사용하는 경우,
|
||||
버전 1.10 또는 이상의 쿠버네티스 클러스터와 kubectl을 사용해야 하며, 외부
|
||||
메트릭 API와 통신이 가능해야 한다.
|
||||
자세한 사항은 [Horizontal Pod Autoscaler 사용자 가이드](/ko/docs/tasks/run-application/horizontal-pod-autoscale/#사용자-정의-메트릭을-위한-지원)를 참고하길 바란다.
|
||||
이 예제를 실행하기 위해, 클러스터에 [Metrics Server](https://github.com/kubernetes-sigs/metrics-server#readme)가
|
||||
배포 및 구성되어 있어야 한다. 쿠버네티스 Metrics Server는 클러스터의
|
||||
{{<glossary_tooltip term_id="kubelet" text="kubelet">}}으로부터
|
||||
리소스 메트릭을 수집하고, 수집한 메트릭을
|
||||
[쿠버네티스 API](/ko/docs/concepts/overview/kubernetes-api/)를 통해 노출시키며,
|
||||
메트릭 수치를 나타내는 새로운 종류의 리소스를 추가하기 위해
|
||||
[APIService](/ko/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/)를 사용할 수 있다.
|
||||
|
||||
Metrics Server를 실행하는 방법을 보려면
|
||||
[metrics-server 문서](https://github.com/kubernetes-sigs/metrics-server#deployment)를 참고한다.
|
||||
|
||||
<!-- steps -->
|
||||
|
||||
## php-apache 서버 구동 및 노출
|
||||
|
||||
Horizontal Pod Autoscaler 시연을 위해 php-apache 이미지를 맞춤 제작한 Docker 이미지를 사용한다. Dockerfile은 다음과 같다.
|
||||
HorizontalPodAutoscaler 예시에서,
|
||||
먼저 도커 허브의 `php-apache` 이미지를 베이스로 하는 커스텀 컨테이너 이미지를 만들어 시작점으로 삼을 것이다.
|
||||
`Dockerfile`은 미리 준비되어 있으며, 내용은 다음과 같다.
|
||||
|
||||
```dockerfile
|
||||
FROM php:5-apache
|
||||
|
|
@ -47,7 +64,8 @@ COPY index.php /var/www/html/index.php
|
|||
RUN chmod a+rx index.php
|
||||
```
|
||||
|
||||
index.php는 CPU 과부하 연산을 수행한다.
|
||||
아래의 코드는 CPU 과부하 연산을 수행하는 간단한 `index.php` 페이지를 정의하며,
|
||||
이를 이용해 클러스터에 부하를 시뮬레이트한다.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
|
@ -59,12 +77,13 @@ index.php는 CPU 과부하 연산을 수행한다.
|
|||
?>
|
||||
```
|
||||
|
||||
첫 번째 단계로, 다음 구성을 사용해서 실행 중인 이미지의 디플로이먼트를
|
||||
시작하고 서비스로 노출시킨다.
|
||||
컨테이너 이미지를 만들었다면,
|
||||
방금 만든 이미지로부터 컨테이너를 실행하는 디플로이먼트를 시작하고, 다음의 매니페스트를 사용하여 디플로이먼트를
|
||||
{{< glossary_tooltip term_id="service" text="서비스">}}로 노출한다.
|
||||
|
||||
{{< codenew file="application/php-apache.yaml" >}}
|
||||
|
||||
다음의 명령어를 실행한다.
|
||||
이를 위해, 다음의 명령어를 실행한다.
|
||||
|
||||
```shell
|
||||
kubectl apply -f https://k8s.io/examples/application/php-apache.yaml
|
||||
|
|
@ -75,16 +94,27 @@ deployment.apps/php-apache created
|
|||
service/php-apache created
|
||||
```
|
||||
|
||||
## Horizontal Pod Autoscaler 생성
|
||||
## HorizontalPodAutoscaler 생성 {#create-horizontal-pod-autoscaler}
|
||||
|
||||
이제 서비스가 동작중이므로,
|
||||
[kubectl autoscale](/docs/reference/generated/kubectl/kubectl-commands#autoscale)를 사용하여 오토스케일러를 생성한다.
|
||||
다음 명령어는 첫 번째 단계에서 만든 php-apache 디플로이먼트 파드의 개수를
|
||||
1부터 10 사이로 유지하는 Horizontal Pod Autoscaler를 생성한다.
|
||||
간단히 얘기하면, HPA는 (디플로이먼트를 통한) 평균 CPU 사용량을 50%로 유지하기 위하여 레플리카의 개수를 늘리고 줄인다.
|
||||
kubectl run으로 각 파드는 200 밀리코어를 요청하므로,
|
||||
여기서 말하는 평균 CPU 사용은 100 밀리코어를 말한다.
|
||||
이에 대한 자세한 알고리즘은 [여기](/ko/docs/tasks/run-application/horizontal-pod-autoscale/#알고리즘-세부-정보)를 참고하기 바란다.
|
||||
`kubectl`을 사용하여 오토스케일러를 생성한다. 이를 위해
|
||||
[kubectl autoscale](/docs/reference/generated/kubectl/kubectl-commands#autoscale) 서브커맨드를 사용할 수 있다.
|
||||
|
||||
아래에서는 첫 번째 단계에서 만든 php-apache
|
||||
디플로이먼트 파드의 개수를 1부터 10 사이로 유지하는
|
||||
Horizontal Pod Autoscaler를 생성하는 명령어를 실행할 것이다.
|
||||
|
||||
간단히 이야기하면, HPA {{<glossary_tooltip text="컨트롤러" term_id="controller">}}는
|
||||
평균 CPU 사용량을 50%로 유지하기 위해 (디플로이먼트를 업데이트하여) 레플리카의 개수를 늘리고 줄인다.
|
||||
그러면 디플로이먼트는 레플리카셋을 업데이트하며(이는 모든 쿠버네티스 디플로이먼트의 동작 방식 중 일부이다),
|
||||
레플리카셋은 자신의 `.spec` 필드의 변경 사항에 따라 파드를 추가하거나 제거한다.
|
||||
|
||||
`kubectl run`으로 각 파드는 200 밀리코어를 요청하므로, 평균 CPU 사용은 100 밀리코어이다.
|
||||
알고리즘에 대한 세부 사항은
|
||||
[알고리즘 세부 정보](/ko/docs/tasks/run-application/horizontal-pod-autoscale/#알고리즘-세부-정보)를 참고한다.
|
||||
|
||||
|
||||
HorizontalPodAutoscaler를 생성한다.
|
||||
|
||||
```shell
|
||||
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
|
||||
|
|
@ -94,47 +124,64 @@ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
|
|||
horizontalpodautoscaler.autoscaling/php-apache autoscaled
|
||||
```
|
||||
|
||||
실행 중인 오토스케일러의 현재 상태를 확인해본다.
|
||||
다음을 실행하여, 새로 만들어진 HorizontalPodAutoscaler의 현재 상태를 확인할 수 있다.
|
||||
|
||||
```shell
|
||||
# "hpa" 또는 "horizontalpodautoscaler" 둘 다 사용 가능하다.
|
||||
kubectl get hpa
|
||||
```
|
||||
|
||||
출력은 다음과 같다.
|
||||
```
|
||||
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
|
||||
php-apache Deployment/php-apache/scale 0% / 50% 1 10 1 18s
|
||||
```
|
||||
|
||||
아직 서버로 어떠한 요청도 하지 않았기 때문에, 현재 CPU 소비는 0%임을 확인할 수 있다.
|
||||
(``TARGET``은 디플로이먼트에 의해 제어되는 파드들의 평균을 나타낸다)
|
||||
(HorizontalPodAutoscalers 이름이 다르다면, 이미 기존에 존재하고 있었다는 뜻이며,
|
||||
보통은 문제가 되지 않는다.)
|
||||
|
||||
## 부하 증가
|
||||
아직 서버로 요청을 보내는 클라이언트가 없기 때문에, 현재 CPU 사용량이 0%임을 확인할 수 있다.
|
||||
(``TARGET`` 열은 디플로이먼트에 의해 제어되는 파드들의 평균을 나타낸다)
|
||||
|
||||
이번에는 부하가 증가함에 따라 오토스케일러가 어떻게 반응하는지를 살펴볼 것이다. 먼저 컨테이너를 하나 실행하고, php-apache 서비스에 무한루프의 쿼리를 전송한다(다른 터미널을 열어 수행하기 바란다).
|
||||
## 부하 증가시키기 {#increase-load}
|
||||
|
||||
다음으로, 부하가 증가함에 따라 오토스케일러가 어떻게 반응하는지를 살펴볼 것이다.
|
||||
이를 위해, 클라이언트 역할을 하는 다른 파드를 실행할 것이다.
|
||||
클라이언트 파드 안의 컨테이너가 php-apache 서비스에 쿼리를 보내는 무한 루프를 실행한다.
|
||||
|
||||
```shell
|
||||
# 부하 생성을 유지하면서 나머지 스텝을 수행할 수 있도록,
|
||||
# 다음의 명령을 별도의 터미널에서 실행한다.
|
||||
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
|
||||
```
|
||||
|
||||
실행 후, 약 1분 정도 후에 CPU 부하가 올라가는 것을 볼 수 있다.
|
||||
|
||||
이제 아래 명령을 실행한다.
|
||||
```shell
|
||||
# 준비가 되면, 관찰을 마치기 위해 Ctrl+C를 누른다.
|
||||
kubectl get hpa
|
||||
```
|
||||
|
||||
1분 쯤 지나면, 다음과 같이 CPU 부하가 올라간 것을 볼 수 있다.
|
||||
|
||||
```
|
||||
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
|
||||
php-apache Deployment/php-apache/scale 305% / 50% 1 10 1 3m
|
||||
```
|
||||
|
||||
CPU 소비가 305%까지 증가하였다.
|
||||
결과적으로, 디플로이먼트의 레플리카 개수는 7개까지 증가하였다.
|
||||
그리고 다음과 같이 레플리카의 수가 증가한 것도 볼 수 있다.
|
||||
```
|
||||
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
|
||||
php-apache Deployment/php-apache/scale 305% / 50% 1 10 7 3m
|
||||
```
|
||||
|
||||
CPU 사용률이 305%까지 증가하였다.
|
||||
결과적으로, 디플로이먼트의 레플리카 개수가 7개까지 증가하였다.
|
||||
|
||||
```shell
|
||||
kubectl get deployment php-apache
|
||||
```
|
||||
|
||||
HorizontalPodAutoscaler를 조회했을 때와 동일한 레플리카 수를 확인할 수 있다.
|
||||
```
|
||||
NAME READY UP-TO-DATE AVAILABLE AGE
|
||||
php-apache 7/7 7 7 19m
|
||||
|
|
@ -146,24 +193,27 @@ php-apache 7/7 7 7 19m
|
|||
최종 레플리카의 개수는 본 예제와 다를 수 있다.
|
||||
{{< /note >}}
|
||||
|
||||
## 부하 중지
|
||||
## 부하 발생 중지하기 {#stop-load}
|
||||
|
||||
본 예제를 마무리하기 위해 부하를 중단시킨다.
|
||||
|
||||
`busybox` 컨테이너를 띄운 터미널에서,
|
||||
`busybox` 파드를 띄운 터미널에서,
|
||||
`<Ctrl> + C`로 부하 발생을 중단시킨다.
|
||||
|
||||
그런 다음 (몇 분 후에) 결과를 확인한다.
|
||||
|
||||
```shell
|
||||
kubectl get hpa
|
||||
# 준비가 되면, 관찰을 마치기 위해 Ctrl+C를 누른다.
|
||||
kubectl get hpa php-apache --watch
|
||||
```
|
||||
|
||||
출력은 다음과 같다.
|
||||
```
|
||||
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
|
||||
php-apache Deployment/php-apache/scale 0% / 50% 1 10 1 11m
|
||||
```
|
||||
|
||||
디플로이먼트도 스케일 다운 했음을 볼 수 있다.
|
||||
```shell
|
||||
kubectl get deployment php-apache
|
||||
```
|
||||
|
|
@ -173,7 +223,7 @@ NAME READY UP-TO-DATE AVAILABLE AGE
|
|||
php-apache 1/1 1 1 27m
|
||||
```
|
||||
|
||||
CPU 사용량은 0으로 떨어졌고, HPA는 레플리카의 개수를 1로 낮췄다.
|
||||
CPU 사용량이 0으로 떨어져서, HPA가 자동으로 레플리카의 개수를 1로 줄였다.
|
||||
|
||||
{{< note >}}
|
||||
레플리카 오토스케일링은 몇 분 정도 소요된다.
|
||||
|
|
@ -184,9 +234,9 @@ CPU 사용량은 0으로 떨어졌고, HPA는 레플리카의 개수를 1로 낮
|
|||
## 다양한 메트릭 및 사용자 정의 메트릭을 기초로한 오토스케일링
|
||||
|
||||
`php-apache` 디플로이먼트를 오토스케일링할 때,
|
||||
`autoscaling/v2beta2` API 버전을 사용하여 추가적인 메트릭을 제공할 수 있다.
|
||||
`autoscaling/v2` API 버전을 사용하여 추가적인 메트릭을 제공할 수 있다.
|
||||
|
||||
첫 번째로, `autoscaling/v2beta2` 형식으로 HorizontalPodAutoscaler YAML 파일을 생성한다.
|
||||
첫 번째로, `autoscaling/v2` 형식으로 HorizontalPodAutoscaler YAML 파일을 생성한다.
|
||||
|
||||
```shell
|
||||
kubectl get hpa php-apache -o yaml > /tmp/hpa-v2.yaml
|
||||
|
|
@ -195,7 +245,7 @@ kubectl get hpa php-apache -o yaml > /tmp/hpa-v2.yaml
|
|||
에디터로 `/tmp/hpa-v2.yaml` 파일을 열면, 다음과 같은 YAML을 확인할 수 있다.
|
||||
|
||||
```yaml
|
||||
apiVersion: autoscaling/v2beta2
|
||||
apiVersion: autoscaling/v2
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: php-apache
|
||||
|
|
@ -287,7 +337,7 @@ HorizontalPodAutoscaler는 각 메트릭에 대해 제안된 레플리카 개수
|
|||
`kubectl edit` 명령어를 이용하여 다음과 같이 정의를 업데이트 할 수 있다.
|
||||
|
||||
```yaml
|
||||
apiVersion: autoscaling/v2beta2
|
||||
apiVersion: autoscaling/v2
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: php-apache
|
||||
|
|
@ -411,7 +461,7 @@ object:
|
|||
|
||||
## 부록: Horizontal Pod Autoscaler 상태 조건
|
||||
|
||||
HorizontalPodAutoscaler의 `autoscaling/v2beta2` 형식을 사용하면,
|
||||
HorizontalPodAutoscaler의 `autoscaling/v2` 형식을 사용하면,
|
||||
HorizontalPodAutoscaler에서 쿠버네티스가 설정한 *상태 조건* 을 확인할 수 있다.
|
||||
이 상태 조건들은 HorizontalPodAutoscaler가 스케일을 할 수 있는지,
|
||||
어떤 방식으로든 제한되어 있는지 여부를 나타낸다.
|
||||
|
|
@ -449,12 +499,12 @@ Events:
|
|||
백 오프 관련 조건으로 스케일링이 방지되는지 여부를 나타낸다.
|
||||
두 번째 `ScalingActive`는 HPA가 활성화되어 있는지(즉 대상 레플리카 개수가 0이 아닌지),
|
||||
원하는 스케일을 계산할 수 있는지 여부를 나타낸다. 만약 `False` 인 경우,
|
||||
일반적으로 메트릭을 가져오는데 문제가 있다.
|
||||
일반적으로 메트릭을 가져오는 데 문제가 있다.
|
||||
마지막으로, 마지막 조건인 `ScalingLimited`는
|
||||
원하는 스케일 한도가 HorizontalPodAutoscaler의 최대/최소값으로 제한돼있음을 나타낸다.
|
||||
이는 HorizontalPodAutoscaler에서 레플리카의 개수 제한을 최대/최소값으로 올리거나 낮추려는 것이다.
|
||||
|
||||
## 부록: 수량
|
||||
## 수량
|
||||
|
||||
HorizontalPodAutoscaler와 메트릭 API에서 모든 메트릭은
|
||||
쿠버네티스에서 사용하는
|
||||
|
|
@ -464,16 +514,16 @@ HorizontalPodAutoscaler와 메트릭 API에서 모든 메트릭은
|
|||
일반적으로 수량을 밀리단위로 반환한다.
|
||||
10진수로 표현했을때, `1`과 `1500m` 또는 `1`과 `1.5` 로 메트릭 값을 나타낼 수 있다.
|
||||
|
||||
## 부록: 다른 가능한 시나리오
|
||||
## 다른 가능한 시나리오
|
||||
|
||||
### 명시적으로 오토스케일러 만들기
|
||||
|
||||
HorizontalPodAutoscaler를 생성하기 위해 `kubectl autoscale` 명령어를 사용하지 않고,
|
||||
명시적으로 다음 파일을 사용하여 만들 수 있다.
|
||||
명시적으로 다음 매니페스트를 사용하여 만들 수 있다.
|
||||
|
||||
{{< codenew file="application/hpa/php-apache.yaml" >}}
|
||||
|
||||
다음 명령어를 실행하여 오토스케일러를 생성할 것이다.
|
||||
다음으로, 아래의 명령어를 실행하여 오토스케일러를 생성한다.
|
||||
|
||||
```shell
|
||||
kubectl create -f https://k8s.io/examples/application/hpa/php-apache.yaml
|
||||
|
|
|
|||
|
|
@ -3,41 +3,59 @@
|
|||
|
||||
|
||||
|
||||
title: Horizontal Pod Autoscaler
|
||||
title: Horizontal Pod Autoscaling
|
||||
feature:
|
||||
title: Horizontal 스케일링
|
||||
description: >
|
||||
간단한 명령어나 UI를 통해서 또는 CPU 사용량에 따라 자동으로 애플리케이션의 스케일을 업 또는 다운한다.
|
||||
|
||||
content_type: concept
|
||||
weight: 90
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
Horizontal Pod Autoscaler는 CPU 사용량
|
||||
(또는 [사용자 정의 메트릭](https://git.k8s.io/community/contributors/design-proposals/instrumentation/custom-metrics-api.md),
|
||||
아니면 다른 애플리케이션 지원 메트릭)을 관찰하여 레플리케이션
|
||||
컨트롤러(ReplicationController), 디플로이먼트(Deployment), 레플리카셋(ReplicaSet) 또는 스테이트풀셋(StatefulSet)의 파드 개수를 자동으로 스케일한다. Horizontal
|
||||
Pod Autoscaler는 크기를 조정할 수 없는 오브젝트(예: 데몬셋(DaemonSet))에는 적용되지 않는다.
|
||||
쿠버네티스에서, _HorizontalPodAutoscaler_ 는 워크로드 리소스(예:
|
||||
{{< glossary_tooltip text="디플로이먼트" term_id="deployment" >}} 또는
|
||||
{{< glossary_tooltip text="스테이트풀셋" term_id="statefulset" >}})를 자동으로 업데이트하며,
|
||||
워크로드의 크기를 수요에 맞게 자동으로 스케일링하는 것을 목표로 한다.
|
||||
|
||||
Horizontal Pod Autoscaler는 쿠버네티스 API 리소스 및 컨트롤러로 구현된다.
|
||||
리소스는 컨트롤러의 동작을 결정한다.
|
||||
컨트롤러는 평균 CPU 사용률, 평균 메모리 사용률 또는 다른 커스텀 메트릭과 같은 관찰 대상 메트릭이 사용자가 지정한 목표값과 일치하도록 레플리케이션 컨트롤러 또는 디플로이먼트에서 레플리카 개수를 주기적으로 조정한다.
|
||||
수평 스케일링은 부하 증가에 대해
|
||||
{{< glossary_tooltip text="파드" term_id="pod" >}}를 더 배치하는 것을 뜻한다.
|
||||
이는 _수직_ 스케일링(쿠버네티스에서는,
|
||||
해당 워크로드를 위해 이미 실행 중인 파드에
|
||||
더 많은 자원(예: 메모리 또는 CPU)를 할당하는 것)과는 다르다.
|
||||
|
||||
부하량이 줄어들고, 파드의 수가 최소 설정값 이상인 경우,
|
||||
HorizontalPodAutoscaler는 워크로드 리소스(디플로이먼트, 스테이트풀셋,
|
||||
또는 다른 비슷한 리소스)에게 스케일 다운을 지시한다.
|
||||
|
||||
Horizontal Pod Autoscaling은 크기 조절이 불가능한 오브젝트(예:
|
||||
{{< glossary_tooltip text="데몬셋" term_id="daemonset" >}})에는 적용할 수 없다.
|
||||
|
||||
HorizontalPodAutoscaler는 쿠버네티스 API 자원 및
|
||||
{{< glossary_tooltip text="컨트롤러" term_id="controller" >}} 형태로 구현되어 있다.
|
||||
HorizontalPodAutoscaler API 자원은 컨트롤러의 행동을 결정한다.
|
||||
쿠버네티스 {{< glossary_tooltip text="컨트롤 플레인" term_id="control-plane" >}}
|
||||
내에서 실행되는 HPA 컨트롤러는 평균 CPU 사용률, 평균 메모리 사용률,
|
||||
또는 다른 커스텀 메트릭 등의 관측된 메트릭을 목표에 맞추기 위해
|
||||
목표물(예: 디플로이먼트)의 적정 크기를 주기적으로 조정한다.
|
||||
|
||||
Horizontal Pod Autoscaling을 활용하는
|
||||
[연습 예제](/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/)가 존재한다.
|
||||
|
||||
<!-- body -->
|
||||
|
||||
## Horizontal Pod Autoscaler는 어떻게 작동하는가?
|
||||
## HorizontalPodAutoscaler는 어떻게 작동하는가?
|
||||
|
||||

|
||||
{{< figure src="/images/docs/horizontal-pod-autoscaler.svg" caption="HorizontalPodAutoscaler는 디플로이먼트 및 디플로이먼트의 레플리카셋의 크기를 조정한다" class="diagram-medium">}}
|
||||
|
||||
Horizontal Pod Autoscaler는 컨트롤러
|
||||
관리자의 `--horizontal-pod-autoscaler-sync-period` 플래그(기본값은
|
||||
15초)에 의해 제어되는 주기를 가진 컨트롤 루프로 구현된다.
|
||||
쿠버네티스는 Horizontal Pod Autoscaling을
|
||||
간헐적으로(intermittently) 실행되는
|
||||
컨트롤 루프 형태로 구현했다(지숙적인 프로세스가 아니다).
|
||||
실행 주기는 [`kube-controller-manager`](/docs/reference/command-line-tools-reference/kube-controller-manager/)의
|
||||
`--horizontal-pod-autoscaler-sync-period` 파라미터에 의해 설정된다(기본 주기는 15초이다).
|
||||
|
||||
각 주기 동안 컨트롤러 관리자는 각 HorizontalPodAutoscaler 정의에
|
||||
각 주기마다, 컨트롤러 관리자는 각 HorizontalPodAutoscaler 정의에
|
||||
지정된 메트릭에 대해 리소스 사용률을 질의한다. 컨트롤러 관리자는 리소스
|
||||
메트릭 API(파드 단위 리소스 메트릭 용)
|
||||
또는 사용자 지정 메트릭 API(다른 모든 메트릭 용)에서 메트릭을 가져온다.
|
||||
|
|
@ -45,7 +63,8 @@ Horizontal Pod Autoscaler는 컨트롤러
|
|||
* 파드 단위 리소스 메트릭(예 : CPU)의 경우 컨트롤러는 HorizontalPodAutoscaler가
|
||||
대상으로하는 각 파드에 대한 리소스 메트릭 API에서 메트릭을 가져온다.
|
||||
그런 다음, 목표 사용률 값이 설정되면, 컨트롤러는 각 파드의
|
||||
컨테이너에 대한 동등한 자원 요청을 퍼센트 단위로 하여 사용률 값을
|
||||
컨테이너에 대한 동등한 [자원 요청](/ko/docs/concepts/configuration/manage-resources-containers/#요청-및-제한)을
|
||||
퍼센트 단위로 하여 사용률 값을
|
||||
계산한다. 대상 원시 값이 설정된 경우 원시 메트릭 값이 직접 사용된다.
|
||||
그리고, 컨트롤러는 모든 대상 파드에서 사용된 사용률의 평균 또는 원시 값(지정된
|
||||
대상 유형에 따라 다름)을 가져와서 원하는 레플리카의 개수를 스케일하는데
|
||||
|
|
@ -54,32 +73,36 @@ Horizontal Pod Autoscaler는 컨트롤러
|
|||
파드의 컨테이너 중 일부에 적절한 리소스 요청이 설정되지 않은 경우,
|
||||
파드의 CPU 사용률은 정의되지 않으며, 따라서 오토스케일러는
|
||||
해당 메트릭에 대해 아무런 조치도 취하지 않는다. 오토스케일링
|
||||
알고리즘의 작동 방식에 대한 자세한 내용은 아래 [알고리즘 세부 정보](#알고리즘-세부-정보)
|
||||
섹션을 참조하기 바란다.
|
||||
알고리즘의 작동 방식에 대한 자세한 내용은 아래 [알고리즘 세부 정보](#알고리즘-세부-정보) 섹션을 참조하기 바란다.
|
||||
|
||||
* 파드 단위 사용자 정의 메트릭의 경우, 컨트롤러는 사용률 값이 아닌 원시 값을 사용한다는 점을
|
||||
제외하고는 파드 단위 리소스 메트릭과 유사하게 작동한다.
|
||||
|
||||
* 오브젝트 메트릭 및 외부 메트릭의 경우, 문제의 오브젝트를 표현하는
|
||||
단일 메트릭을 가져온다. 이 메트릭은 목표 값과
|
||||
비교되어 위와 같은 비율을 생성한다. `autoscaling/v2beta2` API
|
||||
비교되어 위와 같은 비율을 생성한다. `autoscaling/v2` API
|
||||
버전에서는, 비교가 이루어지기 전에 해당 값을 파드의 개수로
|
||||
선택적으로 나눌 수 있다.
|
||||
|
||||
HorizontalPodAutoscaler는 보통 일련의 API 집합(`metrics.k8s.io`,
|
||||
`custom.metrics.k8s.io`, `external.metrics.k8s.io`)에서 메트릭을 가져온다. `metrics.k8s.io` API는 대개 별도로
|
||||
시작해야 하는 메트릭-서버에 의해 제공된다. 더 자세한 정보는 [메트릭-서버](/ko/docs/tasks/debug-application-cluster/resource-metrics-pipeline/#메트릭-서버)를 참조한다.
|
||||
HorizontalPodAutoscaler를 사용하는 일반적인 방법은
|
||||
{{< glossary_tooltip text="집약된 API" term_id="aggregation-layer" >}}(`metrics.k8s.io`,
|
||||
`custom.metrics.k8s.io`, 또는 `external.metrics.k8s.io`)로부터 메트릭을 가져오도록 설정하는 것이다.
|
||||
`metrics.k8s.io` API는 보통 메트릭 서버(Metrics Server)라는 애드온에 의해 제공되며,
|
||||
Metrics Server는 별도로 실행해야 한다. 자원 메트릭에 대한 추가 정보는
|
||||
[Metrics Server](/ko/docs/tasks/debug-application-cluster/resource-metrics-pipeline/#메트릭-서버)를 참고한다.
|
||||
|
||||
자세한 사항은 [메트릭 API를 위한 지원](#메트릭-api를-위한-지원)을 참조한다.
|
||||
[메트릭 API를 위한 지원](#메트릭-api를-위한-지원)에서 위의 API들에 대한 안정성 보장 및 지원 상태를
|
||||
확인할 수 있다.
|
||||
|
||||
오토스케일러는 스케일 하위 리소스를 사용하여 상응하는 확장 가능 컨트롤러(예: 레플리케이션 컨트롤러, 디플로이먼트, 레플리케이션 셋)에 접근한다.
|
||||
스케일은 레플리카의 개수를 동적으로 설정하고 각 현재 상태를 검사 할 수 있게 해주는 인터페이스이다.
|
||||
하위 리소스 스케일에 대한 자세한 내용은
|
||||
[여기](https://git.k8s.io/community/contributors/design-proposals/autoscaling/horizontal-pod-autoscaler.md#scale-subresource)에서 확인할 수 있다.
|
||||
HorizontalPodAutoscaler 컨트롤러는 스케일링을 지원하는 상응하는
|
||||
워크로드 리소스(예: 디플로이먼트 및 스테이트풀셋)에 접근한다.
|
||||
이들 리소스 각각은 `scale`이라는 하위 리소스를 갖고 있으며,
|
||||
이 하위 리소스는 레플리카의 수를 동적으로 설정하고 각각의 현재 상태를 확인할 수 있도록 하는 인터페이스이다.
|
||||
쿠버네티스 API의 하위 리소스에 대한 일반적인 정보는 [쿠버네티스 API 개념](/docs/reference/using-api/api-concepts/)에서 확인할 수 있다.
|
||||
|
||||
### 알고리즘 세부 정보
|
||||
|
||||
가장 기본적인 관점에서, Horizontal Pod Autoscaler 컨트롤러는
|
||||
가장 기본적인 관점에서, HorizontalPodAutoscaler 컨트롤러는
|
||||
원하는(desired) 메트릭 값과 현재(current) 메트릭 값 사이의 비율로
|
||||
작동한다.
|
||||
|
||||
|
|
@ -90,28 +113,30 @@ HorizontalPodAutoscaler는 보통 일련의 API 집합(`metrics.k8s.io`,
|
|||
예를 들어 현재 메트릭 값이 `200m`이고 원하는 값이
|
||||
`100m`인 경우 `200.0 / 100.0 == 2.0`이므로 복제본 수가 두 배가
|
||||
된다. 만약 현재 값이 `50m` 이면, `50.0 / 100.0 == 0.5` 이므로
|
||||
복제본 수를 반으로 줄일 것이다. 비율이 1.0(0.1을 기본값으로 사용하는
|
||||
복제본 수를 반으로 줄일 것이다. 컨트롤 플레인은 비율이 1.0(기본값이 0.1인
|
||||
`-horizontal-pod-autoscaler-tolerance` 플래그를 사용하여
|
||||
전역적으로 구성 가능한 허용 오차 내)에 충분히 가깝다면 스케일링을 건너 뛸 것이다.
|
||||
|
||||
`targetAverageValue` 또는 `targetAverageUtilization`가 지정되면,
|
||||
`currentMetricValue`는 HorizontalPodAutoscaler의 스케일 목표
|
||||
안에 있는 모든 파드에서 주어진 메트릭의 평균을 취하여 계산된다.
|
||||
허용치를 확인하고 최종 값을 결정하기 전에, 파드
|
||||
준비 상태와 누락된 메트릭을 고려한다.
|
||||
|
||||
삭제 타임 스탬프가 설정된 모든 파드(즉, 종료
|
||||
중인 파드) 및 실패한 파드는 모두 폐기된다.
|
||||
허용치를 확인하고 최종 값을 결정하기 전에,
|
||||
컨트롤 플레인은 누락된 메트릭이 있는지,
|
||||
그리고 몇 개의 파드가 [`Ready`](/ko/docs/concepts/workloads/pods/pod-lifecycle/#파드의-조건)인지도 고려한다.
|
||||
삭제 타임스탬프가 설정된 모든 파드(파드에 삭제 타임스탬프가 있으면
|
||||
셧다운/삭제 중임을 뜻한다)는 무시되며, 모든 실패한 파드는
|
||||
버려진다.
|
||||
|
||||
특정 파드에 메트릭이 누락된 경우, 나중을 위해 처리를 미뤄두는데, 이와
|
||||
같이 누락된 메트릭이 있는 모든 파드는 최종 스케일 량을 조정하는데 사용된다.
|
||||
|
||||
CPU를 스케일할 때, 어떤 파드라도 아직 준비가 안되었거나 (즉, 여전히
|
||||
초기화 중인 경우) * 또는 * 파드의 최신 메트릭 포인트가 준비되기
|
||||
CPU를 스케일할 때, 파드가 아직 Ready되지 않았거나(여전히
|
||||
초기화중이거나, unhealthy하여서) *또는* 파드의 최신 메트릭 포인트가 준비되기
|
||||
전이라면, 마찬가지로 해당 파드는 나중에 처리된다.
|
||||
|
||||
기술적 제약으로 인해, HorizontalPodAutoscaler 컨트롤러는
|
||||
특정 CPU 메트릭을 나중에 사용할지 말지 결정할 때, 파드가 준비되는
|
||||
특정 CPU 메트릭을 나중에 사용할지 말지 결정할 때, 파드가 준비되는
|
||||
시작 시간을 정확하게 알 수 없다. 대신, 파드가 아직 준비되지
|
||||
않았고 시작 이후 짧은 시간 내에 파드가 준비되지 않은 상태로
|
||||
전환된다면, 해당 파드를 "아직 준비되지 않음(not yet ready)"으로 간주한다.
|
||||
|
|
@ -124,20 +149,21 @@ CPU를 스케일할 때, 어떤 파드라도 아직 준비가 안되었거나 (
|
|||
`현재 메트릭 값 / 원하는 메트릭 값` 기본 스케일 비율은 나중에
|
||||
사용하기로 되어 있거나 위에서 폐기되지 않은 남아있는 파드를 사용하여 계산된다.
|
||||
|
||||
누락된 메트릭이 있는 경우, 파드가 스케일 다운의 경우
|
||||
누락된 메트릭이 있는 경우, 컨트롤 플레인은 파드가 스케일 다운의 경우
|
||||
원하는 값의 100%를 소비하고 스케일 업의 경우 0%를 소비한다고
|
||||
가정하여 평균을 보다 보수적으로 재계산한다. 이것은 잠재적인
|
||||
스케일의 크기를 약화시킨다.
|
||||
|
||||
또한 아직-준비되지-않은 파드가 있는 경우 누락된 메트릭이나
|
||||
아직-준비되지-않은 파드를 고려하지 않고 스케일 업했을 경우,
|
||||
아직-준비되지-않은 파드가 원하는 메트릭의 0%를 소비한다고
|
||||
또한, 아직-준비되지-않은 파드가 있고, 누락된 메트릭이나
|
||||
아직-준비되지-않은 파드가 고려되지 않고 워크로드가 스케일업 된 경우,
|
||||
컨트롤러는 아직-준비되지-않은 파드가 원하는 메트릭의 0%를 소비한다고
|
||||
보수적으로 가정하고 스케일 확장의 크기를 약화시킨다.
|
||||
|
||||
아직-준비되지-않은 파드나 누락된 메트릭을 고려한 후에 사용
|
||||
비율을 다시 계산한다. 새 비율이 스케일 방향을
|
||||
바꾸거나, 허용 오차 내에 있으면 스케일링을 건너뛴다. 그렇지 않으면, 새
|
||||
비율을 사용하여 스케일한다.
|
||||
아직-준비되지-않은 파드나 누락된 메트릭을 고려한 후에,
|
||||
컨트롤러가 사용률을 다시 계산한다.
|
||||
새로 계산한 사용률이 스케일 방향을 바꾸거나, 허용 오차 내에 있으면,
|
||||
컨트롤러가 스케일링을 건너뛴다.
|
||||
그렇지 않으면, 새로 계산한 사용률를 이용하여 파드 수 변경 결정을 내린다.
|
||||
|
||||
평균 사용량에 대한 *원래* 값은 새로운 사용 비율이 사용되는
|
||||
경우에도 아직-준비되지-않은 파드 또는 누락된 메트릭에 대한
|
||||
|
|
@ -161,32 +187,25 @@ HPA가 여전히 확장할 수 있음을 의미한다.
|
|||
|
||||
## API 오브젝트
|
||||
|
||||
Horizontal Pod Autoscaler는 쿠버네티스 `autoscaling` API 그룹의 API 리소스이다.
|
||||
CPU에 대한 오토스케일링 지원만 포함하는 안정된 버전은
|
||||
`autoscaling/v1` API 버전에서 찾을 수 있다.
|
||||
|
||||
메모리 및 사용자 정의 메트릭에 대한 스케일링 지원을 포함하는 베타 버전은
|
||||
`autoscaling/v2beta2`에서 확인할 수 있다. `autoscaling/v2beta2`에서 소개된
|
||||
새로운 필드는 `autoscaling/v1`로 작업할 때 어노테이션으로 보존된다.
|
||||
Horizontal Pod Autoscaler는
|
||||
쿠버네티스 `autoscaling` API 그룹의 API 리소스이다.
|
||||
현재의 안정 버전은 `autoscaling/v2` API 버전이며,
|
||||
메모리와 커스텀 메트릭에 대한 스케일링을 지원한다.
|
||||
`autoscaling/v2`에서 추가된 새로운 필드는 `autoscaling/v1`를 이용할 때에는
|
||||
어노테이션으로 보존된다.
|
||||
|
||||
HorizontalPodAutoscaler API 오브젝트 생성시 지정된 이름이 유효한
|
||||
[DNS 서브도메인 이름](/ko/docs/concepts/overview/working-with-objects/names/#dns-서브도메인-이름)인지 확인해야 한다.
|
||||
API 오브젝트에 대한 자세한 내용은
|
||||
[HorizontalPodAutoscaler 오브젝트](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#horizontalpodautoscaler-v1-autoscaling)에서 찾을 수 있다.
|
||||
[HorizontalPodAutoscaler 오브젝트](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#horizontalpodautoscaler-v2-autoscaling)에서 찾을 수 있다.
|
||||
|
||||
## 워크로드 스케일링의 안정성 {#flapping}
|
||||
|
||||
## kubectl에서 Horizontal Pod Autoscaler 지원
|
||||
HorizontalPodAutoscaler를 사용하여 레플리카 그룹의 크기를 관리할 때,
|
||||
측정하는 메트릭의 동적 특성 때문에 레플리카 수가 계속 자주 요동칠 수 있다.
|
||||
이는 종종 *thrashing* 또는 *flapping*이라고 불린다.
|
||||
이는 사이버네틱스 분야의 *이력 현상(hysteresis)* 개념과 비슷하다.
|
||||
|
||||
Horizontal Pod Autoscaler는 모든 API 리소스와 마찬가지로 `kubectl`에 의해 표준 방식으로 지원된다.
|
||||
`kubectl create` 커맨드를 사용하여 새로운 오토스케일러를 만들 수 있다.
|
||||
`kubectl get hpa`로 오토스케일러 목록을 조회할 수 있고, `kubectl describe hpa`로 세부 사항을 확인할 수 있다.
|
||||
마지막으로 `kubectl delete hpa`를 사용하여 오토스케일러를 삭제할 수 있다.
|
||||
|
||||
또한 Horizontal Pod Autoscaler를 생성할 수 있는 `kubectl autoscale`이라는 특별한 명령이 있다.
|
||||
예를 들어 `kubectl autoscale rs foo --min=2 --max=5 --cpu-percent=80`을
|
||||
실행하면 레플리케이션 셋 *foo* 에 대한 오토스케일러가 생성되고, 목표 CPU 사용률은 `80 %`,
|
||||
그리고 2와 5 사이의 레플리카 개수로 설정된다.
|
||||
`kubectl autoscale`에 대한 자세한 문서는 [여기](/docs/reference/generated/kubectl/kubectl-commands/#autoscale)에서 찾을 수 있다.
|
||||
|
||||
|
||||
## 롤링 업데이트 중 오토스케일링
|
||||
|
|
@ -203,31 +222,6 @@ HorizontalPodAutoscaler는 디플로이먼트의 `replicas` 필드를 관리한
|
|||
스테이트풀셋이 직접 파드의 숫자를 관리한다(즉,
|
||||
레플리카셋과 같은 중간 리소스가 없다).
|
||||
|
||||
## 쿨-다운 / 지연에 대한 지원
|
||||
|
||||
Horizontal Pod Autoscaler를 사용하여 레플리카 그룹의 스케일을 관리할 때,
|
||||
평가된 메트릭의 동적인 특징 때문에 레플리카 수가
|
||||
자주 변동할 수 있다. 이것은 때로는 *스래싱 (thrashing)* 이라고도 한다.
|
||||
|
||||
v1.6 부터 클러스터 운영자는 `kube-controller-manager` 컴포넌트의 플래그로
|
||||
노출된 글로벌 HPA 설정을 튜닝하여 이 문제를 완화할 수 있다.
|
||||
|
||||
v1.12부터는 새로운 알고리즘 업데이트가 업스케일 지연에 대한
|
||||
필요성을 제거하였다.
|
||||
|
||||
- `--horizontal-pod-autoscaler-downscale-delay` : 다운스케일이
|
||||
안정화되기까지의 시간 간격을 지정한다.
|
||||
Horizontal Pod Autoscaler는 이전의 권장하는 크기를 기억하고,
|
||||
이 시간 간격에서의 가장 큰 크기에서만 작동한다. 기본값은 5분(`5m0s`)이다.
|
||||
|
||||
{{< note >}}
|
||||
이러한 파라미터 값을 조정할 때 클러스터 운영자는 가능한 결과를 알아야
|
||||
한다. 지연(쿨-다운) 값이 너무 길면, Horizontal Pod Autoscaler가
|
||||
워크로드 변경에 반응하지 않는다는 불만이 있을 수 있다. 그러나 지연 값을
|
||||
너무 짧게 설정하면, 레플리카셋의 크기가 평소와 같이 계속 스래싱될 수
|
||||
있다.
|
||||
{{< /note >}}
|
||||
|
||||
## 리소스 메트릭 지원
|
||||
|
||||
모든 HPA 대상은 스케일링 대상에서 파드의 리소스 사용량을 기준으로 스케일링할 수 있다.
|
||||
|
|
@ -260,7 +254,7 @@ resource:
|
|||
|
||||
{{< feature-state for_k8s_version="v1.20" state="alpha" >}}
|
||||
|
||||
`HorizontalPodAutoscaler` 는 대상 리소스를 스케일링하기 위해 HPA가 파드 집합에서 개별 컨테이너의
|
||||
HorizontalPodAutoscaler API는 대상 리소스를 스케일링하기 위해 HPA가 파드 집합에서 개별 컨테이너의
|
||||
리소스 사용량을 추적할 수 있는 컨테이너 메트릭 소스도 지원한다.
|
||||
이를 통해 특정 파드에서 가장 중요한 컨테이너의 스케일링 임계값을 구성할 수 있다.
|
||||
예를 들어 웹 애플리케이션 프로그램과 로깅 사이드카가 있는 경우 사이드카 컨테이너와 해당 리소스 사용을 무시하고
|
||||
|
|
@ -272,6 +266,7 @@ resource:
|
|||
해당 파드는 무시되고 권장 사항이 다시 계산된다. 계산에 대한 자세한 내용은 [알고리즘](#알고리즘-세부-정보)을
|
||||
을 참조한다. 컨테이너 리소스를 오토스케일링에 사용하려면 다음과 같이
|
||||
메트릭 소스를 정의한다.
|
||||
|
||||
```yaml
|
||||
type: ContainerResource
|
||||
containerResource:
|
||||
|
|
@ -297,27 +292,31 @@ HorizontalPodAutoscaler가 추적하는 컨테이너의 이름을 변경하는
|
|||
이전 컨테이너 이름을 제거하여 정리한다.
|
||||
{{< /note >}}
|
||||
|
||||
## 멀티 메트릭을 위한 지원
|
||||
|
||||
Kubernetes 1.6은 멀티 메트릭을 기반으로 스케일링을 지원한다. `autoscaling/v2beta2` API
|
||||
버전을 사용하여 Horizontal Pod Autoscaler가 스케일을 조정할 멀티 메트릭을 지정할 수 있다. 그런 다음 Horizontal Pod
|
||||
Autoscaler 컨트롤러가 각 메트릭을 평가하고, 해당 메트릭을 기반으로 새 스케일을 제안한다.
|
||||
제안된 스케일 중 가장 큰 것이 새로운 스케일로 사용된다.
|
||||
## 사용자 정의 메트릭을 이용하는 스케일링
|
||||
|
||||
## 사용자 정의 메트릭을 위한 지원
|
||||
{{< feature-state for_k8s_version="v1.23" state="stable" >}}
|
||||
|
||||
{{< note >}}
|
||||
쿠버네티스 1.2는 특수 어노테이션을 사용하여 애플리케이션 관련 메트릭을 기반으로 하는 스케일의 알파 지원을 추가했다.
|
||||
쿠버네티스 1.6에서는 이러한 어노테이션 지원이 제거되고 새로운 오토스케일링 API가 추가되었다. 이전 사용자 정의
|
||||
메트릭 수집 방법을 계속 사용할 수는 있지만, Horizontal Pod Autoscaler에서는 이 메트릭을 사용할 수 없다. 그리고
|
||||
Horizontal Pod Autoscaler 컨트롤러에서는 더 이상 스케일 할 사용자 정의 메트릭을 지정하는 이전 어노테이션을 사용할 수 없다.
|
||||
{{< /note >}}
|
||||
(이전에는 `autoscaling/v2beta2` API 버전이 이 기능을 베타 기능으로 제공했었다.)
|
||||
|
||||
쿠버네티스 1.6에서는 Horizontal Pod Autoscaler에서 사용자 정의 메트릭을 사용할 수 있도록 지원한다.
|
||||
`autoscaling/v2beta2` API에서 사용할 Horizontal Pod Autoscaler에 대한 사용자 정의 메트릭을 추가 할 수 있다.
|
||||
그리고 쿠버네티스는 새 사용자 정의 메트릭 API에 질의하여 적절한 사용자 정의 메트릭의 값을 가져온다.
|
||||
`autoscaling/v2beta2` API 버전을 사용하는 경우,
|
||||
(쿠버네티스 또는 어느 쿠버네티스 구성 요소에도 포함되어 있지 않은)
|
||||
커스텀 메트릭을 기반으로 스케일링을 수행하도록 HorizontalPodAutoscaler를 구성할 수 있다.
|
||||
이 경우 HorizontalPodAutoscaler 컨트롤러가 이러한 커스텀 메트릭을 쿠버네티스 API로부터 조회한다.
|
||||
|
||||
요구 사항은 [메트릭을 위한 지원](#메트릭-API를-위한-지원)을 참조한다.
|
||||
요구 사항에 대한 정보는 [메트릭 API를 위한 지원](#메트릭-API를-위한-지원)을 참조한다.
|
||||
|
||||
## 복수의 메트릭을 이용하는 스케일링
|
||||
|
||||
{{< feature-state for_k8s_version="v1.23" state="stable" >}}
|
||||
|
||||
(이전에는 `autoscaling/v2beta2` API 버전이 이 기능을 베타 기능으로 제공했었다.)
|
||||
|
||||
`autoscaling/v2beta2` API 버전을 사용하는 경우,
|
||||
HorizontalPodAutoscaler가 스케일링에 사용할 복수의 메트릭을 설정할 수 있다.
|
||||
이 경우 HorizontalPodAutoscaler 컨트롤러가 각 메트릭을 확인하고 해당 단일 메트릭에 대한 새로운 스케일링 크기를 제안한다.
|
||||
HorizontalPodAutoscaler는 새롭게 제안된 스케일링 크기 중 가장 큰 값을 선택하여 워크로드 사이즈를
|
||||
조정한다(이 값이 이전에 설정한 '총 최대값(overall maximum)'보다는 크지 않을 때에만).
|
||||
|
||||
## 메트릭 API를 위한 지원
|
||||
|
||||
|
|
@ -332,8 +331,7 @@ API에 접속하려면 클러스터 관리자는 다음을 확인해야 한다.
|
|||
클러스터 애드온으로 시작할 수 있다.
|
||||
|
||||
* 사용자 정의 메트릭의 경우, 이것은 `custom.metrics.k8s.io` API이다. 메트릭 솔루션 공급 업체에서 제공하는 "어댑터" API 서버에서 제공한다.
|
||||
메트릭 파이프라인 또는 [알려진 솔루션 목록](https://github.com/kubernetes/metrics/blob/master/IMPLEMENTATIONS.md#custom-metrics-api)으로 확인한다.
|
||||
직접 작성하고 싶다면 [샘플](https://github.com/kubernetes-sigs/custom-metrics-apiserver)을 확인한다.
|
||||
사용 가능한 쿠버네티스 메트릭 어댑터가 있는지 확인하려면 사용하고자 하는 메트릭 파이프라인을 확인한다.
|
||||
|
||||
* 외부 메트릭의 경우, 이것은 `external.metrics.k8s.io` API이다. 위에 제공된 사용자 정의 메트릭 어댑터에서 제공될 수 있다.
|
||||
|
||||
|
|
@ -345,16 +343,21 @@ API에 접속하려면 클러스터 관리자는 다음을 확인해야 한다.
|
|||
어떻게 사용하는지에 대한 예시는 [커스텀 메트릭 사용하는 작업 과정](/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/#다양한-메트릭-및-사용자-정의-메트릭을-기초로한-오토스케일링)과
|
||||
[외부 메트릭스 사용하는 작업 과정](/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/#쿠버네티스-오브젝트와-관련이-없는-메트릭을-기초로한-오토스케일링)을 참조한다.
|
||||
|
||||
## 구성가능한 스케일링 동작 지원
|
||||
## 구성가능한 스케일링 동작
|
||||
|
||||
[v1.18](https://github.com/kubernetes/enhancements/blob/master/keps/sig-autoscaling/853-configurable-hpa-scale-velocity/README.md)
|
||||
부터 `v2beta2` API는 HPA `behavior` 필드를 통해
|
||||
스케일링 동작을 구성할 수 있다.
|
||||
동작은 `behavior` 필드 아래의 `scaleUp` 또는 `scaleDown`
|
||||
섹션에서 스케일링 업과 다운을 위해 별도로 지정된다. 안정화 윈도우는
|
||||
스케일링 대상에서 레플리카 수의 플래핑(flapping)을 방지하는
|
||||
양방향에 대해 지정할 수 있다. 마찬가지로 스케일링 정책을 지정하면
|
||||
스케일링 중 레플리카 변경 속도를 제어할 수 있다.
|
||||
{{< feature-state for_k8s_version="v1.23" state="stable" >}}
|
||||
|
||||
(이전에는 `autoscaling/v2beta2` API 버전이 이 기능을 베타 기능으로 제공했었다.)
|
||||
|
||||
`v2` 버전의 HorizontalPodAutoscaler API를 사용한다면,
|
||||
`behavior` 필드([API 레퍼런스](/docs/reference/kubernetes-api/workload-resources/horizontal-pod-autoscaler-v2/#HorizontalPodAutoscalerSpec) 참고)를
|
||||
사용하여 스케일업 동작과 스케일다운 동작을 별도로 구성할 수 있다.
|
||||
각 방향에 대한 동작은 `behavior` 필드 아래의
|
||||
`scaleUp` / `scaleDown`를 설정하여 지정할 수 있다.
|
||||
|
||||
_안정화 윈도우_ 를 명시하여 스케일링 목적물의
|
||||
레플리카 수 [흔들림](#flapping)을 방지할 수 있다. 스케일링 정책을 이용하여 스케일링 시
|
||||
레플리카 수 변화 속도를 조절할 수도 있다.
|
||||
|
||||
### 스케일링 정책
|
||||
|
||||
|
|
@ -391,23 +394,29 @@ behavior:
|
|||
확장 방향에 대해 `selectPolicy` 필드를 확인하여 폴리시 선택을 변경할 수 있다.
|
||||
레플리카의 수를 최소로 변경할 수 있는 폴리시를 선택하는 `최소(Min)`로 값을 설정한다.
|
||||
값을 `Disabled` 로 설정하면 해당 방향으로 스케일링이 완전히
|
||||
비활성화 된다.
|
||||
비활성화된다.
|
||||
|
||||
### 안정화 윈도우
|
||||
|
||||
안정화 윈도우는 스케일링에 사용되는 메트릭이 계속 변동할 때 레플리카의 플래핑을
|
||||
다시 제한하기 위해 사용된다. 안정화 윈도우는 스케일링을 방지하기 위해 과거부터
|
||||
계산된 의도한 상태를 고려하는 오토스케일링 알고리즘에 의해 사용된다.
|
||||
다음의 예시에서 `scaleDown` 에 대해 안정화 윈도우가 지정되어 있다.
|
||||
안정화 윈도우는 스케일링에 사용되는 메트릭이 계속 변동할 때
|
||||
레플리카 수의 [흔들림](#flapping)을 제한하기 위해 사용된다.
|
||||
오토스케일링 알고리즘은 이전의 목표 상태를 추론하고
|
||||
워크로드 수의 원치 않는 변화를 방지하기 위해 이 안정화 윈도우를 활용한다.
|
||||
|
||||
예를 들어, 다음 예제 스니펫에서, `scaleDown`에 대해 안정화 윈도우가 설정되었다.
|
||||
|
||||
```yaml
|
||||
scaleDown:
|
||||
behavior:
|
||||
scaleDown:
|
||||
stabilizationWindowSeconds: 300
|
||||
```
|
||||
|
||||
메트릭이 대상을 축소해야하는 것을 나타내는 경우 알고리즘은
|
||||
이전에 계산된 의도한 상태를 살펴보고 지정된 간격의 최고 값을 사용한다.
|
||||
위의 예시에서 지난 5분 동안 모든 의도한 상태가 고려된다.
|
||||
메트릭 관측 결과 스케일링 목적물이 스케일 다운 되어야 하는 경우,
|
||||
알고리즘은 이전에 계산된 목표 상태를 확인하고, 해당 구간에서 계산된 값 중 가장 높은 값을 사용한다.
|
||||
위의 예시에서, 이전 5분 동안의 모든 목표 상태가 고려 대상이 된다.
|
||||
|
||||
이를 통해 동적 최대값(rolling maximum)을 근사화하여,
|
||||
스케일링 알고리즘이 빠른 시간 간격으로 파드를 제거하고 바로 다시 동일한 파드를 재생성하는 현상을 방지할 수 있다.
|
||||
|
||||
### 기본 동작
|
||||
|
||||
|
|
@ -453,7 +462,7 @@ behavior:
|
|||
stabilizationWindowSeconds: 60
|
||||
```
|
||||
|
||||
### 예시: 스케일 다운 비율 제한
|
||||
### 예시: 스케일 다운 속도 제한
|
||||
|
||||
HPA에 의해 파드가 제거되는 속도를 분당 10%로 제한하기 위해
|
||||
다음 동작이 HPA에 추가된다.
|
||||
|
|
@ -467,9 +476,7 @@ behavior:
|
|||
periodSeconds: 60
|
||||
```
|
||||
|
||||
마지막으로 5개의 파드를 드롭하기 위해 다른 폴리시를 추가하고, 최소 선택
|
||||
전략을 추가할 수 있다.
|
||||
분당 5개 이하의 파드가 제거되지 않도록, 고정 크기가 5인 두 번째 축소
|
||||
분당 제거되는 파드 수가 5를 넘지 않도록 하기 위해, 크기가 5로 고정된 두 번째 축소
|
||||
정책을 추가하고, `selectPolicy` 를 최소로 설정하면 된다. `selectPolicy` 를 `Min` 으로 설정하면
|
||||
자동 스케일러가 가장 적은 수의 파드에 영향을 주는 정책을 선택함을 의미한다.
|
||||
|
||||
|
|
@ -497,6 +504,18 @@ behavior:
|
|||
selectPolicy: Disabled
|
||||
```
|
||||
|
||||
## kubectl의 HorizontalPodAutoscaler 지원
|
||||
|
||||
Horizontal Pod Autoscaler는 모든 API 리소스와 마찬가지로 `kubectl`에 의해 표준 방식으로 지원된다.
|
||||
`kubectl create` 커맨드를 사용하여 새로운 오토스케일러를 만들 수 있다.
|
||||
`kubectl get hpa`로 오토스케일러 목록을 조회할 수 있고, `kubectl describe hpa`로 세부 사항을 확인할 수 있다.
|
||||
마지막으로 `kubectl delete hpa`를 사용하여 오토스케일러를 삭제할 수 있다.
|
||||
|
||||
또한 Horizontal Pod Autoscaler를 생성할 수 있는 `kubectl autoscale`이라는 특별한 명령이 있다.
|
||||
예를 들어 `kubectl autoscale rs foo --min=2 --max=5 --cpu-percent=80`을
|
||||
실행하면 레플리케이션 셋 *foo* 에 대한 오토스케일러가 생성되고, 목표 CPU 사용률은 `80 %`,
|
||||
그리고 2와 5 사이의 레플리카 개수로 설정된다.
|
||||
|
||||
## 암시적 유지 관리 모드 비활성화
|
||||
|
||||
HPA 구성 자체를 변경할 필요없이 대상에 대한
|
||||
|
|
@ -506,9 +525,54 @@ HPA를 암시적으로 비활성화할 수 있다. 대상의 의도한
|
|||
다시 활성화할 때까지 HPA는 대상 조정을
|
||||
중지한다(그리고 `ScalingActive` 조건 자체를 `false`로 설정).
|
||||
|
||||
### 디플로이먼트와 스테이트풀셋을 horizontal autoscaling으로 전환하기
|
||||
|
||||
HPA가 활성화되어 있으면, 디플로이먼트, 스테이트풀셋 모두 또는 둘 중 하나의
|
||||
{{< glossary_tooltip text="매니페스트" term_id="manifest" >}}에서
|
||||
`spec.replicas`의 값을 삭제하는 것이 바람직하다.
|
||||
이렇게 적용하지 않으면, (예를 들어 `kubectl apply -f deployment.yaml` 명령으로)
|
||||
오브젝트에 변경이 생길 때마다 쿠버네티스가 파드의 수를
|
||||
`spec.replicas`에 기재된 값으로 조정할 것이다.
|
||||
이는 바람직하지 않으며 HPA가 활성화된 경우에 문제가 될 수 있다.
|
||||
|
||||
`spec.replicas` 값을 제거하면 1회성으로 파드 숫자가 줄어들 수 있는데,
|
||||
이는 이 키의 기본값이 1이기 때문이다(레퍼런스:
|
||||
[디플로이먼트 레플리카](/ko/docs/concepts/workloads/controllers/deployment#레플리카)).
|
||||
값을 업데이트하면, 파드 1개를 제외하고 나머지 파드가 종료 절차에 들어간다.
|
||||
이후의 디플로이먼트 애플리케이션은 정상적으로 작동하며 롤링 업데이트 구성도 의도한 대로 동작한다.
|
||||
이러한 1회성 저하를 방지하는 방법이 존재하며,
|
||||
디플로이먼트 수정 방법에 따라 다음 중 한 가지 방법을 선택한다.
|
||||
|
||||
{{< tabs name="fix_replicas_instructions" >}}
|
||||
{{% tab name="클라이언트 쪽에 적용하기 (기본값))" %}}
|
||||
|
||||
1. `kubectl apply edit-last-applied deployment/<디플로이먼트_이름>`
|
||||
2. 에디터에서 `spec.replicas`를 삭제한다. 저장하고 에디터를 종료하면, `kubectl`이
|
||||
업데이트 사항을 적용한다. 이 단계에서 파드 숫자가 변경되지는 않는다.
|
||||
3. 이제 매니페스트에서 `spec.replicas`를 삭제할 수 있다.
|
||||
소스 코드 관리 도구를 사용하고 있다면, 변경 사항을 추적할 수 있도록
|
||||
변경 사항을 커밋하고 추가 필요 단계를 수행한다.
|
||||
4. 이제 `kubectl apply -f deployment.yaml`를 실행할 수 있다.
|
||||
|
||||
{{% /tab %}}
|
||||
{{% tab name="서버 쪽에 적용하기" %}}
|
||||
|
||||
[서버 쪽에 적용하기](/docs/reference/using-api/server-side-apply/)를 수행하려면,
|
||||
정확히 이러한 사용 사례를 다루고 있는 [소유권 이전하기](/docs/reference/using-api/server-side-apply/#transferring-ownership)
|
||||
가이드라인을 참조한다.
|
||||
|
||||
{{% /tab %}}
|
||||
{{< /tabs >}}
|
||||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
클러스터에 오토스케일링을 구성한다면, [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler)와 같은
|
||||
클러스터 수준의 오토스케일러 사용을 고려해 볼 수 있다.
|
||||
|
||||
* 디자인 문서: [Horizontal Pod Autoscaling](https://git.k8s.io/community/contributors/design-proposals/autoscaling/horizontal-pod-autoscaler.md).
|
||||
* kubectl 오토스케일 커맨드: [kubectl autoscale](/docs/reference/generated/kubectl/kubectl-commands/#autoscale).
|
||||
* [Horizontal Pod Autoscaler](/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/)의 사용 예제.
|
||||
HorizontalPodAutoscaler에 대한 더 많은 정보는 아래를 참고한다.
|
||||
|
||||
* horizontal pod autoscaling에 대한 [연습 예제](/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/)를 확인한다.
|
||||
* [`kubectl autoscale`](/docs/reference/generated/kubectl/kubectl-commands/#autoscale) 문서를 확인한다.
|
||||
* 커스텀 메트릭 어댑터를 직접 작성하고 싶다면,
|
||||
[샘플](https://github.com/kubernetes-sigs/custom-metrics-apiserver)을 확인한다.
|
||||
* HorizontalPodAutoscaler [API 레퍼런스](/docs/reference/kubernetes-api/workload-resources/horizontal-pod-autoscaler-v2/)를 확인한다.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,100 @@
|
|||
---
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
title: 스테이트풀셋(StatefulSet) 확장하기
|
||||
content_type: task
|
||||
weight: 50
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
이 작업은 스테이트풀셋을 확장하는 방법을 보여준다. 스테이트풀셋 확장은 레플리카 수를 늘리거나 줄이는 것을 의미한다.
|
||||
|
||||
|
||||
## {{% heading "prerequisites" %}}
|
||||
|
||||
|
||||
* 스테이트풀셋은 쿠버네티스 버전 1.5 이상에서만 사용할 수 있다.
|
||||
쿠버네티스 버전을 확인하려면 `kubectl version`을 실행한다.
|
||||
|
||||
* 모든 스테이트풀 애플리케이션이 제대로 확장되는 것은 아니다. 스테이트풀셋을 확장할지 여부가 확실하지 않은 경우에 자세한 내용은 [스테이트풀셋](/ko/docs/concepts/workloads/controllers/statefulset/) 또는 [스테이트풀셋 튜토리얼](/ko/docs/tutorials/stateful-application/basic-stateful-set/)을 참조한다.
|
||||
|
||||
* 스테이트풀 애플리케이션 클러스터가 완전히 정상이라고 확신할 때만
|
||||
확장을 수행해야 한다.
|
||||
|
||||
|
||||
|
||||
<!-- steps -->
|
||||
|
||||
## 스테이트풀셋 확장하기
|
||||
|
||||
### kubectl을 사용하여 스테이트풀셋 확장
|
||||
|
||||
먼저 확장하려는 스테이트풀셋을 찾는다.
|
||||
|
||||
```shell
|
||||
kubectl get statefulsets <stateful-set-name>
|
||||
```
|
||||
|
||||
스테이트풀셋의 레플리카 수를 변경한다.
|
||||
|
||||
```shell
|
||||
kubectl scale statefulsets <stateful-set-name> --replicas=<new-replicas>
|
||||
```
|
||||
|
||||
### 스테이트풀셋 인플레이스(in-place) 업데이트
|
||||
|
||||
대안으로 스테이트풀셋에 [인플레이스 업데이트](/ko/docs/concepts/cluster-administration/manage-deployment/#in-place-updates-of-resources)를 수행할 수 있다.
|
||||
|
||||
스테이트풀셋이 처음에 `kubectl apply`로 생성된 경우,
|
||||
스테이트풀셋 매니페스트의 `.spec.replicas`를 업데이트한 다음 `kubectl apply`를 수행한다.
|
||||
|
||||
```shell
|
||||
kubectl apply -f <stateful-set-file-updated>
|
||||
```
|
||||
|
||||
그렇지 않으면 `kubectl edit`로 해당 필드를 편집한다.
|
||||
|
||||
```shell
|
||||
kubectl edit statefulsets <stateful-set-name>
|
||||
```
|
||||
|
||||
또는 `kubectl patch`를 사용한다.
|
||||
|
||||
```shell
|
||||
kubectl patch statefulsets <stateful-set-name> -p '{"spec":{"replicas":<new-replicas>}}'
|
||||
```
|
||||
|
||||
## 트러블슈팅
|
||||
|
||||
### 축소가 제대로 작동하지 않음
|
||||
|
||||
스테이트풀셋에서 관리하는 스테이트풀 파드가 비정상인 경우에는 스테이트풀셋을 축소할 수 없다. 축소는
|
||||
스테이트풀 파드가 실행되고 준비된 후에만 발생한다.
|
||||
|
||||
spec.replicas > 1인 경우 쿠버네티스는 비정상 파드의 원인을 결정할 수 없다. 영구적인 오류 또는 일시적인 오류의 결과일 수 있다. 일시적인 오류는 업그레이드 또는 유지 관리에 필요한 재시작으로 인해 발생할 수 있다.
|
||||
|
||||
영구적인 오류로 인해 파드가 비정상인 경우
|
||||
오류를 수정하지 않고 확장하면 스테이트풀셋 멤버십이 올바르게 작동하는 데 필요한
|
||||
특정 최소 레플리카 수 아래로 떨어지는 상태로 이어질 수 있다.
|
||||
이로 인해 스테이트풀셋을 사용할 수 없게 될 수 있다.
|
||||
|
||||
일시적인 오류로 인해 파드가 비정상 상태이고 파드를 다시 사용할 수 있게 되면
|
||||
일시적인 오류가 확장 또는 축소 작업을 방해할 수 있다. 일부 분산
|
||||
데이터베이스에는 노드가 동시에 가입 및 탈퇴할 때 문제가 있다. 이러한 경우
|
||||
애플리케이션 수준에서 확장 작업에 대해 추론하고 스테이트풀 애플리케이션 클러스터가
|
||||
완전히 정상이라고 확신할 때만 확장을 수행하는 것이 좋다.
|
||||
|
||||
|
||||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
|
||||
* [스테이트풀셋 삭제하기](/ko/docs/tasks/run-application/delete-stateful-set/)에 대해 더 배워보기
|
||||
|
||||
|
||||
|
|
@ -1,6 +1,10 @@
|
|||
---
|
||||
title: 클러스터에서 TLS 인증서 관리
|
||||
content_type: task
|
||||
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
|
@ -158,9 +162,19 @@ Events: <none>
|
|||
|
||||
## 인증서 서명 요청 승인 받기
|
||||
|
||||
인증서 서명 요청을 승인하는 것은 자동화된 승인 프로세스나
|
||||
클러스터 관리자에 의해 일회성으로 수행한다. 여기에
|
||||
관련된 내용에 대한 자세한 내용은 아래에서 설명한다.
|
||||
[인증서 서명 요청](/docs/reference/access-authn-authz/certificate-signing-requests/) 승인은
|
||||
자동화된 승인 프로세스 또는 클러스터 관리자의 일회성 승인으로 수행된다.
|
||||
인증서 요청 승인 권한을 갖고 있다면,
|
||||
`kubectl`을 이용하여 다음과 같이 수동으로 승인할 수 있다.
|
||||
|
||||
```shell
|
||||
kubectl certificate approve my-svc.my-namespace
|
||||
```
|
||||
|
||||
```none
|
||||
certificatesigningrequest.certificates.k8s.io/my-svc.my-namespace approved
|
||||
```
|
||||
|
||||
|
||||
## 인증서 다운로드 및 사용
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
title: "PowerShell 자동 완성"
|
||||
description: "PowerShell 자동 완성을 위한 몇 가지 선택적 구성에 대해 설명한다."
|
||||
headless: true
|
||||
---
|
||||
|
||||
PowerShell용 kubectl 자동 완성 스크립트는 `kubectl completion powershell` 명령으로 생성할 수 있다.
|
||||
|
||||
모든 셸 세션에서 사용하려면, `$PROFILE` 파일에 다음을 추가한다.
|
||||
|
||||
```powershell
|
||||
kubectl completion powershell | Out-String | Invoke-Expression
|
||||
```
|
||||
|
||||
이 명령은 PowerShell을 실행할 때마다 자동 완성 스크립트를 재생성한다. 아니면, 생성된 스크립트를 `$PROFILE` 파일에 직접 추가할 수도 있다.
|
||||
|
||||
생성된 스크립트를 `$PROFILE` 파일에 직접 추가하려면, PowerShell 프롬프트에서 다음 명령줄을 실행한다.
|
||||
|
||||
```powershell
|
||||
kubectl completion powershell >> $PROFILE
|
||||
```
|
||||
|
||||
셸을 다시 불러오면, kubectl 자동 완성이 동작할 것이다.
|
||||
|
|
@ -176,7 +176,7 @@ kubectl version --client
|
|||
|
||||
### 셸 자동 완성 활성화
|
||||
|
||||
kubectl은 Bash 및 Zsh에 대한 자동 완성 지원을 제공하므로 입력을 위한 타이핑을 많이 절약할 수 있다.
|
||||
kubectl은 Bash, Zsh, Fish, 및 PowerShell에 대한 자동 완성 지원을 제공하므로 입력을 위한 타이핑을 많이 절약할 수 있다.
|
||||
|
||||
다음은 Bash 및 Zsh에 대한 자동 완성을 설정하는 절차이다.
|
||||
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ macOS에서 [Macports](https://macports.org/) 패키지 관리자를 사용하
|
|||
|
||||
### 셸 자동 완성 활성화
|
||||
|
||||
kubectl은 Bash 및 Zsh에 대한 자동 완성 지원을 제공하므로 입력을 위한 타이핑을 많이 절약할 수 있다.
|
||||
kubectl은 Bash, Zsh, Fish, 및 PowerShell에 대한 자동 완성 지원을 제공하므로 입력을 위한 타이핑을 많이 절약할 수 있다.
|
||||
|
||||
다음은 Bash 및 Zsh에 대한 자동 완성을 설정하는 절차이다.
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,6 @@ card:
|
|||
- [윈도우에서 curl을 사용하여 kubectl 바이너리 설치](#install-kubectl-binary-with-curl-on-windows)
|
||||
- [Chocolatey 또는 Scoop을 사용하여 윈도우에 설치](#install-on-windows-using-chocolatey-or-scoop)
|
||||
|
||||
|
||||
### 윈도우에서 curl을 사용하여 kubectl 바이너리 설치 {#install-kubectl-binary-with-curl-on-windows}
|
||||
|
||||
1. [최신 릴리스 {{< param "fullversion" >}}](https://dl.k8s.io/release/{{< param "fullversion" >}}/bin/windows/amd64/kubectl.exe)를 다운로드한다.
|
||||
|
|
@ -134,11 +133,11 @@ card:
|
|||
|
||||
### 셸 자동 완성 활성화
|
||||
|
||||
kubectl은 Bash 및 Zsh에 대한 자동 완성 지원을 제공하므로 입력을 위한 타이핑을 많이 절약할 수 있다.
|
||||
kubectl은 Bash, Zsh, Fish, 및 PowerShell에 대한 자동 완성 지원을 제공하므로 입력을 위한 타이핑을 많이 절약할 수 있다.
|
||||
|
||||
다음은 Zsh에 대한 자동 완성을 설정하는 절차이다.
|
||||
다음은 PowerShell에 대한 자동 완성을 설정하는 절차이다.
|
||||
|
||||
{{< include "included/optional-kubectl-configs-zsh.md" >}}
|
||||
{{< include "included/optional-kubectl-configs-pwsh.md" >}}
|
||||
|
||||
### `kubectl convert` 플러그인 설치
|
||||
|
||||
|
|
|
|||
|
|
@ -52,10 +52,16 @@ content_type: concept
|
|||
* [AppArmor](/ko/docs/tutorials/clusters/apparmor/)
|
||||
|
||||
* [seccomp](/docs/tutorials/clusters/seccomp/)
|
||||
|
||||
## 서비스
|
||||
|
||||
* [소스 IP 주소 이용하기](/ko/docs/tutorials/services/source-ip/)
|
||||
|
||||
## 보안
|
||||
|
||||
* [파드 보안 표준을 클러스터 수준으로 적용하기](/docs/tutorials/security/cluster-level-pss/)
|
||||
* [파드 보안 표준을 네임스페이스 수준으로 적용하기](/docs/tutorials/security/ns-level-pss/)
|
||||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
튜토리얼을 작성하고 싶다면, 튜토리얼 페이지 유형에 대한 정보가 있는
|
||||
|
|
|
|||
|
|
@ -233,7 +233,7 @@ kubectl get events | grep hello-apparmor
|
|||
proc attr을 확인하여 컨테이너가 실제로 해당 프로파일로 실행 중인지 확인할 수 있다.
|
||||
|
||||
```shell
|
||||
kubectl exec hello-apparmor cat /proc/1/attr/current
|
||||
kubectl exec hello-apparmor -- cat /proc/1/attr/current
|
||||
```
|
||||
```
|
||||
k8s-apparmor-example-deny-write (enforce)
|
||||
|
|
@ -242,7 +242,7 @@ k8s-apparmor-example-deny-write (enforce)
|
|||
마지막으로 파일 쓰기를 통해 프로파일을 위반하면 어떻게 되는지 확인할 수 있다.
|
||||
|
||||
```shell
|
||||
kubectl exec hello-apparmor touch /tmp/test
|
||||
kubectl exec hello-apparmor -- touch /tmp/test
|
||||
```
|
||||
```
|
||||
touch: /tmp/test: Permission denied
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ weight: 10
|
|||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<p><b>컨트롤 플레인은 클러스터 관리를 담당한다.</b> 컨트롤 플레인은 애플리케이션을 스케줄링하거나, 애플리케이션의 항상성을 유지하거나, 애플리케이션을 스케일링하고, 새로운 변경사항을 순서대로 반영(rolling out)하는 일과 같은 클러스터 내 모든 활동을 조율한다.</p>
|
||||
<p><b>노드는 쿠버네티스 클러스터 내 워커 머신으로 동작하는 VM 또는 물리적인 컴퓨터다.</b> 각 노드는 노드를 관리하고 쿠버네티스 컨트롤 플레인과 통신하는 Kubelet이라는 에이전트를 갖는다. 노드는 컨테이너 운영을 담당하는 containerd 또는 도커와 같은 툴도 갖는다. 운영 트래픽을 처리하는 쿠버네티스 클러스터는 최소 세 대의 노드를 가져야 한다.</p>
|
||||
<p><b>노드는 쿠버네티스 클러스터 내 워커 머신으로 동작하는 VM 또는 물리적인 컴퓨터다.</b> 각 노드는 노드를 관리하고 쿠버네티스 컨트롤 플레인과 통신하는 Kubelet이라는 에이전트를 갖는다. 노드는 컨테이너 운영을 담당하는 containerd 또는 도커와 같은 툴도 갖는다. 운영 트래픽을 처리하는 쿠버네티스 클러스터는 최소 세 대의 노드를 가져야 하는데, 이는 한 노드가 다운되면 etcd 멤버와 컨트롤 플레인 인스턴스가 사라져 중복성(redundancy)을 잃기 때문이다. 컨트롤 플레인 노드를 추가하여 이러한 위험을 줄일 수 있다.</p>
|
||||
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
|
|
|
|||
|
|
@ -163,7 +163,7 @@ command=GET
|
|||
|
||||
## `Type=NodePort` 인 서비스에서 소스 IP
|
||||
|
||||
[`Type=NodePort`](/ko/docs/concepts/services-networking/service/#nodeport)인
|
||||
[`Type=NodePort`](/ko/docs/concepts/services-networking/service/#type-nodeport)인
|
||||
서비스로 보내진 패킷은
|
||||
소스 NAT가 기본으로 적용된다. `NodePort` 서비스를 생성하여 이것을 테스트할 수 있다.
|
||||
|
||||
|
|
|
|||
|
|
@ -127,8 +127,8 @@ web-1 0/1 ContainerCreating 0 0s
|
|||
web-1 1/1 Running 0 18s
|
||||
```
|
||||
|
||||
참고로 `web-1` 파드는 `web-0` 파드가 _Running_ ([파드의 단계](/ko/docs/concepts/workloads/pods/pod-lifecycle/#파드의-단계-phase) 참고)
|
||||
및 _Ready_ ([파드의 조건](/ko/docs/concepts/workloads/pods/pod-lifecycle/#파드의-조건-condition)에서 `type` 참고) 상태가 되기 전에 시작하지 않음을 주의하자.
|
||||
참고로 `web-1` 파드는 `web-0` 파드가 _Running_ ([파드의 단계](/ko/docs/concepts/workloads/pods/pod-lifecycle/#파드의-단계) 참고)
|
||||
및 _Ready_ ([파드의 컨디션](/ko/docs/concepts/workloads/pods/pod-lifecycle/#파드의-컨디션)에서 `type` 참고) 상태가 되기 전에 시작하지 않음을 주의하자.
|
||||
|
||||
## 스테이트풀셋 안에 파드
|
||||
|
||||
|
|
|
|||
|
|
@ -283,6 +283,6 @@ kubectl apply -f cassandra-statefulset.yaml
|
|||
## {{% heading "whatsnext" %}}
|
||||
|
||||
|
||||
* 어떻게 [스테이트풀셋 스케일](/docs/tasks/run-application/scale-stateful-set/)하는지 살펴본다.
|
||||
* 어떻게 [스테이트풀셋 스케일](/ko/docs/tasks/run-application/scale-stateful-set/)하는지 살펴본다.
|
||||
* [*쿠버네티스시드제공자*](https://github.com/kubernetes/examples/blob/master/cassandra/java/src/main/java/io/k8s/cassandra/KubernetesSeedProvider.java)에 대해 더 살펴본다.
|
||||
* 커스텀 [시드 제공자 설정](https://git.k8s.io/examples/cassandra/java/README.md)를 살펴본다.
|
||||
|
|
|
|||
|
|
@ -894,8 +894,7 @@ kubernetes-node-2g2d
|
|||
kubectl get nodes
|
||||
```
|
||||
|
||||
[`kubectl cordon`](/docs/reference/generated/kubectl/kubectl-commands/#cordon)을 이용하여
|
||||
클러스터 내에 4개 노드를 제외하고 다른 모든 노드를 통제해보자.
|
||||
이 튜토리얼에서는 클러스터가 최소 4개의 노드로 구성되었다고 가정한다. 클러스터의 노드가 4개보다 많다면, [`kubectl cordon`](/docs/reference/generated/kubectl/kubectl-commands/#cordon) 명령을 이용하여 4개 노드를 제외하고 다른 모든 노드를 통제(cordon)한다. 이렇게 4개 노드만 사용하도록 제한하여, 다음의 유지보수 시뮬레이션 예시에서 주키퍼 파드를 스케줄링할 때 어피니티와 PodDisruptionBudget 제약이 발생하도록 할 수 있다.
|
||||
|
||||
```shell
|
||||
kubectl cordon <노드-이름>
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue