First Korean l10n work for release-1.19
- Translate tasks/job/parallel-processing-expansion.md into Korean (#23544) - Fix issue with ko/docs/concepts/workloads/controllers/job.md (#23720) - Translate reference/scheduling/policies.md in Korean (#23690) - Update outdated files in the dev-1.19-ko.1 branch (#23702) - Modify translation access by Korean glossary (#23627) Co-authored-by: Jerry Park <jaehwa@gmail.com> Co-authored-by: junghyeonsu <54893898+junghyeonsu@users.noreply.github.com> Co-authored-by: coolguyhong <podolsmith@naver.com>
This commit is contained in:
@@ -23,7 +23,7 @@ weight: 40
|
||||
|
||||
## 디자인
|
||||
|
||||

|
||||

|
||||
|
||||
클라우드 컨트롤러 매니저는 컨트롤 플레인에서 복제된 프로세스의 집합으로 실행된다(일반적으로,
|
||||
파드의 컨테이너). 각 클라우드 컨트롤러 매니저는 단일
|
||||
@@ -213,4 +213,3 @@ rules:
|
||||
이 문서(노드, 라우트와 서비스)에서 강조된 공유 컨트롤러의 구현과 공유 cloudprovider 인터페이스와 함께 일부 스캐폴딩(scaffolding)은 쿠버네티스 핵심의 일부이다. 클라우드 공급자 전용 구현은 쿠버네티스의 핵심 바깥에 있으며 `CloudProvider` 인터페이스를 구현한다.
|
||||
|
||||
플러그인 개발에 대한 자세한 내용은 [클라우드 컨트롤러 매니저 개발하기](/docs/tasks/administer-cluster/developing-cloud-controller-manager/)를 참조한다.
|
||||
|
||||
|
||||
@@ -6,14 +6,14 @@ weight: 30
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
로보틱스와 자동화에서 _컨트롤 루프_ 는
|
||||
로보틱스와 자동화에서 _컨트롤 루프_ 는
|
||||
시스템 상태를 조절하는 종료되지 않는 루프이다.
|
||||
|
||||
컨트롤 루프의 예시: 실내 온도 조절기
|
||||
|
||||
사용자는 온도를 설정해서, 사용자가 *의도한 상태* 를
|
||||
온도 조절기에 알려준다.
|
||||
*현재 상태* 이다. 온도 조절기는 장비를 켜거나 꺼서
|
||||
*현재 상태* 이다. 온도 조절기는 장비를 켜거나 꺼서
|
||||
현재 상태를 의도한 상태에 가깝게 만든다.
|
||||
|
||||
{{< glossary_definition term_id="controller" length="short">}}
|
||||
@@ -28,64 +28,64 @@ weight: 30
|
||||
컨트롤러는 적어도 하나 이상의 쿠버네티스 리소스 유형을 추적한다.
|
||||
이 [오브젝트](/ko/docs/concepts/overview/working-with-objects/kubernetes-objects/#kubernetes-objects)
|
||||
는 의도한 상태를 표현하는 사양 필드를 가지고 있다.
|
||||
해당 리소스의 컨트롤러(들)은 현재 상태를 의도한
|
||||
해당 리소스의 컨트롤러(들)은 현재 상태를 의도한
|
||||
상태에 가깝게 만드는 역할을 한다.
|
||||
|
||||
컨트롤러는 스스로 작업을 수행할 수 있다. 보다 일반적으로,
|
||||
쿠버네티스에서는 컨트롤러가
|
||||
컨트롤러는 스스로 작업을 수행할 수 있다. 보다 일반적으로,
|
||||
쿠버네티스에서는 컨트롤러가
|
||||
{{< glossary_tooltip text="API 서버" term_id="kube-apiserver" >}} 로
|
||||
유용한 부수적인 효과가 있는 메시지를 발송한다. 그 예시는 아래에서 볼 수 있다.
|
||||
|
||||
{{< comment >}}
|
||||
네임스페이스 컨트롤러와 같은 일부 내장된 컨트롤러는 사양을 가지지 않는
|
||||
오브젝트에 대해 작동한다. 내용의 간결함을 위해서, 이 페이지에서는
|
||||
네임스페이스 컨트롤러와 같은 일부 내장된 컨트롤러는 사양을 가지지 않는
|
||||
오브젝트에 대해 작동한다. 내용의 간결함을 위해서, 이 페이지에서는
|
||||
자세한 설명을 생략한다.
|
||||
{{< /comment >}}
|
||||
|
||||
### API 서버를 통한 제어
|
||||
|
||||
{{< glossary_tooltip term_id="job" >}} 컨트롤러는 쿠버네티스
|
||||
내장 컨트롤러의 예시이다. 내장 컨트롤러는 클러스터 API 서버와
|
||||
{{< glossary_tooltip term_id="job" >}} 컨트롤러는 쿠버네티스
|
||||
내장 컨트롤러의 예시이다. 내장 컨트롤러는 클러스터 API 서버와
|
||||
상호 작용하며 상태를 관리한다.
|
||||
|
||||
잡은 단일 {{< glossary_tooltip text="파드" term_id="pod" >}} 또는 여러 파드를 실행하고,
|
||||
작업을 수행한 다음 중지하는
|
||||
잡은 단일 {{< glossary_tooltip text="파드" term_id="pod" >}} 또는 여러 파드를 실행하고,
|
||||
작업을 수행한 다음 중지하는
|
||||
쿠버네티스 리소스 이다.
|
||||
|
||||
(일단 [스케줄되면](/ko/docs/concepts/scheduling-eviction/), 파드 오브젝트는 kubelet
|
||||
(일단 [스케줄되면](/ko/docs/concepts/scheduling-eviction/), 파드 오브젝트는 kubelet
|
||||
의 의도한 상태 중 일부가 된다.)
|
||||
|
||||
잡 컨트롤러가 새로운 작업을 확인하면, 클러스터 어딘가에서
|
||||
잡 컨트롤러가 새로운 작업을 확인하면, 클러스터 어딘가에서
|
||||
노드 집합의 kubelet이 작업을 수행하기에 적합한
|
||||
수의 파드를 실행하게 한다.
|
||||
잡 컨트롤러는 어떤 파드 또는 컨테이너를 스스로 실행하지 않는다.
|
||||
대신, 잡 컨트롤러는 API 서버에 파드를 생성하거나 삭제하도록
|
||||
대신, 잡 컨트롤러는 API 서버에 파드를 생성하거나 삭제하도록
|
||||
지시한다.
|
||||
{{< glossary_tooltip text="컨트롤 플레인" term_id="control-plane" >}}의
|
||||
{{< glossary_tooltip text="컨트롤 플레인" term_id="control-plane" >}}의
|
||||
다른 컴포넌트는 신규 정보
|
||||
(예약 및 실행해야 하는 새 파드가 있다는 정보)에 대응하여,
|
||||
(예약 및 실행해야 하는 새 파드가 있다는 정보)에 대응하여,
|
||||
결국 해당 작업을 완료시킨다.
|
||||
|
||||
새 잡을 생성하고 나면, 의도한 상태는 해당 잡을 완료하는 것이 된다.
|
||||
잡 컨트롤러는 현재 상태를 의도한 상태에 가깝게
|
||||
만들며, 사용자가 원하는 잡을 수행하기 위해 파드를 생성해서
|
||||
잡 컨트롤러는 현재 상태를 의도한 상태에 가깝게
|
||||
만들며, 사용자가 원하는 잡을 수행하기 위해 파드를 생성해서
|
||||
잡이 완료에 가까워 지도록 한다.
|
||||
|
||||
또한, 컨트롤러는 오브젝트의 설정을 업데이트 한다.
|
||||
예시: 잡을 위한 작업이 종료된 경우, 잡 컨트롤러는
|
||||
잡 오브젝트가 `Finished` 로 표시되도록 업데이트한다.
|
||||
|
||||
(이것은 지금 방 온도가 설정한 온도인 것을 표시하기
|
||||
(이것은 지금 방 온도가 설정한 온도인 것을 표시하기
|
||||
위해 실내 온도 조절기의 빛을 끄는 것과 약간 비슷하다).
|
||||
|
||||
### 직접 제어
|
||||
|
||||
잡과는 대조적으로, 일부 컨트롤러는 클러스터 외부의 것을
|
||||
잡과는 대조적으로, 일부 컨트롤러는 클러스터 외부의 것을
|
||||
변경해야 할 필요가 있다.
|
||||
|
||||
예를 들어, 만약 컨트롤 루프를 사용해서
|
||||
예를 들어, 만약 컨트롤 루프를 사용해서
|
||||
클러스터에 충분한 {{< glossary_tooltip text="노드들" term_id="node" >}}이
|
||||
있도록 만드는 경우, 해당 컨트롤러는 필요할 때 새 노드를 설정할 수 있도록
|
||||
있도록 만드는 경우, 해당 컨트롤러는 필요할 때 새 노드를 설정할 수 있도록
|
||||
현재 클러스터 외부의 무언가를 필요로 한다.
|
||||
|
||||
외부 상태와 상호 작용하는 컨트롤러는 API 서버에서 의도한
|
||||
@@ -101,7 +101,7 @@ weight: 30
|
||||
쿠버네티스는 클라우드-네이티브 관점에서 시스템을 관찰하며, 지속적인
|
||||
변화에 대응할 수 있다.
|
||||
|
||||
작업이 발생함에 따라 어떤 시점에서든 클러스터가
|
||||
작업이 발생함에 따라 어떤 시점에서든 클러스터가
|
||||
변경 될 수 있으며 컨트롤 루프가 자동으로 실패를 바로잡는다. 이는 잠재적으로,
|
||||
클러스터가 안정적인 상태에 도달하지 못하는 것을 의미한다.
|
||||
|
||||
@@ -110,26 +110,26 @@ weight: 30
|
||||
|
||||
## 디자인
|
||||
|
||||
디자인 원리에 따라, 쿠버네티스는 클러스터 상태의 각 특정 측면을
|
||||
디자인 원리에 따라, 쿠버네티스는 클러스터 상태의 각 특정 측면을
|
||||
관리하는 많은 컨트롤러를 사용한다. 가장 일반적으로, 특정 컨트롤 루프
|
||||
(컨트롤러)는 의도한 상태로서 한 종류의 리소스를 사용하고, 의도한 상태로
|
||||
(컨트롤러)는 의도한 상태로서 한 종류의 리소스를 사용하고, 의도한 상태로
|
||||
만들기 위해 다른 종류의 리소스를 관리한다. 예를 들어, 잡 컨트롤러는
|
||||
잡 오브젝트(새 작업을 발견하기 위해)와 파드 오브젝트(잡을 실행하고, 완료된 시기를
|
||||
잡 오브젝트(새 작업을 발견하기 위해)와 파드 오브젝트(잡을 실행하고, 완료된 시기를
|
||||
확인하기 위해)를 추적한다. 이 경우 파드는 잡 컨트롤러가 생성하는 반면,
|
||||
잡은 다른 컨트롤러가 생성한다.
|
||||
|
||||
컨트롤 루프들로 연결 구성된 하나의 모놀리식(monolithic) 집합보다,
|
||||
간단한 컨트롤러를 여러 개 사용하는 것이 유용하다. 컨트롤러는 실패할 수 있으므로, 쿠버네티스는 이를
|
||||
컨트롤 루프들로 연결 구성된 하나의 모놀리식(monolithic) 집합보다,
|
||||
간단한 컨트롤러를 여러 개 사용하는 것이 유용하다. 컨트롤러는 실패할 수 있으므로, 쿠버네티스는 이를
|
||||
허용하도록 디자인되었다.
|
||||
|
||||
{{< note >}}
|
||||
동일한 종류의 오브젝트를 만들거나 업데이트하는 여러 컨트롤러가 있을 수 있다.
|
||||
이면에, 쿠버네티스 컨트롤러는 컨트롤 하고 있는 리소스에
|
||||
이면에, 쿠버네티스 컨트롤러는 컨트롤 하고 있는 리소스에
|
||||
연결된 리소스에만 주의를 기울인다.
|
||||
|
||||
예를 들어, 디플로이먼트와 잡을 가지고 있다. 이 두 가지 모두 파드를 생성한다.
|
||||
잡 컨트롤러는 디플로이먼트가 생성한 파드를 삭제하지 않는다.
|
||||
이는 컨트롤러가 해당 파드를 구별하기 위해 사용할 수 있는
|
||||
잡 컨트롤러는 디플로이먼트가 생성한 파드를 삭제하지 않는다.
|
||||
이는 컨트롤러가 해당 파드를 구별하기 위해 사용할 수 있는
|
||||
정보({{< glossary_tooltip term_id="label" text="레이블" >}})가 있기 때문이다.
|
||||
{{< /note >}}
|
||||
|
||||
@@ -139,14 +139,14 @@ weight: 30
|
||||
내부에서 실행되는 내장된 컨트롤러 집합이 있다. 이
|
||||
내장 컨트롤러는 중요한 핵심 동작을 제공한다.
|
||||
|
||||
디플로이먼트 컨트롤러와 잡 컨트롤러는 쿠버네티스의
|
||||
디플로이먼트 컨트롤러와 잡 컨트롤러는 쿠버네티스의
|
||||
자체("내장" 컨트롤러)로 제공되는 컨트롤러 예시이다.
|
||||
쿠버네티스를 사용하면 복원력이 뛰어난 컨트롤 플레인을 실행할 수 있으므로,
|
||||
쿠버네티스를 사용하면 복원력이 뛰어난 컨트롤 플레인을 실행할 수 있으므로,
|
||||
어떤 내장 컨트롤러가 실패하더라도 다른 컨트롤 플레인의 일부가 작업을 이어서 수행한다.
|
||||
|
||||
컨트롤 플레인의 외부에서 실행하는 컨트롤러를 찾아서 쿠버네티스를 확장할 수 있다.
|
||||
또는, 원하는 경우 새 컨트롤러를 직접 작성할 수 있다.
|
||||
소유하고 있는 컨트롤러를 파드 집합으로서 실행하거나,
|
||||
소유하고 있는 컨트롤러를 파드 집합으로서 실행하거나,
|
||||
또는 쿠버네티스 외부에서 실행할 수 있다. 가장 적합한 것은 특정 컨트롤러의 기능에
|
||||
따라 달라진다.
|
||||
|
||||
@@ -154,8 +154,7 @@ weight: 30
|
||||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
* [쿠버네티스 컨트롤 플레인](/ko/docs/concepts/#쿠버네티스-컨트롤-플레인)에 대해 읽기
|
||||
* [쿠버네티스 오브젝트](/ko/docs/concepts/#쿠버네티스-오브젝트)의 몇 가지 기본 사항을 알아보자.
|
||||
* [쿠버네티스 컨트롤 플레인](/ko/docs/concepts/overview/components/#컨트롤-플레인-컴포넌트)에 대해 읽기
|
||||
* [쿠버네티스 오브젝트](/ko/docs/concepts/overview/working-with-objects/kubernetes-objects/)의 몇 가지 기본 사항을 알아보자.
|
||||
* [쿠버네티스 API](/ko/docs/concepts/overview/kubernetes-api/)에 대해 더 배워 보자.
|
||||
* 만약 자신만의 컨트롤러를 작성하기 원한다면, 쿠버네티스 확장하기의 [확장 패턴](/ko/docs/concepts/extend-kubernetes/extend-cluster/#익스텐션-패턴)을 본다.
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ content_type: concept
|
||||
* [NSX-T](https://docs.vmware.com/en/VMware-NSX-T/2.0/nsxt_20_ncp_kubernetes.pdf) 컨테이너 플러그인(NCP)은 VMware NSX-T와 쿠버네티스와 같은 컨테이너 오케스트레이터 간의 통합은 물론 NSX-T와 PKS(Pivotal 컨테이너 서비스) 및 OpenShift와 같은 컨테이너 기반 CaaS/PaaS 플랫폼 간의 통합을 제공한다.
|
||||
* [Nuage](https://github.com/nuagenetworks/nuage-kubernetes/blob/v5.1.1-1/docs/kubernetes-1-installation.rst)는 가시성과 보안 모니터링 기능을 통해 쿠버네티스 파드와 비-쿠버네티스 환경 간에 폴리시 기반 네트워킹을 제공하는 SDN 플랫폼이다.
|
||||
* [Romana](https://romana.io)는 [네트워크폴리시 API](/ko/docs/concepts/services-networking/network-policies/)도 지원하는 파드 네트워크용 Layer 3 네트워킹 솔루션이다. Kubeadm 애드온 설치에 대한 세부 정보는 [여기](https://github.com/romana/romana/tree/master/containerize)에 있다.
|
||||
* [Weave Net](https://www.weave.works/docs/net/latest/kube-addon/)은 네트워킹 및 네트워크 폴리시를 제공하고, 네트워크 파티션의 양면에서 작업을 수행하며, 외부 데이터베이스는 필요하지 않다.
|
||||
* [Weave Net](https://www.weave.works/docs/net/latest/kubernetes/kube-addon/)은 네트워킹 및 네트워크 폴리시를 제공하고, 네트워크 파티션의 양면에서 작업을 수행하며, 외부 데이터베이스는 필요하지 않다.
|
||||
|
||||
## 서비스 검색
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ weight: 30
|
||||
|
||||
<!-- overview -->
|
||||
이 페이지에서는 특정 클라우드 제공자에서 실행 중인 쿠버네티스를 관리하는 방법에
|
||||
대해 설명한다.
|
||||
대해 설명한다. 다른 많은 타사 클라우드 제공자 프로젝트가 있지만, 이 목록은 쿠버네티스 자체에 의존하거나, 포함되어있는 프로젝트에 한정한다.
|
||||
|
||||
<!-- body -->
|
||||
### kubeadm
|
||||
@@ -116,15 +116,6 @@ AWS 어노테이션에 대한 정보 출처는 [aws.go](https://github.com/kuber
|
||||
Azure 클라우드 제공자는 쿠버네티스 노드 오브젝트의 이름으로 노드의 (kubelet에 의해 결정되거나 `--hostname-override` 로 재정의된) 호스트 이름(hostname)을 사용한다.
|
||||
참고로 쿠버네티스 노드 이름은 Azure VM 이름과 일치해야 한다.
|
||||
|
||||
## CloudStack
|
||||
|
||||
이 외부 클라우드 제공자를 사용하려는 경우, 해당 리포지터리는 [apache/cloudstack-kubernetes-provider](https://github.com/apache/cloudstack-kubernetes-provider)이다.
|
||||
|
||||
### 노드 이름
|
||||
|
||||
CloudStack 클라우드 제공자는 쿠버네티스 노드 오브젝트의 이름으로 노드의 (kubelet에 의해 결정되거나 `--hostname-override` 로 재정의된) 호스트 이름을 사용한다.
|
||||
참고로 쿠버네티스 노드 이름은 CloudStack VM 이름과 일치해야 한다.
|
||||
|
||||
## GCE
|
||||
|
||||
이 외부 클라우드 제공자를 사용하려는 경우, 해당 리포지터리는 [kubernetes/cloud-provider-gcp](https://github.com/kubernetes/cloud-provider-gcp#readme)이다.
|
||||
@@ -138,11 +129,6 @@ GCE 클라우드 제공자는 쿠버네티스 노드 오브젝트의 이름으
|
||||
|
||||
외부 클라우드 제공자를 사용하려는 경우, 해당 리포지터리는 [kubernetes-sigs/cloud-provider-huaweicloud](https://github.com/kubernetes-sigs/cloud-provider-huaweicloud)이다.
|
||||
|
||||
### 노드 이름
|
||||
|
||||
HUAWEI CLOUD 제공자는 쿠버네티스 노드 오브젝트의 이름으로 노드의 프라이빗 IP 주소가 필요하다.
|
||||
노드에서 kubelet을 시작할 때 반드시 `--hostname-override=<node private IP>` 를 사용한다.
|
||||
|
||||
## OpenStack
|
||||
이 섹션에서는 쿠버네티스와 함께 OpenStack을 사용할 때 사용할 수 있는
|
||||
모든 구성에 대해 설명한다.
|
||||
@@ -251,11 +237,9 @@ OpenStack 제공자에 대한 다음의 구성 옵션은 로드 밸런서와 관
|
||||
값은 `v1` 또는 `v2` 이다. 값이 제공되지 않는 경우 자동 감지는
|
||||
기본 OpenStack 클라우드에 의해 제공되는 가장 최신의 지원되는 버전을
|
||||
선택한다.
|
||||
* `use-octavia` (선택): Octavia LBaaS V2 서비스 카탈로그 엔드포인트를 찾고 사용할지의
|
||||
여부를 결정하는 데 사용된다. 유효한 값은 `true` 또는 `false` 이다.
|
||||
`true` 가 지정되고 Octaiva LBaaS V2 항목을 찾을 수 없는 경우,
|
||||
제공자는 폴백(fall back)하고 대신 Neutron LBaaS V2 엔드포인트를 찾으려고
|
||||
시도한다. 기본값은 `false` 이다.
|
||||
* `use-octavia` (선택): Neutron-LBaaS를 사용하는 대신 LoadBalancer 유형의
|
||||
서비스 구현에 Octavia를 사용할지 여부를 결정한다. 기본값: true
|
||||
주의: Openstack CCM은 v1.17.0 이후로 기본 로드 밸런서 구현으로 Octavia를 사용한다.
|
||||
* `subnet-id` (선택): 로드 밸런서를 생성하려는 서브넷의 id를
|
||||
지정하는 데 사용된다. Network > Networks 에서 찾을 수 있다. 해당
|
||||
네트워크를 클릭하여 서브넷을 가져온다.
|
||||
@@ -362,19 +346,7 @@ OpenStack 제공자에 대한 다음의 구성 옵션은 [kubenet]
|
||||
[kubenet](/ko/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#kubenet)을
|
||||
사용하는 데 필요하다.
|
||||
|
||||
## OVirt
|
||||
|
||||
### 노드 이름
|
||||
|
||||
OVirt 클라우드 제공자는 쿠버네티스 노드 오브젝트의 이름으로 노드의 (kubelet에 의해 결정되거나 `--hostname-override` 로 재정의된) 호스트 이름을 사용한다.
|
||||
참고로 쿠버네티스 노드 이름은 VM FQDN(Ovirt의 `<vm><guest_info><fqdn>...</fqdn></guest_info></vm>` 아래에서 보고된)과 일치해야 한다.
|
||||
|
||||
## Photon
|
||||
|
||||
### 노드 이름
|
||||
|
||||
Photon 클라우드 제공자는 쿠버네티스 노드 오브젝트의 이름으로 노드의 (kubelet에 의해 결정되거나 `--hostname-override` 로 재정의된) 호스트 이름을 사용한다.
|
||||
참고로 쿠버네티스 노드 이름은 Photon VM 이름(또는 `--cloud-config` 에서 `overrideIP` 가 true로 설정된 경우, 쿠버네티스 노드 이름은 Photon VM IP 주소와 일치해야 함)과 일치해야 한다.
|
||||
[kubenet]: /ko/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/#kubenet
|
||||
|
||||
## vSphere
|
||||
|
||||
@@ -388,46 +360,3 @@ vSphere 6.7U3 미만을 사용할 경우, 인-트리 vSphere 클라우드 제공
|
||||
{{< /tabs >}}
|
||||
|
||||
vSphere 클라우드 제공자에 대한 자세한 문서를 보려면, [vSphere 클라우드 제공자 문서 사이트](https://cloud-provider-vsphere.sigs.k8s.io)를 방문한다.
|
||||
|
||||
## IBM 클라우드 쿠버네티스 서비스
|
||||
|
||||
### 컴퓨트 노드
|
||||
IBM 클라우드 쿠버네티스 서비스 제공자를 사용하면, 단일 영역 또는 하나의 리전에서 여러 영역에 걸쳐 가상 노드와 물리(베어 메탈) 노드가 혼합된 클러스터를 생성할 수 있다. 자세한 정보는, [클러스터와 워커(worker) 노드 설정 계획](https://cloud.ibm.com/docs/containers?topic=containers-planning_worker_nodes)을 참고한다.
|
||||
|
||||
쿠버네티스 노드 오브젝트의 이름은 IBM 클라우드 쿠버네티스 서비스 워커 노드 인스턴스의 프라이빗 IP 주소이다.
|
||||
|
||||
### 네트워킹
|
||||
IBM 클라우드 쿠버네티스 서비스 제공자는 노드의 네트워크 성능 품질과 네트워크 격리를 위한 VLAN을 제공한다. 사용자 정의 방화벽 및 Calico 네트워크 폴리시를 설정하여 클러스터에 추가적인 보안 계층을 추가하거나 VPN을 통해 온-프레미스 데이터센터에 클러스터를 연결할 수 있다. 자세한 내용은 [클러스터 네트워킹 구성](https://cloud.ibm.com/docs/containers?topic=containers-plan_clusters)을 참고한다.
|
||||
|
||||
퍼블릭 또는 클러스터 내에서 앱을 노출하기 위해 노드포트(NodePort), 로드밸런서 또는 인그레스 서비스를 활용할 수 있다. 어노테이션을 사용하여 인그레스 애플리케이션 로드 밸런서를 커스터마이징 할 수도 있다. 자세한 내용은 [앱을 노출할 서비스 선택하기](https://cloud.ibm.com/docs/containers?topic=containers-cs_network_planning#cs_network_planning)을 참고한다.
|
||||
|
||||
### 스토리지
|
||||
IBM 클라우드 쿠버네티스 서비스 제공자는 쿠버네티스-네이티브 퍼시스턴트 볼륨을 활용하여 사용자가 파일, 블록 및 클라우드 오브젝트 스토리지를 앱에 마운트할 수 있도록 한다. 데이터를 지속적으로 저장하기 위해 서비스로서의-데이터베이스(database-as-a-service)와 써드파티 애드온을 사용할 수도 있다. 자세한 정보는 [고가용성 퍼시스턴트 스토리지 계획](https://cloud.ibm.com/docs/containers?topic=containers-storage_planning#storage_planning)을 참고한다.
|
||||
|
||||
## Baidu 클라우드 컨테이너 엔진
|
||||
|
||||
### 노드 이름
|
||||
|
||||
Baidu 클라우드 제공자는 쿠버네티스 노드 오브젝트의 이름으로 노드의 (kubelet에 의해 결정되거나 `--hostname-override` 로 재정의된) 프라이빗 IP 주소를 사용한다.
|
||||
참고로 쿠버네티스 노드 이름은 Baidu VM 프라이빗 IP와 일치해야 한다.
|
||||
|
||||
## Tencent 쿠버네티스 엔진
|
||||
|
||||
이 외부 클라우드 제공자를 사용하려는 경우, 해당 리포지터리는 [TencentCloud/tencentcloud-cloud-controller-manager](https://github.com/TencentCloud/tencentcloud-cloud-controller-manager)이다.
|
||||
|
||||
### 노드 이름
|
||||
|
||||
Tencent 클라우드 제공자는 쿠버네티스 노드 오브젝트의 이름으로 노드의 (kubelet에 의해 결정되거나 `--hostname-override` 로 재정의된) 호스트 이름을 사용한다.
|
||||
참고로 쿠버네티스 노드 이름은 Tencent VM 프라이빗 IP와 일치해야 한다.
|
||||
|
||||
## Alibaba 클라우드 쿠버네티스
|
||||
|
||||
이 외부 클라우드 제공자를 사용하려는 경우, 해당 리포지터리는 [kubernetes/cloud-provider-alibaba-cloud](https://github.com/kubernetes/cloud-provider-alibaba-cloud)이다.
|
||||
|
||||
### 노드 이름
|
||||
|
||||
Alibaba 클라우드는 노드 이름의 형식을 요구하지는 않지만, kubelet은 `--provider-id=${REGION_ID}.${INSTANCE_ID}` 를 추가해야만 한다. 파라미터 `${REGION_ID}` 는 쿠버네티스의 지역 ID에 해당하고, `${INSTANCE_ID}` 는 Alibaba ECS (Elastic Compute Service) ID를 의미한다.
|
||||
|
||||
### 로드 밸런서
|
||||
|
||||
[어노테이션](https://www.alibabacloud.com/help/en/doc-detail/86531.htm)을 구성해서 Alibaba 클라우드의 특정 기능을 사용하도록 외부 로드 밸런서를 설정할 수 있다.
|
||||
|
||||
@@ -6,7 +6,7 @@ weight: 60
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
애플리케이션과 시스템 로그는 클러스터 내부에서 발생하는 상황을 이해하는 데 도움이 된다. 로그는 문제를 디버깅하고 클러스터 활동을 모니터링하는 데 특히 유용하다. 대부분의 최신 애플리케이션에는 일종의 로깅 메커니즘이 있다. 따라서, 대부분의 컨테이너 엔진은 일종의 로깅을 지원하도록 설계되었다. 컨테이너화된 애플리케이션에 가장 쉽고 가장 널리 사용되는 로깅 방법은 표준 출력과 표준 에러 스트림에 작성하는 것이다.
|
||||
애플리케이션 로그는 애플리케이션 내부에서 발생하는 상황을 이해하는 데 도움이 된다. 로그는 문제를 디버깅하고 클러스터 활동을 모니터링하는 데 특히 유용하다. 대부분의 최신 애플리케이션에는 일종의 로깅 메커니즘이 있다. 따라서, 대부분의 컨테이너 엔진은 일종의 로깅을 지원하도록 설계되었다. 컨테이너화된 애플리케이션에 가장 쉽고 가장 널리 사용되는 로깅 방법은 표준 출력과 표준 에러 스트림에 작성하는 것이다.
|
||||
|
||||
그러나, 일반적으로 컨테이너 엔진이나 런타임에서 제공하는 기본 기능은 완전한 로깅 솔루션으로 충분하지 않다. 예를 들어, 컨테이너가 크래시되거나, 파드가 축출되거나, 노드가 종료된 경우에도 여전히 애플리케이션의 로그에 접근하려고 한다. 따라서, 로그는 노드, 파드 또는 컨테이너와는 독립적으로 별도의 스토리지와 라이프사이클을 가져야 한다. 이 개념을 _클러스터-레벨-로깅_ 이라고 한다. 클러스터-레벨 로깅은 로그를 저장하고, 분석하고, 쿼리하기 위해 별도의 백엔드가 필요하다. 쿠버네티스는 로그 데이터를 위한 네이티브 스토리지 솔루션을 제공하지 않지만, 기존의 많은 로깅 솔루션을 쿠버네티스 클러스터에 통합할 수 있다.
|
||||
|
||||
@@ -91,6 +91,7 @@ GCP의 COS 이미지 로깅을 설정하는 방법에 대한 자세한 정보를
|
||||
그 후 `kubectl logs` 는 빈 응답을 반환한다.
|
||||
{{< /note >}}
|
||||
|
||||
[cosConfigureHelper]: https://github.com/kubernetes/kubernetes/blob/{{< param "githubbranch" >}}/cluster/gce/gci/configure-helper.sh
|
||||
### 시스템 컴포넌트 로그
|
||||
|
||||
시스템 컴포넌트에는 컨테이너에서 실행되는 것과 컨테이너에서 실행되지 않는 두 가지 유형이 있다.
|
||||
@@ -257,5 +258,3 @@ fluentd를 구성하는 것에 대한 자세한 내용은,
|
||||
모든 애플리케이션에서 직접 로그를 노출하거나 푸시하여 클러스터-레벨 로깅을
|
||||
구현할 수 있다. 그러나, 이러한 로깅 메커니즘의 구현은
|
||||
쿠버네티스의 범위를 벗어난다.
|
||||
|
||||
|
||||
|
||||
@@ -214,9 +214,9 @@ kubelet은 모든 주기적인 동기화에서 마운트된 컨피그맵이 최
|
||||
전파 지연은 선택한 캐시 유형에 따라 달라질 수 있다(전파
|
||||
지연을 지켜보거나, 캐시의 ttl 또는 0에 상응함).
|
||||
|
||||
{{< feature-state for_k8s_version="v1.18" state="alpha" >}}
|
||||
{{< feature-state for_k8s_version="v1.19" state="beta" >}}
|
||||
|
||||
쿠버네티스 알파 기능인 _변경할 수 없는(immutable) 시크릿과 컨피그맵_ 은 개별 시크릿과
|
||||
쿠버네티스 베타 기능인 _변경할 수 없는(immutable) 시크릿과 컨피그맵_ 은 개별 시크릿과
|
||||
컨피그맵을 변경할 수 없는 것으로 설정하는 옵션을 제공한다. 컨피그맵을 광범위하게
|
||||
사용하는 클러스터(최소 수만 개의 고유한 컨피그맵이 파드에 마운트)의 경우
|
||||
데이터 변경을 방지하면 다음과 같은 이점이 있다.
|
||||
|
||||
@@ -112,7 +112,7 @@ CPU는 항상 절대 수량으로 요청되며, 상대적 수량은 아니다.
|
||||
|
||||
`memory` 에 대한 제한 및 요청은 바이트 단위로 측정된다.
|
||||
E, P, T, G, M, K와 같은 접미사 중 하나를 사용하여 메모리를
|
||||
일반 정수 또는 고정 소수점 정수로 표현할 수 있다. Ei, Pi, Ti, Gi, Mi, Ki와
|
||||
일반 정수 또는 고정 소수점 숫자로 표현할 수 있다. Ei, Pi, Ti, Gi, Mi, Ki와
|
||||
같은 2의 거듭제곱을 사용할 수도 있다. 예를 들어, 다음은 대략 동일한 값을 나타낸다.
|
||||
|
||||
```shell
|
||||
@@ -311,7 +311,7 @@ _임시-스토리지_ 를 사용하여 로컬 임시 저장소를 관리할 수
|
||||
* `spec.containers[].resources.requests.ephemeral-storage`
|
||||
|
||||
`ephemeral-storage` 에 대한 제한 및 요청은 바이트 단위로 측정된다. E, P, T, G, M, K와
|
||||
같은 접미사 중 하나를 사용하여 스토리지를 일반 정수 또는 고정 소수점 정수로 표현할 수 있다.
|
||||
같은 접미사 중 하나를 사용하여 스토리지를 일반 정수 또는 고정 소수점 숫자로 표현할 수 있다.
|
||||
Ei, Pi, Ti, Gi, Mi, Ki와 같은 2의 거듭제곱을 사용할 수도 있다.
|
||||
예를 들어, 다음은 대략 동일한 값을 나타낸다.
|
||||
|
||||
|
||||
@@ -48,40 +48,6 @@ weight: 70
|
||||
이들은 일반적인 클래스이며 [중요한(critical) 컴포넌트가 항상 먼저 스케줄링이 되도록 하는 데](/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/) 사용된다.
|
||||
{{< /note >}}
|
||||
|
||||
## 선점을 비활성화하는 방법
|
||||
|
||||
{{< caution >}}
|
||||
중요 파드는 클러스터에 리소스 압박(resource pressure)이 가해지면
|
||||
스케줄러 선점에 따라 스케줄링된다. 이런 이유로, 선점을 비활성화하지
|
||||
않는 것을 권장한다.
|
||||
{{< /caution >}}
|
||||
|
||||
{{< note >}}
|
||||
쿠버네티스 1.15 이상에서, `NonPreemptingPriority` 기능이 활성화된 경우,
|
||||
프라이어리티클래스는 옵션을 `preemptionPolicy: Never` 로 설정할 수 있다.
|
||||
이렇게 하면 해당 프라이어리티클래스의 파드가 다른 파드를 축출할 수 없다.
|
||||
{{< /note >}}
|
||||
|
||||
선점은 기본값이 `false`로 설정된 `disablePreemption` kube-scheduler
|
||||
플래그에 의해 제어된다.
|
||||
위의 주의에도 불구하고 선점을 비활성화하려는 경우,
|
||||
`disablePreemption` 을 `true` 로 설정할 수 있다.
|
||||
|
||||
이 옵션은 컴포넌트 구성에서만 사용할 수 있으며
|
||||
이전 스타일의 커맨드 라인 옵션에서는 사용할 수 없다. 다음은 선점을 비활성화하는 샘플 컴포넌트
|
||||
구성이다.
|
||||
|
||||
```yaml
|
||||
apiVersion: kubescheduler.config.k8s.io/v1alpha1
|
||||
kind: KubeSchedulerConfiguration
|
||||
algorithmSource:
|
||||
provider: DefaultProvider
|
||||
|
||||
...
|
||||
|
||||
disablePreemption: true
|
||||
```
|
||||
|
||||
## 프라이어리티클래스
|
||||
|
||||
프라이어리티클래스는 프라이어리티 클래스 이름에서 우선순위의 정수 값으로의 매핑을
|
||||
@@ -135,7 +101,7 @@ description: "이 프라이어리티 클래스는 XYZ 서비스 파드에만 사
|
||||
|
||||
## 비-선점 프라이어리티클래스 {#non-preempting-priority-class}
|
||||
|
||||
{{< feature-state for_k8s_version="v1.15" state="alpha" >}}
|
||||
{{< feature-state for_k8s_version="v1.19" state="beta" >}}
|
||||
|
||||
`PreemptionPolicy: Never` 를 가진 파드는 낮은 우선순위 파드의 스케줄링 대기열의
|
||||
앞쪽에 배치되지만,
|
||||
@@ -159,10 +125,6 @@ description: "이 프라이어리티 클래스는 XYZ 서비스 파드에만 사
|
||||
`PreemptionPolicy` 가 `Never` 로 설정된 경우,
|
||||
해당 프라이어리티클래스의 파드는 비-선점될 것이다.
|
||||
|
||||
`PreemptionPolicy` 필드를 사용하려면 `NonPreemptingPriority`
|
||||
[기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)가
|
||||
활성화되어야 한다.
|
||||
|
||||
예제 유스케이스는 데이터 과학 관련 워크로드이다.
|
||||
사용자는 다른 워크로드보다 우선순위가 높은 잡(job)을 제출할 수 있지만,
|
||||
실행 중인 파드를 축출하여 기존의 작업을 삭제하지는 않을 것이다.
|
||||
|
||||
@@ -168,7 +168,7 @@ Node Score:
|
||||
|
||||
intel.com/foo = resourceScoringFunction((2+2),8)
|
||||
= (100 - ((8-4)*100/8)
|
||||
= (100 - 25)
|
||||
= (100 - 50)
|
||||
= 50
|
||||
= rawScoringFunction(50)
|
||||
= 5
|
||||
|
||||
@@ -350,6 +350,8 @@ NAME TYPE DATA
|
||||
db-user-pass-96mffmfh4k Opaque 2 51s
|
||||
```
|
||||
|
||||
시크릿에 대한 설명을 볼 수 있다.
|
||||
|
||||
```shell
|
||||
kubectl describe secrets/db-user-pass-96mffmfh4k
|
||||
```
|
||||
@@ -713,9 +715,9 @@ kubelet은 마운트된 시크릿이 모든 주기적인 동기화에서 최신
|
||||
받지 않는다.
|
||||
{{< /note >}}
|
||||
|
||||
{{< feature-state for_k8s_version="v1.18" state="alpha" >}}
|
||||
{{< feature-state for_k8s_version="v1.19" state="beta" >}}
|
||||
|
||||
쿠버네티스 알파 기능인 _변경할 수 없는(immutable) 시크릿과 컨피그맵_ 은
|
||||
쿠버네티스 베타 기능인 _변경할 수 없는(immutable) 시크릿과 컨피그맵_ 은
|
||||
개별 시크릿과 컨피그맵을 변경할 수 없는 것으로 설정하는 옵션을 제공한다. 시크릿을 광범위하게 사용하는
|
||||
클러스터(최소 수만 개의 고유한 시크릿이 파드에 마운트)의 경우, 데이터 변경을 방지하면
|
||||
다음과 같은 이점이 있다.
|
||||
@@ -1000,6 +1002,8 @@ kubectl create secret generic prod-db-secret --from-literal=username=produser --
|
||||
secret "prod-db-secret" created
|
||||
```
|
||||
|
||||
테스트 환경의 자격 증명에 대한 시크릿을 만들 수도 있다.
|
||||
|
||||
```shell
|
||||
kubectl create secret generic test-db-secret --from-literal=username=testuser --from-literal=password=iluvtests
|
||||
```
|
||||
|
||||
@@ -94,7 +94,7 @@ weight: 10
|
||||
이 방법은 노드 구성을 제어할 수 있는 경우에 적합하다.
|
||||
|
||||
{{< note >}}
|
||||
쿠버네티스는 도커 구성에서 `auths` 와 `HttpHeaders` 섹션만 지원한다.
|
||||
기본 쿠버네티스는 도커 구성에서 `auths` 와 `HttpHeaders` 섹션만 지원한다.
|
||||
도커 자격 증명 도우미(`credHelpers` 또는 `credsStore`)는 지원되지 않는다.
|
||||
{{< /note >}}
|
||||
|
||||
@@ -262,7 +262,7 @@ EOF
|
||||
|
||||
이것은 프라이빗 레지스트리를 사용하는 각 파드에 대해서 수행될 필요가 있다.
|
||||
|
||||
그러나, 이 필드의 셋팅은 [서비스 어카운트](/docs/tasks/configure-pod-container/configure-service-accounts/)) 리소스에
|
||||
그러나, 이 필드의 셋팅은 [서비스 어카운트](/docs/tasks/configure-pod-container/configure-service-account/) 리소스에
|
||||
imagePullSecrets을 셋팅하여 자동화할 수 있다.
|
||||
|
||||
자세한 지침을 위해서는 [서비스 어카운트에 ImagePullSecrets 추가](/docs/tasks/configure-pod-container/configure-service-account/#add-imagepullsecrets-to-a-service-account)를 확인한다.
|
||||
|
||||
@@ -45,7 +45,7 @@ service Registration {
|
||||
해당 자원을 API 서버에 알리는 역할을 한다.
|
||||
예를 들어, 장치 플러그인이 kubelet에 `hardware-vendor.example/foo` 를 등록하고
|
||||
노드에 두 개의 정상 장치를 보고하고 나면, 노드 상태가 업데이트되어
|
||||
노드에 2개의 “Foo” 장치가 설치되어 사용 가능함을 알릴 수 있다.
|
||||
노드에 2개의 "Foo" 장치가 설치되어 사용 가능함을 알릴 수 있다.
|
||||
|
||||
그러고 나면, 사용자가
|
||||
[컨테이너](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#container-v1-core) 명세에 있는 장치를 요청할 수 있다.
|
||||
@@ -91,6 +91,9 @@ spec:
|
||||
|
||||
```gRPC
|
||||
service DevicePlugin {
|
||||
// GetDevicePluginOptions는 장치 관리자와 통신할 옵션을 반환한다.
|
||||
rpc GetDevicePluginOptions(Empty) returns (DevicePluginOptions) {}
|
||||
|
||||
// ListAndWatch는 장치 목록 스트림을 반환한다.
|
||||
// 장치 상태가 변경되거나 장치가 사라질 때마다, ListAndWatch는
|
||||
// 새 목록을 반환한다.
|
||||
@@ -100,10 +103,31 @@ spec:
|
||||
// 플러그인이 장치별 작업을 실행하고 Kubelet에 장치를
|
||||
// 컨테이너에서 사용할 수 있도록 하는 단계를 지시할 수 있다.
|
||||
rpc Allocate(AllocateRequest) returns (AllocateResponse) {}
|
||||
|
||||
// GetPreferredAllocation은 사용 가능한 장치 목록에서 할당할
|
||||
// 기본 장치 집합을 반환한다. 그 결과로 반환된 선호하는 할당은
|
||||
// devicemanager가 궁극적으로 수행하는 할당이 되는 것을 보장하지
|
||||
// 않는다. 가능한 경우 devicemanager가 정보에 입각한 할당 결정을
|
||||
// 내릴 수 있도록 설계되었다.
|
||||
rpc GetPreferredAllocation(PreferredAllocationRequest) returns (PreferredAllocationResponse) {}
|
||||
|
||||
// PreStartContainer는 등록 단계에서 장치 플러그인에 의해 표시되면 각 컨테이너가
|
||||
// 시작되기 전에 호출된다. 장치 플러그인은 장치를 컨테이너에서 사용할 수 있도록 하기 전에
|
||||
// 장치 재설정과 같은 장치별 작업을 실행할 수 있다.
|
||||
rpc PreStartContainer(PreStartContainerRequest) returns (PreStartContainerResponse) {}
|
||||
}
|
||||
```
|
||||
|
||||
* 플러그인은 호스트 경로 `/var/lib/kubelet/device-plugins/kubelet.sock` 에서
|
||||
{{< note >}}
|
||||
`GetPreferredAllocation()` 또는 `PreStartContainer()` 에 대한 유용한 구현을
|
||||
제공하기 위해 플러그인이 필요하지 않다. 이러한 호출(있는 경우) 중
|
||||
사용할 수 있는 경우를 나타내는 플래그는 `GetDevicePluginOptions()`
|
||||
호출에 의해 다시 전송된 `DevicePluginOptions` 메시지에 설정되어야 한다. `kubelet` 은
|
||||
항상 `GetDevicePluginOptions()` 를 호출하여 사용할 수 있는
|
||||
선택적 함수를 확인한 후 직접 호출한다.
|
||||
{{< /note >}}
|
||||
|
||||
* 플러그인은 호스트 경로 `/var/lib/kubelet/device-plugins/kubelet.sock` 에서
|
||||
유닉스 소켓을 통해 kubelet에 직접 등록한다.
|
||||
|
||||
* 성공적으로 등록하고 나면, 장치 플러그인은 서빙(serving) 모드에서 실행되며, 그 동안 플러그인은 장치 상태를
|
||||
@@ -183,7 +207,7 @@ gRPC 서비스는 `/var/lib/kubelet/pod-resources/kubelet.sock` 의 유닉스
|
||||
|
||||
## 토폴로지 관리자와 장치 플러그인 통합
|
||||
|
||||
{{< feature-state for_k8s_version="v1.17" state="alpha" >}}
|
||||
{{< feature-state for_k8s_version="v1.18" state="beta" >}}
|
||||
|
||||
토폴로지 관리자는 Kubelet 컴포넌트로, 리소스를 토폴로지 정렬 방식으로 조정할 수 있다. 이를 위해, 장치 플러그인 API가 `TopologyInfo` 구조체를 포함하도록 확장되었다.
|
||||
|
||||
@@ -230,3 +254,5 @@ pluginapi.Device{ID: "25102017", Health: pluginapi.Healthy, Topology:&pluginapi.
|
||||
* 노드에서의 [확장 리소스 알리기](/ko/docs/tasks/administer-cluster/extended-resource-node/)에 대해 배우기
|
||||
* 쿠버네티스에서 [TLS 수신에 하드웨어 가속](https://kubernetes.io/blog/2019/04/24/hardware-accelerated-ssl/tls-termination-in-ingress-controllers-using-kubernetes-device-plugins-and-runtimeclass/) 사용에 대해 읽기
|
||||
* [토폴로지 관리자](/docs/tasks/adminster-cluster/topology-manager/)에 대해 알아보기
|
||||
|
||||
|
||||
|
||||
@@ -93,7 +93,7 @@ kubectl에서
|
||||
1. 사용자는 종종 `kubectl`을 사용하여 쿠버네티스 API와 상호 작용한다. [Kubectl 플러그인](/ko/docs/tasks/extend-kubectl/kubectl-plugins/)은 kubectl 바이너리를 확장한다. 개별 사용자의 로컬 환경에만 영향을 미치므로 사이트 전체 정책을 적용할 수는 없다.
|
||||
2. apiserver는 모든 요청을 처리한다. apiserver의 여러 유형의 익스텐션 포인트는 요청을 인증하거나, 콘텐츠를 기반으로 요청을 차단하거나, 콘텐츠를 편집하고, 삭제 처리를 허용한다. 이 내용은 [API 접근 익스텐션](/ko/docs/concepts/extend-kubernetes/extend-cluster/#api-접근-익스텐션) 섹션에 설명되어 있다.
|
||||
3. apiserver는 다양한 종류의 *리소스* 를 제공한다. `pods`와 같은 *빌트인 리소스 종류* 는 쿠버네티스 프로젝트에 의해 정의되며 변경할 수 없다. 직접 정의한 리소스를 추가할 수도 있고, [커스텀 리소스](/ko/docs/concepts/extend-kubernetes/extend-cluster/#사용자-정의-유형) 섹션에 설명된대로 *커스텀 리소스* 라고 부르는 다른 프로젝트에서 정의한 리소스를 추가할 수도 있다. 커스텀 리소스는 종종 API 접근 익스텐션과 함께 사용된다.
|
||||
4. 쿠버네티스 스케줄러는 파드를 배치할 노드를 결정한다. 스케줄링을 확장하는 몇 가지 방법이 있다. 이들은 [스케줄러 익스텐션](/ko/docs/concepts/extend-kubernetes/extend-cluster/#스케줄러-익스텐션) 섹션에 설명되어 있다.
|
||||
4. 쿠버네티스 스케줄러는 파드를 배치할 노드를 결정한다. 스케줄링을 확장하는 몇 가지 방법이 있다. 이들은 [스케줄러 익스텐션](/ko/docs/concepts/extend-kubernetes/#스케줄러-익스텐션) 섹션에 설명되어 있다.
|
||||
5. 쿠버네티스의 많은 동작은 API-Server의 클라이언트인 컨트롤러(Controller)라는 프로그램으로 구현된다. 컨트롤러는 종종 커스텀 리소스와 함께 사용된다.
|
||||
6. kubelet은 서버에서 실행되며 파드가 클러스터 네트워크에서 자체 IP를 가진 가상 서버처럼 보이도록 한다. [네트워크 플러그인](/ko/docs/concepts/extend-kubernetes/extend-cluster/#네트워크-플러그인)을 사용하면 다양한 파드 네트워킹 구현이 가능하다.
|
||||
7. kubelet은 컨테이너의 볼륨을 마운트 및 마운트 해제한다. 새로운 유형의 스토리지는 [스토리지 플러그인](/ko/docs/concepts/extend-kubernetes/extend-cluster/#스토리지-플러그인)을 통해 지원될 수 있다.
|
||||
|
||||
@@ -9,7 +9,7 @@ weight: 30
|
||||
오퍼레이터(Operator)는
|
||||
[사용자 정의 리소스](/ko/docs/concepts/extend-kubernetes/api-extension/custom-resources/)를
|
||||
사용하여 애플리케이션 및 해당 컴포넌트를 관리하는 쿠버네티스의 소프트웨어 익스텐션이다. 오퍼레이터는
|
||||
쿠버네티스 원칙, 특히 [컨트롤 루프](/ko/docs/concepts/#쿠버네티스-컨트롤-플레인)를 따른다.
|
||||
쿠버네티스 원칙, 특히 [컨트롤 루프](/ko/docs/concepts/architecture/controller/)를 따른다.
|
||||
|
||||
<!-- body -->
|
||||
|
||||
@@ -126,6 +126,3 @@ kubectl edit SampleDB/example-database # 일부 설정을 수동으로 변경하
|
||||
* 다른 사람들이 사용할 수 있도록 자신의 오퍼레이터를 [게시](https://operatorhub.io/)하기
|
||||
* 오퍼레이터 패턴을 소개한 [CoreOS 원본 기사](https://coreos.com/blog/introducing-operators.html) 읽기
|
||||
* 오퍼레이터 구축을 위한 모범 사례에 대한 구글 클라우드(Google Cloud)의 [기사](https://cloud.google.com/blog/products/containers-kubernetes/best-practices-for-building-kubernetes-operators-and-stateful-apps) 읽기
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ description: >
|
||||
쿠버네티스 클러스터는 컴퓨터 집합인 노드 컴포넌트와 컨트롤 플레인
|
||||
컴포넌트로 구성된다.
|
||||
weight: 20
|
||||
card:
|
||||
card:
|
||||
name: concepts
|
||||
weight: 20
|
||||
---
|
||||
@@ -19,7 +19,7 @@ card:
|
||||
|
||||
여기에 모든 컴포넌트가 함께 있는 쿠버네티스 클러스터 다이어그램이 있다.
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
@@ -593,8 +593,11 @@ spec:
|
||||
|
||||
### Seccomp
|
||||
|
||||
파드에서 seccomp 프로파일의 사용은 파드시큐리티폴리시의 어노테이션을 통해
|
||||
제어할 수 있다. Seccomp는 쿠버네티스의 알파 기능이다.
|
||||
쿠버네티스 v1.19부터 파드나 컨테이너의 `securityContext` 에서
|
||||
`seccompProfile` 필드를 사용하여 [seccomp 프로파일 사용을
|
||||
제어](/docs/tutorials/clusters/seccomp)할 수 있다. 이전 버전에서는, 파드에
|
||||
어노테이션을 추가하여 seccomp를 제어했다. 두 버전에서 동일한 파드시큐리티폴리시를 사용하여
|
||||
이러한 필드나 어노테이션이 적용되는 방식을 적용할 수 있다.
|
||||
|
||||
**seccomp.security.alpha.kubernetes.io/defaultProfileName** - 컨테이너에
|
||||
적용할 기본 seccomp 프로파일을 지정하는 어노테이션이다. 가능한 값은
|
||||
@@ -607,7 +610,14 @@ spec:
|
||||
되었다. 대신 `runtime/default` 사용을 권장한다.
|
||||
- `localhost/<path>` - `<seccomp_root>/<path>`에 있는 노드에서 파일을 프로파일로
|
||||
지정한다. 여기서 `<seccomp_root>`는 Kubelet의 `--seccomp-profile-root` 플래그를
|
||||
통해 정의된다.
|
||||
통해 정의된다. `--seccomp-profile-root` 플래그가
|
||||
정의되어 있지 않으면, `<root-dir>` 이 `--root-dir` 플래그로
|
||||
지정된 `<root-dir>/seccomp` 기본 경로가 사용된다.
|
||||
|
||||
{{< note >}}
|
||||
`--seccomp-profile-root` 플래그는 쿠버네티스 v1.19부터 더 이상 사용되지
|
||||
않는다. 사용자는 기본 경로를 사용하는 것이 좋다.
|
||||
{{< /note >}}
|
||||
|
||||
**seccomp.security.alpha.kubernetes.io/allowedProfileNames** - 파드 seccomp
|
||||
어노테이션에 허용되는 값을 지정하는 어노테이션. 쉼표로 구분된
|
||||
|
||||
@@ -495,8 +495,7 @@ kubectl create quota test --hard=count/deployments.extensions=2,count/replicaset
|
||||
```
|
||||
|
||||
```shell
|
||||
kubectl create deployment nginx --image=nginx --namespace=myspace
|
||||
kubectl scale deployment nginx --replicas=2 --namespace=myspace
|
||||
kubectl create deployment nginx --image=nginx --namespace=myspace --replicas=2
|
||||
```
|
||||
|
||||
```shell
|
||||
|
||||
@@ -77,7 +77,7 @@ _스코어링_ 단계에서 스케줄러는 목록에 남아있는 노드의 순
|
||||
스케줄러의 필터링 및 스코어링 동작을 구성하는 데 지원되는 두 가지
|
||||
방법이 있다.
|
||||
|
||||
1. [스케줄링 정책](/docs/reference/scheduling/policies)을 사용하면
|
||||
1. [스케줄링 정책](/docs/reference/scheduling/config/#profiles)을 사용하면
|
||||
필터링을 위한 _단정(Predicates)_ 및 스코어링을 위한 _우선순위(Priorities)_ 를 구성할 수 있다.
|
||||
1. [스케줄링 프로파일](/docs/reference/scheduling/profiles)을 사용하면
|
||||
`QueueSort`, `Filter`, `Score`, `Bind`, `Reserve`, `Permit` 등의
|
||||
@@ -93,3 +93,7 @@ _스코어링_ 단계에서 스케줄러는 목록에 남아있는 노드의 순
|
||||
* [멀티 스케줄러 구성하기](/docs/tasks/extend-kubernetes/configure-multiple-schedulers/)에 대해 배우기
|
||||
* [토폴로지 관리 정책](/docs/tasks/administer-cluster/topology-manager/)에 대해 배우기
|
||||
* [파드 오버헤드](/ko/docs/concepts/configuration/pod-overhead/)에 대해 배우기
|
||||
* 볼륨을 사용하느 파드의 스케줄링에 대해 배우기
|
||||
* [볼륨 토폴리지 지원](/ko/docs/concepts/storage/storage-classes/#볼륨-바인딩-모드)
|
||||
* [스토리지 용량 추적](/docs/concepts/storage/storage-capacity/)
|
||||
* [노드별 볼륨 한도](/ko/docs/concepts/storage/storage-limits/)
|
||||
|
||||
@@ -163,6 +163,24 @@ A 또는 AAAA 레코드만 생성할 수 있다. (`default-subdomain.my-namespac
|
||||
또한 서비스에서 `publishNotReadyAddresses=True` 를 설정하지 않았다면, 파드가 준비 상태가 되어야 레코드를 가질 수 있다.
|
||||
{{< /note >}}
|
||||
|
||||
### 파드의 setHostnameAsFQDN 필드 {# pod-sethostnameasfqdn-field}
|
||||
|
||||
{{< feature-state for_k8s_version="v1.19" state="alpha" >}}
|
||||
|
||||
**전제 조건**: `SetHostnameAsFQDN` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를
|
||||
{{< glossary_tooltip text="API 서버" term_id="kube-apiserver" >}}에
|
||||
대해 활성화해야 한다.
|
||||
|
||||
파드가 전체 주소 도메인 이름(FQDN)을 갖도록 구성된 경우, 해당 호스트네임은 짧은 호스트네임이다. 예를 들어, 전체 주소 도메인 이름이 `busybox-1.default-subdomain.my-namespace.svc.cluster-domain.example` 인 파드가 있는 경우, 기본적으로 해당 파드 내부의 `hostname` 명령어는 `busybox-1` 을 반환하고 `hostname --fqdn` 명령은 FQDN을 반환한다.
|
||||
|
||||
파드 명세에서 `setHostnameAsFQDN: true` 를 설정하면, kubelet은 파드의 FQDN을 해당 파드 네임스페이스의 호스트네임에 기록한다. 이 경우, `hostname` 과 `hostname --fqdn` 은 모두 파드의 FQDN을 반환한다.
|
||||
|
||||
{{< note >}}
|
||||
리눅스에서, 커널의 호스트네임 필드(`struct utsname` 의 `nodename` 필드)는 64자로 제한된다.
|
||||
|
||||
파드에서 이 기능을 사용하도록 설정하고 FQDN이 64자보다 길면, 시작되지 않는다. 파드는 파드 호스트네임과 클러스터 도메인에서 FQDN을 구성하지 못한다거나, FQDN `long-FDQN` 이 너무 길다(최대 64자, 70자 요청인 경우)와 같은 오류 이벤트를 생성하는 `Pending` 상태(`kubectl` 에서 표시하는 `ContainerCreating`)로 유지된다. 이 시나리오에서 사용자 경험을 개선하는 한 가지 방법은 사용자가 최상위 레벨을 오브젝트(예를 들어, 디플로이먼트)를 생성할 때 FQDN 크기를 제어하기 위해 [어드미션 웹훅 컨트롤러](/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks)를 생성하는 것이다.
|
||||
{{< /note >}}
|
||||
|
||||
### 파드의 DNS 정책
|
||||
|
||||
DNS 정책은 파드별로 설정할 수 있다.
|
||||
@@ -188,7 +206,7 @@ DNS 정책은 파드별로 설정할 수 있다.
|
||||
|
||||
{{< note >}}
|
||||
"Default"는 기본 DNS 정책이 아니다. `dnsPolicy`가 명시적으로 지정되어있지 않다면
|
||||
“ClusterFirst”가 기본값으로 사용된다.
|
||||
"ClusterFirst"가 기본값으로 사용된다.
|
||||
{{< /note >}}
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: 엔드포인트슬라이스
|
||||
content_type: concept
|
||||
weight: 15
|
||||
weight: 35
|
||||
---
|
||||
|
||||
|
||||
@@ -21,7 +21,9 @@ _엔드포인트슬라이스_ 는 쿠버네티스 클러스터 내의 네트워
|
||||
|
||||
엔드포인트 API는 쿠버네티스에서 네트워크 엔드포인트를 추적하는
|
||||
간단하고 직접적인 방법을 제공한다. 불행하게도 쿠버네티스 클러스터와
|
||||
서비스가 점점 더 커짐에 따라, 이 API의 한계가 더욱 눈에 띄게 되었다.
|
||||
{{< glossary_tooltip text="서비스" term_id="service" >}}가 점점 더
|
||||
커짐에 따라, 이 API의 한계가 더욱 눈에 띄게
|
||||
되었다.
|
||||
특히나, 많은 수의 네트워크 엔드포인트로 확장하는 것에
|
||||
어려움이 있었다.
|
||||
|
||||
@@ -34,16 +36,17 @@ _엔드포인트슬라이스_ 는 쿠버네티스 클러스터 내의 네트워
|
||||
|
||||
## 엔드포인트슬라이스 리소스 {#endpointslice-resource}
|
||||
|
||||
쿠버네티스에서 EndpointSlice는 일련의 네트워크 엔드 포인트에 대한
|
||||
쿠버네티스에서 엔드포인트슬라이스는 일련의 네트워크 엔드포인트에 대한
|
||||
참조를 포함한다. 쿠버네티스 서비스에 {{< glossary_tooltip text="셀렉터"
|
||||
term_id="selector" >}} 가 지정되면 EndpointSlice
|
||||
컨트롤러는 자동으로 엔드포인트슬라이스를 생성한다. 이 엔드포인트슬라이스는
|
||||
term_id="selector" >}}가 지정되면 컨트롤 플레인은 자동으로
|
||||
엔드포인트슬라이스를 생성한다. 이 엔드포인트슬라이스는
|
||||
서비스 셀렉터와 매치되는 모든 파드들을 포함하고 참조한다. 엔드포인트슬라이스는
|
||||
고유한 서비스와 포트 조합을 통해 네트워크 엔드포인트를 그룹화 한다.
|
||||
EndpointSlice 오브젝트의 이름은 유효한
|
||||
프로토콜, 포트 번호 및 서비스 이름의 고유한 조합을 통해 네트워크 엔드포인트를
|
||||
그룹화한다.
|
||||
엔드포인트슬라이스 오브젝트의 이름은 유효한
|
||||
[DNS 서브도메인 이름](/ko/docs/concepts/overview/working-with-objects/names/#dns-서브도메인-이름)이어야 한다.
|
||||
|
||||
예를 들어, 여기에 `example` 쿠버네티스 서비스를 위한 EndpointSlice
|
||||
예를 들어, 여기에 `example` 쿠버네티스 서비스를 위한 엔드포인트슬라이스
|
||||
리소스 샘플이 있다.
|
||||
|
||||
```yaml
|
||||
@@ -69,28 +72,30 @@ endpoints:
|
||||
topology.kubernetes.io/zone: us-west2-a
|
||||
```
|
||||
|
||||
기본적으로, EndpointSlice 컨트롤러가 관리하는 엔드포인트슬라이스에는
|
||||
각각 100개 이하의 엔드포인트를 가지고 있다. 이 스케일 아래에서 엔드포인트슬라이스는
|
||||
엔드포인트 및 서비스와 1:1로 매핑해야하며, 유사한 성능을 가져야 한다.
|
||||
기본적으로, 컨트롤 플레인은 각각 100개 이하의 엔드포인트를
|
||||
갖도록 엔드포인트슬라이스를 생성하고 관리한다. `--max-endpoints-per-slice`
|
||||
{{< glossary_tooltip text="kube-controller-manager" term_id="kube-controller-manager" >}}
|
||||
플래그를 사용하여, 최대 1000개까지 구성할 수 있다.
|
||||
|
||||
엔드포인트슬라이스는 내부 트래픽을 라우트하는 방법에 대해 kube-proxy에
|
||||
엔드포인트슬라이스는 내부 트래픽을 라우트하는 방법에 대해
|
||||
{{< glossary_tooltip term_id="kube-proxy" text="kube-proxy" >}}에
|
||||
신뢰할 수 있는 소스로 역할을 할 수 있다. 이를 활성화 하면, 많은 수의 엔드포인트를 가지는
|
||||
서비스에 대해 성능 향상을 제공해야 한다.
|
||||
|
||||
### 주소 유형
|
||||
|
||||
EndpointSlice는 다음 주소 유형을 지원한다.
|
||||
엔드포인트슬라이스는 다음 주소 유형을 지원한다.
|
||||
|
||||
* IPv4
|
||||
* IPv6
|
||||
* FQDN (Fully Qualified Domain Name)
|
||||
* FQDN (전체 주소 도메인 이름)
|
||||
|
||||
### 토폴로지
|
||||
### 토폴로지 정보 {#토폴로지}
|
||||
|
||||
엔드포인트슬라이스 내 각 엔드포인트는 연관된 토폴로지 정보를 포함할 수 있다.
|
||||
이는 해당 노드, 영역 그리고 지역에 대한 정보가 포함된
|
||||
엔드포인트가 있는 위치를 나타나는데 사용 한다. 값을 사용할 수 있으면
|
||||
다음의 토폴로지 레이블이 엔드포인트슬라이스 컨트롤러에 의해 설정된다.
|
||||
엔드포인트가 있는 위치를 나타나는데 사용 한다. 값을 사용할 수 있으면,
|
||||
컨트롤 플레인은 엔드포인트슬라이스에 대해 다음의 토폴로지 레이블을 설정한다.
|
||||
|
||||
* `kubernetes.io/hostname` - 이 엔드포인트가 있는 노드의 이름.
|
||||
* `topology.kubernetes.io/zone` - 이 엔드포인트가 있는 영역의 이름.
|
||||
@@ -103,37 +108,48 @@ NodeName 필드 값을 나타낸다. 영역 및 지역 레이블은 해당
|
||||
|
||||
### 관리
|
||||
|
||||
기본적으로 엔드포인트슬라이스는 엔드포인트슬라이스 컨트롤러에의해
|
||||
생성되고 관리된다. 서비스 메시 구현과 같은 다른 엔드포인트슬라이스
|
||||
유스 케이스는 다른 엔터티나 컨트롤러가 추가 엔드포인트슬라이스
|
||||
집합을 관리할 수 있게 할 수 있다. 여러 엔티티가 서로 간섭하지 않고
|
||||
엔드포인트슬라이스를 관리할 수 있도록 엔드포인트슬라이스를 관리하는
|
||||
엔티티를 나타내는데 `endpointslice.kubernetes.io/managed-by` 레이블이 사용된다.
|
||||
엔드포인트슬라이스 컨트롤러는 관리하는 모든 엔드포인트
|
||||
슬라이스에 레이블의 값으로 `endpointslice-controller.k8s.io` 를 설정한다.
|
||||
엔드포인트슬라이스를 관리하는 다른 엔티티도 이 레이블에
|
||||
고유한 값을 설정해야 한다.
|
||||
대부분의 경우, 컨트롤 플레인(특히, 엔드포인트 슬라이스
|
||||
{{< glossary_tooltip text="컨트롤러" term_id="controller" >}})는
|
||||
엔드포인트슬라이스 오브젝트를 생성하고 관리한다. 다른 엔티티나 컨트롤러가 추가
|
||||
엔드포인트슬라이스 집합을 관리하게 할 수 있는 서비스 메시 구현과 같이
|
||||
엔드포인트슬라이스에 대한 다양한 다른 유스케이스가 있다.
|
||||
|
||||
여러 엔티티가 서로 간섭하지 않고 엔드포인트슬라이스를
|
||||
관리할 수 있도록 쿠버네티스는 엔드포인트슬라이스를 관리하는
|
||||
엔티티를 나타내는 `endpointslice.kubernetes.io/managed-by`
|
||||
{{< glossary_tooltip term_id="label" text="레이블" >}}을
|
||||
정의한다.
|
||||
엔드포인트 슬라이스 컨트롤러는 관리하는 모든 엔드포인트슬라이스에 레이블의 값으로
|
||||
`endpointslice-controller.k8s.io` 를 설정한다. 엔드포인트슬라이스를
|
||||
관리하는 다른 엔티티도 이 레이블에 고유한 값을 설정해야 한다.
|
||||
|
||||
### 소유권
|
||||
|
||||
대부분의 유스 케이스에서 엔드포인트를 추적하는 서비스가 엔드포인트슬라이스를
|
||||
소유한다. 이는 각 엔드포인트슬라이스의 참조와 서비스에 속하는 모든
|
||||
엔드포인트슬라이스를 간단하게 조회할 수 있는 `kubernetes.io/service-name`
|
||||
레이블로 표시된다.
|
||||
대부분의 유스케이스에서, 엔드포인트 슬라이스 오브젝트가 엔드포인트를
|
||||
추적하는 서비스가 엔드포인트슬라이스를 소유한다. 이 소유권은 각 엔드포인트슬라이스의 소유자
|
||||
참조와 서비스에 속한 모든 엔드포인트슬라이스의 간단한 조회를 가능하게 하는
|
||||
`kubernetes.io/service-name` 레이블로 표시된다.
|
||||
|
||||
## 엔드포인트슬라이스 컨트롤러
|
||||
### 엔드포인트슬라이스 미러링
|
||||
|
||||
엔드포인트슬라이스 컨트롤러는 해당 엔드포인트슬라이스가 최신 상태인지
|
||||
확인하기 위해 서비스와 파드를 감시한다. 컨트롤러가 셀렉터로 지정한 모든
|
||||
서비스에 대해 엔드포인트슬라이스를 관리한다. 이는 서비스 셀렉터와
|
||||
일치하는 파드의 IP를 나타내게 된다.
|
||||
경우에 따라, 애플리케이션이 사용자 지정 엔드포인트 리소스를 생성한다. 이러한
|
||||
애플리케이션이 엔드포인트와 엔드포인트슬라이스 리소스에 동시에 쓸 필요가 없도록
|
||||
클러스터의 컨트롤 플레인은 대부분의 엔드포인트 리소스를
|
||||
해당 엔드포인트슬라이스에 미러링한다.
|
||||
|
||||
### 엔드포인트슬라이스의 크기
|
||||
컨트롤 플레인은 다음을 제외하고 엔드포인트 리소스를 미러링한다.
|
||||
|
||||
기본적으로 엔드포인트슬라이스는 각각 100개의 엔드포인트 크기로 제한된다.
|
||||
최대 1000개까지 `--max-endpoints-per-slice` {{< glossary_tooltip
|
||||
text="kube-controller-manager" term_id="kube-controller-manager" >}} 플래그를
|
||||
사용해서 구성할 수 있다.
|
||||
* 엔드포인트 리소스에는 `endpointslice.kubernetes.io/skip-mirror` 레이블이
|
||||
`true` 로 설정되어 있다.
|
||||
* 엔드포인트 리소스에는 `control-plane.alpha.kubernetes.io/leader`
|
||||
어노테이션이 있다.
|
||||
* 해당 서비스 리소스가 존재하지 않는다.
|
||||
* 해당 서비스 리소스에 nil이 아닌 셀렉터가 있다.
|
||||
|
||||
개별 엔드포인트 리소스는 여러 엔드포인트슬라이스로 변환될 수 있다.
|
||||
엔드포인트 리소스에 여러 하위 집합이 있거나 여러 IP 제품군(IPv4 및 IPv6)이 있는
|
||||
엔드포인트가 포함된 경우 변환이 일어난다. 하위 집합 당 최대 1000개의 주소가
|
||||
엔드포인트슬라이스에 미러링된다.
|
||||
|
||||
### 엔드포인트슬라이스의 배포
|
||||
|
||||
@@ -143,8 +159,8 @@ text="kube-controller-manager" term_id="kube-controller-manager" >}} 플래그
|
||||
엔드포인트슬라이스가 필요하다. 이는 하위 집합이 엔드포인트와 그룹화하는
|
||||
방식의 논리와 유사하다.
|
||||
|
||||
컨트롤러는 엔드포인트슬라이스를 최대한 채우려고 노력하지만,
|
||||
적극적으로 재조정하지는 않는다. 컨트롤러의 동작은 매우 직관적이다.
|
||||
컨트롤 플레인은 엔드포인트슬라이스를 최대한 채우려고 노력하지만,
|
||||
적극적으로 재조정하지는 않는다. 로직은 매우 직관적이다.
|
||||
|
||||
1. 기존 엔드포인트슬라이스에 대해 반복적으로, 더 이상 필요하지 않는 엔드포인트를
|
||||
제거하고 변경에 의해 일치하는 엔드포인트를 업데이트 한다.
|
||||
@@ -173,10 +189,17 @@ text="kube-controller-manager" term_id="kube-controller-manager" >}} 플래그
|
||||
교체되는 엔드포인트에 대해서 엔드포인트슬라이스를
|
||||
자연스럽게 재포장한다.
|
||||
|
||||
### 중복 엔드포인트
|
||||
|
||||
엔드포인트슬라이스 변경의 특성으로 인해, 엔드포인트는 동시에 둘 이상의
|
||||
엔드포인트슬라이스에 표시될 수 있다. 이는 다른 엔드포인트슬라이스 오브젝트에
|
||||
대한 변경 사항이 다른 시간에서의 쿠버네티스 클라이언트 워치(watch)/캐시에
|
||||
도착할 수 있기 때문에 자연스럽게 발생한다. 엔드포인트슬라이스를 사용하는 구현은
|
||||
엔드포인트가 둘 이상의 슬라이스에 표시되도록 할 수 있어야 한다. 엔드포인트
|
||||
중복 제거를 수행하는 방법에 대한 레퍼런스 구현은 `kube-proxy` 의
|
||||
`EndpointSliceCache` 구현에서 찾을 수 있다.
|
||||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
|
||||
* [엔드포인트슬라이스 활성화하기](/docs/tasks/administer-cluster/enabling-endpointslices)
|
||||
* [엔드포인트슬라이스 활성화하기](/docs/tasks/administer-cluster/enabling-endpointslices)에 대해 배우기
|
||||
* [애플리케이션을 서비스와 함께 연결하기](/ko/docs/concepts/services-networking/connect-applications-service/)를 읽어보기
|
||||
|
||||
@@ -5,7 +5,7 @@ weight: 40
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
{{< feature-state for_k8s_version="v1.1" state="beta" >}}
|
||||
{{< feature-state for_k8s_version="v1.19" state="stable" >}}
|
||||
{{< glossary_definition term_id="ingress" length="all" >}}
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ weight: 40
|
||||
|
||||
## 인그레스란?
|
||||
|
||||
[인그레스](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#ingress-v1beta1-networking-k8s-io)는 클러스터 외부에서 클러스터 내부
|
||||
[인그레스](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#ingress-v1-networking-k8s-io)는 클러스터 외부에서 클러스터 내부
|
||||
{{< link text="서비스" url="/docs/concepts/services-networking/service/" >}}로 HTTP와 HTTPS 경로를 노출한다.
|
||||
트래픽 라우팅은 인그레스 리소스에 정의된 규칙에 의해 컨트롤된다.
|
||||
|
||||
@@ -59,23 +59,7 @@ weight: 40
|
||||
|
||||
최소한의 인그레스 리소스 예제:
|
||||
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1beta1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: test-ingress
|
||||
annotations:
|
||||
nginx.ingress.kubernetes.io/rewrite-target: /
|
||||
spec:
|
||||
rules:
|
||||
- http:
|
||||
paths:
|
||||
- path: /testpath
|
||||
pathType: Prefix
|
||||
backend:
|
||||
serviceName: test
|
||||
servicePort: 80
|
||||
```
|
||||
{{< codenew file="service/networking/minimal-ingress.yaml" >}}
|
||||
|
||||
다른 모든 쿠버네티스 리소스와 마찬가지로 인그레스에는 `apiVersion`, `kind`, 그리고 `metadata` 필드가 필요하다.
|
||||
인그레스 오브젝트의 이름은 유효한
|
||||
@@ -98,44 +82,100 @@ spec:
|
||||
* 선택적 호스트. 이 예시에서는, 호스트가 지정되지 않기에 지정된 IP 주소를 통해 모든 인바운드
|
||||
HTTP 트래픽에 규칙이 적용 된다. 만약 호스트가 제공되면(예,
|
||||
foo.bar.com), 규칙이 해당 호스트에 적용된다.
|
||||
* 경로 목록 (예, `/testpath`)에는 각각 `serviceName` 과 `servicePort` 가 정의되어있는 관련
|
||||
백엔드를 가지고 있다. 로드 밸런서가 트래픽을 참조된 서비스로 보내기 전에 호스트와 경로가
|
||||
모두 수신 요청의 내용과 일치해야 한다.
|
||||
* 백엔드는 [서비스 문서](/ko/docs/concepts/services-networking/service/)에 설명된 바와 같이
|
||||
* 경로 목록 (예, `/testpath`)에는 각각 `service.name` 과
|
||||
`service.port.name` 또는 `service.port.number` 가 정의되어 있는 관련
|
||||
백엔드를 가지고 있다. 로드 밸런서가 트래픽을 참조된 서비스로
|
||||
보내기 전에 호스트와 경로가 모두 수신 요청의 내용과
|
||||
일치해야 한다.
|
||||
* 백엔드는 [서비스 문서](/ko/docs/concepts/services-networking/service/) 또는 [사용자 정의 리소스 백엔드](#resource-backend)에 설명된 바와 같이
|
||||
서비스와 포트 이름의 조합이다. 호스트와 규칙 경로가 일치하는 인그레스에 대한
|
||||
HTTP(와 HTTPS) 요청은 백엔드 목록으로 전송된다.
|
||||
|
||||
기본 백엔드는 종종 사양의 경로와 일치하지 않는 서비스에 대한 모든 요청을 처리하도록 인그레스
|
||||
`defaultBackend` 는 종종 사양의 경로와 일치하지 않는 서비스에 대한 모든 요청을 처리하도록 인그레스
|
||||
컨트롤러에 구성되는 경우가 많다.
|
||||
|
||||
### 기본 벡엔드
|
||||
### DefaultBackend {#default-backend}
|
||||
|
||||
규칙이 없는 인그레스는 모든 트래픽을 단일 기본 백엔드로 전송한다. 기본
|
||||
백엔드는 일반적으로 [인그레스 컨트롤러](/ko/docs/concepts/services-networking/ingress-controllers)의 구성 옵션이며, 인그레스 리소스에 지정되어 있지 않다.
|
||||
규칙이 없는 인그레스는 모든 트래픽을 단일 기본 백엔드로 전송한다. `defaultBackend` 는 일반적으로
|
||||
[인그레스 컨트롤러](/ko/docs/concepts/services-networking/ingress-controllers)의 구성 옵션이며, 인그레스 리소스에 지정되어 있지 않다.
|
||||
|
||||
만약 인그레스 오브젝트의 HTTP 요청과 일치하는 호스트 또는 경로가 없으면, 트래픽은
|
||||
기본 백엔드로 라우팅 된다.
|
||||
|
||||
### 경로(Path) 유형
|
||||
### 리소스 백엔드 {#resource-backend}
|
||||
|
||||
인그레스의 각 경로에는 해당하는 경로 유형이 있다. 지원되는 세 가지의 경로
|
||||
유형이 있다.
|
||||
`Resource` 백엔드는 인그레스 오브젝트의 동일한 네임스페이스 내에 있는
|
||||
다른 쿠버네티스 리소스에 대한 ObjectRef이다. `Resource` 는 서비스와
|
||||
상호 배타적인 설정이며, 둘 다 지정하면 유효성 검사에 실패한다. `Resource`
|
||||
백엔드의 일반적인 용도는 정적 자산이 있는 오브젝트 스토리지 백엔드로 데이터를
|
||||
수신하는 것이다.
|
||||
|
||||
* _`ImplementationSpecific`_ (기본): 이 경로 유형의 일치 여부는 IngressClass에 따라
|
||||
{{< codenew file="service/networking/ingress-resource-backend.yaml" >}}
|
||||
|
||||
위의 인그레스를 생성한 후, 다음의 명령으로 확인할 수 있다.
|
||||
|
||||
```bash
|
||||
kubectl describe ingress ingress-resource-backend
|
||||
```
|
||||
|
||||
```
|
||||
Name: ingress-resource-backend
|
||||
Namespace: default
|
||||
Address:
|
||||
Default backend: APIGroup: k8s.example.com, Kind: StorageBucket, Name: static-assets
|
||||
Rules:
|
||||
Host Path Backends
|
||||
---- ---- --------
|
||||
*
|
||||
/icons APIGroup: k8s.example.com, Kind: StorageBucket, Name: icon-assets
|
||||
Annotations: <none>
|
||||
Events: <none>
|
||||
```
|
||||
|
||||
### 경로 유형
|
||||
|
||||
인그레스의 각 경로에는 해당 경로 유형이 있어야 한다. 명시적
|
||||
`pathType` 을 포함하지 않는 경로는 유효성 검사에 실패한다. 지원되는
|
||||
경로 유형은 세 가지이다.
|
||||
|
||||
* `ImplementationSpecific`: 이 경로 유형의 일치 여부는 IngressClass에 따라
|
||||
달라진다. 이를 구현할 때 별도 `pathType` 으로 처리하거나, `Prefix` 또는 `Exact`
|
||||
경로 유형과 같이 동일하게 처리할 수 있다.
|
||||
|
||||
* _`Exact`_: URL 경로의 대소문자를 엄격하게 일치시킨다.
|
||||
* `Exact`: URL 경로의 대소문자를 엄격하게 일치시킨다.
|
||||
|
||||
* _`Prefix`_: URL 경로의 접두사를 `/` 를 기준으로 분리한 값과 일치시킨다.
|
||||
* `Prefix`: URL 경로의 접두사를 `/` 를 기준으로 분리한 값과 일치시킨다.
|
||||
일치는 대소문자를 구분하고,
|
||||
요소별로 경로 요소에 대해 수행한다.
|
||||
모든 _p_ 가 요청 경로의 요소별 접두사가 _p_ 인 경우
|
||||
요청은 _p_ 경로에 일치한다.
|
||||
|
||||
{{< note >}}
|
||||
경로의 마지막 요소가 요청 경로에 있는 마지막 요소의 하위 문자열인 경우에는 일치하지 않는다(예시: `/foo/bar` 와 `/foo/bar/baz` 와 일치하지만, `/foo/barbaz` 는 일치하지 않는다).
|
||||
{{< /note >}}
|
||||
{{< note >}} 경로의 마지막 요소가 요청 경로에 있는 마지막
|
||||
요소의 하위 문자열인 경우에는 일치하지 않는다(예시: `/foo/bar` 와
|
||||
`/foo/bar/baz` 와 일치하지만, `/foo/barbaz` 는 일치하지 않는다). {{< /note >}}
|
||||
|
||||
### 예제
|
||||
|
||||
| 종류 | 경로 | 요청 경로 | 일치 여부 |
|
||||
|--------|---------------------------------|-------------------------------|------------------------------------|
|
||||
| Prefix | `/` | (모든 경로) | 예 |
|
||||
| Exact | `/foo` | `/foo` | 예 |
|
||||
| Exact | `/foo` | `/bar` | 아니오 |
|
||||
| Exact | `/foo` | `/foo/` | 아니오 |
|
||||
| Exact | `/foo/` | `/foo` | 아니오 |
|
||||
| Prefix | `/foo` | `/foo`, `/foo/` | 예 |
|
||||
| Prefix | `/foo/` | `/foo`, `/foo/` | 예 |
|
||||
| Prefix | `/aaa/bb` | `/aaa/bbb` | 아니오 |
|
||||
| Prefix | `/aaa/bbb` | `/aaa/bbb` | 예 |
|
||||
| Prefix | `/aaa/bbb/` | `/aaa/bbb` | 예, 마지막 슬래시 무시함 |
|
||||
| Prefix | `/aaa/bbb` | `/aaa/bbb/` | 예, 마지막 슬래시 일치함 |
|
||||
| Prefix | `/aaa/bbb` | `/aaa/bbb/ccc` | 예, 하위 경로 일치함 |
|
||||
| Prefix | `/aaa/bbb` | `/aaa/bbbxyz` | 아니오, 문자열 접두사 일치하지 않음 |
|
||||
| Prefix | `/`, `/aaa` | `/aaa/ccc` | 예, `/aaa` 접두사 일치함 |
|
||||
| Prefix | `/`, `/aaa`, `/aaa/bbb` | `/aaa/bbb` | 예, `/aaa/bbb` 접두사 일치함 |
|
||||
| Prefix | `/`, `/aaa`, `/aaa/bbb` | `/ccc` | 예, `/` 접두사 일치함 |
|
||||
| Prefix | `/aaa` | `/ccc` | 아니오, 기본 백엔드 사용함 |
|
||||
| Mixed | `/foo` (Prefix), `/foo` (Exact) | `/foo` | 예, Exact 선호함 |
|
||||
|
||||
#### 다중 일치
|
||||
경우에 따라 인그레스의 여러 경로가 요청과 일치할 수 있다.
|
||||
@@ -143,6 +183,20 @@ spec:
|
||||
여전히 동일하게 일치하는 경우 접두사(prefix) 경로 유형보다
|
||||
정확한(exact) 경로 유형을 가진 경로가 사용 된다.
|
||||
|
||||
## 호스트네임 와일드카드
|
||||
호스트는 정확한 일치(예: "`foo.bar.com`") 또는 와일드카드(예:
|
||||
"`* .foo.com`")일 수 있다. 정확한 일치를 위해서는 HTTP `host` 헤더가
|
||||
`host` 필드와 일치해야 한다. 와일드카드 일치를 위해서는 HTTP `host` 헤더가
|
||||
와일드카드 규칙의 접미사와 동일해야 한다.
|
||||
|
||||
| 호스트 | 호스트 헤더 | 일치 여부 |
|
||||
| ----------- |-------------------| --------------------------------------------------|
|
||||
| `*.foo.com` | `bar.foo.com` | 공유 접미사를 기반으로 일치함 |
|
||||
| `*.foo.com` | `baz.bar.foo.com` | 일치하지 않음, 와일드카드는 단일 DNS 레이블만 포함함 |
|
||||
| `*.foo.com` | `foo.com` | 일치하지 않음, 와일드카드는 단일 DNS 레이블만 포함함 |
|
||||
|
||||
{{< codenew file="service/networking/ingress-wildcard-host.yaml" >}}
|
||||
|
||||
## 인그레스 클래스
|
||||
|
||||
인그레스는 서로 다른 컨트롤러에 의해 구현될 수 있으며, 종종 다른 구성으로
|
||||
@@ -150,18 +204,7 @@ spec:
|
||||
이름을 포함하여 추가 구성이 포함된 IngressClass
|
||||
리소스에 대한 참조 클래스를 지정해야 한다.
|
||||
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1beta1
|
||||
kind: IngressClass
|
||||
metadata:
|
||||
name: external-lb
|
||||
spec:
|
||||
controller: example.com/ingress-controller
|
||||
parameters:
|
||||
apiGroup: k8s.example.com/v1alpha
|
||||
kind: IngressParameters
|
||||
name: external-lb
|
||||
```
|
||||
{{< codenew file="service/networking/external-lb.yaml" >}}
|
||||
|
||||
IngressClass 리소스에는 선택적인 파라미터 필드가 있다. 이 클래스에 대한
|
||||
추가 구성을 참조하는데 사용할 수 있다.
|
||||
@@ -179,7 +222,7 @@ IngressClass 리소스에는 선택적인 파라미터 필드가 있다. 이 클
|
||||
이 필드는 인그레스 컨트롤러의 이름을 포함하는 추가 인그레스 구성이
|
||||
포함된 인그레스 클래스 리소스에 대한 참조이다.
|
||||
|
||||
### 기본 인그레스 클래스
|
||||
### 기본 IngressClass {#default-ingress-class}
|
||||
|
||||
특정 IngressClass를 클러스터의 기본 값으로 표시할 수 있다. IngressClass
|
||||
리소스에서 `ingressclass.kubernetes.io/is-default-class` 를 `true` 로
|
||||
@@ -195,24 +238,24 @@ IngressClass 리소스에는 선택적인 파라미터 필드가 있다. 이 클
|
||||
|
||||
## 인그레스 유형들
|
||||
|
||||
### 단일 서비스 인그레스
|
||||
### 단일 서비스로 지원되는 인그레스 {#single-service-ingress}
|
||||
|
||||
단일 서비스를 노출할 수 있는 기존 쿠버네티스 개념이 있다
|
||||
([대안](#대안)을 본다). 인그레스에 규칙 없이 *기본 백엔드* 를 지정해서
|
||||
이를 수행할 수 있다.
|
||||
|
||||
{{< codenew file="service/networking/ingress.yaml" >}}
|
||||
{{< codenew file="service/networking/test-ingress.yaml" >}}
|
||||
|
||||
만약 `kubectl apply -f` 를 사용해서 생성한다면 방금 추가한 인그레스의
|
||||
상태를 볼 수 있어야 한다.
|
||||
|
||||
```shell
|
||||
```bash
|
||||
kubectl get ingress test-ingress
|
||||
```
|
||||
|
||||
```
|
||||
NAME HOSTS ADDRESS PORTS AGE
|
||||
test-ingress * 203.0.113.123 80 59s
|
||||
NAME CLASS HOSTS ADDRESS PORTS AGE
|
||||
test-ingress external-lb * 203.0.113.123 80 59s
|
||||
```
|
||||
|
||||
여기서 `203.0.113.123` 는 인그레스 컨트롤러가 인그레스를 충족시키기 위해
|
||||
@@ -229,34 +272,14 @@ test-ingress * 203.0.113.123 80 59s
|
||||
트래픽을 라우팅 한다. 인그레스를 사용하면 로드 밸런서의 수를
|
||||
최소로 유지할 수 있다. 예를 들어 다음과 같은 설정을 한다.
|
||||
|
||||
```none
|
||||
```
|
||||
foo.bar.com -> 178.91.123.132 -> / foo service1:4200
|
||||
/ bar service2:8080
|
||||
```
|
||||
|
||||
다음과 같은 인그레스가 필요하다.
|
||||
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1beta1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: simple-fanout-example
|
||||
annotations:
|
||||
nginx.ingress.kubernetes.io/rewrite-target: /
|
||||
spec:
|
||||
rules:
|
||||
- host: foo.bar.com
|
||||
http:
|
||||
paths:
|
||||
- path: /foo
|
||||
backend:
|
||||
serviceName: service1
|
||||
servicePort: 4200
|
||||
- path: /bar
|
||||
backend:
|
||||
serviceName: service2
|
||||
servicePort: 8080
|
||||
```
|
||||
{{< codenew file="service/networking/simple-fanout-example.yaml" >}}
|
||||
|
||||
`kubectl apply -f` 를 사용해서 인그레스를 생성 할 때 다음과 같다.
|
||||
|
||||
@@ -275,8 +298,6 @@ Rules:
|
||||
foo.bar.com
|
||||
/foo service1:4200 (10.8.0.90:4200)
|
||||
/bar service2:8080 (10.8.0.91:8080)
|
||||
Annotations:
|
||||
nginx.ingress.kubernetes.io/rewrite-target: /
|
||||
Events:
|
||||
Type Reason Age From Message
|
||||
---- ------ ---- ---- -------
|
||||
@@ -289,8 +310,8 @@ Events:
|
||||
볼 수 있다.
|
||||
|
||||
{{< note >}}
|
||||
사용중인 [인그레스 컨트롤러](/ko/docs/concepts/services-networking/ingress-controllers)
|
||||
에 따라 default-http-backend
|
||||
사용 중인 [인그레스 컨트롤러](/ko/docs/concepts/services-networking/ingress-controllers/)에
|
||||
따라 default-http-backend
|
||||
[서비스](/ko/docs/concepts/services-networking/service/)를 만들어야 할 수도 있다.
|
||||
{{< /note >}}
|
||||
|
||||
@@ -307,68 +328,26 @@ bar.foo.com --| |-> bar.foo.com service2:80
|
||||
다음 인그레스는 [호스트 헤더](https://tools.ietf.org/html/rfc7230#section-5.4)에 기반한 요청을
|
||||
라우팅 하기 위해 뒷단의 로드 밸런서를 알려준다.
|
||||
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1beta1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: name-virtual-host-ingress
|
||||
spec:
|
||||
rules:
|
||||
- host: foo.bar.com
|
||||
http:
|
||||
paths:
|
||||
- backend:
|
||||
serviceName: service1
|
||||
servicePort: 80
|
||||
- host: bar.foo.com
|
||||
http:
|
||||
paths:
|
||||
- backend:
|
||||
serviceName: service2
|
||||
servicePort: 80
|
||||
```
|
||||
{{< codenew file="service/networking/name-virtual-host-ingress.yaml" >}}
|
||||
|
||||
만약 규칙에 정의된 호스트 없이 인그레스 리소스를 생성하는 경우,
|
||||
이름 기반 가상 호스트가 없어도 인그레스 컨트롤러의 IP 주소에 대한 웹
|
||||
트래픽을 일치 시킬 수 있다.
|
||||
|
||||
예를 들어, 다음 인그레스 리소스는 `first.bar.com`에 요청된 트래픽을
|
||||
예를 들어, 다음 인그레스는 `first.bar.com`에 요청된 트래픽을
|
||||
`service1`로, `second.foo.com`는 `service2`로, 호스트 이름이 정의되지
|
||||
않은(즉, 요청 헤더가 표시 되지 않는) IP 주소로의 모든
|
||||
트래픽은 `service3`로 라우팅 한다.
|
||||
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1beta1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: name-virtual-host-ingress
|
||||
spec:
|
||||
rules:
|
||||
- host: first.bar.com
|
||||
http:
|
||||
paths:
|
||||
- backend:
|
||||
serviceName: service1
|
||||
servicePort: 80
|
||||
- host: second.foo.com
|
||||
http:
|
||||
paths:
|
||||
- backend:
|
||||
serviceName: service2
|
||||
servicePort: 80
|
||||
- http:
|
||||
paths:
|
||||
- backend:
|
||||
serviceName: service3
|
||||
servicePort: 80
|
||||
```
|
||||
{{< codenew file="service/networking/name-virtual-host-ingress-no-third-host.yaml" >}}
|
||||
|
||||
### TLS
|
||||
|
||||
TLS 개인 키 및 인증서가 포함된 {{< glossary_tooltip term_id="secret" >}}
|
||||
을 지정해서 인그레스를 보호할 수 있다. 현재 인그레스는
|
||||
단일 TLS 포트인 443만 지원하며 TLS 종료를 가정한다. 만약 인그레스의 TLS
|
||||
구성 섹션에서 다른 호스트를 지정하면, SNI TLS 확장을 통해
|
||||
TLS 개인 키 및 인증서가 포함된 {{< glossary_tooltip term_id="secret" >}}을
|
||||
지정해서 인그레스를 보호할 수 있다. 인그레스 리소스는
|
||||
단일 TLS 포트인 443만 지원하고 인그레스 지점에서 TLS 종료를
|
||||
가정한다(서비스 및 해당 파드에 대한 트래픽은 일반 텍스트임).
|
||||
인그레스의 TLS 구성 섹션에서 다른 호스트를 지정하면, SNI TLS 확장을 통해
|
||||
지정된 호스트이름에 따라 동일한 포트에서 멀티플렉싱
|
||||
된다(인그레스 컨트롤러가 SNI를 지원하는 경우). TLS secret에는
|
||||
`tls.crt` 와 `tls.key` 라는 이름의 키가 있어야 하고, 여기에는 TLS에 사용할 인증서와
|
||||
@@ -391,25 +370,7 @@ type: kubernetes.io/tls
|
||||
TLS 시크릿이 `sslexample.foo.com` 의 정규화 된 도메인 이름(FQDN)이라고
|
||||
하는 일반 이름(CN)을 포함하는 인증서에서 온 것인지 확인해야 한다.
|
||||
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1beta1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: tls-example-ingress
|
||||
spec:
|
||||
tls:
|
||||
- hosts:
|
||||
- sslexample.foo.com
|
||||
secretName: testsecret-tls
|
||||
rules:
|
||||
- host: sslexample.foo.com
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
backend:
|
||||
serviceName: service1
|
||||
servicePort: 80
|
||||
```
|
||||
{{< codenew file="service/networking/tls-example-ingress.yaml" >}}
|
||||
|
||||
{{< note >}}
|
||||
TLS 기능을 제공하는 다양한 인그레스 컨트롤러간의 기능
|
||||
@@ -419,7 +380,7 @@ TLS 기능을 제공하는 다양한 인그레스 컨트롤러간의 기능
|
||||
플랫폼의 특정 인그레스 컨트롤러에 대한 설명서를 참조한다.
|
||||
{{< /note >}}
|
||||
|
||||
### 로드밸런싱
|
||||
### 로드 밸런싱 {#load-balancing}
|
||||
|
||||
인그레스 컨트롤러는 로드 밸런싱 알고리즘, 백엔드 가중치 구성표 등
|
||||
모든 인그레스에 적용되는 일부 로드 밸런싱
|
||||
@@ -432,8 +393,8 @@ TLS 기능을 제공하는 다양한 인그레스 컨트롤러간의 기능
|
||||
[준비 상태 프로브](/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)와
|
||||
같은 동일한 최종 결과를 얻을 수 있는 병렬 개념이
|
||||
있다는 점도 주목할 가치가 있다. 컨트롤러 별
|
||||
설명서를 검토하여 헬스 체크를 처리하는 방법을 확인한다(
|
||||
[nginx](https://git.k8s.io/ingress-nginx/README.md),
|
||||
설명서를 검토하여 헬스 체크를 처리하는 방법을 확인한다(예:
|
||||
[nginx](https://git.k8s.io/ingress-nginx/README.md), 또는
|
||||
[GCE](https://git.k8s.io/ingress-gce/README.md#health-checks)).
|
||||
|
||||
## 인그레스 업데이트
|
||||
@@ -476,16 +437,22 @@ spec:
|
||||
http:
|
||||
paths:
|
||||
- backend:
|
||||
serviceName: service1
|
||||
servicePort: 80
|
||||
service:
|
||||
name: service1
|
||||
port:
|
||||
number: 80
|
||||
path: /foo
|
||||
pathType: Prefix
|
||||
- host: bar.baz.com
|
||||
http:
|
||||
paths:
|
||||
- backend:
|
||||
serviceName: service2
|
||||
servicePort: 80
|
||||
service:
|
||||
name: service2
|
||||
port:
|
||||
number: 80
|
||||
path: /foo
|
||||
pathType: Prefix
|
||||
..
|
||||
```
|
||||
|
||||
@@ -523,15 +490,9 @@ Events:
|
||||
## 가용성 영역에 전체에서의 실패
|
||||
|
||||
장애 도메인에 트래픽을 분산시키는 기술은 클라우드 공급자마다 다르다.
|
||||
자세한 내용은 [인그레스 컨트롤러](/ko/docs/concepts/services-networking/ingress-controllers) 설명서를 확인한다. 페더레이션 클러스터에서 인그레스 배포에 대한 자세한 내용은 [페더레이션 설명서](https://github.com/kubernetes-sigs/federation-v2)
|
||||
를 참조할 수 있다.
|
||||
|
||||
## 앞으로의 할일
|
||||
|
||||
[SIG Network](https://github.com/kubernetes/community/tree/master/sig-network)
|
||||
를 추적하여 인그레스와 진행중인 리소스의 발전에 대한 자세한 내용을 알아 본다. 다양한
|
||||
인그레스 컨트롤러의 발전에 대한 자세한 내용은
|
||||
[인그레스 리포지터리](https://github.com/kubernetes/ingress/tree/master)에서 추적할 수 있다.
|
||||
자세한 내용은 [인그레스 컨트롤러](/ko/docs/concepts/services-networking/ingress-controllers) 설명서를 확인한다.
|
||||
페더레이션 클러스터에서 인그레스 배포에 대한 자세한 내용은 [페더레이션 설명서](https://github.com/kubernetes-sigs/federation-v2)를
|
||||
참조할 수 있다.
|
||||
|
||||
## 대안
|
||||
|
||||
@@ -546,4 +507,4 @@ Events:
|
||||
|
||||
* [인그레스 API](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#ingress-v1beta1-networking-k8s-io)에 대해 배우기
|
||||
* [인그레스 컨트롤러](/ko/docs/concepts/services-networking/ingress-controllers/)에 대해 배우기
|
||||
* [NGINX 컨트롤러로 Minikube에서 인그레스 구성하기](/docs/tasks/access-application-cluster/ingress-minikube)
|
||||
* [NGINX 컨트롤러로 Minikube에서 인그레스 구성하기](/docs/tasks/access-application-cluster/ingress-minikube/)
|
||||
|
||||
@@ -5,11 +5,18 @@ weight: 50
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
네트워크 정책은 {{< glossary_tooltip text="파드" term_id="pod">}} 그룹이 서로 간에 또는 다른 네트워크 엔드포인트와 통신할 수 있도록 허용하는 방법에 대한 명세이다.
|
||||
|
||||
`네트워크폴리시(NetworkPolicy)` 리소스는 {{< glossary_tooltip text="레이블" term_id="label">}}을 사용해서 파드를 선택하고 선택한 파드에 허용되는 트래픽을 지정하는 규칙을 정의한다.
|
||||
IP 주소 또는 포트 수준(OSI 계층 3 또는 4)에서 트래픽 흐름을 제어하려는 경우, 클러스터의 특정 애플리케이션에 대해 쿠버네티스 네트워크폴리시(NetworkPolicy) 사용을 고려할 수 있다. 네트워크폴리시는 {{< glossary_tooltip text="파드" term_id="pod" >}}가 네트워크 상의 다양한 네트워크 "엔티티"(여기서는 "엔티티"를 사용하여 쿠버네티스에서 특별한 의미로 사용되는 "엔드포인트" 및 "서비스"와 같은 일반적인 용어가 중의적으로 표현되는 것을 방지함)와 통신할 수 있도록 허용하는 방법을 지정할 수 있는 애플리케이션 중심 구조이다.
|
||||
|
||||
파드가 통신할 수 있는 엔티티는 다음 3개의 식별자 조합을 통해 식별된다.
|
||||
|
||||
1. 허용되는 다른 파드(예외: 파드는 자신에 대한 접근을 차단할 수 없음)
|
||||
2. 허용되는 네임스페이스
|
||||
3. IP 블록(예외: 파드 또는 노드의 IP 주소와 관계없이 파드가 실행 중인 노드와의 트래픽은 항상 허용됨)
|
||||
|
||||
pod- 또는 namespace- 기반의 네트워크폴리시를 정의할 때, {{< glossary_tooltip text="셀렉터" term_id="selector" >}}를 사용하여 셀렉터와 일치하는 파드와 주고받는 트래픽을 지정한다.
|
||||
|
||||
한편, IP 기반의 네트워크폴리시가 생성되면, IP 블록(CIDR 범위)을 기반으로 정책을 정의한다.
|
||||
|
||||
<!-- body -->
|
||||
## 전제 조건
|
||||
@@ -199,17 +206,29 @@ __ipBlock__: 인그레스 소스 또는 이그레스 대상으로 허용할 IP C
|
||||
|
||||
## SCTP 지원
|
||||
|
||||
{{< feature-state for_k8s_version="v1.12" state="alpha" >}}
|
||||
{{< feature-state for_k8s_version="v1.19" state="beta" >}}
|
||||
|
||||
이 기능을 사용하려면 사용자(또는 클러스터 관리자가) API 서버에 `--feature-gates=SCTPSupport=true,…` 를 사용해서 `SCTPSupport` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 활성화 해야 한다.
|
||||
기능 게이트가 활셩화 되면, 네트워크폴리시의 `protocol` 필드를 `SCTP` 로 설정할 수 있다.
|
||||
베타 기능으로, 기본 활성화되어 있다. 클러스터 수준에서 SCTP를 비활성화하려면, 사용자(또는 클러스터 관리자)가 API 서버에 `--feature-gates=SCTPSupport=false,…` 를 사용해서 `SCTPSupport` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 비활성화해야 한다.
|
||||
|
||||
{{< note >}}
|
||||
SCTP 프로토콜 네트워크폴리시를 지원하는 {{< glossary_tooltip text="CNI" term_id="cni" >}} 플러그인을 사용하고 있어야 한다.
|
||||
{{< /note >}}
|
||||
|
||||
# 네트워크 정책으로 할 수 없는 것(적어도 아직은 할 수 없는)
|
||||
|
||||
쿠버네티스 1.20부터 다음의 기능은 네트워크폴리시 API에 존재하지 않지만, 운영 체제 컴포넌트(예: SELinux, OpenVSwitch, IPTables 등) 또는 Layer 7 기술(인그레스 컨트롤러, 서비스 메시 구현) 또는 어드미션 컨트롤러를 사용하여 제2의 해결책을 구현할 수 있다. 쿠버네티스의 네트워크 보안을 처음 사용하는 경우, 네트워크폴리시 API를 사용하여 다음의 사용자 스토리를 (아직) 구현할 수 없다는 점에 유의할 가치가 있다. 이러한 사용자 스토리 중 일부(전부는 아님)가 네트워크폴리시 API의 향후 릴리스에서 활발히 논의되고 있다.
|
||||
|
||||
- 내부 클러스터 트래픽이 공통 게이트웨이를 통과하도록 강제한다(서비스 메시나 기타 프록시와 함께 제공하는 것이 가장 좋을 수 있음).
|
||||
- TLS와 관련된 모든 것(이를 위해 서비스 메시나 인그레스 컨트롤러 사용).
|
||||
- 노드별 정책(이에 대해 CIDR 표기법을 사용할 수 있지만, 특히 쿠버네티스 ID로 노드를 대상으로 지정할 수 없음).
|
||||
- 이름으로 네임스페이스나 서비스를 타겟팅한다(그러나, {{< glossary_tooltip text="레이블" term_id="label" >}}로 파드나 네임스페이스를 타겟팅할 수 있으며, 이는 종종 실행할 수 있는 해결 방법임).
|
||||
- 타사 공급사가 이행한 "정책 요청"의 생성 또는 관리.
|
||||
- 모든 네임스페이스나 파드에 적용되는 기본 정책(이를 수행할 수 있는 타사 공급사의 쿠버네티스 배포본 및 프로젝트가 있음).
|
||||
- 고급 정책 쿼리 및 도달 가능성 도구.
|
||||
- 단일 정책 선언에서 포트 범위를 대상으로 하는 기능.
|
||||
- 네트워크 보안 이벤트를 기록하는 기능(예: 차단되거나 수락된 연결).
|
||||
- 명시적으로 정책을 거부하는 기능(현재 네트워크폴리시 모델은 기본적으로 거부하며, 허용 규칙을 추가하는 기능만 있음).
|
||||
- 루프백 또는 들어오는 호스트 트래픽을 방지하는 기능(파드는 현재 로컬 호스트 접근을 차단할 수 없으며, 상주 노드의 접근을 차단할 수 있는 기능도 없음).
|
||||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
|
||||
@@ -31,8 +31,8 @@ weight: 10
|
||||
한 시점에 실행되는 파드 집합이
|
||||
잠시 후 실행되는 해당 파드 집합과 다를 수 있다.
|
||||
|
||||
이는 다음과 같은 문제를 야기한다. (“백엔드”라 불리는) 일부 파드 집합이
|
||||
클러스터의 (“프론트엔드”라 불리는) 다른 파드에 기능을 제공하는 경우,
|
||||
이는 다음과 같은 문제를 야기한다. ("백엔드"라 불리는) 일부 파드 집합이
|
||||
클러스터의 ("프론트엔드"라 불리는) 다른 파드에 기능을 제공하는 경우,
|
||||
프론트엔드가 워크로드의 백엔드를 사용하기 위해,
|
||||
프론트엔드가 어떻게 연결할 IP 주소를 찾아서 추적할 수 있는가?
|
||||
|
||||
@@ -89,7 +89,7 @@ spec:
|
||||
targetPort: 9376
|
||||
```
|
||||
|
||||
이 명세는 “my-service”라는 새로운 서비스 오브젝트를 생성하고,
|
||||
이 명세는 "my-service"라는 새로운 서비스 오브젝트를 생성하고,
|
||||
`app=MyApp` 레이블을 가진 파드의 TCP 9376 포트를 대상으로 한다.
|
||||
|
||||
쿠버네티스는 이 서비스에 서비스 프록시가 사용하는 IP 주소 ("cluster IP"라고도 함)
|
||||
@@ -97,7 +97,7 @@ spec:
|
||||
(이하 [가상 IP와 서비스 프록시](#가상-ip와-서비스-프록시) 참고)
|
||||
|
||||
서비스 셀렉터의 컨트롤러는 셀렉터와 일치하는 파드를 지속적으로 검색하고,
|
||||
“my-service”라는 엔드포인트 오브젝트에 대한
|
||||
"my-service"라는 엔드포인트 오브젝트에 대한
|
||||
모든 업데이트를 POST한다.
|
||||
|
||||
{{< note >}}
|
||||
@@ -200,14 +200,11 @@ API 리소스이다. 개념적으로 엔드포인트와 매우 유사하지만,
|
||||
|
||||
### 애플리케이션 프로토콜
|
||||
|
||||
{{< feature-state for_k8s_version="v1.18" state="alpha" >}}
|
||||
{{< feature-state for_k8s_version="v1.19" state="beta" >}}
|
||||
|
||||
AppProtocol 필드는 각 서비스 포트에 사용될 애플리케이션 프로토콜을
|
||||
지정하는 방법을 제공한다.
|
||||
|
||||
알파 기능으로 이 필드는 기본적으로 활성화되어 있지 않다. 이 필드를 사용하려면,
|
||||
[기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)에서
|
||||
`ServiceAppProtocol` 을 활성화해야 한다.
|
||||
지정하는 방법을 제공한다. 이 필드의 값은 해당 엔드포인트와 엔드포인트슬라이스에
|
||||
의해 미러링된다.
|
||||
|
||||
## 가상 IP와 서비스 프록시
|
||||
|
||||
@@ -862,6 +859,7 @@ Classic ELB의 연결 드레이닝은
|
||||
service.beta.kubernetes.io/aws-load-balancer-healthcheck-interval: "20"
|
||||
# 개별 인스턴스의 상태 점검 사이의
|
||||
# 대략적인 간격 (초 단위). 기본값은 10이며, 5와 300 사이여야 한다.
|
||||
|
||||
service.beta.kubernetes.io/aws-load-balancer-healthcheck-timeout: "5"
|
||||
# 헬스 체크 실패를 의미하는 무 응답의 총 시간 (초 단위)
|
||||
# 이 값은 service.beta.kubernetes.io/aws-load-balancer-healthcheck-interval
|
||||
@@ -869,6 +867,10 @@ Classic ELB의 연결 드레이닝은
|
||||
|
||||
service.beta.kubernetes.io/aws-load-balancer-extra-security-groups: "sg-53fae93f,sg-42efd82e"
|
||||
# ELB에 추가될 추가 보안 그룹(security group) 목록
|
||||
|
||||
service.beta.kubernetes.io/aws-load-balancer-target-node-labels: "ingress-gw,gw-name=public-api"
|
||||
# 로드 밸런서의 대상 노드를 선택하는 데
|
||||
# 사용되는 키-값 쌍의 쉼표로 구분된 목록
|
||||
```
|
||||
|
||||
#### AWS의 네트워크 로드 밸런서 지원 {#aws-nlb-support}
|
||||
@@ -1189,11 +1191,11 @@ PROXY TCP4 192.0.2.202 10.0.42.7 12345 7\r\n
|
||||
|
||||
### SCTP
|
||||
|
||||
{{< feature-state for_k8s_version="v1.12" state="alpha" >}}
|
||||
{{< feature-state for_k8s_version="v1.19" state="beta" >}}
|
||||
|
||||
쿠버네티스는 서비스, 엔드포인트, 네트워크 정책 및 파드 정의에서 알파 기능으로 SCTP를 `프로토콜` 값으로 지원한다. 이 기능을 활성화하기 위해서는, 클러스터 관리자가 API 서버에서 `--feature-gates=SCTPSupport=true,…`처럼 `SCTPSupport` 기능 게이트를 활성화해야 한다.
|
||||
쿠버네티스는 서비스, 엔드포인트, 엔드포인트슬라이스, 네트워크폴리시 및 파드 정의에서 SCTP를 `protocol` 값으로 지원한다. 이 기능은 베타 기능으로, 기본 활성화되어 있다. 클러스터 수준에서 SCTP를 비활성화하려면, 사용자(또는 클러스터 관리자)가 API 서버에서 `--feature-gates=SCTPSupport=false,…` 를 사용해서 `SCTPSupport` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 비활성화해야 한다.
|
||||
|
||||
기능 게이트가 활성화되면, 서비스, 엔드포인트, 네트워크 정책 또는 파드의 `프로토콜` 필드를 `SCTP`로 설정할 수 있다. 쿠버네티스는 TCP 연결과 마찬가지로, SCTP 연결에 맞게 네트워크를 설정한다.
|
||||
기능 게이트가 활성화되면, 서비스, 엔드포인트, 엔드포인트슬라이스, 네트워크폴리시 또는 파드의 `protocol` 필드를 `SCTP` 로 설정할 수 있다. 쿠버네티스는 TCP 연결과 마찬가지로, SCTP 연결에 맞게 네트워크를 설정한다.
|
||||
|
||||
#### 경고 {#caveat-sctp-overview}
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ v1.6부터 더 이상 사용하지 않는다. 사용자는 이제 `PersistentVol
|
||||
관리자가 구성한 `StorageClass` 의 이름과
|
||||
일치해야 한다. ([아래](#동적-프로비저닝-활성화하기)를 참고)
|
||||
|
||||
예를 들어 “fast” 스토리지 클래스를 선택하려면 다음과
|
||||
예를 들어 "fast" 스토리지 클래스를 선택하려면 다음과
|
||||
같은 `PersistentVolumeClaim` 을 생성한다.
|
||||
|
||||
```yaml
|
||||
@@ -127,4 +127,3 @@ spec:
|
||||
여러 영역에 걸쳐 분산될 수 있다. 파드가 예약된 영역에서 단일 영역 스토리지 백엔드를
|
||||
프로비전해야 한다. [볼륨 바인딩 모드](/ko/docs/concepts/storage/storage-classes/#볼륨-바인딩-모드)를
|
||||
설정해서 수행할 수 있다.
|
||||
|
||||
|
||||
@@ -248,6 +248,16 @@ FlexVolume의 크기 조정은 기본 드라이버가 크기 조정을 지원하
|
||||
EBS 볼륨 확장은 시간이 많이 걸리는 작업이다. 또한 6시간마다 한 번의 수정을 할 수 있는 볼륨별 쿼터가 있다.
|
||||
{{< /note >}}
|
||||
|
||||
#### 볼륨 확장 시 오류 복구
|
||||
|
||||
기본 스토리지 확장에 실패하면, 클러스터 관리자가 수동으로 퍼시스턴트 볼륨 클레임(PVC) 상태를 복구하고 크기 조정 요청을 취소할 수 있다. 그렇지 않으면, 컨트롤러가 관리자 개입 없이 크기 조정 요청을 계속해서 재시도한다.
|
||||
|
||||
1. 퍼시스턴트볼륨클레임(PVC)에 바인딩된 퍼시스턴트볼륨(PV)을 `Retain` 반환 정책으로 표시한다.
|
||||
2. PVC를 삭제한다. PV에는 `Retain` 반환 정책이 있으므로 PVC를 재생성할 때 데이터가 손실되지 않는다.
|
||||
3. 새 PVC를 바인딩할 수 있도록 PV 명세에서 `claimRef` 항목을 삭제한다. 그러면 PV가 `Available` 상태가 된다.
|
||||
4. PV 보다 작은 크기로 PVC를 다시 만들고 PVC의 `volumeName` 필드를 PV 이름으로 설정한다. 이것은 새 PVC를 기존 PV에 바인딩해야 한다.
|
||||
5. PV의 반환 정책을 복원하는 것을 잊지 않는다.
|
||||
|
||||
|
||||
## 퍼시스턴트 볼륨의 유형
|
||||
|
||||
|
||||
@@ -87,14 +87,14 @@ spec:
|
||||
|
||||
사전 프로비저닝된 스냅샷의 경우, 다음 예와 같이 `volumeSnapshotContentName`을 스냅샷 소스로 지정해야 한다. 사전 프로비저닝된 스냅샷에는 `volumeSnapshotContentName` 소스 필드가 필요하다.
|
||||
|
||||
```
|
||||
```yaml
|
||||
apiVersion: snapshot.storage.k8s.io/v1beta1
|
||||
kind: VolumeSnapshot
|
||||
metadata:
|
||||
name: test-snapshot
|
||||
spec:
|
||||
source:
|
||||
volumeSnapshotContentName: test-content
|
||||
volumeSnapshotContentName: test-content
|
||||
```
|
||||
|
||||
## 볼륨 스냅샷 컨텐츠
|
||||
|
||||
@@ -150,7 +150,7 @@ awsElasticBlockStore 의 CSI 마이그레이션 기능이 활성화된 경우,
|
||||
드라이버로 모든 플러그인 작업을 수행한다. 이 기능을 사용하려면, 클러스터에 [AWS EBS CSI
|
||||
드라이버](https://github.com/kubernetes-sigs/aws-ebs-csi-driver)
|
||||
를 설치하고 `CSIMigration` 과 `CSIMigrationAWS`
|
||||
베타 기능을 활성화 해야 한다.
|
||||
베타 기능을 활성화해야 한다.
|
||||
|
||||
#### CSI 마이그레이션 완료
|
||||
{{< feature-state for_k8s_version="v1.17" state="alpha" >}}
|
||||
@@ -165,14 +165,14 @@ awsElasticBlockStore 의 CSI 마이그레이션 기능이 활성화된 경우,
|
||||
|
||||
#### CSI 마이그레이션
|
||||
|
||||
{{< feature-state for_k8s_version="v1.15" state="alpha" >}}
|
||||
{{< feature-state for_k8s_version="v1.19" state="beta" >}}
|
||||
|
||||
azureDisk의 CSI 마이그레이션 기능이 활성화된 경우, 기존 트리 내 플러그인에서
|
||||
`disk.csi.azure.com` 컨테이너 스토리지 인터페이스(CSI)
|
||||
드라이버로 모든 플러그인 작업을 수행한다. 이 기능을 사용하려면, 클러스터에 [Azure 디스크 CSI
|
||||
드라이버](https://github.com/kubernetes-sigs/azuredisk-csi-driver)
|
||||
를 설치하고 `CSIMigration` 과 `CSIMigrationAzureDisk`
|
||||
알파 기능을 활성화 해야 한다.
|
||||
기능을 활성화해야 한다.
|
||||
|
||||
### azureFile {#azurefile}
|
||||
|
||||
@@ -190,7 +190,7 @@ azureFile의 CSI 마이그레이션 기능이 활성화된 경우, 기존 트리
|
||||
드라이버로 모든 플러그인 작업을 수행한다. 이 기능을 사용하려면, 클러스터에 [Azure 파일 CSI
|
||||
드라이버](https://github.com/kubernetes-sigs/azurefile-csi-driver)
|
||||
를 설치하고 `CSIMigration` 과 `CSIMigrationAzureFile`
|
||||
알파 기능을 활성화 해야 한다.
|
||||
알파 기능을 활성화해야 한다.
|
||||
|
||||
### cephfs {#cephfs}
|
||||
|
||||
@@ -493,7 +493,7 @@ GCE PD의 CSI 마이그레이션 기능이 활성화된 경우 기존 트리 내
|
||||
드라이버로 모든 플러그인 작업을 수행한다. 이 기능을 사용하려면, 클러스터에 [GCE PD CSI
|
||||
드라이버](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver)
|
||||
를 설치하고 `CSIMigration` 과 `CSIMigrationGCE`
|
||||
베타 기능을 활성화 해야 한다.
|
||||
베타 기능을 활성화해야 한다.
|
||||
|
||||
### gitRepo (사용 중단(deprecated)) {#gitrepo}
|
||||
|
||||
@@ -1151,6 +1151,38 @@ spec:
|
||||
|
||||
더 많은 예시는 [여기](https://github.com/kubernetes/examples/tree/master/staging/volumes/vsphere)에서 확인할 수 있다.
|
||||
|
||||
#### CSI 마이그레이션
|
||||
|
||||
{{< feature-state for_k8s_version="v1.19" state="beta" >}}
|
||||
|
||||
vsphereVolume용 CSI 마이그레이션 기능이 활성화되면, 기존 인-트리 플러그인에서
|
||||
`csi.vsphere.vmware.com` {{< glossary_tooltip text="CSI" term_id="csi" >}} 드라이버로 모든 플러그인 작업을 shim한다.
|
||||
이 기능을 사용하려면, [vSphere CSI
|
||||
드라이버](https://github.com/kubernetes-sigs/vsphere-csi-driver)가
|
||||
클러스터에 설치되어야 하며 `CSIMigration` 및 `CSIMigrationvSphere`
|
||||
[기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)가 활성화되어 있어야 한다.
|
||||
|
||||
또한 최소 vSphere vCenter/ESXi 버전은 7.0u1이고 최소 HW 버전은 VM 버전 15여야 한다.
|
||||
|
||||
{{< note >}}
|
||||
빌트인 vsphereVolume 플러그인의 다음 스토리지클래스 파라미터는 vSphere CSI 드라이버에서 지원되지 않는다.
|
||||
|
||||
* `diskformat`
|
||||
* `hostfailurestotolerate`
|
||||
* `forceprovisioning`
|
||||
* `cachereservation`
|
||||
* `diskstripes`
|
||||
* `objectspacereservation`
|
||||
* `iopslimit`
|
||||
|
||||
이러한 파라미터를 사용하여 생성된 기존 볼륨은 vSphere CSI 드라이버로 마이그레이션되지만, vSphere CSI 드라이버에서 생성된 새 볼륨은 이러한 파라미터를 따르지 않는다.
|
||||
{{< /note >}}
|
||||
|
||||
#### CSI 마이그레이션 완료
|
||||
{{< feature-state for_k8s_version="v1.19" state="beta" >}}
|
||||
|
||||
vsphereVolume 플러그인이 컨트롤러 관리자와 kubelet에 의해 로드되지 않도록 기능을 비활성화하려면, 이 기능 플래그를 true로 설정해야 한다. 이를 위해서는 모든 워커 노드에 `csi.vsphere.vmware.com` {{< glossary_tooltip text="CSI" term_id="csi" >}} 드라이버가 설치되어 있어야 한다.
|
||||
|
||||
|
||||
## subPath 사용하기
|
||||
|
||||
@@ -1194,7 +1226,6 @@ spec:
|
||||
|
||||
|
||||
`subPathExpr` 필드를 사용해서 Downward API 환경 변수로부터 `subPath` 디렉터리 이름을 구성한다.
|
||||
이 기능을 사용하려면 `VolumeSubpathEnvExpansion` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)를 활성화 해야 한다. 쿠버네티스 1.15에서는 시작 시 기본적으로 활성화되어 있다.
|
||||
`subPath` 와 `subPathExpr` 속성은 상호 배타적이다.
|
||||
|
||||
이 예제는 파드가 `subPathExpr` 을 사용해서 Downward API로부터 파드 이름을 사용해서 hostPath 볼륨 `/var/log/pods` 내에 `pod1` 디렉터리를 생성한다. 호스트 디렉터리 `/var/log/pods/pod1` 은 컨테이너의 `/logs` 에 마운트 된다.
|
||||
@@ -1284,8 +1315,11 @@ CSI 호환 볼륨 드라이버가 쿠버네티스 클러스터에 배포되면
|
||||
`csi` 볼륨 유형을 사용해서 CSI 드라이버에 의해 노출된 볼륨에 연결, 마운트,
|
||||
등을 할 수 있다.
|
||||
|
||||
`csi` 볼륨 유형은 파드에서의 직접 참조를 지원하지 않으며
|
||||
`PersistentVolumeClaim` 오브젝트를 통해 파드에서 참조할 수 있다.
|
||||
`csi` 볼륨은 세 가지 방법으로 파드에서 사용할 수 있다.
|
||||
- [`persistentVolumeClaim`](#persistentvolumeclaim)에 대한 참조를 통해서
|
||||
- [일반 임시 볼륨](/docs/concepts/storage/ephemeral-volumes/#generic-ephemeral-volume)과 함께 (알파 기능)
|
||||
- 드라이버가 지원하는 경우
|
||||
[CSI 임시 볼륨](/docs/concepts/storage/ephemeral-volumes/#csi-ephemeral-volume) (베타 기능)
|
||||
|
||||
스토리지 관리자가 다음 필드를 사용해서 CSI 퍼시스턴트 볼륨을
|
||||
구성할 수 있다.
|
||||
@@ -1348,38 +1382,14 @@ CSI 설정 변경 없이 평소와 같이
|
||||
|
||||
{{< feature-state for_k8s_version="v1.16" state="beta" >}}
|
||||
|
||||
이 기능을 사용하면 CSI 볼륨을 퍼시스턴트볼륨 대신에 파드 사양에 직접적으로 포함할 수 있다.
|
||||
이러한 방식으로 지정된 볼륨은 임시적이고 파드 재시작시에는 유지되지 않는다.
|
||||
파드 명세 내에서 CSI 볼륨을 직접 구성할 수
|
||||
있다. 이 방식으로 지정된 볼륨은 임시 볼륨이며
|
||||
파드가 다시 시작할 때 지속되지 않는다. 자세한 내용은 [임시
|
||||
볼륨](/docs/concepts/storage/ephemeral-volumes/#csi-ephemeral-volume)을
|
||||
참고한다.
|
||||
|
||||
예시
|
||||
#### {{% heading "whatsnext" %}}
|
||||
|
||||
```yaml
|
||||
kind: Pod
|
||||
apiVersion: v1
|
||||
metadata:
|
||||
name: my-csi-app
|
||||
spec:
|
||||
containers:
|
||||
- name: my-frontend
|
||||
image: busybox
|
||||
volumeMounts:
|
||||
- mountPath: "/data"
|
||||
name: my-csi-inline-vol
|
||||
command: [ "sleep", "1000000" ]
|
||||
volumes:
|
||||
- name: my-csi-inline-vol
|
||||
csi:
|
||||
driver: inline.storage.kubernetes.io
|
||||
volumeAttributes:
|
||||
foo: bar
|
||||
```
|
||||
|
||||
이 기능을 사용하려면 CSIInlineVolume 기능 게이트를 활성화 해야 한다.
|
||||
쿠버네티스 1.16 시작시 기본적으로 활성화 되어있다.
|
||||
|
||||
CSI 임시 볼륨은 CSI 드라이버의 하위집합에서만 지원된다. CSI 드라이버의 목록은 [여기](https://kubernetes-csi.github.io/docs/drivers.html)를 본다.
|
||||
|
||||
# 개발자 리소스
|
||||
CSI 드라이버의 개발 방법에 대한 더 자세한 정보는 [쿠버네티스-csi
|
||||
문서](https://kubernetes-csi.github.io/docs/)를 참조한다.
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: 데몬셋
|
||||
content_type: concept
|
||||
weight: 50
|
||||
weight: 40
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
@@ -6,7 +6,7 @@ feature:
|
||||
쿠버네티스는 애플리케이션 또는 애플리케이션의 설정 변경시 점진적으로 롤아웃하는 동시에 애플리케이션을 모니터링해서 모든 인스턴스가 동시에 종료되지 않도록 보장한다. 만약 어떤 문제가 발생하면 쿠버네티스는 변경 사항을 롤백한다. 성장하는 디플로이먼트 솔루션 생태계를 이용한다.
|
||||
|
||||
content_type: concept
|
||||
weight: 30
|
||||
weight: 10
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
@@ -82,7 +82,7 @@ kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml
|
||||
2. `kubectl get deployments` 을 실행해서 디플로이먼트가 생성되었는지 확인한다.
|
||||
|
||||
만약 디플로이먼트가 여전히 생성 중이면, 다음과 유사하게 출력된다.
|
||||
```shell
|
||||
```
|
||||
NAME READY UP-TO-DATE AVAILABLE AGE
|
||||
nginx-deployment 0/3 0 0 1s
|
||||
```
|
||||
@@ -98,21 +98,21 @@ kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml
|
||||
3. 디플로이먼트의 롤아웃 상태를 보려면, `kubectl rollout status deployment.v1.apps/nginx-deployment` 를 실행한다.
|
||||
|
||||
다음과 유사하게 출력된다.
|
||||
```shell
|
||||
```
|
||||
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
|
||||
deployment.apps/nginx-deployment successfully rolled out
|
||||
```
|
||||
|
||||
4. 몇 초 후 `kubectl get deployments` 를 다시 실행한다.
|
||||
다음과 유사하게 출력된다.
|
||||
```shell
|
||||
```
|
||||
NAME READY UP-TO-DATE AVAILABLE AGE
|
||||
nginx-deployment 3/3 3 3 18s
|
||||
```
|
||||
디플로이먼트에서 3개의 레플리카가 생성되었고, 모든 레플리카는 최신 상태(최신 파드 템플릿을 포함)이며 사용 가능한 것을 알 수 있다.
|
||||
|
||||
5. 디플로이먼트로 생성된 레플리카셋(`rs`)을 보려면, `kubectl get rs` 를 실행한다. 다음과 유사하게 출력된다.
|
||||
```shell
|
||||
```
|
||||
NAME DESIRED CURRENT READY AGE
|
||||
nginx-deployment-75675f5897 3 3 3 18s
|
||||
```
|
||||
@@ -129,7 +129,7 @@ kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml
|
||||
|
||||
6. 각 파드에 자동으로 생성된 레이블을 보려면, `kubectl get pods --show-labels` 를 실행한다.
|
||||
다음과 유사하게 출력된다.
|
||||
```shell
|
||||
```
|
||||
NAME READY STATUS RESTARTS AGE LABELS
|
||||
nginx-deployment-75675f5897-7ci7o 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453
|
||||
nginx-deployment-75675f5897-kzszj 1/1 Running 0 18s app=nginx,pod-template-hash=3123191453
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: 가비지(Garbage) 수집
|
||||
content_type: concept
|
||||
weight: 70
|
||||
weight: 60
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
---
|
||||
title: 잡 - 실행부터 완료까지
|
||||
title: 잡
|
||||
content_type: concept
|
||||
feature:
|
||||
title: 배치 실행
|
||||
description: >
|
||||
쿠버네티스는 서비스 외에도 배치와 CI 워크로드를 관리할 수 있으며, 원하는 경우 실패한 컨테이너를 교체할 수 있다.
|
||||
weight: 70
|
||||
weight: 50
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
@@ -116,6 +116,7 @@ kubectl logs $pods
|
||||
|
||||
`.spec.template` 은 `.spec` 의 유일한 필수 필드이다.
|
||||
|
||||
|
||||
`.spec.template` 은 [파드 템플릿](/ko/docs/concepts/workloads/pods/#파드-템플릿)이다. 이것은 `apiVersion` 또는 `kind` 가 없다는 것을 제외한다면 {{< glossary_tooltip text="파드" term_id="pod" >}}와 정확하게 같은 스키마를 가지고 있다.
|
||||
|
||||
추가로 파드의 필수 필드 외에도 잡의 파드 템플릿은 적절한
|
||||
@@ -129,7 +130,7 @@ kubectl logs $pods
|
||||
[자신의 파드 셀렉터를 지정하기](#자신의-파드-셀렉터를-지정하기) 섹션을 참고한다.
|
||||
|
||||
|
||||
### 병렬 잡
|
||||
### 잡에 대한 병렬 실행 {#parallel-jobs}
|
||||
|
||||
잡으로 실행하기에 적합한 작업 유형은 크게 세 가지가 있다.
|
||||
|
||||
@@ -212,9 +213,6 @@ _작업 큐_ 잡은 `.spec.completions` 를 설정하지 않은 상태로 두고
|
||||
해당 시간 동안 잡에 대한 다른 파드가 실패 없이 성공했을 때 백 오프
|
||||
카운트가 재설정된다.
|
||||
|
||||
{{< note >}}
|
||||
1.12 이전 버전의 쿠버네티스 버전에 대해 여전히 [#54870](https://github.com/kubernetes/kubernetes/issues/54870) 이슈가 있다.
|
||||
{{< /note >}}
|
||||
{{< note >}}
|
||||
만약 잡에 `restartPolicy = "OnFailure"` 가 있는 경우 잡 백오프 한계에
|
||||
도달하면 잡을 실행 중인 컨테이너가 종료된다. 이로 인해 잡 실행 파일의 디버깅이
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: 레플리카셋
|
||||
content_type: concept
|
||||
weight: 10
|
||||
weight: 20
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
@@ -241,9 +241,10 @@ API 버전에 대해서는 `frontend.yaml` 예제의 첫 번째 줄을 참고한
|
||||
`.spec.selector` 필드는 [레이블 셀렉터](/ko/docs/concepts/overview/working-with-objects/labels/)이다.
|
||||
[앞서](#레플리카-셋의-작동-방식) 논의한 것처럼 이 레이블은 소유될 가능성이 있는 파드를 식별하는데 사용된다.
|
||||
우리 `frontend.yaml` 예제에서의 셀렉터는 다음과 같다.
|
||||
```shell
|
||||
|
||||
```yaml
|
||||
matchLabels:
|
||||
tier: frontend
|
||||
tier: frontend
|
||||
```
|
||||
|
||||
레플리카셋에서 `.spec.template.metadata.labels`는 `spec.selector`과 일치해야 하며
|
||||
|
||||
@@ -7,7 +7,7 @@ feature:
|
||||
오류가 발생한 컨테이너를 재시작하고, 노드가 죽었을 때 컨테이너를 교체하기 위해 다시 스케줄하고, 사용자 정의 상태 체크에 응답하지 않는 컨테이너를 제거하며, 서비스를 제공할 준비가 될 때까지 클라이언트에 해당 컨테이너를 알리지 않는다.
|
||||
|
||||
content_type: concept
|
||||
weight: 20
|
||||
weight: 90
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
@@ -112,20 +112,20 @@ nginx-3ntk0 nginx-4ok8v nginx-qrm3m
|
||||
다른 모든 쿠버네티스 컨피그와 마찬가지로 레플리케이션 컨트롤러는 `apiVersion`, `kind`, `metadata` 와 같은 필드가 필요하다.
|
||||
레플리케이션 컨트롤러 오브젝트의 이름은 유효한
|
||||
[DNS 서브도메인 이름](/ko/docs/concepts/overview/working-with-objects/names/#dns-서브도메인-이름)이어야 한다.
|
||||
컨피그 파일의 동작에 관련된 일반적인 정보는 다음을 참조하라 [쿠버네티스 오브젝트 관리 ](/ko/docs/concepts/overview/working-with-objects/object-management/).
|
||||
컨피그 파일의 동작에 관련된 일반적인 정보는 [쿠버네티스 오브젝트 관리](/ko/docs/concepts/overview/working-with-objects/object-management/)를 참고한다.
|
||||
|
||||
레플리케이션 컨트롤러는 또한 [`.spec` section](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status) 도 필요하다.
|
||||
레플리케이션 컨트롤러는 또한 [`.spec` section](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status)도 필요하다.
|
||||
|
||||
### 파드 템플릿
|
||||
|
||||
`.spec.template` 는 오직 `.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`를 갖지 않는다.
|
||||
|
||||
파드에 필요한 필드 외에도 레플리케이션 컨트롤러의 파드 템플릿은 적절한 레이블과 적절한 재시작 정책을 지정해야 한다. 레이블의 경우 다른 컨트롤러와
|
||||
중첩되지 않도록 하라. [파드 셀렉터](#파드-셀렉터)를 참조하라.
|
||||
|
||||
오직 `Always` 와 동일한 [`.spec.template.spec.restartPolicy`](/ko/docs/concepts/workloads/pods/pod-lifecycle/#재시작-정책) 만 허용되며, 특별히 지정되지 않으면 기본값이다.
|
||||
오직 `Always` 와 동일한 [`.spec.template.spec.restartPolicy`](/ko/docs/concepts/workloads/pods/pod-lifecycle/#재시작-정책)만 허용되며, 특별히 지정되지 않으면 기본값이다.
|
||||
|
||||
로컬 컨테이너의 재시작의 경우, 레플리케이션 컨트롤러는 노드의 에이전트에게 위임한다.
|
||||
예를 들어 [Kubelet](/docs/reference/command-line-tools-reference/kubelet/) 혹은 도커이다.
|
||||
@@ -139,7 +139,7 @@ nginx-3ntk0 nginx-4ok8v nginx-qrm3m
|
||||
|
||||
### 파드 셀렉터
|
||||
|
||||
`.spec.selector` 필드는 [레이블 셀렉터](/ko/docs/concepts/overview/working-with-objects/labels/#레이블-셀렉터) 이다. 레플리케이션 컨트롤러는 셀렉터와 일치하는 레이블이 있는 모든 파드를 관리한다.
|
||||
`.spec.selector` 필드는 [레이블 셀렉터](/ko/docs/concepts/overview/working-with-objects/labels/#레이블-셀렉터)이다. 레플리케이션 컨트롤러는 셀렉터와 일치하는 레이블이 있는 모든 파드를 관리한다.
|
||||
직접 생성하거나 삭제된 파드와 다른 사람이나 프로세스가 생성하거나
|
||||
삭제한 파드를 구분하지 않는다. 이렇게 하면 실행중인 파드에 영향을 주지 않고
|
||||
레플리케이션 컨트롤러를 교체할 수 있다.
|
||||
@@ -181,14 +181,14 @@ REST API나 go 클라이언트 라이브러리를 사용하는 경우 명시적
|
||||
|
||||
해당 파드에 영향을 주지 않고 레플리케이션 컨트롤러를 삭제할 수 있다.
|
||||
|
||||
kubectl을 사용하여, [`kubectl delete`](/docs/reference/generated/kubectl/kubectl-commands#delete) 에 옵션으로 `--cascade=false`를 지정하라.
|
||||
kubectl을 사용하여, [`kubectl delete`](/docs/reference/generated/kubectl/kubectl-commands#delete)에 옵션으로 `--cascade=false`를 지정하라.
|
||||
|
||||
REST API나 go 클라이언트 라이브러리를 사용하는 경우 간단히 레플리케이션 컨트롤러 오브젝트를 삭제하라.
|
||||
|
||||
원본이 삭제되면 대체할 새로운 레플리케이션 컨트롤러를 생성하여 교체할 수 있다. 오래된 파드와 새로운 파드의 `.spec.selector` 가 동일하다면,
|
||||
새로운 레플리케이션 컨트롤러는 오래된 파드를 채택할 것이다. 그러나 기존 파드를
|
||||
새로운 파드 템플릿과 일치시키려는 노력은 하지 않을 것이다.
|
||||
새로운 spec에 대한 파드를 제어된 방법으로 업데이트하려면 [롤링 업데이트](#롤링-업데이트) 를 사용하라.
|
||||
새로운 spec에 대한 파드를 제어된 방법으로 업데이트하려면 [롤링 업데이트](#롤링-업데이트)를 사용하라.
|
||||
|
||||
### 레플리케이션 컨트롤러에서 파드 격리
|
||||
|
||||
@@ -208,7 +208,7 @@ REST API나 go 클라이언트 라이브러리를 사용하는 경우 간단히
|
||||
|
||||
레플리케이션 컨트롤러는 파드를 하나씩 교체함으로써 서비스에 대한 롤링 업데이트를 쉽게 하도록 설계되었다.
|
||||
|
||||
[#1353](https://issue.k8s.io/1353) 에서 설명한 것처럼, 권장되는 접근법은 1 개의 레플리카를 가진 새로운 레플리케이션 컨트롤러를 생성하고 새로운 (+1) 컨트롤러 및 이전 (-1) 컨트롤러를 차례대로 스케일한 후 0개의 레플리카가 되면 이전 컨트롤러를 삭제하는 것이다. 예상치 못한 오류와 상관없이 파드 세트를 예측 가능하게 업데이트한다.
|
||||
[#1353](https://issue.k8s.io/1353)에서 설명한 것처럼, 권장되는 접근법은 1 개의 레플리카를 가진 새로운 레플리케이션 컨트롤러를 생성하고 새로운 (+1) 컨트롤러 및 이전 (-1) 컨트롤러를 차례대로 스케일한 후 0개의 레플리카가 되면 이전 컨트롤러를 삭제하는 것이다. 예상치 못한 오류와 상관없이 파드 세트를 예측 가능하게 업데이트한다.
|
||||
|
||||
이상적으로 롤링 업데이트 컨트롤러는 애플리케이션 준비 상태를 고려하며 주어진 시간에 충분한 수의 파드가 생산적으로 제공되도록 보장할 것이다.
|
||||
|
||||
@@ -229,15 +229,15 @@ REST API나 go 클라이언트 라이브러리를 사용하는 경우 간단히
|
||||
|
||||
## 레플리케이션을 위한 프로그램 작성
|
||||
|
||||
레플리케이션 컨트롤러에 의해 생성된 파드는 해당 구성이 시간이 지남에 따라 이질적이 될 수 있지만 균일하고 의미상 동일하도록 설계되었다. 이는 레플리카된 상태 스테이트리스 서버에 적합하지만 레플리케이션 컨트롤러를 사용하여 마스터 선출, 샤드 및 워크-풀 애플리케이션의 가용성을 유지할 수도 있다. [RabbitMQ work queues](https://www.rabbitmq.com/tutorials/tutorial-two-python.html) 와 같은 애플리케이션은 안티패턴으로 간주되는 각 파드의 구성에 대한 정적/일회성 사용자 정의와 반대로 동적 작업 할당 메커니즘을 사용해야 한다. 리소스의 수직 자동 크기 조정 (예 : CPU 또는 메모리)과 같은 수행된 모든 파드 사용자 정의는 레플리케이션 컨트롤러 자체와 달리 다른 온라인 컨트롤러 프로세스에 의해 수행되어야 한다.
|
||||
레플리케이션 컨트롤러에 의해 생성된 파드는 해당 구성이 시간이 지남에 따라 이질적이 될 수 있지만 균일하고 의미상 동일하도록 설계되었다. 이는 레플리카된 상태 스테이트리스 서버에 적합하지만 레플리케이션 컨트롤러를 사용하여 마스터 선출, 샤드 및 워크-풀 애플리케이션의 가용성을 유지할 수도 있다. [RabbitMQ work queues](https://www.rabbitmq.com/tutorials/tutorial-two-python.html)와 같은 애플리케이션은 안티패턴으로 간주되는 각 파드의 구성에 대한 정적/일회성 사용자 정의와 반대로 동적 작업 할당 메커니즘을 사용해야 한다. 리소스의 수직 자동 크기 조정 (예 : CPU 또는 메모리)과 같은 수행된 모든 파드 사용자 정의는 레플리케이션 컨트롤러 자체와 달리 다른 온라인 컨트롤러 프로세스에 의해 수행되어야 한다.
|
||||
|
||||
## 레플리케이션 컨트롤러의 책임
|
||||
|
||||
레플리케이션 컨트롤러는 의도한 수의 파드가 해당 레이블 선택기와 일치하고 동작하는지를 단순히 확인한다. 현재, 종료된 파드만 해당 파드의 수에서 제외된다. 향후 시스템에서 사용할 수 있는 [readiness](https://issue.k8s.io/620) 및 기타 정보가 고려될 수 있으며 교체 정책에 대한 통제를 더 추가 할 수 있고 외부 클라이언트가 임의로 정교한 교체 또는 스케일 다운 정책을 구현하기 위해 사용할 수 있는 이벤트를 내보낼 계획이다.
|
||||
|
||||
레플리케이션 컨트롤러는 이 좁은 책임에 영원히 제약을 받는다. 그 자체로는 준비성 또는 활성 프로브를 실행하지 않을 것이다. 오토 스케일링을 수행하는 대신, 외부 오토 스케일러 ([#492](https://issue.k8s.io/492)에서 논의된) 가 레플리케이션 컨트롤러의 `replicas` 필드를 변경함으로써 제어되도록 의도되었다. 레플리케이션 컨트롤러에 스케줄링 정책 (예를 들어 [spreading](https://issue.k8s.io/367#issuecomment-48428019)) 을 추가하지 않을 것이다. 오토사이징 및 기타 자동화 된 프로세스를 방해할 수 있으므로 제어된 파드가 현재 지정된 템플릿과 일치하는지 확인해야 한다. 마찬가지로 기한 완료, 순서 종속성, 구성 확장 및 기타 기능은 다른 곳에 속한다. 대량의 파드 생성 메커니즘 ([#170](https://issue.k8s.io/170)) 까지도 고려해야 한다.
|
||||
레플리케이션 컨트롤러는 이 좁은 책임에 영원히 제약을 받는다. 그 자체로는 준비성 또는 활성 프로브를 실행하지 않을 것이다. 오토 스케일링을 수행하는 대신, 외부 오토 스케일러 ([#492](https://issue.k8s.io/492)에서 논의된)가 레플리케이션 컨트롤러의 `replicas` 필드를 변경함으로써 제어되도록 의도되었다. 레플리케이션 컨트롤러에 스케줄링 정책 (예를 들어 [spreading](https://issue.k8s.io/367#issuecomment-48428019))을 추가하지 않을 것이다. 오토사이징 및 기타 자동화 된 프로세스를 방해할 수 있으므로 제어된 파드가 현재 지정된 템플릿과 일치하는지 확인해야 한다. 마찬가지로 기한 완료, 순서 종속성, 구성 확장 및 기타 기능은 다른 곳에 속한다. 대량의 파드 생성 메커니즘 ([#170](https://issue.k8s.io/170))까지도 고려해야 한다.
|
||||
|
||||
레플리케이션 컨트롤러는 조합 가능한 빌딩-블록 프리미티브가 되도록 고안되었다. 향후 사용자의 편의를 위해 더 상위 수준의 API 및/또는 도구와 그리고 다른 보완적인 기본 요소가 그 위에 구축 될 것으로 기대한다. 현재 kubectl이 지원하는 "매크로" 작업 (실행, 스케일)은 개념 증명의 예시이다. 예를 들어 [Asgard](https://techblog.netflix.com/2012/06/asgard-web-based-cloud-management-and.html) 와 같이 레플리케이션 컨트롤러, 오토 스케일러, 서비스, 정책 스케줄링, 카나리 등을 관리할 수 있다.
|
||||
레플리케이션 컨트롤러는 조합 가능한 빌딩-블록 프리미티브가 되도록 고안되었다. 향후 사용자의 편의를 위해 더 상위 수준의 API 및/또는 도구와 그리고 다른 보완적인 기본 요소가 그 위에 구축 될 것으로 기대한다. 현재 kubectl이 지원하는 "매크로" 작업 (실행, 스케일)은 개념 증명의 예시이다. 예를 들어 [Asgard](https://techblog.netflix.com/2012/06/asgard-web-based-cloud-management-and.html)와 같이 레플리케이션 컨트롤러, 오토 스케일러, 서비스, 정책 스케줄링, 카나리 등을 관리할 수 있다.
|
||||
|
||||
|
||||
## API 오브젝트
|
||||
@@ -250,14 +250,14 @@ API 오브젝트에 대한 더 자세한 것은
|
||||
|
||||
### 레플리카셋
|
||||
|
||||
[`레플리카셋`](/ko/docs/concepts/workloads/controllers/replicaset/)은 새로운 [집합성 기준 레이블 셀렉터](/ko/docs/concepts/overview/working-with-objects/labels/#집합성-기준-요건) 이다.
|
||||
이것은 주로 [`디플로이먼트`](/ko/docs/concepts/workloads/controllers/deployment/) 에 의해 파드의 생성, 삭제 및 업데이트를 오케스트레이션 하는 메커니즘으로 사용된다.
|
||||
[`ReplicaSet`](/ko/docs/concepts/workloads/controllers/replicaset/)은 새로운 [집합성 기준 레이블 셀렉터](/ko/docs/concepts/overview/working-with-objects/labels/#집합성-기준-요건)이다.
|
||||
이것은 주로 [디플로이먼트](/ko/docs/concepts/workloads/controllers/deployment/)에 의해 파드의 생성, 삭제 및 업데이트를 오케스트레이션 하는 메커니즘으로 사용된다.
|
||||
사용자 지정 업데이트 조정이 필요하거나 업데이트가 필요하지 않은 경우가 아니면 레플리카셋을 직접 사용하는 대신 디플로이먼트를 사용하는 것이 좋다.
|
||||
|
||||
|
||||
### 디플로이먼트 (권장되는)
|
||||
|
||||
[`디플로이먼트`](/ko/docs/concepts/workloads/controllers/deployment/) 는 기본 레플리카셋과 그 파드를 업데이트하는 상위 수준의 API 오브젝트이다. 선언적이며, 서버 사이드이고, 추가 기능이 있기 때문에 롤링 업데이트 기능을 원한다면 디플로이먼트를 권장한다.
|
||||
[`Deployment`](/ko/docs/concepts/workloads/controllers/deployment/)는 기본 레플리카셋과 그 파드를 업데이트하는 상위 수준의 API 오브젝트이다. 선언적이며, 서버 사이드이고, 추가 기능이 있기 때문에 롤링 업데이트 기능을 원한다면 디플로이먼트를 권장한다.
|
||||
|
||||
### 베어 파드
|
||||
|
||||
@@ -266,12 +266,12 @@ API 오브젝트에 대한 더 자세한 것은
|
||||
### 잡
|
||||
|
||||
자체적으로 제거될 것으로 예상되는 파드 (즉, 배치 잡)의 경우
|
||||
레플리케이션 컨트롤러 대신 [`잡`](/ko/docs/concepts/workloads/controllers/job/)을 사용하라.
|
||||
레플리케이션 컨트롤러 대신 [`Job`](/ko/docs/concepts/workloads/controllers/job/)을 사용하라.
|
||||
|
||||
### 데몬셋
|
||||
|
||||
머신 모니터링이나 머신 로깅과 같은 머신 레벨 기능을 제공하는 파드에는 레플리케이션 컨트롤러 대신
|
||||
[`데몬셋`](/ko/docs/concepts/workloads/controllers/daemonset/)을 사용하라. 이런 파드들의 수명은 머신의 수명에 달려 있다.
|
||||
[`DaemonSet`](/ko/docs/concepts/workloads/controllers/daemonset/)을 사용하라. 이런 파드들의 수명은 머신의 수명에 달려 있다.
|
||||
다른 파드가 시작되기 전에 파드가 머신에서 실행되어야 하며,
|
||||
머신이 재부팅/종료 준비가 되어 있을 때 안전하게 종료된다.
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: 스테이트풀셋
|
||||
content_type: concept
|
||||
weight: 40
|
||||
weight: 30
|
||||
---
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
@@ -255,7 +255,7 @@ kubelet은 자동으로 각 정적 파드에 대한 쿠버네티스 API 서버
|
||||
* [런타임클래스(RuntimeClass)](/ko/docs/concepts/containers/runtime-class/)와 이를 사용하여
|
||||
다양한 컨테이너 런타임 구성으로 다양한 파드를 설정하는 방법에 대해 알아본다.
|
||||
* [파드 토폴로지 분배 제약 조건](/ko/docs/concepts/workloads/pods/pod-topology-spread-constraints/)에 대해 읽어본다.
|
||||
* [PodDisruptionBudget](https://kubernetes.io/ko/docs/concepts/workloads/pods/disruptions/)과 이를 사용하여 서비스 중단 중에 애플리케이션 가용성을 관리하는 방법에 대해 읽어본다.
|
||||
* [PodDisruptionBudget](/ko/docs/concepts/workloads/pods/disruptions/)과 이를 사용하여 서비스 중단 중에 애플리케이션 가용성을 관리하는 방법에 대해 읽어본다.
|
||||
* 파드는 쿠버네티스 REST API의 최상위 리소스이다.
|
||||
[파드](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#pod-v1-core)
|
||||
오브젝트 정의는 오브젝트를 상세히 설명한다.
|
||||
|
||||
@@ -45,7 +45,7 @@ ID([UID](/ko/docs/concepts/overview/working-with-objects/names/#uids))가
|
||||
상대적으로 일회용인 파드 인스턴스를 관리하는 작업을 처리한다.
|
||||
|
||||
UID로 정의된 특정 파드는 다른 노드로 절대 "다시 스케줄"되지 않는다. 대신,
|
||||
해당 파드는 사용자가 원하는 이름은 같지만, UID가 다른, 거의 동일한 새 파드로
|
||||
해당 파드는 사용자가 원한다면 이름은 같지만, UID가 다른, 거의 동일한 새 파드로
|
||||
대체될 수 있다.
|
||||
|
||||
{{< glossary_tooltip term_id="volume" text="볼륨" >}}과
|
||||
@@ -118,7 +118,7 @@ UID로 정의된 특정 파드는 다른 노드로 절대 "다시 스케줄"되
|
||||
### `Running` {#container-state-running}
|
||||
|
||||
`Running` 상태는 컨테이너가 문제없이 실행되고 있음을 나타낸다. `postStart` 훅이
|
||||
구성되어 있었다면, 이미 실행이 완료되었다. `kubectl` 을
|
||||
구성되어 있었다면, 이미 실행되고 완료되었다. `kubectl` 을
|
||||
사용하여 컨테이너가 `Running` 인 파드를 쿼리하면, 컨테이너가 `Running` 상태에 진입한 시기에 대한
|
||||
정보도 볼 수 있다.
|
||||
|
||||
@@ -341,7 +341,7 @@ kubelet은 실행 중인 컨테이너들에 대해서 선택적으로 세 가지
|
||||
적용되면, {{< glossary_tooltip text="kubelet" term_id="kubelet" >}}은 정상
|
||||
종료를 시도한다.
|
||||
|
||||
일반적으로, 컨테이너 런타임은 TERM 시그널을 각 컨테이너의 기본 프로세스로
|
||||
일반적으로, 컨테이너 런타임은 각 컨테이너의 기본 프로세스에 TERM 신호를
|
||||
전송한다. 일단 유예 기간이 만료되면, KILL 시그널이 나머지 프로세스로
|
||||
전송되고, 그런 다음 파드는
|
||||
{{< glossary_tooltip text="API 서버" term_id="kube-apiserver" >}}로부터 삭제된다. 프로세스가
|
||||
|
||||
@@ -6,8 +6,6 @@ weight: 40
|
||||
|
||||
<!-- overview -->
|
||||
|
||||
{{< feature-state for_k8s_version="v1.18" state="beta" >}}
|
||||
|
||||
사용자는 _토폴로지 분배 제약 조건_ 을 사용해서 지역, 영역, 노드 그리고 기타 사용자-정의 토폴로지 도메인과 같이 장애-도메인으로 설정된 클러스터에 걸쳐 파드가 분산되는 방식을 제어할 수 있다. 이를 통해 고가용성뿐만 아니라, 효율적인 리소스 활용의 목적을 이루는 데 도움이 된다.
|
||||
|
||||
|
||||
@@ -16,13 +14,6 @@ weight: 40
|
||||
|
||||
## 필수 구성 요소
|
||||
|
||||
### 기능 게이트 활성화
|
||||
|
||||
를 참조한다. {{< glossary_tooltip text="API 서버" term_id="kube-apiserver" >}} **와**
|
||||
{{< glossary_tooltip text="스케줄러" term_id="kube-scheduler" >}}에 대해
|
||||
`EvenPodsSpread` [기능 게이트](/ko/docs/reference/command-line-tools-reference/feature-gates/)가
|
||||
활성화되어야 한다.
|
||||
|
||||
### 노드 레이블
|
||||
|
||||
토폴로지 분배 제약 조건은 노드 레이블을 의지해서 각 노드가 속한 토폴로지 도메인(들)을 인식한다. 예를 들어, 노드에 다음과 같은 레이블을 가지고 있을 수 있다. `node=node1,zone=us-east-1a,region=us-east-1`
|
||||
@@ -53,7 +44,7 @@ node4 Ready <none> 2m43s v1.16.0 node=node4,zone=zoneB
|
||||
|
||||
### API
|
||||
|
||||
`pod.spec.topologySpreadConstraints` 필드는 1.16에서 다음과 같이 도입되었다.
|
||||
API 필드 `pod.spec.topologySpreadConstraints` 는 다음과 같이 정의된다.
|
||||
|
||||
```
|
||||
apiVersion: v1
|
||||
@@ -70,7 +61,15 @@ spec:
|
||||
|
||||
사용자는 하나 또는 다중 `topologySpreadConstraint` 를 정의해서 kube-scheduler 에게 클러스터에 걸쳐 있는 기존 파드와 시작하는 각각의 파드와 연관하여 배치하는 방법을 명령할 수 있다. 필드는 다음과 같다.
|
||||
|
||||
- **maxSkew** 는 파드가 균등하지 않게 분산될 수 있는 정도를 나타낸다. 이것은 주어진 토폴로지 유형의 임의의 두 토폴로지 도메인에 일치하는 파드의 수 사이에서 허용되는 차이의 최댓값이다. 이것은 0보다는 커야 한다.
|
||||
- **maxSkew** 는 파드가 균등하지 않게 분산될 수 있는 정도를 나타낸다.
|
||||
이것은 주어진 토폴로지 유형의 임의의 두 토폴로지 도메인에 일치하는
|
||||
파드의 수 사이에서 허용되는 차이의 최댓값이다. 이것은 0보다는 커야
|
||||
한다. 그 의미는 `whenUnsatisfiable` 의 값에 따라 다르다.
|
||||
- `whenUnsatisfiable` 이 "DoNotSchedule"과 같을 때, `maxSkew` 는
|
||||
대상 토폴로지에서 일치하는 파드 수와 전역 최솟값 사이에
|
||||
허용되는 최대 차이이다.
|
||||
- `whenUnsatisfiable` 이 "ScheduleAnyway"와 같으면, 스케줄러는
|
||||
왜곡을 줄이는데 도움이 되는 토폴로지에 더 높은 우선 순위를 부여한다.
|
||||
- **topologyKey** 는 노드 레이블의 키다. 만약 두 노드가 이 키로 레이블이 지정되고, 레이블이 동일한 값을 가진다면 스케줄러는 두 노드를 같은 토폴로지에 있는것으로 여기게 된다. 스케줄러는 각 토폴로지 도메인에 균형잡힌 수의 파드를 배치하려고 시도한다.
|
||||
- **whenUnsatisfiable** 는 분산 제약 조건을 만족하지 않을 경우에 처리하는 방법을 나타낸다.
|
||||
- `DoNotSchedule` (기본값)은 스케줄러에 스케줄링을 하지 말라고 알려준다.
|
||||
@@ -186,7 +185,7 @@ spec:
|
||||
|
||||
### 클러스터 수준의 기본 제약 조건
|
||||
|
||||
{{< feature-state for_k8s_version="v1.18" state="alpha" >}}
|
||||
{{< feature-state for_k8s_version="v1.19" state="beta" >}}
|
||||
|
||||
클러스터에 대한 기본 토폴로지 분배 제약 조건을 설정할 수 있다. 기본
|
||||
토폴로지 분배 제약 조건은 다음과 같은 경우에만 파드에 적용된다.
|
||||
@@ -194,7 +193,7 @@ spec:
|
||||
- `.spec.topologySpreadConstraints` 에는 어떠한 제약도 정의되어 있지 않는 경우.
|
||||
- 서비스, 레플리케이션컨트롤러(ReplicationController), 레플리카셋(ReplicaSet) 또는 스테이트풀셋(StatefulSet)에 속해있는 경우.
|
||||
|
||||
기본 제약 조건은 [스케줄링 프로파일](/docs/reference/scheduling/profiles)에서
|
||||
기본 제약 조건은 [스케줄링 프로파일](/docs/reference/scheduling/config/#profiles)에서
|
||||
`PodTopologySpread` 플러그인의 일부로 설정할 수 있다.
|
||||
제약 조건은 `labelSelector` 가 비어 있어야 한다는 점을 제외하고, [위와 동일한 API](#api)로
|
||||
제약 조건을 지정한다. 셀렉터는 파드가 속한 서비스, 레플리케이션 컨트롤러,
|
||||
@@ -203,7 +202,7 @@ spec:
|
||||
예시 구성은 다음과 같다.
|
||||
|
||||
```yaml
|
||||
apiVersion: kubescheduler.config.k8s.io/v1alpha2
|
||||
apiVersion: kubescheduler.config.k8s.io/v1beta1
|
||||
kind: KubeSchedulerConfiguration
|
||||
|
||||
profiles:
|
||||
@@ -212,18 +211,49 @@ profiles:
|
||||
args:
|
||||
defaultConstraints:
|
||||
- maxSkew: 1
|
||||
topologyKey: failure-domain.beta.kubernetes.io/zone
|
||||
topologyKey: topology.kubernetes.io/zone
|
||||
whenUnsatisfiable: ScheduleAnyway
|
||||
```
|
||||
|
||||
{{< note >}}
|
||||
기본 스케줄링 제약 조건에 의해 생성된 점수는
|
||||
[`DefaultPodTopologySpread` 플러그인](/docs/reference/scheduling/profiles/#scheduling-plugins)에
|
||||
[`SelectorSpread` 플러그인](/docs/reference/scheduling/config/#scheduling-plugins)에
|
||||
의해 생성된 점수와 충돌 할 수 있다.
|
||||
`PodTopologySpread` 에 대한 기본 제약 조건을 사용할 때 스케줄링 프로파일에서
|
||||
이 플러그인을 비활성화 하는 것을 권장한다.
|
||||
{{< /note >}}
|
||||
|
||||
#### 내부 기본 제약
|
||||
|
||||
{{< feature-state for_k8s_version="v1.19" state="alpha" >}}
|
||||
|
||||
`DefaultPodTopologySpread` 기능 게이트를 활성화하면, 기존
|
||||
`SelectorSpread` 플러그인이 비활성화된다.
|
||||
kube-scheduler는 `PodTopologySpread` 플러그인 구성에 다음과 같은
|
||||
기본 토폴로지 제약 조건을 사용한다.
|
||||
|
||||
```yaml
|
||||
defaultConstraints:
|
||||
- maxSkew: 3
|
||||
topologyKey: "kubernetes.io/hostname"
|
||||
whenUnsatisfiable: ScheduleAnyway
|
||||
- maxSkew: 5
|
||||
topologyKey: "topology.kubernetes.io/zone"
|
||||
whenUnsatisfiable: ScheduleAnyway
|
||||
```
|
||||
|
||||
또한, 같은 동작을 제공하는 레거시 `SelectorSpread` 플러그인이
|
||||
비활성화된다.
|
||||
|
||||
{{< note >}}
|
||||
노드에 `kubernetes.io/hostname` 및 `topology.kubernetes.io/zone`
|
||||
레이블 세트 **둘 다**가 설정되지 않을 것으로 예상되는 경우, 쿠버네티스 기본값을 사용하는
|
||||
대신 자체 제약 조건을 정의한다.
|
||||
|
||||
`PodTopologySpread` 플러그인은 분배 제약 조건에 지정된 토폴로지 키가
|
||||
없는 노드에 점수를 매기지 않는다.
|
||||
{{< /note >}}
|
||||
|
||||
## 파드어피니티(PodAffinity)/파드안티어피니티(PodAntiAffinity)와의 비교
|
||||
|
||||
쿠버네티스에서 "어피니티(Affinity)"와 관련된 지침은 파드가
|
||||
@@ -234,13 +264,19 @@ profiles:
|
||||
- `PodAntiAffinity` 로는, 단일 토폴로지 도메인에
|
||||
단 하나의 파드만 스케줄 될 수 있다.
|
||||
|
||||
"EvenPodsSpread" 기능은 다양한 토폴로지 도메인에 파드를 균등하게 분배해서
|
||||
고 가용성 또는 비용 절감을 달성할 수 있는 유연한 옵션을 제공한다. 또한 워크로드의 롤링 업데이트와 레플리카의 원활한 스케일링 아웃에 도움이 될 수 있다.
|
||||
더 자세한 내용은 [모티베이션(Motivation)](https://github.com/kubernetes/enhancements/tree/master/keps/sig-scheduling/895-pod-topology-spread#motivation)를 참조한다.
|
||||
더 세밀한 제어를 위해, 토폴로지 분배 제약 조건을 지정하여 다양한 토폴로지 도메인에 파드를
|
||||
분배해서 고 가용성 또는 비용 절감을 달성할 수 있는 유연한 옵션을
|
||||
제공한다. 또한 워크로드의 롤링 업데이트와 레플리카의 원활한 스케일링 아웃에 도움이 될 수 있다.
|
||||
더 자세한 내용은
|
||||
[모티베이션(Motivation)](https://github.com/kubernetes/enhancements/tree/master/keps/sig-scheduling/895-pod-topology-spread#motivation)를
|
||||
참고한다.
|
||||
|
||||
## 알려진 제한사항
|
||||
|
||||
1.18을 기준으로 이 기능은 베타(Beta)이며, 몇 가지 알려진 제한사항이 있다.
|
||||
|
||||
- 디플로이먼트를 스케일링 다운하면 그 결과로 파드의 분포가 불균형이 될 수 있다.
|
||||
- 파드와 일치하는 테인트(taint)가 된 노드가 존중된다. [이슈 80921](https://github.com/kubernetes/kubernetes/issues/80921)을 본다.
|
||||
|
||||
## {{% heading "whatsnext" %}}
|
||||
|
||||
- [블로그: PodTopologySpread 소개](https://kubernetes.io/blog/2020/05/introducing-podtopologyspread/)에서는
|
||||
`maxSkew` 에 대해 자세히 설명하고, 몇 가지 고급 사용 예제를 제공한다.
|
||||
|
||||
Reference in New Issue
Block a user