Merge sixth Korean l10n work for release 1.17 (#19615)
* Link modify to new docs added from previous branch. (#19374) * Localize email address placeholder (ko) (#19407) * Translate storage/volume-snapshot-classes.md in Korean. (#19371) * Translate concepts/security/overview.md in Korean (#19464) * Translate storage/volume-pvc-datasource.md in Korean. (#19370) * Translate controllers/jobs-run-to-completion.md in Korean. (#19369) Co-authored-by: Ian Y. Choi <ianyrchoi@gmail.com> Co-authored-by: Jesang Myung <jesang.myung@gmail.com> Co-authored-by: Seokho Son <shsongist@gmail.com> Co-authored-by: Yuk, Yongsu <ysyukr@gmail.com> Co-authored-by: Ryan <c1t1d0s7@gmail.com> Co-authored-by: Tim Bannister <tim@scalefactory.com> Co-authored-by: Yuk, Yongsu <ysyukr@gmail.com> Co-authored-by: Ian Y. Choi <ianyrchoi@gmail.com> Co-authored-by: Jesang Myung <jesang.myung@gmail.com> Co-authored-by: Seokho Son <shsongist@gmail.com> Co-authored-by: Ryan <c1t1d0s7@gmail.com> Co-authored-by: Tim Bannister <tim@scalefactory.com>pull/19622/head
parent
4af7b0f5bd
commit
3a3d25736a
|
@ -32,7 +32,7 @@ weight: 40
|
|||
|
||||
* [파드](/ko/docs/concepts/workloads/pods/pod-overview/)
|
||||
* [서비스](/ko/docs/concepts/services-networking/service/)
|
||||
* [볼륨](/docs/concepts/storage/volumes/)
|
||||
* [볼륨](/ko/docs/concepts/storage/volumes/)
|
||||
* [네임스페이스](/ko/docs/concepts/overview/working-with-objects/namespaces/)
|
||||
|
||||
또한, 쿠버네티스에는 기초 오브젝트를 기반으로, 부가 기능 및 편의 기능을 제공하는 [컨트롤러](/ko/docs/concepts/architecture/controller/)에 의존하는 보다 높은 수준의 추상 개념도 포함되어 있다. 다음이 포함된다.
|
||||
|
|
|
@ -52,7 +52,7 @@ CCM은 쿠버네티스 컨트롤러 매니저(KCM)의 기능 일부를 독립시
|
|||
볼륨 컨트롤러는 의도적으로 CCM의 일부가 되지 않도록 선택되었다. 연관된 복잡성 때문에 그리고 벤더 특유의 볼륨 로직 개념을 일반화 하기 위한 기존의 노력때문에, 볼륨 컨트롤러는 CCM으로 이전되지 않도록 결정되었다.
|
||||
{{< /note >}}
|
||||
|
||||
CCM을 이용하는 볼륨을 지원하기 위한 원래 계획은 플러그형 볼륨을 지원하기 위한 [Flex](/docs/concepts/storage/volumes/#flexVolume) 볼륨을 사용하기 위한 것이었다. 그러나, [CSI](/docs/concepts/storage/volumes/#csi)라 알려진 경쟁적인 노력이 Flex를 대체하도록 계획되고 있다.
|
||||
CCM을 이용하는 볼륨을 지원하기 위한 원래 계획은 플러그형 볼륨을 지원하기 위한 [Flex](/ko/docs/concepts/storage/volumes/#flexVolume) 볼륨을 사용하기 위한 것이었다. 그러나, [CSI](/ko/docs/concepts/storage/volumes/#csi)라 알려진 경쟁적인 노력이 Flex를 대체하도록 계획되고 있다.
|
||||
|
||||
이러한 역동성을 고려하여, CSI가 준비될 때까지 차이점에 대한 측정은 도중에 중지하기로 결정하였다.
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ weight: 20
|
|||
|
||||
쿠버네티스 컨테이너 환경은 컨테이너에 몇 가지 중요한 리소스를 제공한다.
|
||||
|
||||
* 하나의 [이미지](/ko/docs/concepts/containers/images/)와 하나 이상의 [볼륨](/docs/concepts/storage/volumes/)이 결합된 파일 시스템.
|
||||
* 하나의 [이미지](/ko/docs/concepts/containers/images/)와 하나 이상의 [볼륨](/ko/docs/concepts/storage/volumes/)이 결합된 파일 시스템.
|
||||
* 컨테이너 자신에 대한 정보.
|
||||
* 클러스터 내의 다른 오브젝트에 대한 정보.
|
||||
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: "보안"
|
||||
weight: 81
|
||||
---
|
|
@ -0,0 +1,161 @@
|
|||
---
|
||||
title: 클라우드 네이티브 보안 개요
|
||||
content_template: templates/concept
|
||||
weight: 1
|
||||
---
|
||||
|
||||
{{< toc >}}
|
||||
|
||||
{{% capture overview %}}
|
||||
쿠버네티스 보안(일반적인 보안)은 관련된 많은 부분이 상호작용하는
|
||||
방대한 주제다. 오늘날에는 웹 애플리케이션의 실행을 돕는
|
||||
수많은 시스템에 오픈소스 소프트웨어가 통합되어 있으며,
|
||||
전체적인 보안에 대하여 생각할 수 있는 방법에 대한 통찰력을 도울 수 있는
|
||||
몇 가지 중요한 개념이 있다. 이 가이드는 클라우드 네이티브 보안과 관련된
|
||||
몇 가지 일반적인 개념에 대한 멘탈 모델(mental model)을 정의한다. 멘탈 모델은 완전히 임의적이며
|
||||
소프트웨어 스택을 보호할 위치를 생각하는데 도움이되는 경우에만 사용해야
|
||||
한다.
|
||||
{{% /capture %}}
|
||||
|
||||
{{% capture body %}}
|
||||
|
||||
## 클라우드 네이티브 보안의 4C
|
||||
계층적인 보안에 대해서 어떻게 생각할 수 있는지 이해하는 데 도움이 될 수 있는 다이어그램부터 살펴보자.
|
||||
{{< note >}}
|
||||
이 계층화된 접근 방식은 보안에 대한 [심층 방어](https://en.wikipedia.org/wiki/Defense_in_depth_(computing))
|
||||
접근 방식을 강화하며, 소프트웨어 시스템의 보안을 위한 모범 사례로
|
||||
널리 알려져 있다. 4C는 클라우드(Cloud), 클러스터(Clusters), 컨테이너(Containers) 및 코드(Code)이다.
|
||||
{{< /note >}}
|
||||
|
||||
{{< figure src="/images/docs/4c.png" title="클라우드 네이티브 보안의 4C" >}}
|
||||
|
||||
|
||||
위 그림에서 볼 수 있듯이,
|
||||
4C는 각각의 사각형의 보안에 따라 다르다. 코드
|
||||
수준의 보안만 처리하여 클라우드, 컨테이너 및 코드의 열악한 보안 표준으로부터
|
||||
보호하는 것은 거의 불가능하다. 그러나 이런 영역들의 보안이 적절하게
|
||||
처리되고, 코드에 보안을 추가한다면 이미 강력한 기반이 더욱
|
||||
강화될 것이다. 이러한 관심 분야는 아래에서 더 자세히 설명한다.
|
||||
|
||||
## 클라우드
|
||||
|
||||
여러 면에서 클라우드(또는 공동 위치 서버, 또는 기업의 데이터 센터)는 쿠버네티스 클러스터 구성을 위한
|
||||
[신뢰 컴퓨팅 기반(trusted computing base)](https://en.wikipedia.org/wiki/Trusted_computing_base)
|
||||
이다. 이러한 구성 요소 자체가 취약하거나(또는 취약한 방법으로 구성된)
|
||||
경우 이 기반 위에서 구축된 모든 구성 요소의 보안을
|
||||
실제로 보장할 방법이 없다. 각 클라우드 공급자는 그들의 환경에서 워크로드를
|
||||
안전하게 실행하는 방법에 대해 고객에게 광범위한 보안 권장 사항을
|
||||
제공한다. 모든 클라우드 공급자와 워크로드는 다르기 때문에
|
||||
클라우드 보안에 대한 권장 사항을 제공하는 것은 이 가이드의 범위를 벗어난다. 다음은
|
||||
알려진 클라우드 공급자의 보안 문서의 일부와
|
||||
쿠버네티스 클러스터를 구성하기 위한 인프라
|
||||
보안에 대한 일반적인 지침을 제공한다.
|
||||
|
||||
### 클라우드 공급자 보안 표
|
||||
|
||||
|
||||
|
||||
IaaS 공급자 | 링크 |
|
||||
-------------------- | ------------ |
|
||||
Alibaba Cloud | https://www.alibabacloud.com/trust-center |
|
||||
Amazon Web Services | https://aws.amazon.com/security/ |
|
||||
Google Cloud Platform | https://cloud.google.com/security/ |
|
||||
IBM Cloud | https://www.ibm.com/cloud/security |
|
||||
Microsoft Azure | https://docs.microsoft.com/en-us/azure/security/azure-security |
|
||||
VMWare VSphere | https://www.vmware.com/security/hardening-guides.html |
|
||||
|
||||
|
||||
자체 하드웨어나 다른 클라우드 공급자를 사용하는 경우 보안에 대한
|
||||
모범 사례는 해당 문서를 참조한다.
|
||||
|
||||
### 일반적인 인프라 지침 표
|
||||
|
||||
쿠버네티스 인프라에서 고려할 영역 | 추천 |
|
||||
--------------------------------------------- | ------------ |
|
||||
API 서버에 대한 네트워크 접근(마스터) | 이상적으로는 인터넷에서 쿠버네티스 마스터에 대한 모든 접근을 공개적으로 허용하지 않으며 클러스터를 관리하는데 필요한 IP 주소 집합으로 제한된 네트워크 접근 제어 목록(ACL)에 의해 제어되어야 한다. |
|
||||
노드에 대한 네트워크 접근(워커 서버) | 노드는 마스터의 지정된 포트 연결_만_ 허용하고(네트워크 접근 제어 목록의 사용), NodePort와 LoadBalancer 유형의 쿠버네티스 서비스에 대한 연결을 허용하도록 구성해야 한다. 가능한 노드가 공용 인터넷에 완전히 노출되어서는 안된다.
|
||||
클라우드 공급자 API에 대한 쿠버네티스 접근 | 각 클라우드 공급자는 쿠버네티스 마스터 및 노드에 서로 다른 권한을 부여해야 함으로써, 이런 권장 사항이 더 일반적이다. 관리해야 하는 리소스에 대한 [최소 권한의 원칙](https://en.wikipedia.org/wiki/Principle_of_least_privilege)을 따르는 클라우드 공급자의 접근 권한을 클러스터에 구성하는 것이 가장 좋다. AWS의 Kops에 대한 예제: https://github.com/kubernetes/kops/blob/master/docs/iam_roles.md#iam-roles
|
||||
etcd에 대한 접근 | etcd (쿠버네티스의 데이터저장소)에 대한 접근은 마스터로만 제한되어야 한다. 구성에 따라 TLS를 통해 etcd를 사용해야 한다. 자세한 정보: https://github.com/etcd-io/etcd/tree/master/Documentation#security
|
||||
etcd 암호화 | 가능한 모든 드라이브를 유휴 상태에서 암호화 하는 것이 좋은 방법이지만, etcd는 전체 클러스터(시크릿 포함)의 상태를 유지하고 있기에 디스크의 암호화는 유휴 상태에서 암호화 되어야 한다.
|
||||
|
||||
## 클러스터
|
||||
|
||||
이 섹션에서는 쿠버네티스의 워크로드
|
||||
보안을 위한 링크를 제공한다. 쿠버네티스
|
||||
보안에 영향을 미치는 다음 두 가지 영역이 있다.
|
||||
|
||||
* 클러스터를 구성하는 설정 가능한 컴포넌트의 보안
|
||||
* 클러스터에서 실행되는 컴포넌트의 보안
|
||||
|
||||
### 클러스터_의_ 컴포넌트
|
||||
|
||||
우발적이거나 악의적인 접근으로부터 클러스터를 보호하고,
|
||||
모범 사례에 대한 정보를 채택하기 위해서는
|
||||
[클러스터 보안](/docs/tasks/administer-cluster/securing-a-cluster/)에 대한 조언을 읽고 따른다.
|
||||
|
||||
### 클러스터 _내_ 컴포넌트(애플리케이션)
|
||||
애플리케이션의 공격 영역에 따라, 보안의 특정 측면에
|
||||
중점을 둘 수 있다. 예를 들어, 다른 리소스 체인에 중요한 서비스(서비스 A)와
|
||||
리소스 소진 공격에 취약한 별도의 작업 부하(서비스 B)를 실행하는 경우,
|
||||
리소스 제한을 설정하지 않은 서비스 B에 의해
|
||||
서비스 A 또한 손상시킬 위험이 있다. 다음은 쿠버네티스에서
|
||||
실행 중인 워크로드를 보호할 때 고려해야 할 사항에 대한 링크 표이다.
|
||||
|
||||
워크로드 보안에서 고려할 영역 | 추천 |
|
||||
------------------------------ | ------------ |
|
||||
RBAC 인증(쿠버네티스 API에 대한 접근) | https://kubernetes.io/docs/reference/access-authn-authz/rbac/
|
||||
인증 | https://kubernetes.io/docs/reference/access-authn-authz/controlling-access/
|
||||
애플리케이션 시크릿 관리(및 유휴 상태에서의 etcd 암호화 등) | https://kubernetes.io/docs/concepts/configuration/secret/ <br> https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/
|
||||
파드 보안 정책 | https://kubernetes.io/docs/concepts/policy/pod-security-policy/
|
||||
서비스 품질(및 클러스터 리소스 관리) | https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/
|
||||
네트워크 정책 | https://kubernetes.io/ko/docs/concepts/services-networking/network-policies/
|
||||
쿠버네티스 인그레스를 위한 TLS | https://kubernetes.io/ko/docs/concepts/services-networking/ingress/#tls
|
||||
|
||||
|
||||
|
||||
## 컨테이너
|
||||
|
||||
쿠버네티스에서 소프트웨어를 실행하려면, 소프트웨어는 컨테이너에 있어야 한다. 이로 인해,
|
||||
쿠버네티스의 원시적인 워크로드 보안으로부터 이점을 얻기 위해서
|
||||
반드시 고려해야 할 보안 사항이 있다. 컨테이너 보안
|
||||
또한 이 가이드의 범위를 벗어나지만, 해당 주제에 대한 추가적인 설명을 위하여
|
||||
일반 권장사항 및 링크 표를 아래에 제공한다.
|
||||
|
||||
컨테이너에서 고려할 영역 | 추천 |
|
||||
------------------------------ | ------------ |
|
||||
컨테이너 취약점 스캔 및 OS에 종속적인 보안 | 이미지 빌드 단계의 일부 또는 정기적으로 [CoreOS의 Clair](https://github.com/coreos/clair/)와 같은 도구를 사용해서 컨테이너에 알려진 취약점이 있는지 검사한다.
|
||||
이미지 서명 및 시행 | 두 개의 다른 CNCF 프로젝트(TUF 와 Notary)는 컨테이너 이미지에 서명하고 컨테이너 내용에 대한 신뢰 시스템을 유지하는데 유용한 도구이다. 도커를 사용하는 경우 도커 엔진에 [도커 컨텐츠 신뢰](https://docs.docker.com/engine/security/trust/content_trust/)가 내장되어 있다. 시행 부분에서의 [IBM의 Portieris](https://github.com/IBM/portieris) 프로젝트는 쿠버네티스 다이나믹 어드미션 컨트롤러로 실행되는 도구로, 클러스터에서 허가하기 전에 Notary를 통해 이미지가 적절하게 서명되었는지 확인한다.
|
||||
권한있는 사용자의 비허용 | 컨테이너를 구성할 때 컨테이너의 목적을 수행하는데 필요한 최소 권한을 가진 사용자를 컨테이너 내에 만드는 방법에 대해서는 설명서를 참조한다.
|
||||
|
||||
## 코드
|
||||
|
||||
마지막으로 애플리케이션의 코드 수준으로 내려가면, 가장 많은 제어를 할 수 있는
|
||||
주요 공격 영역 중 하나이다. 이런 코드 수준은 쿠버네티스의 범위
|
||||
밖이지만 몇가지 권장사항이 있다.
|
||||
|
||||
### 일반적인 코드 보안 지침표
|
||||
|
||||
코드에서 고려할 영역 | 추천 |
|
||||
--------------------------------------------- | ------------ |
|
||||
TLS를 통한 접근 | 코드가 TCP를 통해 통신해야 한다면, 클라이언트와 먼저 TLS 핸드 셰이크를 수행하는 것이 이상적이다. 몇 가지 경우를 제외하고, 기본 동작은 전송 중인 모든 것을 암호화하는 것이다. 한걸음 더 나아가, VPC의 "방화벽 뒤"에서도 서비스 간 네트워크 트래픽을 암호화하는 것이 좋다. 이것은 인증서를 가지고 있는 두 서비스의 양방향 검증을 [mTLS](https://en.wikipedia.org/wiki/Mutual_authentication)를 통해 수행할 수 있다. 이것을 수행하기 위해 쿠버네티스에는 [Linkerd](https://linkerd.io/) 및 [Istio](https://istio.io/)와 같은 수많은 도구가 있다. |
|
||||
통신 포트 범위 제한 | 이 권장사항은 당연할 수도 있지만, 가능하면 통신이나 메트릭 수집에 꼭 필요한 서비스의 포트만 노출시켜야 한다. |
|
||||
타사 종속성 보안 | 애플리케이션은 자체 코드베이스의 외부에 종속적인 경향이 있기 때문에, 코드의 종속성을 정기적으로 스캔하여 현재 알려진 취약점이 없는지 확인하는 것이 좋다. 각 언어에는 이런 검사를 자동으로 수행하는 도구를 가지고 있다. |
|
||||
정적 코드 분석 | 대부분 언어에는 잠재적으로 안전하지 않은 코딩 방법에 대해 코드 스니펫을 분석할 수 있는 방법을 제공한다. 가능한 언제든지 일반적인 보안 오류에 대해 코드베이스를 스캔할 수 있는 자동화된 도구를 사용하여 검사를 한다. 도구는 다음에서 찾을 수 있다: https://www.owasp.org/index.php/Source_Code_Analysis_Tools |
|
||||
동적 탐지 공격 | 일반적으로 서비스에서 발생할 수 있는 잘 알려진 공격 중 일부를 서비스에 테스트할 수 있는 자동화된 몇 가지 도구가 있다. 이런 잘 알려진 공격에는 SQL 인젝션, CSRF 및 XSS가 포함된다. 가장 널리 사용되는 동적 분석 도구는 OWASP Zed Attack 프록시다. https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project |
|
||||
|
||||
|
||||
## 강력한(robust) 자동화
|
||||
|
||||
위에서 언급한 대부분의 제안사항은 실제로 일련의 보안 검사의 일부로 코드를
|
||||
전달하는 파이프라인에 의해 자동화 될 수 있다. 소프트웨어 전달을 위한
|
||||
"지속적인 해킹(Continuous Hacking)"에 대한 접근 방식에 대해 알아 보려면, 자세한 설명을 제공하는 [이 기사](https://thenewstack.io/beyond-ci-cd-how-continuous-hacking-of-docker-containers-and-pipeline-driven-security-keeps-ygrene-secure/)를 참고한다.
|
||||
|
||||
{{% /capture %}}
|
||||
{{% capture whatsnext %}}
|
||||
* [파드에 대한 네트워크 정책](/docs/concepts/services-networking/network-policies/) 알아보기
|
||||
* [클러스터 보안](/docs/tasks/administer-cluster/securing-a-cluster/)에 대해 알아보기
|
||||
* [API 접근 통제](/docs/reference/access-authn-authz/controlling-access/)에 대해 알아보기
|
||||
* 컨트롤 플레인에 대한 [전송 데이터 암호화](/docs/tasks/tls/managing-tls-in-a-cluster/) 알아보기
|
||||
* [Rest에서 데이터 암호화](/docs/tasks/administer-cluster/encrypt-data/) 알아보기
|
||||
* [쿠버네티스 시크릿](/docs/concepts/configuration/secret/)에 대해 알아보기
|
||||
{{% /capture %}}
|
|
@ -1189,7 +1189,7 @@ kube-proxy는 유저스페이스 모드에 있을 때 SCTP 연결 관리를 지
|
|||
|
||||
{{% capture whatsnext %}}
|
||||
|
||||
* [서비스와 애플리케이션 연결](/docs/concepts/services-networking/connect-applications-service/) 알아보기
|
||||
* [서비스와 애플리케이션 연결](/ko/docs/concepts/services-networking/connect-applications-service/) 알아보기
|
||||
* [인그레스](/ko/docs/concepts/services-networking/ingress/)에 대해 알아보기
|
||||
* [엔드포인트슬라이스](/ko/docs/concepts/services-networking/endpoint-slices/)에 대해 알아보기
|
||||
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
---
|
||||
title: CSI 볼륨 복제하기
|
||||
content_template: templates/concept
|
||||
weight: 30
|
||||
---
|
||||
|
||||
{{% capture overview %}}
|
||||
|
||||
{{< feature-state for_k8s_version="v1.16" state="beta" >}}
|
||||
이 문서에서는 쿠버네티스의 기존 CSI 볼륨 복제의 개념을 설명한다. [볼륨]
|
||||
(/ko/docs/concepts/storage/volumes)을 숙지하는 것을 추천한다.
|
||||
|
||||
{{% /capture %}}
|
||||
|
||||
|
||||
{{% capture body %}}
|
||||
|
||||
## 소개
|
||||
|
||||
{{< glossary_tooltip text="CSI" term_id="csi" >}} 볼륨 복제 기능은 `dataSource` 필드에 기존 {{< glossary_tooltip text="PVC" term_id="persistent-volume-claim" >}}를 지정하는 지원을 추가해서 사용자가 {{< glossary_tooltip term_id="volume" >}}을 복제하려는 것을 나타낸다.
|
||||
|
||||
복제는 표준 볼륨처럼 소비할 수 있는 쿠버네티스 볼륨의 복제본으로 정의된다. 유일한 차이점은 프로비저닝할 때 "새" 빈 볼륨을 생성하는 대신에 백엔드 장치가 지정된 볼륨의 정확한 복제본을 생성한다는 것이다.
|
||||
|
||||
쿠버네티스 API의 관점에서 복제를 구현하면 새로운 PVC 생성 중에 기존 PVC를 데이터 소스로 지정할 수 있는 기능이 추가된다. 소스 PVC는 바인딩되어있고, 사용가능해야 한다(사용 중이 아니어야함).
|
||||
|
||||
사용자는 이 기능을 사용할 때 다음 사항을 알고 있어야 한다.
|
||||
|
||||
* 복제 지원(`VolumePVCDataSource`)은 CSI 드라이버에서만 사용할 수 있다.
|
||||
* 복제 지원은 동적 프로비저너만 사용할 수 있다.
|
||||
* CSI 드라이버는 볼륨 복제 기능을 구현했거나 구현하지 않았을 수 있다.
|
||||
* PVC는 대상 PVC와 동일한 네임스페이스에 있는 경우에만 복제할 수 있다(소스와 대상은 동일한 네임스페이스에 있어야 함).
|
||||
* 복제는 동일한 스토리지 클래스 내에서만 지원된다.
|
||||
- 대상 볼륨은 소스와 동일한 스토리지 클래스여야 한다.
|
||||
- 기본 스토리지 클래스를 사용할 수 있으며, 사양에 storageClassName을 생략할 수 있다.
|
||||
|
||||
|
||||
## 프로비저닝
|
||||
|
||||
동일한 네임스페이스에서 기존 PVC를 참조하는 dataSource를 추가하는 것을 제외하고는 다른 PVC와 마찬가지로 복제가 프로비전된다.
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: clone-of-pvc-1
|
||||
namespace: myns
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
storageClassName: cloning
|
||||
resources:
|
||||
requests:
|
||||
storage: 5Gi
|
||||
dataSource:
|
||||
kind: PersistentVolumeClaim
|
||||
name: pvc-1
|
||||
```
|
||||
|
||||
그 결과로 지정된 소스 `pvc-1` 과 동일한 내용을 가진 `clone-of-pvc-1` 이라는 이름을 가지는 새로운 PVC가 생겨난다.
|
||||
|
||||
## 사용
|
||||
|
||||
새 PVC를 사용할 수 있게 되면, 복제된 PVC는 다른 PVC와 동일하게 소비된다. 또한, 이 시점에서 새롭게 생성된 PVC는 독립된 오브젝트이다. 원본 dataSource PVC와는 무관하게 독립적으로 소비하고, 복제하고, 스냅샷의 생성 또는 삭제를 할 수 있다. 이는 소스가 새롭게 생성된 복제본에 어떤 방식으로든 연결되어 있지 않으며, 새롭게 생성된 복제본에 영향 없이 수정하거나, 삭제할 수도 있는 것을 의미한다.
|
||||
|
||||
{{% /capture %}}
|
|
@ -0,0 +1,65 @@
|
|||
---
|
||||
title: 볼륨 스냅샷 클래스
|
||||
content_template: templates/concept
|
||||
weight: 30
|
||||
---
|
||||
|
||||
{{% capture overview %}}
|
||||
|
||||
이 문서는 쿠버네티스의 `VolumeSnapshotClass` 개요를 설명한다.
|
||||
[볼륨 스냅샷](/docs/concepts/storage/volume-snapshots/)과
|
||||
[스토리지 클래스](/docs/concepts/storage/storage-classes)의 숙지를 추천한다.
|
||||
|
||||
{{% /capture %}}
|
||||
|
||||
|
||||
{{% capture body %}}
|
||||
|
||||
## 소개
|
||||
|
||||
`StorageClass` 는 관리자가 볼륨을 프로비저닝할 때 제공하는 스토리지의 "클래스"를
|
||||
설명하는 방법을 제공하는 것처럼, `VolumeSnapshotClass` 는 볼륨 스냅샷을
|
||||
프로비저닝할 때 스토리지의 "클래스"를 설명하는 방법을 제공한다.
|
||||
|
||||
## VolumeSnapshotClass 리소스
|
||||
|
||||
각 `VolumeSnapshotClass` 에는 클래스에 속하는 `VolumeSnapshot` 을
|
||||
동적으로 프로비전 할 때 사용되는 `driver`, `deletionPolicy` 그리고 `parameters`
|
||||
필드를 포함한다.
|
||||
|
||||
`VolumeSnapshotClass` 오브젝트의 이름은 중요하며, 사용자가 특정
|
||||
클래스를 요청할 수 있는 방법이다. 관리자는 `VolumeSnapshotClass` 오브젝트를
|
||||
처음 생성할 때 클래스의 이름과 기타 파라미터를 설정하고, 오브젝트가
|
||||
생성된 이후에는 업데이트할 수 없다.
|
||||
|
||||
관리자는 특정 클래스의 바인딩을 요청하지 않는 VolumeSnapshots에만
|
||||
기본 `VolumeSnapshotClass` 를 지정할 수 있다.
|
||||
|
||||
```yaml
|
||||
apiVersion: snapshot.storage.k8s.io/v1beta1
|
||||
kind: VolumeSnapshotClass
|
||||
metadata:
|
||||
name: csi-hostpath-snapclass
|
||||
driver: hostpath.csi.k8s.io
|
||||
deletionPolicy: Delete
|
||||
parameters:
|
||||
```
|
||||
|
||||
### 드라이버
|
||||
|
||||
볼륨 스냅샷 클래스에는 VolumeSnapshots의 프로비저닝에 사용되는 CSI 볼륨 플러그인을
|
||||
결정하는 드라이버를 가지고 있다. 이 필드는 반드시 지정해야한다.
|
||||
|
||||
### 삭제정책(DeletionPolicy)
|
||||
|
||||
볼륨 스냅샷 클래스는 삭제정책을 가지고 있다. 바인딩 된 `VolumeSnapshot` 오브젝트를 삭제할 때 `VolumeSnapshotContent` 의 상황을 구성할 수 있다. 볼륨 스냅삿의 삭제정책은 `Retain` 또는 `Delete` 일 수 있다. 이 필드는 반드시 지정해야 한다.
|
||||
|
||||
삭제정책이 `Delete` 인 경우 기본 스토리지 스냅샷이 `VolumeSnapshotContent` 오브젝트와 함께 삭제된다. 삭제정책이 `Retain` 인 경우 기본 스냅샷과 `VolumeSnapshotContent` 모두 유지된다.
|
||||
|
||||
## 파라미터
|
||||
|
||||
볼륨 스냅샷 클래스에는 볼륨 스냅샷 클래스에 속하는 볼륨 스냅샷을
|
||||
설명하는 파라미터를 가지고 있다. `driver` 에 따라 다른 파라미터를 사용할
|
||||
수 있다.
|
||||
|
||||
{{% /capture %}}
|
|
@ -0,0 +1,477 @@
|
|||
---
|
||||
title: 잡 - 실행부터 완료까지
|
||||
content_template: templates/concept
|
||||
feature:
|
||||
title: 배치 실행
|
||||
description: >
|
||||
쿠버네티스는 서비스 외에도 배치와 CI 워크로드를 관리할 수 있으며, 원하는 경우 실패한 컨테이너를 교체할 수 있다.
|
||||
weight: 70
|
||||
---
|
||||
|
||||
{{% capture overview %}}
|
||||
|
||||
잡에서 하나 이상의 파드를 생성하고 지정된 수의 파드가 성공적으로 종료되도록 한다.
|
||||
파드가 성공적으로 완료되면, 성공적으로 완료된 잡을 추적한다. 지정된 수의
|
||||
성공 완료에 도달하면, 작업(즉, 잡)이 완료된다. 잡을 삭제하면 잡이 생성한
|
||||
파드가 정리된다.
|
||||
|
||||
간단한 사례는 잡 오브젝트를 하나 생성해서 파드 하나를 안정적으로 실행하고 완료하는 것이다.
|
||||
첫 번째 파드가 실패 또는 삭제된 경우(예로는 노드 하드웨어의 실패 또는
|
||||
노드 재부팅) 잡 오브젝트는 새로운 파드를 기동시킨다.
|
||||
|
||||
잡을 사용하면 여러 파드를 병렬로 실행할 수도 있다.
|
||||
|
||||
{{% /capture %}}
|
||||
|
||||
|
||||
{{% capture body %}}
|
||||
|
||||
## 예시 잡 실행하기
|
||||
|
||||
다음은 잡 설정 예시이다. 예시는 파이(π)의 2000 자리까지 계산해서 출력한다.
|
||||
이를 완료하는 데 약 10초가 소요된다.
|
||||
|
||||
{{< codenew file="controllers/job.yaml" >}}
|
||||
|
||||
이 명령으로 예시를 실행할 수 있다.
|
||||
|
||||
```shell
|
||||
kubectl apply -f https://k8s.io/examples/controllers/job.yaml
|
||||
```
|
||||
```
|
||||
job.batch/pi created
|
||||
```
|
||||
|
||||
`kubectl` 을 사용해서 잡 상태를 확인한다.
|
||||
|
||||
```shell
|
||||
kubectl describe jobs/pi
|
||||
```
|
||||
```
|
||||
Name: pi
|
||||
Namespace: default
|
||||
Selector: controller-uid=c9948307-e56d-4b5d-8302-ae2d7b7da67c
|
||||
Labels: controller-uid=c9948307-e56d-4b5d-8302-ae2d7b7da67c
|
||||
job-name=pi
|
||||
Annotations: kubectl.kubernetes.io/last-applied-configuration:
|
||||
{"apiVersion":"batch/v1","kind":"Job","metadata":{"annotations":{},"name":"pi","namespace":"default"},"spec":{"backoffLimit":4,"template":...
|
||||
Parallelism: 1
|
||||
Completions: 1
|
||||
Start Time: Mon, 02 Dec 2019 15:20:11 +0200
|
||||
Completed At: Mon, 02 Dec 2019 15:21:16 +0200
|
||||
Duration: 65s
|
||||
Pods Statuses: 0 Running / 1 Succeeded / 0 Failed
|
||||
Pod Template:
|
||||
Labels: controller-uid=c9948307-e56d-4b5d-8302-ae2d7b7da67c
|
||||
job-name=pi
|
||||
Containers:
|
||||
pi:
|
||||
Image: perl
|
||||
Port: <none>
|
||||
Host Port: <none>
|
||||
Command:
|
||||
perl
|
||||
-Mbignum=bpi
|
||||
-wle
|
||||
print bpi(2000)
|
||||
Environment: <none>
|
||||
Mounts: <none>
|
||||
Volumes: <none>
|
||||
Events:
|
||||
Type Reason Age From Message
|
||||
---- ------ ---- ---- -------
|
||||
Normal SuccessfulCreate 14m job-controller Created pod: pi-5rwd7
|
||||
```
|
||||
|
||||
`kubectl get pods` 를 사용해서 잡의 완료된 파드를 본다.
|
||||
|
||||
잡에 속하는 모든 파드를 기계적으로 읽을 수 있는 양식으로 나열하려면, 다음과 같은 명령을 사용할 수 있다.
|
||||
|
||||
```shell
|
||||
pods=$(kubectl get pods --selector=job-name=pi --output=jsonpath='{.items[*].metadata.name}')
|
||||
echo $pods
|
||||
```
|
||||
```
|
||||
pi-5rwd7
|
||||
```
|
||||
|
||||
여기서 셀렉터는 잡의 셀렉터와 동일하다. `--output=jsonpath` 옵션은 반환된 목록의
|
||||
각각의 파드에서 이름을 가져와서 표현하는 방식을 지정한다.
|
||||
|
||||
파드 중 하나를 표준 출력으로 본다.
|
||||
|
||||
```shell
|
||||
kubectl logs $pods
|
||||
```
|
||||
다음과 유사하게 출력된다.
|
||||
```shell
|
||||
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901
|
||||
```
|
||||
|
||||
## 잡 사양 작성하기
|
||||
|
||||
다른 쿠버네티스의 설정과 마찬가지로 잡에는 `apiVersion`, `kind` 그리고 `metadata` 필드가 필요하다.
|
||||
|
||||
잡에는 [`.spec` 섹션](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/pod-overview/#파드-템플릿)이다. 이것은 `apiVersion` 또는 `kind` 가 없다는 것을 제외한다면 [파드](/ko/docs/concepts/workloads/pods/pod/)와 정확하게 같은 스키마를 가지고 있다.
|
||||
|
||||
추가로 파드의 필수 필드 외에도 잡의 파드 템플릿은 적절한
|
||||
레이블([파드 셀렉터](#파드-셀렉터)를 본다)과 적절한 재시작 정책을 명시해야 한다.
|
||||
|
||||
`Never` 또는 `OnFailure` 와 같은 [`RestartPolicy`](/ko/docs/concepts/workloads/pods/pod-lifecycle/#재시작-정책)만 허용된다.
|
||||
|
||||
### 파드 셀렉터
|
||||
|
||||
`.spec.selector` 필드는 선택 사항이다. 대부분의 케이스에서 지정해서는 안된다.
|
||||
[자신의 파드 셀렉터를 지정하기](#자신의-파드-셀렉터를-지정하기) 섹션을 참고한다.
|
||||
|
||||
|
||||
### 병렬 잡
|
||||
|
||||
잡으로 실행하기에 적합한 작업 유형은 크게 세 가지가 있다.
|
||||
|
||||
1. 비-병렬(Non-parallel) 잡:
|
||||
- 일반적으로, 파드가 실패하지 않은 한, 하나의 파드만 시작된다.
|
||||
- 파드가 성공적으로 종료하자마자 즉시 잡이 완료된다.
|
||||
1. *고정적(fixed)인 완료 횟수* 를 가진 병렬 잡:
|
||||
- `.spec.completions` 에 0이 아닌 양수 값을 지정한다.
|
||||
- 잡은 전체 작업을 나타내며 1에서 `.spec.completions` 까지의 범위의 각 값에 대해 한 개씩 성공한 파드가 있으면 완료된다.
|
||||
- **아직 구현되지 않음:** 각 파드에게는 1부터 `.spec.completions` 까지의 범위 내의 서로 다른 인덱스가 전달된다.
|
||||
1. *작업 큐(queue)* 가 있는 병렬 잡:
|
||||
- `.spec.completions` 를 지정하지 않고, `.spec.parallelism` 를 기본으로 한다.
|
||||
- 파드는 각자 또는 외부 서비스 간에 조정을 통해 각각의 작업을 결정해야 한다. 예를 들어 파드는 작업 큐에서 최대 N 개의 항목을 일괄로 가져올(fetch) 수 있다.
|
||||
- 각 파드는 모든 피어들의 작업이 완료되었는지 여부를 독립적으로 판단할 수 있으며, 결과적으로 전체 잡이 완료되게 한다.
|
||||
- 잡의 _모든_ 파드가 성공적으로 종료되면, 새로운 파드는 생성되지 않는다.
|
||||
- 하나 이상의 파드가 성공적으로 종료되고, 모든 파드가 종료되면 잡은 성공적으로 완료된다.
|
||||
- 성공적으로 종료된 파드가 하나라도 생긴 경우, 다른 파드들은 해당 작업을 지속하지 않아야 하며 어떠한 출력도 작성하면 안 된다. 파드들은 모두 종료되는 과정에 있어야 한다.
|
||||
|
||||
_비-병렬_ 잡은 `.spec.completions` 와 `.spec.parallelism` 모두를 설정하지 않은 채로 둘 수 있다. 이때 둘 다
|
||||
설정하지 않은 경우 1이 기본으로 설정된다.
|
||||
|
||||
_고정적인 완료 횟수_ 잡은 `.spec.completions` 을 필요한 완료 횟수로 설정해야 한다.
|
||||
`.spec.parallelism` 을 설정할 수 있고, 설정하지 않으면 1이 기본으로 설정된다.
|
||||
|
||||
_작업 큐_ 잡은 `.spec.completions` 를 설정하지 않은 상태로 두고, `.spec.parallelism` 을
|
||||
음수가 아닌 정수로 설정해야 한다.
|
||||
|
||||
다른 유형의 잡을 사용하는 방법에 대한 더 자세한 정보는 [잡 패턴](#잡-패턴) 섹션을 본다.
|
||||
|
||||
|
||||
#### 병렬 처리 제어하기
|
||||
|
||||
요청된 병렬 처리(`.spec.parallelism`)는 음수가 아닌 값으로 설정할 수 있다.
|
||||
만약 지정되지 않은 경우에는 1이 기본이 된다.
|
||||
만약 0으로 지정되면 병렬 처리가 증가할 때까지 사실상 일시 중지된다.
|
||||
|
||||
실제 병렬 처리(모든 인스턴스에서 실행되는 파드의 수)는 여러가지 이유로 요청된
|
||||
병렬 처리보다 많거나 적을 수 있다.
|
||||
|
||||
- _고정적인 완료 횟수(fixed completion count)_ 잡의 경우, 병렬로 실행 중인 파드의 수는 남은 완료 수를
|
||||
초과하지 않는다. `.spec.parallelism` 의 더 큰 값은 사실상 무시된다.
|
||||
- _작업 큐_ 잡은 파드가 성공한 이후에 새로운 파드가 시작되지 않는다. 그러나 나머지 파드는 완료될 수 있다.
|
||||
- 만약 잡 {{< glossary_tooltip term_id="controller" >}} 가 반응할 시간이 없는 경우
|
||||
- 만약 잡 컨트롤러가 어떤 이유(`리소스 쿼터` 의 부족, 권한 부족 등)로든 파드 생성에 실패한 경우,
|
||||
요청한 것보다 적은 수의 파드가 있을 수 있다.
|
||||
- 잡 컨트롤러는 동일한 잡에서 과도하게 실패한 이전 파드들로 인해 새로운 파드의 생성을 조절할 수 있다.
|
||||
- 파드가 정상적으로(gracefully) 종료되면, 중지하는데 시간이 소요된다.
|
||||
|
||||
## 파드와 컨테이너 장애 처리하기
|
||||
|
||||
파드내 컨테이너의 프로세스가 0이 아닌 종료 코드로 종료되었거나 컨테이너 메모리 제한을
|
||||
초과해서 죽는 등의 여러가지 이유로 실패할 수 있다. 만약 이런 일이
|
||||
발생하고 `.spec.template.spec.restartPolicy = "OnFailure"` 라면 파드는
|
||||
노드에 그대로 유지되지만, 컨테이너는 다시 실행된다. 따라서 프로그램은 로컬에서 재시작될 때의
|
||||
케이스를 다루거나 `.spec.template.spec.restartPolicy = "Never"` 로 지정해야 한다.
|
||||
더 자세한 정보는 [파드 라이프사이클](/ko/docs/concepts/workloads/pods/pod-lifecycle/#상태-예제)의 `restartPolicy` 를 본다.
|
||||
|
||||
파드가 노드에서 내보내지는 경우(노드 업그레이드, 재부팅, 삭제 등) 또는 파드의 컨테이너가 실패
|
||||
되고 `.spec.template.spec.restartPolicy = "Never"` 로 설정됨과 같은 여러 이유로
|
||||
전체 파드가 실패할 수 있다. 파드가 실패하면 잡 컨트롤러는
|
||||
새 파드를 시작한다. 이 의미는 애플리케이션이 새 파드에서 재시작될 때 이 케이스를 처리해야
|
||||
한다는 점이다. 특히, 이전 실행으로 인한 임시파일, 잠금, 불완전한 출력 그리고 이와 유사한
|
||||
것들을 처리해야 한다.
|
||||
|
||||
`.spec.parallelism = 1`, `.spec.completions = 1` 그리고
|
||||
`.spec.template.spec.restartPolicy = "Never"` 를 지정하더라도 같은 프로그램을
|
||||
두 번 시작하는 경우가 있다는 점을 참고한다.
|
||||
|
||||
`.spec.parallelism` 그리고 `.spec.completions` 를 모두 1보다 크게 지정한다면 한번에
|
||||
여러개의 파드가 실행될 수 있다. 따라서 파드는 동시성에 대해서도 관대(tolerant)해야 한다.
|
||||
|
||||
### 파드 백오프(backoff) 실패 정책
|
||||
|
||||
구성 등의 논리적 오류로 인해 약간의 재시도 이후에
|
||||
잡을 실패하게 만들려는 경우가 있다.
|
||||
이렇게 하려면 `.spec.backoffLimit` 에 잡을 실패로 간주하기 이전에
|
||||
재시도할 횟수를 설정한다. 백오프 제한은 기본적으로 6으로 설정되어 있다. 잡과
|
||||
관련한 실패한 파드는 최대 6분안에서 기하급수적으로 증가하는 백-오프 지연 (10초, 20초, 40초 ...)
|
||||
한도가 되어 잡 컨트롤러에 의해 재생성 된다. 잡의 다음 상태
|
||||
확인 이전에 새로 실패한 파드가 표시되지 않으면 백 오프
|
||||
카운트가 재설정 된다.
|
||||
|
||||
{{< note >}}
|
||||
1.12 이전 버전의 쿠버네티스 버전에 대해 여전히 [#54870](https://github.com/kubernetes/kubernetes/issues/54870) 이슈가 있다.
|
||||
{{< /note >}}
|
||||
{{< note >}}
|
||||
만약 잡에 `restartPolicy = "OnFailure"` 가 있는 경우 잡 백오프 한계에
|
||||
도달하면 잡을 실행 중인 컨테이너가 종료된다. 이로 인해 잡 실행 파일의 디버깅이
|
||||
더 어려워질 수 있다. 디버깅하거나 로깅 시스템을 사용해서 실패한 작업의 결과를 실수로 손실되지 않도록
|
||||
하려면 `restartPolicy = "Never"` 로 설정하는 것을 권장한다.
|
||||
{{< /note >}}
|
||||
|
||||
## 잡의 종료와 정리
|
||||
|
||||
잡이 완료되면 파드가 더 이상 생성되지도 않지만, 삭제되지도 않는다. 이를 유지하면
|
||||
완료된 파드의 로그를 계속 보며 에러, 경고 또는 다른 기타 진단 출력을 확인할 수 있다.
|
||||
잡 오브젝트는 완료된 후에도 상태를 볼 수 있도록 남아 있다. 상태를 확인한 후 이전 잡을 삭제하는 것은 사용자의 몫이다.
|
||||
`kubectl` 로 잡을 삭제할 수 있다 (예: `kubectl delete jobs/pi` 또는 `kubectl delete -f ./job.yaml`). `kubectl` 을 사용해서 잡을 삭제하면 생성된 모든 파드도 함께 삭제된다.
|
||||
|
||||
기본적으로 파드의 실패(`restartPolicy=Never`) 또는 컨테이너가 오류(`restartPolicy=OnFailure`)로 종료되지 않는 한, 잡은 중단되지 않고 실행되고
|
||||
이때 위에서 설명했던 `.spec.backoffLimit` 까지 연기된다. `.spec.backoffLimit` 에 도달하면 잡은 실패로 표기되고 실행 중인 모든 파드는 종료된다.
|
||||
|
||||
잡을 종료하는 또 다른 방법은 유효 데드라인을 설정하는 것이다.
|
||||
잡의 `.spec.activeDeadlineSeconds` 필드를 초 단위로 설정하면 된다.
|
||||
`activeDeadlineSeconds` 는 생성된 파드의 수에 관계 없이 잡의 기간에 적용된다.
|
||||
잡이 `activeDeadlineSeconds` 에 도달하면, 실행 중인 모든 파드가 종료되고 잡의 상태는 `reason: DeadlineExceeded` 와 함께 `type: Failed` 가 된다.
|
||||
|
||||
잡의 `.spec.activeDeadlineSeconds` 는 `.spec.backoffLimit` 보다 우선한다는 점을 참고한다. 따라서 하나 이상 실패한 파드를 재시도하는 잡은 `backoffLimit` 에 도달하지 않은 경우에도 `activeDeadlineSeconds` 에 지정된 시간 제한에 도달하면 추가 파드를 배포하지 않는다.
|
||||
|
||||
예시:
|
||||
|
||||
```yaml
|
||||
apiVersion: batch/v1
|
||||
kind: Job
|
||||
metadata:
|
||||
name: pi-with-timeout
|
||||
spec:
|
||||
backoffLimit: 5
|
||||
activeDeadlineSeconds: 100
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: pi
|
||||
image: perl
|
||||
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
|
||||
restartPolicy: Never
|
||||
```
|
||||
|
||||
잡의 사양과 잡의 [파드 템플릿 사양](/ko/docs/concepts/workloads/pods/init-containers/#자세한-동작)에는 모두 `activeDeadlineSeconds` 필드가 있다는 점을 참고한다. 이 필드를 적절한 레벨로 설정해야 한다.
|
||||
|
||||
`restartPolicy` 는 잡 자체에 적용되는 것이 아니라 파드에 적용된다는 점을 유념한다. 잡의 상태가 `type: Failed` 이 되면, 잡의 자동 재시작은 없다.
|
||||
즉, `.spec.activeDeadlineSeconds` 와 `.spec.backoffLimit` 로 활성화된 잡의 종료 메커니즘은 영구적인 잡의 실패를 유발하며 이를 해결하기 위해 수동 개입이 필요하다.
|
||||
|
||||
## 완료된 잡을 자동으로 정리
|
||||
|
||||
완료된 잡은 일반적으로 시스템에서 더 이상 필요로 하지 않는다. 시스템 내에
|
||||
이를 유지한다면 API 서버에 부담이 된다.
|
||||
만약 [크론잡](/ko/docs/concepts/workloads/controllers/cron-jobs/)과
|
||||
같은 상위 레벨 컨트롤러가 잡을 직접 관리하는 경우,
|
||||
지정된 용량 기반 정리 정책에 따라 크론잡이 잡을 정리할 수 있다.
|
||||
|
||||
### 완료된 잡을 위한 TTL 메커니즘
|
||||
|
||||
{{< feature-state for_k8s_version="v1.12" state="alpha" >}}
|
||||
|
||||
완료된 잡 (`Complete` 또는 `Failed`)을 자동으로 정리하는 또 다른 방법은
|
||||
잡의 `.spec.ttlSecondsAfterFinished` 필드를 지정해서 완료된 리소스에 대해
|
||||
[TTL 컨트롤러](/ko/docs/concepts/workloads/controllers/ttlafterfinished/)에서
|
||||
제공하는 TTL 메커니즘을 사용하는
|
||||
것이다.
|
||||
|
||||
TTL 컨트롤러는 잡을 정리하면 잡을 계단식으로 삭제한다.
|
||||
즉, 잡과 함께 파드와 같은 종속 오브젝트를 삭제한다. 잡을
|
||||
삭제하면 finalizer와 같은 라이프사이클 보증이 보장되는 것을
|
||||
참고한다.
|
||||
|
||||
예시:
|
||||
|
||||
```yaml
|
||||
apiVersion: batch/v1
|
||||
kind: Job
|
||||
metadata:
|
||||
name: pi-with-ttl
|
||||
spec:
|
||||
ttlSecondsAfterFinished: 100
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: pi
|
||||
image: perl
|
||||
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
|
||||
restartPolicy: Never
|
||||
```
|
||||
|
||||
`pi-with-ttl` 잡은 완료 후 `100` 초 이후에
|
||||
자동으로 삭제될 수 있다.
|
||||
|
||||
만약 필드를 `0` 으로 설정하면, 잡이 완료된 직후에 자동으로
|
||||
삭제되도록 할 수 있다. 만약 필드를 설정하지 않으면, 이 잡이 완료된
|
||||
후에 TTL 컨트롤러에 의해 정리되지 않는다.
|
||||
|
||||
이 TTL 메커니즘은 기능 게이트 `TTLAfterFinished`와 함께 알파 단계이다. 더
|
||||
자세한 정보는 완료된 리소스를 위한
|
||||
[TTL 컨트롤러](/ko/docs/concepts/workloads/controllers/ttlafterfinished/)
|
||||
문서를 본다.
|
||||
|
||||
## 잡 패턴
|
||||
|
||||
잡 오브젝트를 사용해서 신뢰할 수 있는 파드의 병렬 실행을 지원할 수 있다. 잡 오브젝트는 과학
|
||||
컴퓨팅(scientific computing)에서 일반적으로 사용되는 밀접하게 통신하는 병렬 프로세스를 지원하도록
|
||||
설계되지 않았다. 잡 오브젝트는 독립적이지만 관련된 *작업 항목* 집합의 병렬 처리를 지원한다.
|
||||
여기에는 전송할 이메일들, 렌더링할 프레임, 코드 변환이 필요한 파일, NoSQL 데이터베이스에서의
|
||||
키 범위 스캔 등이 있다.
|
||||
|
||||
복잡한 시스템에는 여러개의 다른 작업 항목 집합이 있을 수 있다. 여기서는 사용자와
|
||||
함께 관리하려는 하나의 작업 항목 집합 — *배치 잡* 을 고려하고 있다.
|
||||
|
||||
병렬 계산에는 몇몇 다른 패턴이 있으며 각각의 장단점이 있다.
|
||||
트레이드오프는 다음과 같다.
|
||||
|
||||
- 각 작업 항목에 대한 하나의 잡 오브젝트 vs 모든 작업 항목에 대한 단일 잡 오브젝트. 후자는
|
||||
작업 항목 수가 많은 경우 더 적합하다. 전자는 사용자와 시스템이 많은 수의 잡 오브젝트를
|
||||
관리해야 하는 약간의 오버헤드를 만든다.
|
||||
- 작업 항목과 동일한 개수의 파드 생성 vs 각 파드에서 다수의 작업 항목을 처리
|
||||
전자는 일반적으로 기존 코드와 컨테이너를 거의 수정할 필요가 없다. 후자는
|
||||
이전 글 머리표(-)와 비슷한 이유로 많은 수의 작업 항목에 적합하다.
|
||||
- 여러 접근 방식이 작업 큐를 사용한다. 이를 위해서는 큐 서비스를 실행하고,
|
||||
작업 큐를 사용하도록 기존 프로그램이나 컨테이너를 수정해야 한다.
|
||||
다른 접근 방식들은 기존에 컨테이너화된 애플리케이션에 보다 쉽게 적용할 수 있다.
|
||||
|
||||
|
||||
여기에 트레이드오프가 요약되어있고, 2열에서 4열까지가 위의 트레이드오프에 해당한다.
|
||||
패턴 이름은 예시와 더 자세한 설명을 위한 링크이다.
|
||||
|
||||
| 패턴 | 단일 잡 오브젝트 | 작업 항목보다 파드가 적은가? | 수정하지 않은 앱을 사용하는가? | Kube 1.1에서 작동하는가? |
|
||||
| -------------------------------------------------------------------- |:-----------------:|:---------------------------:|:-------------------:|:-------------------:|
|
||||
| [잡 템플릿 확장](/docs/tasks/job/parallel-processing-expansion/) | | | ✓ | ✓ |
|
||||
| [작업 항목 당 파드가 있는 큐](/docs/tasks/job/coarse-parallel-processing-work-queue/) | ✓ | | 때때로 | ✓ |
|
||||
| [가변 파드 수를 가진 큐](/docs/tasks/job/fine-parallel-processing-work-queue/) | ✓ | ✓ | | ✓ |
|
||||
| 정적 작업이 할당된 단일 잡 | ✓ | | ✓ | |
|
||||
|
||||
`.spec.completions` 로 완료를 지정할 때, 잡 컨트롤러에 의해 생성된 각 파드는
|
||||
동일한 [`사양`](https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status)을 갖는다. 이 의미는
|
||||
작업의 모든 파드는 동일한 명령 줄과 동일한 이미지,
|
||||
동일한 볼륨, (거의) 동일한 환경 변수를 가진다는 점이다. 이 패턴은
|
||||
파드가 다른 작업을 수행하도록 배열하는 다른 방법이다.
|
||||
|
||||
이 표는 각 패턴에 필요한 `.spec.parallelism` 그리고 `.spec.completions` 설정을 보여준다.
|
||||
여기서 `W` 는 작업 항목의 수이다.
|
||||
|
||||
| 패턴 | `.spec.completions` | `.spec.parallelism` |
|
||||
| -------------------------------------------------------------------- |:-------------------:|:--------------------:|
|
||||
| [잡 템플릿 확장](/docs/tasks/job/parallel-processing-expansion/) | 1 | 1이어야 함 |
|
||||
| [작업 항목 당 파드가 있는 큐](/docs/tasks/job/coarse-parallel-processing-work-queue/) | W | any |
|
||||
| [가변 파드 수를 가진 큐](/docs/tasks/job/fine-parallel-processing-work-queue/) | 1 | any |
|
||||
| 정적 작업이 할당된 단일 잡 | W | any |
|
||||
|
||||
|
||||
## 고급 사용법
|
||||
|
||||
### 자신의 파드 셀렉터를 지정하기
|
||||
|
||||
일반적으로 잡 오브젝트를 생성할 때 `.spec.selector` 를 지정하지 않는다.
|
||||
시스템의 기본적인 로직은 잡이 생성될 때 이 필드를 추가한다.
|
||||
이것은 다른 잡과 겹치지 않는 셀렉터 값을 선택한다.
|
||||
|
||||
그러나, 일부 케이스에서는 이 자동화된 설정 셀렉터를 재정의해야 할 수도 있다.
|
||||
이를 위해 잡의 `.spec.selector` 를 설정할 수 있다.
|
||||
|
||||
이 것을 할 때는 매우 주의해야 한다. 만약 해당 잡의 파드에 고유하지
|
||||
않고 연관이 없는 파드와 일치하는 레이블 셀렉터를 지정하면, 연관이 없는 잡의 파드가 삭제되거나,
|
||||
해당 잡이 다른 파드가 완료한 것으로 수를 세거나, 하나 또는
|
||||
양쪽 잡 모두 파드 생성이나 실행 완료를 거부할 수도 있다. 만약 고유하지 않은 셀렉터가
|
||||
선택된 경우, 다른 컨트롤러(예: 레플리케이션 컨트롤러)와 해당 파드는
|
||||
예측할 수 없는 방식으로 작동할 수 있다. 쿠버네티스는 당신이 `.spec.selector` 를 지정할 때
|
||||
발생하는 실수를 막을 수 없을 것이다.
|
||||
|
||||
다음은 이 기능을 사용하려는 경우의 예시이다.
|
||||
|
||||
잡 `old` 가 이미 실행 중이다. 기존 파드가 계속
|
||||
실행되기를 원하지만, 잡이 생성한 나머지 파드에는 다른
|
||||
파드 템플릿을 사용하고 잡으로 하여금 새 이름을 부여하기를 원한다.
|
||||
그러나 관련된 필드들은 업데이트가 불가능하기 때문에 잡을 업데이트할 수 없다.
|
||||
따라서 `kubectl delete jobs/old --cascade=false` 를 사용해서
|
||||
잡 `old` 를 삭제하지만, _파드를 실행 상태로 둔다_.
|
||||
삭제하기 전에 어떤 셀렉터를 사용하는지 기록한다.
|
||||
|
||||
```
|
||||
kubectl get job old -o yaml
|
||||
```
|
||||
```
|
||||
kind: Job
|
||||
metadata:
|
||||
name: old
|
||||
...
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
controller-uid: a8f3d00d-c6d2-11e5-9f87-42010af00002
|
||||
...
|
||||
```
|
||||
|
||||
그런 이후에 이름이 `new` 인 새 잡을 생성하고, 동일한 셀렉터를 명시적으로 지정한다.
|
||||
기존 파드에는 `controller-uid=a8f3d00d-c6d2-11e5-9f87-42010af00002`
|
||||
레이블이 있기에 잡 `new` 에 의해서도 제어된다.
|
||||
|
||||
시스템이 일반적으로 자동 생성하는 셀렉터를 사용하지 않도록 하기 위해
|
||||
새 잡에서 `manualSelector: true` 를 지정해야 한다.
|
||||
|
||||
```
|
||||
kind: Job
|
||||
metadata:
|
||||
name: new
|
||||
...
|
||||
spec:
|
||||
manualSelector: true
|
||||
selector:
|
||||
matchLabels:
|
||||
controller-uid: a8f3d00d-c6d2-11e5-9f87-42010af00002
|
||||
...
|
||||
```
|
||||
|
||||
새 잡 자체는 `a8f3d00d-c6d2-11e5-9f87-42010af00002` 와 다른 uid 를 가지게 될 것이다.
|
||||
`manualSelector: true` 를 설정하면 시스템에게 사용자가 무엇을 하는지 알고 있음을 알리고, 이런
|
||||
불일치를 허용한다.
|
||||
|
||||
## 대안
|
||||
|
||||
### 베어(Bare) 파드
|
||||
|
||||
파드가 실행 중인 노드가 재부팅되거나 실패하면 파드가 종료되고
|
||||
다시 시작되지 않는다. 그러나 잡은 종료된 항목을 대체하기 위해 새 파드를 생성한다.
|
||||
따라서, 애플리케이션에 단일 파드만 필요한 경우에도 베어 파드 대신
|
||||
잡을 사용하는 것을 권장한다.
|
||||
|
||||
### 레플리케이션 컨트롤러
|
||||
|
||||
잡은 [레플리케이션 컨트롤러](/ko/docs/concepts/workloads/controllers/replicationcontroller/)를 보완한다.
|
||||
레플리케이션 컨트롤러는 종료하지 않을 파드(예: 웹 서버)를 관리하고, 잡은 종료될 것으로
|
||||
예상되는 파드(예: 배치 작업)를 관리한다.
|
||||
|
||||
[파드 라이프사이클](/ko/docs/concepts/workloads/pods/pod-lifecycle/)에서 설명한 것처럼, `잡` 은 *오직*
|
||||
`OnFailure` 또는 `Never` 와 같은 `RestartPolicy` 를 사용하는 파드에만 적절하다.
|
||||
(참고: `RestartPolicy` 가 설정되지 않은 경우에는 기본값은 `Always` 이다.)
|
||||
|
||||
### 단일 잡으로 컨트롤러 파드 시작
|
||||
|
||||
또 다른 패턴은 단일 잡이 파드를 생성한 후 다른 파드들을 생성해서 해당 파드들에
|
||||
일종의 사용자 정의 컨트롤러 역할을 하는 것이다. 이를 통해 최대한의 유연성을 얻을 수 있지만,
|
||||
시작하기에는 다소 복잡할 수 있으며 쿠버네티스와의 통합성이 낮아진다.
|
||||
|
||||
이 패턴의 한 예시는 파드를 시작하는 잡이다. 파드는 스크립트를 실행해서
|
||||
스파크(Spark) 마스터 컨트롤러 ([스파크 예시](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/staging/spark/README.md)를 본다)를 시작하고,
|
||||
스파크 드라이버를 실행한 다음, 정리한다.
|
||||
|
||||
이 접근 방식의 장점은 전체 프로세스가 잡 오브젝트의 완료를 보장하면서도,
|
||||
파드 생성과 작업 할당 방법을 완전히 제어할 수 있다는 점이다.
|
||||
|
||||
## 크론 잡 {#cron-jobs}
|
||||
|
||||
[`크론잡`](/ko/docs/concepts/workloads/controllers/cron-jobs/)을 사용해서 Unix 도구인 `cron`과 유사하게 지정된 시간/일자에 실행되는 잡을 생성할 수 있다.
|
||||
|
||||
{{% /capture %}}
|
|
@ -51,7 +51,7 @@ card:
|
|||
|
||||
#### 저장소
|
||||
|
||||
파드는 공유 저장소 집합인 {{< glossary_tooltip text="Volumes" term_id="volume" >}} 을 명시할 수 있다. 파드 내부의 모든 컨테이너는 공유 볼륨에 접근할 수 있고, 그 컨테이너끼리 데이터를 공유하는 것을 허용한다. 또한 볼륨은 컨테이너가 재시작되어야 하는 상황에도 파드 안의 데이터가 영구적으로 유지될 수 있게 한다. 쿠버네티스가 어떻게 파드 안의 공유 저장소를 사용하는지 보려면 [볼륨](/docs/concepts/storage/volumes/)를 참고하길 바란다.
|
||||
파드는 공유 저장소 집합인 {{< glossary_tooltip text="Volumes" term_id="volume" >}} 을 명시할 수 있다. 파드 내부의 모든 컨테이너는 공유 볼륨에 접근할 수 있고, 그 컨테이너끼리 데이터를 공유하는 것을 허용한다. 또한 볼륨은 컨테이너가 재시작되어야 하는 상황에도 파드 안의 데이터가 영구적으로 유지될 수 있게 한다. 쿠버네티스가 어떻게 파드 안의 공유 저장소를 사용하는지 보려면 [볼륨](/ko/docs/concepts/storage/volumes/)를 참고하길 바란다.
|
||||
|
||||
## 파드 작업
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ _파드_ 는 (고래 떼(pod of whales)나 콩꼬투리(pea pod)와 마찬가지
|
|||
공유 볼륨에 엑세스 할 수 있다.
|
||||
|
||||
[도커](https://www.docker.com/)의 구조 관점에서 보면
|
||||
파드는 공유 네임스페이스와 공유 [볼륨](/docs/concepts/storage/volumes/)을 가진
|
||||
파드는 공유 네임스페이스와 공유 [볼륨](/ko/docs/concepts/storage/volumes/)을 가진
|
||||
도커 컨테이너 그룹으로 모델링 된다.
|
||||
|
||||
개별 애플리케이션 컨테이너와 같이, 파드는 상대적으로 수명이 짧은 엔터티로 간주된다.
|
||||
|
|
|
@ -92,7 +92,7 @@ YAML 블록이다. 여기 예시가 있다.
|
|||
- 이 코드는 `kubectl get deploy mydeployment -o json | jq '.status'`와 같은
|
||||
명령어의 출력을 보여준다.
|
||||
- 이 코드는 시도해보기에 적절하지 않다. 예를 들어
|
||||
특정 [FlexVolume](/docs/concepts/storage/volumes#flexvolume) 구현에 따라
|
||||
특정 [FlexVolume](/ko/docs/concepts/storage/volumes#flexvolume) 구현에 따라
|
||||
파드를 만들기 위해 YAML 파일을
|
||||
포함할 수 있다.
|
||||
- 이 코드의 목적은 더 큰 파일의 일부를 강조하는 것이기 때문에
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
title: 볼륨(Volume)
|
||||
id: volume
|
||||
date: 2018-04-12
|
||||
full_link: /docs/concepts/storage/volumes/
|
||||
full_link: /ko/docs/concepts/storage/volumes/
|
||||
short_description: >
|
||||
데이터를 포함하고 있는 디렉토리이며, 파드의 컨테이너에서 접근 가능하다.
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ weight: 40
|
|||
- [파드](/docs/user-guide/pods/single-container/)
|
||||
- [클러스터 DNS](/ko/docs/concepts/services-networking/dns-pod-service/)
|
||||
- [헤드리스 서비스](/ko/docs/concepts/services-networking/service/#헤드리스-headless-서비스)
|
||||
- [퍼시스턴트볼륨](/docs/concepts/storage/volumes/)
|
||||
- [퍼시스턴트볼륨](/ko/docs/concepts/storage/volumes/)
|
||||
- [퍼시스턴트볼륨 프로비저닝](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/staging/persistent-volume-provisioning/)
|
||||
- [스테이트풀셋](/ko/docs/concepts/workloads/controllers/statefulset/)
|
||||
- [파드디스룹션버짓](/ko/docs/concepts/workloads/pods/disruptions/#specifying-a-poddisruptionbudget)
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
apiVersion: batch/v1
|
||||
kind: Job
|
||||
metadata:
|
||||
name: pi
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: pi
|
||||
image: perl
|
||||
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
|
||||
restartPolicy: Never
|
||||
backoffLimit: 4
|
||||
|
|
@ -193,3 +193,6 @@ other = "이벤트 캘린더"
|
|||
# UI elements
|
||||
[ui_search_placeholder]
|
||||
other = "검색하기"
|
||||
|
||||
[input_placeholder_email_address]
|
||||
other = "전자 우편 주소"
|
||||
|
|
Loading…
Reference in New Issue