diff --git a/content/ko/_index.html b/content/ko/_index.html index 854a54c7ee295..f932ba6c2ec66 100644 --- a/content/ko/_index.html +++ b/content/ko/_index.html @@ -30,7 +30,7 @@ {{% blocks/feature image="suitcase" %}} #### 어디서나 동작 -쿠버네티스는 오픈소스로서 온-프레미스, 하이브리드, 또는 퍼블릭 클라우드 인프라스트럭처를 활용하는데 자유를 제공하며, 워크로드를 사용자에게 관건이 되는 곳으로 손쉽게 이동시켜 줄 수 있습니다. +쿠버네티스는 오픈소스로서 온-프레미스, 하이브리드, 또는 퍼블릭 클라우드 인프라스트럭처를 활용하는데 자유를 제공하며, 워크로드를 사용자에게 관건이 되는 곳으로 손쉽게 이동시켜 줄 수 있습니다. {{% /blocks/feature %}} @@ -44,12 +44,12 @@

150+ 마이크로서비스를 쿠버네티스로 마이그레이션하는


- Attend KubeCon in Shanghai on June 24-26, 2019 + Attend KubeCon in San Diego on Nov. 18-21, 2019



- Attend KubeCon in San Diego on Nov. 18-21, 2019 + Attend KubeCon in Amsterdam on Mar. 30-Apr. 2, 2020
diff --git a/content/ko/docs/concepts/architecture/nodes.md b/content/ko/docs/concepts/architecture/nodes.md index cd639c39c7103..2028073489c89 100644 --- a/content/ko/docs/concepts/architecture/nodes.md +++ b/content/ko/docs/concepts/architecture/nodes.md @@ -22,6 +22,10 @@ weight: 10 * [용량과 할당가능](#capacity) * [정보](#info) +노드의 상태와 상세 정보는 다음 커맨드를 통해 확인할 수 있다. +```shell +kubectl describe node +``` 각 섹션은 아래 상세하게 기술되었다. ### 주소 {#addresses} @@ -88,7 +92,8 @@ ready 컨디션의 상태가 [kube-controller-manager](/docs/admin/kube-controll ### 정보 {#info} -커널 버전, 쿠버네티스 버전 (kubelet과 kube-proxy 버전), (사용하는 경우) Docker 버전, OS 이름과 같은 노드에 대한 일반적인 정보이다. 정보는 Kubelet에 의해 노드로부터 수집된다. +커널 버전, 쿠버네티스 버전 (kubelet과 kube-proxy 버전), (사용하는 경우) Docker 버전, OS 이름과 같은노드에 대한 일반적인 정보를 보여준다. +이 정보는 Kubelet에 의해 노드로부터 수집된다. ## 관리 diff --git a/content/ko/docs/concepts/configuration/organize-cluster-access-kubeconfig.md b/content/ko/docs/concepts/configuration/organize-cluster-access-kubeconfig.md new file mode 100644 index 0000000000000..d5ffe7a508163 --- /dev/null +++ b/content/ko/docs/concepts/configuration/organize-cluster-access-kubeconfig.md @@ -0,0 +1,156 @@ +--- +title: kubeconfig 파일을 사용하여 클러스터 접근 구성하기 +content_template: templates/concept +weight: 60 +--- + +{{% capture overview %}} + +kubeconfig 파일들을 사용하여 클러스터, 사용자, 네임스페이스 및 인증 메커니즘에 대한 정보를 관리하자. +`kubectl` 커맨드라인 툴은 kubeconfig 파일을 사용하여 +클러스터의 선택과 +클러스터의 API 서버와의 통신에 필요한 정보를 찾는다. + +{{< note >}} +클러스터에 대한 접근을 구성하는 데 사용되는 파일을 *kubeconfig 파일* 이라 한다. +이는 구성 파일을 참조하는 일반적인 방법을 의미한다. +`kubeconfig`라는 이름의 파일이 있다는 의미는 아니다. +{{< /note >}} + +기본적으로 `kubectl`은 `$HOME/.kube` 디렉터리에서 `config`라는 이름의 파일을 찾는다. +`KUBECONFIG` 환경 변수를 설정하거나 +[`--kubeconfig`](/docs/reference/generated/kubectl/kubectl/) 플래그를 지정해서 +다른 kubeconfig 파일을 사용할 수 있다. + +kubeconfig 파일을 생성하고 지정하는 단계별 지시사항은 +[다중 클러스터로 접근 구성하기](/docs/tasks/access-application-cluster/configure-access-multiple-clusters)를 참조한다. + +{{% /capture %}} + + +{{% capture body %}} + +## 다중 클러스터, 사용자와 인증 메커니즘 지원 + +여러 클러스터가 있고, 사용자와 구성 요소가 다양한 방식으로 인증한다고 가정하자. +예를 들면 다음과 같다. + +- 실행 중인 kubelet은 인증서를 이용하여 인증할 수 있다. +- 사용자는 토큰으로 인증할 수 있다. +- 관리자는 개별 사용자에게 제공하는 인증서 집합을 가지고 있다. + +kubeconfig 파일을 사용하면 클러스터와 사용자와 네임스페이스를 구성할 수 있다. +또한 컨텍스트를 정의하여 +빠르고 쉽게 클러스터와 네임스페이스 간에 전환할 수 있다. + +## 컨텍스트 + +kubeconfig에서 *컨텍스트* 요소는 편리한 이름으로 접속 매개 변수를 묶는데 사용한다. +각 컨텍스트는 클러스터, 네임스페이스와 사용자라는 세 가지 매개 변수를 가진다. +기본적으로 `kubectl` 커맨드라인 툴은 *현재 컨텍스트* 의 매개 변수를 +사용하여 클러스터와 통신한다. + +현재 컨택스트를 선택하려면 다음을 실행한다. +``` +kubectl config use-context +``` + +## KUBECONFIG 환경 변수 + +`KUBECONFIG` 환경 변수는 kubeconfig 파일 목록을 보유한다. +Linux 및 Mac의 경우 이는 콜론(:)으로 구분된 목록이다. +Windows는 세미콜론(;)으로 구분한다. `KUBECONFIG` 환경 변수가 필수는 아니다. +`KUBECONFIG` 환경 변수가 없으면, +`kubectl`은 기본 kubeconfig 파일인 `$HOME/.kube/config`를 사용한다. + +`KUBECONFIG` 환경 변수가 존재하면, `kubectl`은 +`KUBECONFIG` 환경 변수에 나열된 파일을 병합한 결과 형태의 +효과적 구성을 이용한다. + +## kubeconfig 파일 병합 + +구성을 보려면, 다음 커맨드를 입력한다. + +```shell +kubectl config view +``` + +앞서 설명한 것처럼, 이 출력 내용은 단일 kubeconfig 파일이나 +여러 kubeconfig 파일을 병합한 결과 일 수 있다. + +다음은 kubeconfig 파일을 병합할 때에 `kubectl`에서 사용하는 규칙이다. + +1. `--kubeconfig` 플래그를 설정했으면, 지정한 파일만 사용한다. 병합하지 않는다. + 이 플래그는 오직 한 개 인스턴스만 허용한다. + + 그렇지 않고, `KUBECONFIG` 환경 변수를 설정하였다면 + 병합해야 하는 파일의 목록으로 사용한다. + `KUBECONFIG` 환경 변수의 나열된 파일은 + 다음 규칙에 따라 병합한다. + + * 빈 파일명은 무시한다. + * 역 직렬화 불가한 파일 내용에 대해서 오류를 일으킨다. + * 특정 값이나 맵 키를 설정한 첫 번째 파일을 우선한다. + * 값이나 맵 키를 변경하지 않는다. + 예: `현재 컨텍스트`를 설정할 첫 번째 파일의 컨택스트를 유지한다. + 예: 두 파일이 `red-user`를 지정했다면, 첫 번째 파일의 `red-user` 값만을 사용한다. + 두 번째 파일의 `red-user` 하위에 충돌하지 않는 항목이 있어도 버린다. + + `KUBECONFIG` 환경 변수 설정의 예로, + [KUBECONFIG 환경 변수 설정](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#set-the-kubeconfig-environment-variable)를 참조한다. + + 그렇지 않다면, 병합하지 않고 기본 kubecofig 파일인 `$HOME/.kube/config`를 사용한다. + +1. 이 체인에서 첫 번째를 기반으로 사용할 컨텍스트를 결정한다. + + 1. 커맨드라인 플래그의 `--context`를 사용한다. + 1. 병합된 kubeconfig 파일에서 `current-context`를 사용한다. + + 이 시점에서는 빈 컨텍스트도 허용한다. + +1. 클러스터와 사용자를 결정한다. 이 시점에서는 컨텍스트가 있을 수도 있고 없을 수도 있다. + 사용자에 대해 한 번, 클러스터에 대해 한 번 총 두 번에 걸친 + 이 체인에서 첫 번째 것을 기반으로 클러스터와 사용자를 결정한다. + + 1. 커맨드라인 플래그가 존재하면, `--user` 또는 `--cluster`를 사용한다. + 1. 컨텍스트가 비어있지 않다면, 컨텍스트에서 사용자 또는 클러스터를 가져온다. + + 이 시점에서는 사용자와 클러스터는 비워둘 수 있다. + +1. 사용할 실제 클러스터 정보를 결정한다. + 이 시점에서 클러스터 정보가 있을 수 있고 없을 수도 있다. + 이 체인을 기반으로 클러스터 정보를 구축한다. 첫 번째 것을 사용한다. + + 1. 커맨드라인 플래그가 존재하면, `--server`, `--certificate-authority`, `--insecure-skip-tls-verify`를 사용한다. + 1. 병합된 kubeconfig 파일에서 클러스터 정보 속성이 있다면 사용한다. + 1. 서버 위치가 없다면 실패한다. + +1. 사용할 실제 사용자 정보를 결정한다. + 사용자 당 하나의 인증 기법만 허용하는 것을 제외하고는 + 클러스터 정보와 동일한 규칙을 사용하여 사용자 정보를 작성한다. + + 1. 커맨드라인 플래그가 존재하면, `--client-certificate`, `--client-key`, `--username`, `--password`, `--token`을 사용한다. + 1. 병합된 kubeconfig 파일에서 `user` 필드를 사용한다. + 1. 충돌하는 두 가지 기법이 있다면 실패한다. + +1. 여전히 누락된 정보는 기본 값을 사용하고 + 인증 정보를 묻는 메시지가 표시될 수 있다. + +## 파일 참조 + +kubeconfig 파일에서 파일과 경로 참조는 kubeconfig 파일의 위치와 관련 있다. +커맨드라인 상에 파일 참조는 현재 디렉터리를 기준으로 한다. +`$HOME/.kube/config`에서 상대 경로는 상대적으로, 절대 경로는 +절대적으로 저장한다. + +{{% /capture %}} + + +{{% capture whatsnext %}} + +* [다중 클러스터 접근 구성하기](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/) +* [`kubectl config`](/docs/reference/generated/kubectl/kubectl-commands#config) + +{{% /capture %}} + + diff --git a/content/ko/docs/concepts/configuration/overview.md b/content/ko/docs/concepts/configuration/overview.md new file mode 100644 index 0000000000000..d1294c119d402 --- /dev/null +++ b/content/ko/docs/concepts/configuration/overview.md @@ -0,0 +1,107 @@ +--- +title: 구성 모범 사례 +content_template: templates/concept +weight: 10 +--- + +{{% capture overview %}} +이 문서는 사용자 가이드, 시작하기 문서 및 예제들에 걸쳐 소개된 구성 모범 사례를 강조하고 통합한다. + +이 문서는 지속적으로 변경 가능하다. 이 목록에 없지만 다른 사람들에게 유용할 것 같은 무엇인가를 생각하고 있다면, 새로운 이슈를 생성하거나 풀 리퀘스트를 제출하는 것을 망설이지 말기를 바란다. +{{% /capture %}} + +{{% capture body %}} +## 일반적인 구성 팁 + +- 구성을 정의할 때, 안정된 최신 API 버전을 명시한다. + +- 구성 파일들은 클러스터에 적용되기 전에 버전 컨트롤에 저장되어 있어야 한다. 이는 만약 필요하다면 구성의 변경 사항을 빠르게 되돌릴 수 있도록 해준다. 이는 또한 클러스터의 재-생성과 복원을 도와준다. + +- JSON보다는 YAML을 사용해 구성 파일을 작성한다. 비록 이러한 포맷들은 대부분의 모든 상황에서 통용되어 사용될 수 있지만, YAML이 좀 더 사용자 친화적인 성향을 가진다. + +- 의미상 맞다면 가능한 연관된 오브젝트들을 하나의 파일에 모아 놓는다. 때로는 여러 개의 파일보다 하나의 파일이 더 관리하기 쉽다. 이 문법의 예시로서 [guestbook-all-in-one.yaml](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/guestbook/all-in-one/guestbook-all-in-one.yaml) 파일을 참고한다. + +- 많은 `kubectl` 커맨드들은 디렉터리에 대해 호출될 수 있다. 예를 들어, 구성 파일들의 디렉터리에 대해 `kubectl apply`를 호출할 수 있다. + +- 불필요하게 기본 값을 명시하지 않는다. 간단하고 최소한의 설정은 에러를 덜 발생시킨다. + +- 더 나은 인트로스펙션(introspection)을 위해서, 어노테이션에 오브젝트의 설명을 넣는다. + + +## "단독(Naked)" 파드 vs 레플리카 셋, 디플로이먼트, 그리고 잡 + +- 가능하다면 단독 파드(즉, [레플리카 셋](/ko/docs/concepts/workloads/controllers/replicaset/)이나 [디플로이먼트](/docs/concepts/workloads/controllers/deployment/)에 연결되지 않은 파드)를 사용하지 않는다. 단독 파드는 노드 장애 이벤트가 발생해도 다시 스케줄링되지 않는다. + + 명백하게 [`restartPolicy: Never`](/ko/docs/concepts/workloads/pods/pod-lifecycle/#재시작-정책)를 사용하는 상황을 제외한다면, 의도한 파드의 수가 항상 사용 가능한 상태를 유지하는 레플리카 셋을 생성하고, 파드를 교체하는 전략([롤링 업데이트](/docs/concepts/workloads/controllers/deployment/#rolling-update-deployment)와 같은)을 명시하는 디플로이먼트는 파드를 직접 생성하기 위해 항상 선호되는 방법이다. [잡](/docs/concepts/workloads/controllers/jobs-run-to-completion/) 또한 적절할 수 있다. + + +## 서비스 + +- 서비스에 대응하는 백엔드 워크로드(디플로이먼트 또는 레플리카 셋) 또는 서비스 접근이 필요한 어떠한 워크로드를 생성하기 전에 [서비스](/docs/concepts/services-networking/service/)를 미리 생성한다. 쿠버네티스가 컨테이너를 시작할 때, 쿠버네티스는 컨테이너 시작 당시에 생성되어 있는 모든 서비스를 가리키는 환경 변수를 컨테이너에 제공한다. 예를 들어, `foo` 라는 이름의 서비스가 존재한다면, 모든 컨테이너들은 초기 환경에서 다음의 변수들을 얻을 것이다. + + ```shell + FOO_SERVICE_HOST=<서비스가 동작 중인 호스트> + FOO_SERVICE_PORT=<서비스가 동작 중인 포트> + ``` + + *이는 순서를 정하는 일이 요구됨을 암시한다* - `파드`가 접근하기를 원하는 어떠한 `서비스`는 `파드` 스스로가 생성되기 전에 미리 생성되어 있어야 하며, 그렇지 않으면 환경 변수가 설정되지 않을 것이다. DNS는 이러한 제한을 가지고 있지 않다. + +- 선택적인(그렇지만 매우 권장되는) [클러스터 애드온](/docs/concepts/cluster-administration/addons/)은 DNS 서버이다. +DNS 서버는 새로운 `서비스`를 위한 쿠버네티스 API를 Watch하며, 각 서비스를 위한 DNS 레코드 셋을 생성한다. 만약 DNS가 클러스터에 걸쳐 활성화되어 있다면, 모든 `파드`는 `서비스`의 이름을 자동으로 해석할 수 있어야 한다. + +- 반드시 필요한 것이 아니라면 파드에 `hostPort` 를 명시하지 않는다. <`hostIP`, `hostPort`, `protocol`> 조합은 유일해야 하기 때문에, `hostPort`로 바인드하는 것은 파드가 스케줄링될 수 있는 위치의 개수를 제한한다. 만약 `hostIP`와 `protocol`을 뚜렷히 명시하지 않으면, 쿠버네티스는 `hostIP`의 기본 값으로 `0.0.0.0`를, `protocol`의 기본 값으로 `TCP`를 사용한다. + + 만약 오직 디버깅의 목적으로 포트에 접근해야 한다면, [apiserver proxy](/ko/docs/tasks/access-application-cluster/access-cluster/#수작업으로-apiserver-proxy-url을-구축) 또는 [`kubectl port-forward`](/docs/tasks/access-application-cluster/port-forward-access-application-cluster/)를 사용할 수 있다. + + 만약 파드의 포트를 노드에서 명시적으로 노출해야 한다면, `hostPort`에 의존하기 전에 [NodePort](/docs/concepts/services-networking/service/#nodeport) 서비스를 사용하는 것을 고려할 수 있다. + +- `hostPort`와 같은 이유로, `hostNetwork`를 사용하는 것을 피한다. + +- `kube-proxy` 로드 밸런싱이 필요하지 않을 때, 쉬운 서비스 발견을 위해 [헤드리스 서비스](/docs/concepts/services-networking/service/#headless- +services)(`ClusterIP`의 값을 `None`으로 가지는)를 사용한다. + +## 레이블 사용하기 + +- `{ app: myapp, tier: frontend, phase: test, deployment: v3 }`처럼 애플리케이션이나 디플로이먼트의 __속성에 대한 의미__를 식별하는 [레이블](/docs/concepts/overview/working-with-objects/labels/)을 정의해 사용한다. 다른 리소스를 위해 적절한 파드를 선택하는 용도로 이러한 레이블을 이용할 수 있다. 예를 들어, 모든 `tier: frontend` 파드를 선택하거나, `app: myapp`의 모든 `phase: test` 컴포넌트를 선택하는 서비스를 생각해 볼 수 있다. 이 접근 방법의 예시는 [방명록](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/guestbook/) 앱을 참고한다. + +릴리스에 특정되는 레이블을 서비스의 셀렉터에서 생략함으로써 여러 개의 디플로이먼트에 걸치는 서비스를 생성할 수 있다. [디플로이먼트](/docs/concepts/workloads/controllers/deployment/)는 생성되어 있는 서비스를 다운타임 없이 수정하기 쉽도록 만든다. + +오브젝트의 의도한 상태는 디플로이먼트에 의해 기술되며, 만약 그 스펙에 대한 변화가 _적용될_ 경우, 디플로이먼트 컨트롤러는 일정한 비율로 실제 상태를 의도한 상태로 변화시킨다. + +- 디버깅을 위해 레이블을 조작할 수 있다. (레플리카 셋과 같은) 쿠버네티스 컨트롤러와 서비스는 셀렉터 레이블을 사용해 파드를 선택하기 때문에, 관련된 레이블을 파드에서 삭제하는 것은 컨트롤러로부터 관리되거나 서비스로부터 트래픽을 전달받는 것을 중단시킨다. 만약 이미 존재하는 파드의 레이블을 삭제한다면, 파드의 컨트롤러는 그 자리를 대신할 새로운 파드를 생성한다. 이것은 이전에 "살아 있는" 파드를 "격리된" 환경에서 디버그할 수 있는 유용한 방법이다. 레이블을 상호적으로 추가하고 삭제하기 위해서, [`kubectl label`](/docs/reference/generated/kubectl/kubectl-commands#label)를 사용할 수 있다. + +## 컨테이너 이미지 + +[imagePullPolicy](/ko/docs/concepts/containers/images/#이미지-업데이트)와 이미지의 태그는 [kubelet](/docs/admin/kubelet/)이 명시된 이미지를 풀(pull) 하려고 시도할 때 영향을 미친다. + +- `imagePullPolicy: IfNotPresent`: 이미지가 로컬에 이미 존재하지 않으면 이미지가 풀(Pull) 된다. + +- `imagePullPolicy: Always`: 파드가 시작될 때마다 이미지가 풀(Pull) 된다. + +- `imagePullPolicy`가 생략되어 있고, 이미지 태그가 `:latest` 이거나 생략되어 있다면 `Always`가 적용된다. + +- `imagePullPolicy`가 생략되어 있고, 이미지 태그가 존재하지만 `:latest`가 아니라면 `IfNotPresent`가 적용된다. + +- `imagePullPolicy: Never`: 이미지가 로컬에 존재한다고 가정한다. 이미지를 풀(Pull) 하기 위해 시도하지 않는다. + +{{< note >}} +컨테이너가 항상 같은 버전의 이미지를 사용하도록 만들기 위해, `sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2`와 같은 이미지의 [다이제스트](https://docs.docker.com/engine/reference/commandline/pull/#pull-an-image-by-digest-immutable-identifier)를 명시할 수 있다. 다이제스트는 특정 버전의 이미지를 고유하게 식별하며, 다이제스트 값을 변경하지 않는 한 쿠버네티스에 의해 절대로 변경되지 않는다. +{{< /note >}} + +{{< note >}} +운영 환경에서 컨테이너를 생성할 때 `:latest` 태그의 사용을 피하는 것이 좋은데, 이는 어떠한 버전의 이미지가 실행 중인지 추적하기가 어렵고, 적절히 롤백하기가 더 어려워지기 때문이다. +{{< /note >}} + +{{< note >}} +기반이 되는 이미지 제공자의 캐시 방법은 `imagePullPolicy: Always`를 효율적으로 만든다. 예를 들어, 도커에서는 이미지가 이미 존재한다면 풀(Pull) 시도는 빠르게 진행되는데, 이는 모든 이미지 레이어가 캐시되어 있으며 이미지 다운로드가 필요하지 않기 때문이다. +{{< /note >}} + +## kubectl 사용하기 + +- `kubectl apply -f <디렉터리>`를 사용한다. 이 명령어는 `<디렉터리>` 내부의 모든 `.yaml`, `.yml`, 그리고 `.json` 쿠버네티스 구성 파일을 찾아 `apply`에 전달한다. + +- `get`과 `delete` 동작을 위해 특정 오브젝트의 이름 대신 레이블 셀렉터를 사용한다. [레이블 셀렉터](/docs/concepts/overview/working-with-objects/labels/#label-selectors)와 [효율적으로 레이블 사용하기](/docs/concepts/cluster-administration/manage-deployment/#using-labels-effectively)를 참고할 수 있다. + +- 단일 컨테이너로 구성된 디플로이먼트와 서비스를 빠르게 생성하기 위해 `kubectl run`와 `kubectl expose`를 사용한다. [클러스터 내부의 애플리케이션에 접근하기 위한 서비스 사용](/docs/tasks/access-application-cluster/service-access-application-cluster/)에서 예시를 확인할 수 있다. + +{{% /capture %}} diff --git a/content/ko/docs/concepts/containers/images.md b/content/ko/docs/concepts/containers/images.md index 50291bd72d234..09143afa7d73d 100644 --- a/content/ko/docs/concepts/containers/images.md +++ b/content/ko/docs/concepts/containers/images.md @@ -57,7 +57,7 @@ Docker *18.06 또는 그 이상* 을 사용하길 바란다. 더 낮은 버전 - 각 클러스터에 대하여 - Google 컴퓨트 엔진 또는 Google 쿠버네티스 엔진에서 자동적으로 구성됨 - 모든 파드는 해당 프로젝트의 프라이빗 레지스트리를 읽을 수 있음 - - AWS EC2 컨테이너 레지스트리(ECR) 사용 + - AWS Elastic Container Registry(ECR) 사용 - IAM 역할 및 정책을 사용하여 ECR 저장소에 접근을 제어함 - ECR 로그인 자격 증명은 자동으로 갱신됨 - Oracle 클라우드 인프라스트럭처 레지스트리(OCIR) 사용 @@ -67,7 +67,7 @@ Docker *18.06 또는 그 이상* 을 사용하길 바란다. 더 낮은 버전 - 프라이빗 레지스트리에 대한 인증을 위한 노드 구성 - 모든 파드는 구성된 프라이빗 레지스트리를 읽을 수 있음 - 클러스터 관리자에 의한 노드 구성 필요 - - 미리 풀링(pre-pulling)된 이미지 + - 미리 내려받은(pre-pulled) 이미지 - 모든 파드는 노드에 캐시된 모든 이미지를 사용 가능 - 셋업을 위해서는 모든 노드에 대해서 root 접근이 필요 - 파드에 ImagePullSecrets을 명시 @@ -89,10 +89,9 @@ Kubelet은 해당 인스턴스의 Google 서비스 계정을 이용하여 GCR을 인스턴스의 서비스 계정은 `https://www.googleapis.com/auth/devstorage.read_only`라서, 프로젝트의 GCR로부터 풀은 할 수 있지만 푸시는 할 수 없다. -### AWS EC2 컨테이너 레지스트리 사용 +### Amazon Elastic Container Registry 사용 -쿠버네티스는 노드가 AWS EC2 인스턴스일 때, [AWS EC2 컨테이너 -레지스트리](https://aws.amazon.com/ecr/)를 자연스럽게 지원한다. +쿠버네티스는 노드가 AWS EC2 인스턴스일 때, [Amazon Elastic Container Registry](https://aws.amazon.com/ecr/)를 자연스럽게 지원한다. 간단히 이미지의 전체 이름(예: `ACCOUNT.dkr.ecr.REGION.amazonaws.com/imagename:tag`)을 파드 정의에 사용하면 된다. @@ -240,7 +239,7 @@ kubectl describe pods/private-image-test-1 | grep "Failed" 프라이빗 레지스트리 키가 `.docker/config.json`에 추가되고 나면 모든 파드는 프라이빗 레지스트리의 이미지에 읽기 접근 권한을 가지게 될 것이다. -### 미리 풀링(pre-pulling)된 이미지 +### 미리 내려받은 이미지 {{< note >}} Google 쿠버네티스 엔진에서 동작 중이라면, 이미 각 노드에 Google 컨테이너 레지스트리에 대한 자격 증명과 함께 `.dockercfg`가 있을 것이다. 그렇다면 이 방법은 쓸 수 없다. @@ -257,11 +256,11 @@ GCE 및 자동 노드 교체를 수행하는 다른 클라우드 제공자에 로컬 이미지가 사용된다(우선적으로 또는 배타적으로). 레지스트리 인증의 대안으로 미리 풀 된 이미지에 의존하고 싶다면, -클러스터의 모든 노드가 동일한 미리 풀 된 이미지를 가지고 있는지 확인해야 한다. +클러스터의 모든 노드가 동일한 미리 내려받은 이미지를 가지고 있는지 확인해야 한다. 이것은 특정 이미지를 속도를 위해 미리 로드하거나 프라이빗 레지스트리에 대한 인증의 대안으로 사용될 수 있다. -모든 파드는 미리 풀 된 이미지에 대해 읽기 접근 권한을 가질 것이다. +모든 파드는 미리 내려받은 이미지에 대해 읽기 접근 권한을 가질 것이다. ### 파드에 ImagePullSecrets 명시 diff --git a/content/ko/docs/concepts/overview/components.md b/content/ko/docs/concepts/overview/components.md index 575d5e2e5c889..f2b58c7113948 100644 --- a/content/ko/docs/concepts/overview/components.md +++ b/content/ko/docs/concepts/overview/components.md @@ -16,7 +16,7 @@ card: ## 마스터 컴포넌트 마스터 컴포넌트는 클러스터의 컨트롤 플레인을 제공한다. 마스터 컴포넌트는 클러스터에 관한 전반적인 결정 -(예를 들어, 스케줄링)을 수행하고 클러스터 이벤트(예를 들어, 레플리케이션 컨트롤러의 `replicas` 필드가 요구조건을 충족되지 않을 경우 새로운 파드를 구동 시키는 것)를 감지하고 반응한다. +(예를 들어, 스케줄링)을 수행하고 클러스터 이벤트(예를 들어, 디플로이먼트의 `replicas` 필드가 요구조건을 충족되지 않을 경우 새로운 {{< glossary_tooltip text="파드" term_id="pod">}}를 구동 시키는 것)를 감지하고 반응한다. 마스터 컴포넌트는 클러스터 내 어떠한 머신에서든지 동작 될 수 있다. 그러나, 간결성을 위하여, 구성 스크립트는 보통 동일 머신 상에 모든 마스터 컴포넌트를 구동시키고, @@ -110,6 +110,9 @@ cloud-controller-manager는 클라우드 밴더 코드와 쿠버네티스 코드 [클러스터-레벨 로깅](/docs/concepts/cluster-administration/logging/) 메커니즘은 검색/열람 인터페이스와 함께 중앙 로그 저장소에 컨테이너 로그를 저장하는 책임을 가진다. +* [노드](/ko/docs/concepts/architecture/nodes/)에 대해 더 배우기 +* [kube-scheduler](/docs/concepts/scheduling/kube-scheduler/)에 대해 더 배우기 +* etcd의 공식 [문서](https://etcd.io/docs/) 읽기 {{% /capture %}} diff --git a/content/ko/docs/concepts/overview/working-with-objects/common-labels.md b/content/ko/docs/concepts/overview/working-with-objects/common-labels.md new file mode 100644 index 0000000000000..450255c37c221 --- /dev/null +++ b/content/ko/docs/concepts/overview/working-with-objects/common-labels.md @@ -0,0 +1,169 @@ +--- +title: 권장 레이블 +content_template: templates/concept +--- + +{{% capture overview %}} +kubectl과 대시보드와 같은 많은 도구들로 쿠버네티스 오브젝트를 시각화 하고 관리할 수 있다. +공통 레이블 셋은 모든 도구들이 이해할 수 있는 공통의 방식으로 오브젝트를 식별하고 +도구들이 상호 운용적으로 작동할 수 있도록 한다. + +권장 레이블은 지원 도구 외에도 쿼리하는 방식으로 애플리케이션을 식별하게 한다. +{{% /capture %}} + +{{% capture body %}} +메타데이터는 _애플리케이션_ 의 개념을 중심으로 정리된다. +쿠버네티스는 플랫폼 서비스(PaaS)가 아니며 애플리케이션에 대해 공식적인 개념이 없거나 강요하지 않는다. +대신 애플리케이션은 비공식적이며 메타데이터로 설명된다. +애플리케이션에 포함된 정의는 유연하다. + +{{< note >}} +메타데이터들은 권장하는 레이블이다. 애플리케이션을 보다 쉽게 관리할 수 있지만 코어 도구에는 필요하지 않다. +{{< /note >}} + +공유 레이블과 주석에는 공통 접두사인 `app.kubernetes.io` 가 있다. +접두사가 없는 레이블은 사용자가 개인적으로 사용할 수 있다. +공유 접두사는 공유 레이블이 사용자 정의 레이블을 방해하지 않도록 한다. + + +## 레이블 + +레이블을 최대한 활용하려면 모든 리소스 오브젝트에 적용해야 한다. + +| Key | Description | Example | Type | +| ----------------------------------- | --------------------- | -------- | ---- | +| `app.kubernetes.io/name` | 애플리케이션 이름 | `mysql` | 문자열 | +| `app.kubernetes.io/instance` | 애플리케이션의 인스턴스를 식별하는 고유한 이름 | `wordpress-abcxzy` | 문자열 | +| `app.kubernetes.io/version` | 애플리케이션의 현재 버전 (예: a semantic version, revision hash 등.) | `5.7.21` | 문자열 | +| `app.kubernetes.io/component` | 아키텍처 내 구성요소 | `database` | 문자열 | +| `app.kubernetes.io/part-of` | 이 애플리케이션의 전체 이름 | `wordpress` | 문자열 | +| `app.kubernetes.io/managed-by` | 애플리케이션의 작동을 관리하는데 사용되는 도구 | `helm` | 문자열 | + +위 레이블의 실제 예시는 다음 스테이트풀셋 오브젝트를 고려한다. + +```yaml +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + app.kubernetes.io/name: mysql + app.kubernetes.io/instance: wordpress-abcxzy + app.kubernetes.io/version: "5.7.21" + app.kubernetes.io/component: database + app.kubernetes.io/part-of: wordpress + app.kubernetes.io/managed-by: helm +``` + +## 애플리케이션과 애플리케이션 인스턴스 + +애플리케이션은 때에 따라 쿠버네티스 클러스터의 동일한 네임스페이스에 한번 또는 그 이상 설치할 수 있다. +예를 들어 워드프레스는 다른 워드프레스가 설치되어있는 웹사이트에 한번 한번 또는 그 이상 설치할 수 있다. + +애플리케이션의 이름과 인스턴스 이름은 별도로 기록된다. +예를 들어 워드프레스는 `app.kubernetes.io/name` 에 `wordpress` 를 가지며 인스턴스 이름으로는 +`app.kubernetes.io/instance` 에 `wordpress-abcxzy` 의 값을 가진다. +이를 통해 애플리케이션과 애플리케이션 인스턴스를 식별할 수 있다. +모든 애플리케이션 인스턴스는 고유한 이름을 가져야 한다. + +## 예시 + +위 레이블을 사용하는 다른 방식에 대한 예시는 다양한 복잡성이 있다. + +### 단순한 스테이트리스 서비스 + +`Deployment` 와 `Service` 오브젝트를 통해 배포된 단순한 스테이트리스 서비스의 경우를 보자. 다음 두 식별자는 레이블을 가장 간단한 형태로 사용하는 방법을 나타낸다. + +`Deployment` 는 애플리케이션을 실행하는 파드를 감시하는데 사용한다. +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/name: myservice + app.kubernetes.io/instance: myservice-abcxzy +... +``` + +`Service`는 애플리케이션을 노출하기 위해 사용한다. +```yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: myservice + app.kubernetes.io/instance: myservice-abcxzy +... +``` + +### 데이터베이스가 있는 웹 애플리케이션 + +Helm을 이용해서 데이터베이스(MySQL)을 이용하는 웹 애플리케이션(WordPress)을 설치한 것과 같이 좀 더 복잡한 애플리케이션을 고려할 수 있다. +다음 식별자는 이 애플리케이션을 배포하는데 사용하는 오브젝트의 시작을 보여준다. + +WordPress를 배포하는데 다음과 같이 `Deployment` 로 시작한다. + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/name: wordpress + app.kubernetes.io/instance: wordpress-abcxzy + app.kubernetes.io/version: "4.9.4" + app.kubernetes.io/managed-by: helm + app.kubernetes.io/component: server + app.kubernetes.io/part-of: wordpress +... +``` + +`Service` 는 애플리케이션을 노출하기 위해 사용한다. + +```yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: wordpress + app.kubernetes.io/instance: wordpress-abcxzy + app.kubernetes.io/version: "4.9.4" + app.kubernetes.io/managed-by: helm + app.kubernetes.io/component: server + app.kubernetes.io/part-of: wordpress +... +``` + +MySQL은 `StatefulSet` 에 MySQL의 소속과 상위 애플리케이션에 대한 메타데이터가 포함되어 노출된다. + +```yaml +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + app.kubernetes.io/name: mysql + app.kubernetes.io/instance: mysql-abcxzy + app.kubernetes.io/version: "5.7.21" + app.kubernetes.io/managed-by: helm + app.kubernetes.io/component: database + app.kubernetes.io/part-of: wordpress +... +``` + +`Service` 는 WordPress의 일부로 MySQL을 노출하는데 이용한다. + +```yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: mysql + app.kubernetes.io/instance: mysql-abcxzy + app.kubernetes.io/version: "5.7.21" + app.kubernetes.io/managed-by: helm + app.kubernetes.io/component: database + app.kubernetes.io/part-of: wordpress +... +``` + +MySQL `StatefulSet` 과 `Service` 로 MySQL과 WordPress가 더 큰 범위의 애플리케이션에 포함되어 있는 것을 알게 된다. + +{{% /capture %}} diff --git a/content/ko/docs/concepts/overview/working-with-objects/labels.md b/content/ko/docs/concepts/overview/working-with-objects/labels.md new file mode 100644 index 0000000000000..58d29c2532204 --- /dev/null +++ b/content/ko/docs/concepts/overview/working-with-objects/labels.md @@ -0,0 +1,225 @@ +--- +title: 레이블과 셀렉터 +content_template: templates/concept +weight: 40 +--- + +{{% capture overview %}} + +_레이블_ 은 파드와 같은 오브젝트에 첨부된 키와 값의 쌍이다. +레이블은 오브젝트의 특성을 식별하는 데 사용되어 사용자에게 중요하지만, 코어 시스템에 직접적인 의미는 없다. +레이블로 오브젝트의 하위 집합을 선택하고, 구성하는데 사용할 수 있다. 레이블은 오브젝트를 생성할 때에 붙이거나 생성 이후에 붙이거나 언제든지 수정이 가능하다. +오브젝트마다 키와 값으로 레이블을 정의할 수 있다. 오브젝트의 키는 고유한 값이어야 한다. + +```json +"metadata": { + "labels": { + "key1" : "value1", + "key2" : "value2" + } +} +``` + +레이블은 UI와 CLI에서 효율적인 쿼리를 사용하고 검색에 사용하기에 적합하다. 식별되지 않는 정보는 [어노테이션](/docs/concepts/overview/working-with-objects/annotations/)으로 기록해야 한다. + +{{% /capture %}} + + +{{% capture body %}} + +## 사용동기 + +레이블을 이용하면 사용자가 느슨하게 결합한 방식으로 조직 구조와 시스템 오브젝트를 매핑할 수 있으며, 클라이언트에 매핑 정보를 저장할 필요가 없다. + +서비스 배포와 배치 프로세싱 파이프라인은 흔히 다차원의 엔터티들이다(예: 다중파티션 또는 배포, 다중 릴리즈 트랙, 다중 계층, 계층속 여러 마이크로 서비스들). 관리에는 크로스-커팅 작업이 필요한 경우가 많은데 이 작업은 사용자보다는 인프라에 의해 결정된 엄격한 계층 표현인 캡슐화를 깨트린다. + +레이블 예시: + + * `"release" : "stable"`, `"release" : "canary"` + * `"environment" : "dev"`, `"environment" : "qa"`, `"environment" : "production"` + * `"tier" : "frontend"`, `"tier" : "backend"`, `"tier" : "cache"` + * `"partition" : "customerA"`, `"partition" : "customerB"` + * `"track" : "daily"`, `"track" : "weekly"` + +레이블 예시는 일반적으로 사용하는 경우에 해당한다. 당신의 규약에 따라 자유롭게 개발할 수 있다. 오브젝트에 붙여진 레이블 키는 고유해야한다는 것을 기억해야한다. + +## 구문과 캐릭터 셋 + +_레이블_ 은 키와 값의 쌍이다. 유효한 레이블 키에는 슬래시(`/`)로 구분되는 선택한 접두사와 이름이라는 2개의 세그먼트가 있다. 이름 세그먼트는 63자 미만으로 시작과 끝은 알파벳과 숫자(`[a-z0-9A-Z]`)이며, 대시(`-`), 밑줄(`_`), 점(`.`)과 함께 사용할 수 있다. 접두사는 선택이다. 만약 접두사를 지정한 경우 접두사는 DNS의 하위 도메인으로 해야하며, 점(`.`)과, 전체 253자 이하, 슬래시(`/`)로 구분되는 DNS 레이블이다. + +접두사를 생략하면 키 레이블은 개인용으로 간주한다. 최종 사용자의 오브젝트에 자동화된 시스템 구성 요소(예: `kube-scheduler`, `kube-controller-manager`, `kube-apiserver`, `kubectl` 또는 다른 타사의 자동화 구성 요소)의 접두사를 지정해야 한다. + +`kubernetes.io/`와 `k8s.io/` 접두사는 쿠버네티스의 핵심 구성요소로 예약되어있다. + +유효한 레이블 값은 63자 미만 또는 공백이며 시작과 끝은 알파벳과 숫자(`[a-z0-9A-Z]`)이며, 대시(`-`), 밑줄(`_`), 점(`.`)과 함께 사용할 수 있다. + +다음의 예시는 파드에 `environment: production` 과 `app: nginx` 2개의 레이블이 있는 구성 파일이다. + +```yaml + +apiVersion: v1 +kind: Pod +metadata: + name: label-demo + labels: + environment: production + app: nginx +spec: + containers: + - name: nginx + image: nginx:1.7.9 + ports: + - containerPort: 80 + +``` + +## 레이블 셀렉터 + +[이름과 UID](/docs/user-guide/identifiers)와 다르게 레이블은 고유하지 않다. 일반적으로 우리는 많은 오브젝트에 같은 레이블을 가질 것으로 예상한다. + +레이블 셀렉터를 통해 클라이언트와 사용자는 오브젝트를 식별할 수 있다. 레이블 셀렉터는 쿠버네티스 코어 그룹의 기본이다. + +API는 현재 _일치성 기준_ 과 _집합성 기준_ 이라는 두 종류의 셀렉터를 지원한다. +레이블 셀렉터는 쉼표로 구분된 다양한 _요구사항_ 에 따라 만들 수 있다. 다양한 요구사항이 있는 경우 쉼표 기호가 AND(`&&`) 연산자로 구분되는 역할을 하도록 해야 한다. + +비어있거나 지정되지 않은 셀렉터는 상황에 따라 달라진다. +셀렉터를 사용하는 API 유형은 유효성과 의미를 문서화 해야 한다. + +{{< note >}} +레플리카 셋과 같은 일부 API 유형에서 두 인스턴스의 레이블 셀렉터는 네임스페이스 내에서 겹치지 않아야 한다. 그렇지 않으면 컨트롤러는 상충되는 명령으로 보고, 얼마나 많은 복제본이 필요한지 알 수 없다. +{{< /note >}} + +### _일치성 기준_ 요건 + +_일치성 기준_ 또는 _불일치 기준_ 의 요구사항으로 레이블의 키와 값의 필터링을 허용한다. 일치하는 오브젝트는 추가 레이블을 가질 수 있지만 레이블의 명시된 제약 조건을 모두 만족해야 한다. +`=`,`==`,`!=` 이 3가지 연산자만 허용한다. 처음 두 개의 연산자의 _일치성_(그리고 단순히 동의어일 뿐임), 나머지는 _불일치_를 의미한다. 예를 들면, + +``` +environment = production +tier != frontend +``` + +전자는 `environment`를 키로 가지는 것과 `production`를 값으로 가지는 모든 리소스를 선택한다. +후자는 `tier`를 키로 가지고, 값을 `frontend`를 가지는 리소스를 제외한 모든 리소스를 선택하고, `tier`를 키로 가지며, 값을 공백으로 가지는 모든 리소스를 선택한다. +`environment=production,tier!=frontend` 처럼 쉼표를 통해 한 문장으로 `frontend`를 제외한 `production`을 필터링할 수 있다. + +균등-기반 레이블의 요건에 대한 하나의 이용 시나리오는 파드가 노드를 선택하는 기준을 지정하는 것이다. +예를 들어, 아래 샘플 파드는 "`accelerator=nvidia-tesla-p100`" 레이블을 가진 노드를 선택한다. + + + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: cuda-test +spec: + containers: + - name: cuda-test + image: "k8s.gcr.io/cuda-vector-add:v0.1" + resources: + limits: + nvidia.com/gpu: 1 + nodeSelector: + accelerator: nvidia-tesla-p100 +``` + +### _집합성 기준_ 요건 + +_집합성 기준_ 레이블 요건에 따라 값 집합을 키로 필터링할 수 있다. `in`,`notin` and `exists`(키 식별자만 해당)의 3개의 연산자를 지원한다. 예를 들면, + +``` +environment in (production, qa) +tier notin (frontend, backend) +partition +!partition +``` + +첫 번째 예시에서 키가 `environment`이고 값이 `production` 또는 `qa`인 모든 리소스를 선택한다. +두 번째 예시에서 키가 `tier`이고 값이 `frontend`와 `backend`를 가지는 리소스를 제외한 모든 리소스와, 키로 `tier`를 가지고 값을 공백으로 가지는 모든 리소스를 선택한다. +세 번째 예시에서 레이블의 값에 상관없이 키가 `partition`를 포함하는 모든 리소스를 선택한다. +네 번째 예시에서 레이블의 값에 상관없이 키가 `partition`를 포함하지 않는 모든 리소스를 선택한다. +마찬가지로 쉼표는 _AND_ 연산자로 작동한다. 따라서 `partition,environment notin (qa)`와 같이 사용하면 값과 상관없이 키가 `partition`인 것과 키가 `environment`이고 값이 `qa`와 다른 리소스를 필터링할 수 있다. +_집합성 기준_ 레이블 셀렉터는 일반적으로 `environment=production` 과 `environment in (production)`를 같은 것으로 본다. 유사하게는 `!=`과 `notin`을 같은 것으로 본다. + +_집합성 기준_ 요건은 _일치성 기준_ 요건과 조합해서 사용할 수 있다. 예를 들어 `partition in (customerA, customerB),environment!=qa` + +## API + +### LIST와 WATCH 필터링 + +LIST와 WATCH 작업은 쿼리 파라미터를 사용해서 반환되는 오브젝트 집합을 필터링하기 위해 레이블 셀럭터를 지정할 수 있다. 다음의 2가지 요건 모두 허용된다(URL 쿼리 문자열을 그대로 표기함). + + * _불일치 기준_ 요건: `?labelSelector=environment%3Dproduction,tier%3Dfrontend` + * _집합성 기준_ 요건: `?labelSelector=environment+in+%28production%2Cqa%29%2Ctier+in+%28frontend%29` + +두 가지 레이블 셀렉터 스타일은 모두 REST 클라이언트를 통해 선택된 리소스를 확인하거나 목록을 볼 수 있다. 예를 들어, `kubectl`로 `API 서버`를 대상으로 _불일치 기준_으로 하는 셀렉터를 다음과 같이 이용할 수 있다. + +```shell +kubectl get pods -l environment=production,tier=frontend +``` + +또는 _집합성 기준_ 요건을 사용하면 + +```shell +kubectl get pods -l 'environment in (production),tier in (frontend)' +``` + +앞서 안내한 것처럼 _집합성 기준_ 요건은 더 보여준다. 예시에서 다음과 같이 OR 연산자를 구현할 수 있다. + +```shell +kubectl get pods -l 'environment in (production, qa)' +``` + +또는 _exists_ 연산자에 불일치한 것으로 제한할 수 있다. + +```shell +kubectl get pods -l 'environment,environment notin (frontend)' +``` + +### API 오브젝트에서 참조 설정 + +[`서비스`](/docs/user-guide/services) 와 [`레플리케이션 컨트롤러`](/docs/user-guide/replication-controller)와 같은 일부 쿠버네티스 오브젝트는 레이블 셀렉터를 사용해서 [`파드`](/docs/user-guide/pods)와 같은 다른 리소스 집합을 선택한다. + +#### 서비스와 리플리케이션 컨트롤러 + +`서비스`에서 지정하는 파드 집합은 레이블 셀렉터로 정의한다. 마찬가지로 `리플레케이션 컨트롤러`가 관리하는 파드의 개체군도 레이블 셀렉터로 정의한다. + +서비스와 리플리케이션 컨트롤러의 레이블 셀렉터는 `json` 또는 `yaml` 파일에 매핑된 _균등-기반_ 요구사항의 셀렉터만 지원한다. + +```json +"selector": { + "component" : "redis", +} +``` +or + +```yaml +selector: + component: redis +``` + +`json` 또는 `yaml` 서식에서 셀렉터는 `component=redis` 또는 `component in (redis)` 모두 같은 것이다. + + +#### 세트-기반 요건을 지원하는 리소스 + +[`잡`](/docs/concepts/jobs/run-to-completion-finite-workloads/), [`디플로이먼트`](/docs/concepts/workloads/controllers/deployment/), [`레플리카 셋`](/docs/concepts/workloads/controllers/replicaset/) 그리고 [`데몬 셋`](/docs/concepts/workloads/controllers/daemonset/) 같은 새로운 리소스들은 집합성 기준의 요건도 지원한다. + +```yaml +selector: + matchLabels: + component: redis + matchExpressions: + - {key: tier, operator: In, values: [cache]} + - {key: environment, operator: NotIn, values: [dev]} +``` + +`matchLabels`는 `{key,value}`의 쌍과 매칭된다. `matchLabels`에 매칭된 단일 `{key,value}`는 `matchExpressions`의 요소와 같으며 `key` 필드는 "key"로, `operator`는 "In" 그리고 `values`에는 "value"만 나열되어 있다. `matchExpressions`는 파드 셀렉터의 요건 목록이다. 유효한 연산자에는 In, NotIn, Exists 및 DoNotExist가 포함된다. In 및 NotIn은 설정된 값이 있어야 한다. `matchLabels`과 `matchExpressions` 모두 AND로 되어있어 일치하기 위해서는 모든 요건을 만족해야 한다. + +#### 노드 셋 선택 + +레이블을 통해 선택하는 사용 사례 중 하나는 파드를 스케줄 할 수 있는 노드 셋을 제한하는 것이다. +자세한 내용은 [노드 선택](/docs/concepts/configuration/assign-pod-node/) 문서를 참조한다. + +{{% /capture %}} diff --git a/content/ko/docs/concepts/overview/working-with-objects/namespaces.md b/content/ko/docs/concepts/overview/working-with-objects/namespaces.md index 119cf34fe64a0..63229eb600a20 100644 --- a/content/ko/docs/concepts/overview/working-with-objects/namespaces.md +++ b/content/ko/docs/concepts/overview/working-with-objects/namespaces.md @@ -61,13 +61,13 @@ kube-public Active 1d ### 요청에 네임스페이스 설정하기 -임시로 네임스페이스를 요청에 설정하기 위해서는, `--namespace` 플래그를 사용한다. +네임스페이스를 현재 요청에 설정하기 위해서는, `--namespace` 플래그를 사용한다. 예를 들면, ```shell -kubectl --namespace= run nginx --image=nginx -kubectl --namespace= get pods +kubectl run nginx --image=nginx --namespace= +kubectl get pods --namespace= ``` ### 선호하는 네임스페이스 설정하기 @@ -108,3 +108,10 @@ kubectl api-resources --namespaced=false ``` {{% /capture %}} + +{{% capture whatsnext %}} +* [신규 네임스페이스 생성](/docs/tasks/administer-cluster/namespaces/#creating-a-new-namespace)에 대해 더 배우기. +* [네임스페이스 삭제](/docs/tasks/administer-cluster/namespaces/#deleting-a-namespace)에 대해 더 배우기. + +{{% /capture %}} + diff --git a/content/ko/docs/concepts/configuration/scheduler-perf-tuning.md b/content/ko/docs/concepts/scheduling/scheduler-perf-tuning.md similarity index 91% rename from content/ko/docs/concepts/configuration/scheduler-perf-tuning.md rename to content/ko/docs/concepts/scheduling/scheduler-perf-tuning.md index 0416b9b1c4878..6ff8b288f7fd1 100644 --- a/content/ko/docs/concepts/configuration/scheduler-perf-tuning.md +++ b/content/ko/docs/concepts/scheduling/scheduler-perf-tuning.md @@ -8,14 +8,20 @@ weight: 70 {{< feature-state for_k8s_version="1.14" state="beta" >}} -Kube-scheduler는 쿠버네티스의 기본 스케줄러이다. 그것은 클러스터의 -노드에 파드를 배치하는 역할을 한다. 파드의 스케줄링 요건을 충족하는 -클러스터의 노드를 파드에 "적합한(feasible)" 노드라고 한다. 스케줄러는 -파드에 대해 적합한 노드를 찾고 기능 셋을 실행하여 해당 노드의 점수를 -측정한다. 그리고 스케줄러는 파드를 실행하는데 적합한 모든 노드 중 가장 -높은 점수를 가진 노드를 선택한다. 이후 스케줄러는 "바인딩"이라는 프로세스로 +[kube-scheduler](/docs/concepts/scheduling/kube-scheduler/#kube-scheduler) +는 쿠버네티스의 기본 스케줄러이다. 그것은 클러스터의 +노드에 파드를 배치하는 역할을 한다. + +파드의 스케줄링 요건을 충족하는 +클러스터의 노드를 파드에 _적합한(feasible)_ 노드라고 한다. 스케줄러는 +파드에 대해 적합한 노드를 찾고 기능 셋을 실행하여 해당 노드의 점수를 +측정한다. 그리고 스케줄러는 파드를 실행하는데 적합한 모든 노드 중 가장 +높은 점수를 가진 노드를 선택한다. 이후 스케줄러는 _바인딩_ 이라는 프로세스로 API 서버에 해당 결정을 통지한다. +본 페이지에서는 상대적으로 큰 규모의 쿠버네티스 클러스터에 대한 성능 튜닝 +최적화에 대해 설명한다. + {{% /capture %}} {{% capture body %}} diff --git a/content/ko/docs/concepts/workloads/pods/disruptions.md b/content/ko/docs/concepts/workloads/pods/disruptions.md new file mode 100644 index 0000000000000..19a9528ce9264 --- /dev/null +++ b/content/ko/docs/concepts/workloads/pods/disruptions.md @@ -0,0 +1,252 @@ +--- +title: 중단(disruption) +content_template: templates/concept +weight: 60 +--- + +{{% capture overview %}} +이 가이드는 고가용성 애플리케이션을 구성하려는 소유자와 +파드에서 발생하는 장애 유형을 이해하기 +원하는 애플리케이션 소유자를 위한 것이다. + +또한 클러스터의 업그레이드와 오토스케일링과 같은 +클러스터의 자동화 작업을 하려는 관리자를 위한 것이다. + +{{% /capture %}} + + +{{% capture body %}} + +## 자발적 중단과 비자발적 중단 + +파드는 누군가(사람 또는 컨트롤러)가 파괴하거나 +불가피한 하드웨어 오류 또는 시스템 소프트웨어 오류가 아니면 사라지지 않는다. + +우리는 이런 불가피한 상황을 애플리케이션의 *비자발적 중단* 으로 부른다. +예시: + +- 노드를 지원하는 물리 머신의 하드웨어 오류 +- 클러스터 관리자의 실수로 VM(인스턴스) 삭제 +- 클라우드 공급자 또는 하이퍼바이저의 오류로 인한 VM 장애 +- 커널 패닉 +- 클러스터 네트워크 파티션의 발생으로 클러스터에서 노드가 사라짐 +- 노드의 [리소스 부족](/docs/tasks/administer-cluster/out-of-resource/)으로 파드가 축출됨 + +리소스 부족을 제외한 나머지 조건은 대부분의 사용자가 익숙할 것이다. +왜냐하면 그 조건은 쿠버네티스에 국한되지 않기 때문이다. + +우리는 다른 상황을 *자발적인 중단* 으로 부른다. +여기에는 애플리케이션 소유자의 작업과 클러스터 관리자의 작업이 모두 포함된다. +다음은 대표적인 애플리케이션 소유자의 작업이다. + +- 디플로이먼트 제거 또는 다른 파드를 관리하는 컨트롤러의 제거 +- 재시작을 유발하는 디플로이먼트의 파드 템플릿 업데이트 +- 파드를 직접 삭제(예: 우연히) + +클러스터 관리자의 작업: + +- 복구 또는 업그레이드를 위한 [노드 드레이닝](/docs/tasks/administer-cluster/safely-drain-node/). +- 클러스터의 스케일 축소를 위한 노드 드레이닝([클러스터 오토스케일링](/docs/tasks/administer-cluster/cluster-management/#cluster-autoscaler)에 대해 알아보기). +- 노드에 다른 무언가를 추가하기 위해 파드를 제거. + +위 작업은 클러스터 관리자가 직접 수행하거나 자동화를 통해 수행하며, +클러스터 호스팅 공급자에 의해서도 수행된다. + +클러스터에 자발적인 중단을 일으킬 수 있는 어떤 원인이 있는지 +클러스터 관리자에게 문의하거나 클라우드 공급자에게 문의하고, 배포 문서를 참조해서 확인해야 한다. +만약 자발적인 중단을 일으킬 수 있는 원인이 없다면 Pod Disruption Budget의 생성을 넘길 수 있다. + +{{< caution >}} +모든 자발적인 중단이 Pod Disruption Budget에 연관되는 것은 아니다. +예를 들어 디플로이먼트 또는 파드의 삭제는 Pod Disruption Budget를 무시한다. +{{< /caution >}} + +## 중단 다루기 + +비자발적인 중단으로 인한 영향을 경감하기 위한 몇 가지 방법은 다음과 같다. + +- 파드가 필요로 하는 [리소스를 요청](/docs/tasks/configure-pod-container/assign-cpu-ram-container)하는지 확인한다. +- 고가용성이 필요한 경우 애플리케이션을 복제한다. (복제된 [스테이트리스](/docs/tasks/run-application/run-stateless-application-deployment/) 및 [스테이트풀](/docs/tasks/run-application/run-replicated-stateful-application/)애플리케이션에 대해 알아보기.) +- 복제된 애플리케이션의 구동 시 훨씬 더 높은 가용성을 위해 랙 전체([안티-어피니티](/docs/user-guide/node-selection/#inter-pod-affinity-and-anti-affinity-beta-feature) 이용) 또는 +영역 간(또는 [다중 영역 클러스터](/docs/setup/multiple-zones)를 이용한다.)에 +애플리케이션을 분산해야 한다. + +자발적 중단의 빈도는 다양하다. 기본적인 쿠버네티스 클러스터에서는 자발적인 운영 중단이 전혀 없다. +그러나 클러스터 관리자 또는 호스팅 공급자가 자발적 중단이 발생할 수 있는 일부 부가 서비스를 운영할 수 있다. +예를 들어 노드 소프트웨어의 업데이트를 출시하는 경우 자발적 중단이 발생할 수 있다. +또한 클러스터(노드) 오토스케일링의 일부 구현에서는 단편화를 제거하고 노드의 효율을 높이는 과정에서 자발적 중단을 야기할 수 있다. +클러스터 관리자 또는 호스팅 공급자는 예측 가능한 자발적 중단 수준에 대해 문서화해야 한다. + +쿠버네티스는 자주 발생하는 자발적 중단에도 고가용성 애플리케이션을 +실행 할 수 있는 기능을 제공한다. +우리는 이 기능을 *Disruption Budgets* 이라 부른다. + +## Disruption Budgets의 작동 방식 + +애플리케이션 소유자는 각 애플리케이션에 대해 `PodDisruptionBudget` 오브젝트(PDB)를 만들 수 있다. +PDB는 자발적 중단으로 일시에 중지되는 복제된 애플리케이션 파드의 수를 제한한다. +예를 들어 정족수 기반의 애플리케이션이 +실행 중인 레플리카의 수가 정족수 이하로 떨어지지 않도록 한다. +웹 프런트 엔드는 부하를 처리하는 레플리카의 수가 +일정 비율 이하로 떨어지지 않도록 보장할 수 있다. + +클러스터 관리자와 호스팅 공급자는 직접적으로 파드나 디플로이먼트를 제거하는 대신 +[Eviction API](/docs/tasks/administer-cluster/safely-drain-node/#the-eviction-api)로 +불리는 Pod Disruption Budgets를 준수하는 도구를 이용해야 한다. +예를 들어 `kubectl drain` 명령어나 Kubernetes-on-GCE 클러스터 업그레이드 스크립트(`cluster/gce/upgrade.sh`)이다. + +클러스터 관리자가 노드를 비우고자 할 경우에는 `kubectl drain` 명령어를 사용한다. +해당 도구는 머신에 존재하는 모든 파드를 축출하려는 시도를 한다. +축출 요청은 일시적으로 거부될 수 있으며, 도구는 모든 파드가 종료되거나 +설정 가능한 타임아웃이 도래할 때까지 주기적으로 모든 실패된 요청을 다시 시도한다. + +PDB는 애플리케이션이 필요로 하는 레플리카의 수에 상대적으로, 용인할 수 있는 레플리카의 수를 지정한다. +예를 들어 `.spec.replicas: 5` 의 값을 갖는 디플로이먼트는 어느 시점에든 5개의 파드를 가져야 한다. +만약 해당 디플로이먼트의 PDB가 특정 시점에 파드를 4개 허용한다면, Eviction API는 한 번에 2개의 파드가 아닌, 1개의 파드의 자발적인 중단을 허용한다. + +파드 그룹은 레이블 셀렉터를 사용해서 지정한 애플리케이션으로 구성되며 +애플리케이션 컨트롤러(디플로이먼트, 스테이트풀 셋 등)를 사용한 것과 같다. + +파드의 "의도"하는 수량은 파드 컨트롤러의 `.spec.replicas` 를 기반으로 계산한다. +컨트롤러는 오브젝트의 `.metadata.ownerReferences` 를 사용해서 파드를 발견한다. + +PDB는 [비자발적 중단](#자발적-중단과-비자발적-중단)이 발생하는 것을 막을 수는 없지만, +버짓이 차감된다. + +애플리케이션의 롤링 업그레이드로 파드가 삭제되거나 사용할 수 없는 경우 중단 버짓에 영향을 준다. +그러나 컨트롤러(디플로이먼트, 스테이트풀 셋과 같은)는 롤링 업데이트시 PDB의 제한을 받지 않는다. +애플리케이션 업데이트 진행 중 발생하는 중단 처리는 컨트롤러 사양에 구성되어있다. +([디플로이먼트 업데이트](/docs/concepts/workloads/controllers/deployment/#updating-a-deployment)에 대해 알아보기.) + +파드를 Eviction API로 축출하면 정상적으로 종료된다. +([파드사양](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core)에서 `terminationGracePeriodSeconds` 를 참조.) + +## PDB 예시 + +`node-1` 부터 `node-3` 까지 3개의 노드가 있는 클러스터가 있다고 하자. +클러스터에는 여러 애플리케이션을 실행하고 있다. +여러 애플리케이션 중 하나는 `pod-a`, `pod-b`, `pod-c` 로 부르는 3개의 레플리카가 있다. 여기에 `pod-x` 라고 부르는 PDB와 무관한 파드가 보인다. +초기에 파드는 다음과 같이 배치된다. + +| node-1 | node-2 | node-3 | +|:--------------------:|:-------------------:|:------------------:| +| pod-a *available* | pod-b *available* | pod-c *available* | +| pod-x *available* | | | + +전체 3개 파드는 디플로이먼트의 일부분으로 전체적으로 항상 3개의 파드 중 최소 2개의 파드를 사용할 수 있도록 하는 PDB를 가지고 있다. + +예를 들어, 클러스터 관리자가 커널 버그를 수정하기위해 새 커널 버전으로 재부팅하려는 경우를 가정해보자. +클러스터 관리자는 첫째로 `node-1` 을 `kubectl drain` 명령어를 사용해서 비우려 한다. +`kubectl` 은 `pod-a` 과 `pod-x` 를 축출하려고 한다. 이는 즉시 성공한다. +두 파드는 동시에 `terminating` 상태로 진입한다. +이렇게 하면 클러스터는 다음의 상태가 된다. + +| node-1 *draining* | node-2 | node-3 | +|:--------------------:|:-------------------:|:------------------:| +| pod-a *terminating* | pod-b *available* | pod-c *available* | +| pod-x *terminating* | | | + +디플로이먼트는 한 개의 파드가 중지되는 것을 알게되고, `pod-d` 라는 대체 파드를 생성한다. +`node-1` 은 차단되어 있어 다른 노드에 위치한다. +무언가가 `pod-x` 의 대체 파드로 `pod-y` 도 생성했다. + +(참고: 스테이트풀 셋은 `pod-1`처럼 불릴, `pod-a`를 +교체하기 전에 완전히 중지해야 하며, `pod-1` 로 불리지만, 다른 UID로 생성된다. +그렇지 않으면 이 예시는 스테이트풀 셋에도 적용된다.) + +이제 클러스터는 다음과 같은 상태이다. + +| node-1 *draining* | node-2 | node-3 | +|:--------------------:|:-------------------:|:------------------:| +| pod-a *terminating* | pod-b *available* | pod-c *available* | +| pod-x *terminating* | pod-d *starting* | pod-y | + +어느 순간 파드가 종료되고, 클러스터는 다음과 같은 상태가 된다. + +| node-1 *drained* | node-2 | node-3 | +|:--------------------:|:-------------------:|:------------------:| +| | pod-b *available* | pod-c *available* | +| | pod-d *starting* | pod-y | + +이 시점에서 만약 성급한 클러스터 관리자가 `node-2` 또는 `node-3` 을 +비우려고 하는 경우 디플로이먼트에 available 상태의 파드가 2개 뿐이고, +PDB에 필요한 최소 파드는 2개이기 때문에 drain 명령이 차단된다. 약간의 시간이 지나면 `pod-d`가 available 상태가 된다. + +이제 클러스터는 다음과 같은 상태이다. + +| node-1 *drained* | node-2 | node-3 | +|:--------------------:|:-------------------:|:------------------:| +| | pod-b *available* | pod-c *available* | +| | pod-d *available* | pod-y | + +이제 클러스터 관리자는 `node-2` 를 비우려고 한다. +drain 커멘드는 `pod-b`에서 `pod-d`와 같이 어떤 순서대로 두 파드를 축출하려 할 것이다. +drain 커멘드는 `pod-b`를 축출하는데 성공했다. +그러나 drain 커멘드가 `pod-d` 를 축출하려 하는 경우 +디플로이먼트에 available 상태의 파드는 1개로 축출이 거부된다. + +디플로이먼트는`pod-b` 를 대체할 `pod-e`라는 파드를 생성한다. +클러스터에 `pod-e` 를 스케줄하기 위한 충분한 리소스가 없기 때문에 +드레이닝 명령어는 차단된다. +클러스터는 다음 상태로 끝나게 된다. + +| node-1 *drained* | node-2 | node-3 | *no node* | +|:--------------------:|:-------------------:|:------------------:|:------------------:| +| | pod-b *available* | pod-c *available* | pod-e *pending* | +| | pod-d *available* | pod-y | | + +이 시점에서 클러스터 관리자는 +클러스터에 노드를 추가해서 업그레이드를 진행해야 한다. + +쿠버네티스에 중단이 발생할 수 있는 비율을 어떻게 변화시키는지 +다음의 사례를 통해 알 수 있다. + +- 애플리케이션에 필요한 레플리카의 수 +- 인스턴스를 정상적으로 종료하는데 소요되는 시간 +- 새 인스턴스를 시작하는데 소요되는 시간 +- 컨트롤러의 유형 +- 클러스터의 리소스 용량 + +## 클러스터 소유자와 애플리케이션 소유자의 역할 분리 + +보통 클러스터 매니저와 애플리케이션 소유자는 +서로에 대한 지식이 부족한 별도의 역할로 생각하는 것이 유용하다. +이와 같은 책임의 분리는 +다음의 시나리오에서 타당할 수 있다. + +- 쿠버네티스 클러스터를 공유하는 애플리케이션 팀이 많고, 자연스럽게 역할이 나누어진 경우 +- 타사 도구 또는 타사 서비스를 이용해서 클러스터 관리를 자동화 하는 경우 + +Pod Disruption Budgets는 역할 분리에 따라 +역할에 맞는 인터페이스를 제공한다. + +만약 조직에 역할 분리에 따른 책임의 분리가 없다면 +Pod Disruption Budgets를 사용할 필요가 없다. + +## 클러스터에서 중단이 발생할 수 있는 작업을 하는 방법 + +만약 클러스터 관리자라면, 그리고 클러스터 전체 노드에 노드 또는 시스템 소프트웨어 업그레이드와 같은 +중단이 발생할 수 있는 작업을 수행하는 경우 다음과 같은 옵션을 선택한다. + +- 업그레이드 하는 동안 다운타임을 허용한다. +- 다른 레플리카 클러스터로 장애조치를 한다. + - 다운타임은 없지만, 노드 사본과 + 전환 작업을 조정하기 위한 인력 비용이 많이 발생할 수 있다. +- PDB를 이용해서 애플리케이션의 중단에 견디도록 작성한다. + - 다운타임 없음 + - 최소한의 리소스 중복 + - 클러스터 관리의 자동화 확대 적용 + - 내결함성이 있는 애플리케이션의 작성은 까다롭지만 + 자발적 중단를 허용하는 작업의 대부분은 오토스케일링과 + 비자발적 중단를 지원하는 작업과 겹친다. + +{{% /capture %}} + + +{{% capture whatsnext %}} + +* [Pod Disruption Budget 설정하기](/docs/tasks/run-application/configure-pdb/)의 단계를 따라서 애플리케이션을 보호한다. + +* [노드 비우기](/docs/tasks/administer-cluster/safely-drain-node/)에 대해 자세히 알아보기 + +{{% /capture %}} diff --git a/content/ko/docs/concepts/workloads/pods/pod-overview.md b/content/ko/docs/concepts/workloads/pods/pod-overview.md index 1555ff06e462b..3c9aaa09ecc2f 100644 --- a/content/ko/docs/concepts/workloads/pods/pod-overview.md +++ b/content/ko/docs/concepts/workloads/pods/pod-overview.md @@ -19,7 +19,7 @@ card: 파드는 애플리케이션 컨테이너(또는, 몇몇의 경우, 다중 컨테이너), 저장소 리소스, 특정 네트워크 IP 그리고, {{< glossary_tooltip text="container" term_id="container" >}} 가 동작하기 위해 만들어진 옵션들을 캡슐화 한다. 파드는 배포의 단위를 말한다. 아마 단일 컨테이너로 구성되어 있거나, 강하게 결합되어 리소스를 공유하는 소수의 컨테이너로 구성되어 있는 *쿠버네티스에서의 애플리케이션 단일 인스턴스* 를 의미함. -[도커](https://www.docker.com)는 쿠버네티스 파드에서 사용되는 가장 대표적인 컨테이너 런타임이지만, 파드는 다른 컨테이너 런타임 역시 지원한다. +[도커](https://www.docker.com)는 쿠버네티스 파드에서 사용되는 가장 대표적인 컨테이너 런타임이지만, 파드는 다른 [컨테이너 런타임](https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/) 역시 지원한다. 쿠버네티스 클러스터 내부의 파드는 주로 두 가지 방법으로 사용된다. diff --git a/content/ko/docs/concepts/workloads/pods/pod.md b/content/ko/docs/concepts/workloads/pods/pod.md index f58d6f8b4faa7..fdadf15710814 100644 --- a/content/ko/docs/concepts/workloads/pods/pod.md +++ b/content/ko/docs/concepts/workloads/pods/pod.md @@ -139,7 +139,7 @@ _컨테이너의 어피니티(affinity) 기반 공동 스케줄링을 지원하 [StatefulSet](/docs/concepts/workloads/controllers/statefulset.md)과 같은 컨트롤러는 상태를 저장하는 파드에도 위와 같은 기능 제공을 할 수 있다. -사용자 지향적으로 선정된 API를 사용하는 것은 [Borg](https://research.google.com/pubs/pub43438.html), [Marathon](https://mesosphere.github.io/marathon/docs/rest-api.html), [Aurora](http://aurora.apache.org/documentation/latest/reference/configuration/#job-schema)와 [Tupperware](http://www.slideshare.net/Docker/aravindnarayanan-facebook140613153626phpapp02-37588997)를 비롯한 클러스터 스케줄링 시스템에서 비교적 일반적이다. +사용자 지향적으로 선정된 API를 사용하는 것은 [Borg](https://research.google.com/pubs/pub43438.html), [Marathon](https://mesosphere.github.io/marathon/docs/rest-api.html), [Aurora](http://aurora.apache.org/documentation/latest/reference/configuration/#job-schema)와 [Tupperware](https://www.slideshare.net/Docker/aravindnarayanan-facebook140613153626phpapp02-37588997)를 비롯한 클러스터 스케줄링 시스템에서 비교적 일반적이다. 파드는 아래와 같은 사항들을 용이하게 하기 위해 노출이 된다: @@ -176,7 +176,7 @@ _컨테이너의 어피니티(affinity) 기반 공동 스케줄링을 지원하 ### 파드 강제 삭제 -파드 강제 삭제는 클러스터 및 etcd에서 즉시 삭제하는 것으로 정의된다. 강제 삭제가 수행되면, apiserver는 kubelet에서 실행중이던 노드에서 파드가 종료되었다는 확인을 기다리지 않는다. +파드 강제 삭제는 클러스터 및 etcd에서 즉시 삭제하는 것으로 정의된다. 강제 삭제가 수행되면, API 서버는 kubelet에서 실행중이던 노드에서 파드가 종료되었다는 확인을 기다리지 않는다. API에서 파드를 즉시 제거하므로 동일한 이름으로 새 파드를 만들 수 있다. 노드에서 즉시 종결되도록 설정된 파드에는 강제 삭제되기 전에 짧은 유예 기간이 주어진다. diff --git a/content/ko/docs/reference/glossary/admission-controller.md b/content/ko/docs/reference/glossary/admission-controller.md new file mode 100644 index 0000000000000..05a9a91709e28 --- /dev/null +++ b/content/ko/docs/reference/glossary/admission-controller.md @@ -0,0 +1,22 @@ +--- +title: 어드미션 컨트롤러(Admission Controller) +id: admission-controller +date: 2019-06-28 +full_link: /docs/reference/access-authn-authz/admission-controllers/ +short_description: > + 쿠버네티스 API 서버에서 요청을 처리하여 오브젝트가 지속되기 전에 그 요청을 가로채는 코드 조각. + +aka: +tags: +- extension +- security +--- +쿠버네티스 API 서버에서 요청을 처리하여 오브젝트가 지속되기 전에 그 요청을 가로채는 코드 조각. + + + +어드미션 컨트롤러는 쿠버네티스 API 서버에서 구성할 수 있고, "유효성 검사"나 "변조하기" 혹은 모두를 진행할 수 있다. +모든 어드미션 컨트롤러는 요청을 거부할 수 있다. 변조하는 컨트롤러는 자신이 승인하는 오브젝트를 수정할 수 있지만 +유효성 검사 컨트롤러는 수정할 수 없다. + +* [쿠버네티스 문서에서 어드미션 컨트롤러](/docs/reference/access-authn-authz/admission-controllers/) diff --git a/content/ko/docs/reference/glossary/aggregation-layer.md b/content/ko/docs/reference/glossary/aggregation-layer.md new file mode 100644 index 0000000000000..404257f20b383 --- /dev/null +++ b/content/ko/docs/reference/glossary/aggregation-layer.md @@ -0,0 +1,19 @@ +--- +title: 애그리게이션 레이어(Aggregation Layer) +id: aggregation-layer +date: 2018-10-08 +full_link: /docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/ +short_description: > + 애그리게이션 레이어를 이용하면 사용자가 추가로 쿠버네티스 형식의 API를 클러스터에 설치할 수 있다. + +aka: +tags: +- architecture +- extension +- operation +--- +애그리게이션 레이어를 이용하면 사용자가 추가로 쿠버네티스 형식의 API를 클러스터에 설치할 수 있다. + + + +{{< glossary_tooltip text="쿠버네티스 API 서버" term_id="kube-apiserver" >}}에서 [추가 API 지원](/docs/tasks/access-kubernetes-api/configure-aggregation-layer/)을 구성하였으면, 쿠버네티스 API의 URL 경로를 "요구하는" `APIService` 오브젝트 추가할 수 있다. diff --git a/content/ko/docs/reference/glossary/certificate.md b/content/ko/docs/reference/glossary/certificate.md new file mode 100644 index 0000000000000..b5bc067015f6c --- /dev/null +++ b/content/ko/docs/reference/glossary/certificate.md @@ -0,0 +1,18 @@ +--- +title: 인증서(Certificate) +id: certificate +date: 2018-04-12 +full_link: /docs/tasks/tls/managing-tls-in-a-cluster/ +short_description: > + 암호화된 안전한 파일로 쿠버네티스 클러스터 접근 검증에 사용한다. + +aka: +tags: +- security +--- +암호화된 안전한 파일로 쿠버네티스 클러스터 접근 검증에 사용한다. + + + +인증서는 쿠버네티스 클러스터에서 애플리케이션이 쿠버네티스 API에 안전하게 접근할 수 있게 한다. 인증서는 클라이언트의 API 접근 허용 여부를 검증한다. + diff --git a/content/ko/docs/reference/glossary/cgroup.md b/content/ko/docs/reference/glossary/cgroup.md new file mode 100644 index 0000000000000..a8c424cf899a6 --- /dev/null +++ b/content/ko/docs/reference/glossary/cgroup.md @@ -0,0 +1,17 @@ +--- +title: cgroup +id: cgroup +date: 2019-06-25 +full_link: +short_description: > + 선택적으로 리소스를 격리, 관리, 제한하는 리눅스 프로세스의 그룹. + +aka: +tags: +- fundamental +--- +선택적으로 리소스를 격리, 관리, 제한하는 리눅스 프로세스의 그룹. + + + +cgroup은 프로세스 집합에 대해서 리소스 사용(CPU, 메모리, 디스크 I/O, 네트워크)을 격리하고, 관리하며, 제한하는 리눅스 커널 기능이다. diff --git a/content/ko/docs/reference/glossary/controller.md b/content/ko/docs/reference/glossary/controller.md index 947470e054ede..05cbd4d55f46f 100644 --- a/content/ko/docs/reference/glossary/controller.md +++ b/content/ko/docs/reference/glossary/controller.md @@ -4,16 +4,16 @@ id: controller date: 2018-04-12 full_link: /docs/admin/kube-controller-manager/ short_description: > - Apiserver를 통해 클러스터의 공유된 상태를 감시하고, 현재 상태를 원하는 상태로 이행시키는 컨트롤 루프. + API 서버를 통해 클러스터의 공유된 상태를 감시하고, 현재 상태를 원하는 상태로 이행시키는 컨트롤 루프. -aka: +aka: tags: - architecture - fundamental --- - {{< glossary_tooltip text="Apiserver" term_id="kube-apiserver" >}}를 통해 클러스터의 공유된 상태를 감시하고, 현재 상태를 원하는 상태로 이행시키는 컨트롤 루프. + {{< glossary_tooltip text="API 서버" term_id="kube-apiserver" >}}를 통해 클러스터의 공유된 상태를 감시하고, 현재 상태를 원하는 상태로 이행시키는 컨트롤 루프. - + 현재 쿠버네티스에 포함된 컨트롤러의 예시로는 레플리케이션 컨트롤러, 엔드포인트 컨트롤러, 네임스페이스 컨트롤러, 서비스 어카운트 컨트롤러가 있다. diff --git a/content/ko/docs/reference/glossary/customresourcedefinition.md b/content/ko/docs/reference/glossary/customresourcedefinition.md index c5c754d2700e0..d21612e118370 100755 --- a/content/ko/docs/reference/glossary/customresourcedefinition.md +++ b/content/ko/docs/reference/glossary/customresourcedefinition.md @@ -4,17 +4,17 @@ id: CustomResourceDefinition date: 2018-04-12 full_link: docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/ short_description: > - 사용자 정의 서버를 완전히 새로 구축할 필요가 없도록 쿠버네티스 API server에 추가할 리소스를 정의하는 사용자 정의 코드. + 사용자 정의 서버를 완전히 새로 구축할 필요가 없도록 쿠버네티스 API 서버에 추가할 리소스를 정의하는 사용자 정의 코드. -aka: +aka: tags: - fundamental - operation - extension --- - 사용자 정의 서버를 완전히 새로 구축할 필요가 없도록 쿠버네티스 API server에 추가할 리소스를 정의하는 사용자 정의 코드. + 사용자 정의 서버를 완전히 새로 구축할 필요가 없도록 쿠버네티스 API 서버에 추가할 리소스를 정의하는 사용자 정의 코드. - + -만약 공개적으로 지원되는 API 리소스가 사용자의 요구를 충족할 수 없는 경우, 커스텀 리소스 데피니션은 사용자의 환경에 따라 쿠버네티스 API를 확장하게 해준다. +만약 공개적으로 지원되는 API 리소스가 사용자의 요구를 충족할 수 없는 경우, 커스텀 리소스 데피니션은 사용자의 환경에 따라 쿠버네티스 API를 확장하게 해준다. diff --git a/content/ko/docs/reference/glossary/device-plugin.md b/content/ko/docs/reference/glossary/device-plugin.md index 61a857e58e68a..cd850a828bd77 100644 --- a/content/ko/docs/reference/glossary/device-plugin.md +++ b/content/ko/docs/reference/glossary/device-plugin.md @@ -4,7 +4,7 @@ id: device-plugin date: 2019-02-02 full_link: /docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/ short_description: > - 장치 플러그인은 쿠버네티스에서 동작하는 컨테이너이며 공급 업체 고유의 리소스에 대한 액세스를 제공한다. + 쿠버네티스에서 동작하는 컨테이너로, 공급 업체 고유의 리소스에 대한 액세스를 제공한다. aka: tags: - fundamental @@ -14,4 +14,4 @@ tags: -[장치 플러그인](/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/)은 쿠버네티스에서 동작하는 컨테이너이며 공급 업체 고유의 리소스에 대한 액세스를 제공한다. 장치 플로그인은 해당 리소스를 kubelet에 알린다. 장치 플러그인은 사용자 정의 쿠버네티스 코드를 작성하는 대신 수동으로 또는 데몬 셋으로도 디플로이 가능하다. +[장치 플러그인](/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/)은 쿠버네티스에서 동작하는 컨테이너이며 공급 업체 고유의 리소스에 대한 액세스를 제공한다. 장치 플로그인은 해당 리소스를 {{< glossary_tooltip term_id="kubelet" >}}에 알린다. 장치 플러그인은 사용자 정의 쿠버네티스 코드를 작성하는 대신 수동으로 또는 {{< glossary_tooltip text="데몬셋" term_id="daemonset" >}}으로도 디플로이 가능하다. diff --git a/content/ko/docs/reference/glossary/kube-proxy.md b/content/ko/docs/reference/glossary/kube-proxy.md index 5f8a4fc612af6..ea7eb79d580be 100755 --- a/content/ko/docs/reference/glossary/kube-proxy.md +++ b/content/ko/docs/reference/glossary/kube-proxy.md @@ -2,21 +2,19 @@ title: kube-proxy id: kube-proxy date: 2018-04-12 -full_link: /docs/reference/generated/kube-proxy +full_link: /docs/reference/command-line-tools-reference/kube-proxy/ short_description: > `kube-proxy`는 클러스터의 각 노드에서 실행되는 네트워크 프록시이다. aka: tags: - fundamental -- core-object +- networking --- - `kube-proxy`는 클러스터의 각 노드에서 실행되는 네트워크 프록시이다. - -이는 호스트의 네트워크 규칙을 관리하고 접속 포워딩을 수행하여 -쿠버네티스 서비스 추상화를 가능케 한다. + [kube-proxy](/docs/reference/command-line-tools-reference/kube-proxy/)는 클러스터의 각 노드에서 실행되는 네트워크 프록시로, 쿠버네티스의 {{< glossary_tooltip text="서비스" term_id="service">}} 개념의 구현부이다. -`kube-proxy`는 요청에 대한 포워딩을 책임진다. `kube-proxy`는 TCP 및 UDP 스트림 포워딩을 허용하거나 TCP 및 UDP 포워딩을 백 엔드 기능 집합에 걸쳐 라운드 로빈을 제공한다. +kube-proxy는 노드의 네트워크 규칙을 유지 관리한다. 이 네트워크 규칙이 내부 네트워크 세션이나 클러스터 바깥에서 파드로 네트워크 통신을 할 수 있도록 해준다. +kube-proxy는 운영 체제에 가용한 패킷 필터링 계층이 있는 경우, 이를 사용한다. 그렇지 않으면, kube-proxy는 트래픽 자체를 포워드(forward)한다. diff --git a/content/ko/docs/reference/glossary/kubectl.md b/content/ko/docs/reference/glossary/kubectl.md index ac68b191af6bb..0de6f95898532 100755 --- a/content/ko/docs/reference/glossary/kubectl.md +++ b/content/ko/docs/reference/glossary/kubectl.md @@ -4,16 +4,16 @@ id: kubectl date: 2018-04-12 full_link: /docs/user-guide/kubectl-overview/ short_description: > - 쿠버네티스 API server와 통신하기 위한 커맨드라인 툴. + 쿠버네티스 API 서버와 통신하기 위한 커맨드라인 툴. -aka: +aka: tags: - tool - fundamental --- - {{< glossary_tooltip text="쿠버네티스 API" term_id="kubernetes-api" >}} server와 통신하기 위한 커맨드라인 툴. + {{< glossary_tooltip text="쿠버네티스 API" term_id="kubernetes-api" >}} 서버와 통신하기 위한 커맨드라인 툴. - + 사용자는 쿠버네티스 오브젝트를 생성, 점검, 업데이트, 삭제하기 위해서 kubectl를 사용할 수 있다. diff --git a/content/ko/docs/reference/glossary/service-account.md b/content/ko/docs/reference/glossary/service-account.md index 2dc318a569921..ce110187e4706 100755 --- a/content/ko/docs/reference/glossary/service-account.md +++ b/content/ko/docs/reference/glossary/service-account.md @@ -6,14 +6,14 @@ full_link: /docs/tasks/configure-pod-container/configure-service-account/ short_description: > 파드에서 실행 중인 프로세스를 위한 신원(identity)을 제공한다. -aka: +aka: tags: - fundamental - core-object --- {{< glossary_tooltip text="파드" term_id="pod" >}}에서 실행 중인 프로세스를 위한 신원(identity)을 제공한다. - + -파드 내부의 프로세스가 클러스터에 엑세스할 때, API server에 의해서 특별한 서비스 어카운트(예를 들면, 기본(default))로 인증된다. 파드를 생성할 때, 서비스 어카운트를 명시하지 않는다면, 동일한 {{< glossary_tooltip text="네임스페이스" term_id="namespace" >}}의 기본 서비스 어카운트가 자동적으로 할당된다. +파드 내부의 프로세스가 클러스터에 엑세스할 때, API 서버에 의해서 특별한 서비스 어카운트(예를 들면, 기본(default))로 인증된다. 파드를 생성할 때, 서비스 어카운트를 명시하지 않는다면, 동일한 {{< glossary_tooltip text="네임스페이스" term_id="namespace" >}}의 기본 서비스 어카운트가 자동적으로 할당된다. diff --git a/content/ko/docs/reference/glossary/static-pod.md b/content/ko/docs/reference/glossary/static-pod.md index ec5ea8c8e8fc6..6b80d40e24b17 100755 --- a/content/ko/docs/reference/glossary/static-pod.md +++ b/content/ko/docs/reference/glossary/static-pod.md @@ -1,7 +1,7 @@ --- title: 스태틱 파드(Static Pod) id: static-pod -date: 2091-02-12 +date: 2019-02-12 full_link: /docs/tasks/administer-cluster/static-pod/ short_description: > 특정 노드의 Kubelet 데몬이 직접 관리하는 파드 diff --git a/content/ko/docs/reference/kubectl/cheatsheet.md b/content/ko/docs/reference/kubectl/cheatsheet.md index 76e05c79e6851..b6a3f854f8a62 100644 --- a/content/ko/docs/reference/kubectl/cheatsheet.md +++ b/content/ko/docs/reference/kubectl/cheatsheet.md @@ -154,6 +154,10 @@ kubectl get services --sort-by=.metadata.name # Name으로 정렬된 서비스 # 재시작 횟수로 정렬된 파드의 목록 조회 kubectl get pods --sort-by='.status.containerStatuses[0].restartCount' +# test 네임스페이스 내 파드 목록을 용량으로 정렬해서 조회 + +kubectl get pods -n test --sort-by=.spec.capacity.storage + # app=cassandra 레이블을 가진 모든 파드의 레이블 버전 조회 kubectl get pods --selector=app=cassandra -o \ jsonpath='{.items[*].metadata.labels.version}' diff --git a/content/ko/docs/reference/using-api/api-overview.md b/content/ko/docs/reference/using-api/api-overview.md index 3c77ed24b8676..a3ed2d4a7de68 100644 --- a/content/ko/docs/reference/using-api/api-overview.md +++ b/content/ko/docs/reference/using-api/api-overview.md @@ -43,7 +43,7 @@ API 버전 규칙과 소프트웨어 버전 규칙은 간접적으로 연관된 [API와 릴리스 버전 부여에 관한 제안](https://git.k8s.io/community/contributors/design-proposals/release/versioning.md)에는 API 버전 규칙과 소프트웨어 버전 규칙 간의 관계가 기술되어 있다. {{< /note >}} -API 버전의 차이는 수준의 안정성과 지원의 차이를 나타낸다. [API 변경 문서](https://git.k8s.io/community/contributors/devel/api_changes.md#alpha-beta-and-stable-versions)에서 각 수준의 기준에 대한 더 많은 정보를 찾을 수 있다. +API 버전의 차이는 수준의 안정성과 지원의 차이를 나타낸다. [API 변경 문서](https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md#alpha-beta-and-stable-versions)에서 각 수준의 기준에 대한 더 많은 정보를 찾을 수 있다. 아래는 각 수준의 기준에 대한 요약이다. diff --git a/content/ko/docs/setup/_index.md b/content/ko/docs/setup/_index.md index 29789d5dbdd78..3a036102991ff 100644 --- a/content/ko/docs/setup/_index.md +++ b/content/ko/docs/setup/_index.md @@ -37,8 +37,8 @@ card: |커뮤니티 |생태계 | | ------------ | -------- | | [Minikube](/docs/setup/learning-environment/minikube/) | [CDK on LXD](https://www.ubuntu.com/kubernetes/docs/install-local) | -| [Kubeadm-dind](https://github.com/kubernetes-sigs/kubeadm-dind-cluster) | [Docker Desktop](https://www.docker.com/products/docker-desktop)| -| [Kubernetes IN Docker](https://github.com/kubernetes-sigs/kind) | [Minishift](https://docs.okd.io/latest/minishift/)| +| [kind (Kubernetes IN Docker)](https://github.com/kubernetes-sigs/kind) | [Docker Desktop](https://www.docker.com/products/docker-desktop)| +| | [Minishift](https://docs.okd.io/latest/minishift/)| | | [MicroK8s](https://microk8s.io/)| | | [IBM Cloud Private-CE (Community Edition)](https://github.com/IBM/deploy-ibm-cloud-private) | | | [IBM Cloud Private-CE (Community Edition) on Linux Containers](https://github.com/HSBawa/icp-ce-on-linux-containers)| @@ -71,14 +71,14 @@ card: | [Cisco Container Platform](https://cisco.com/go/containers) | | | ✔ | | | | [Cloud Foundry Container Runtime (CFCR)](https://docs-cfcr.cfapps.io/) | | | | ✔ |✔ | | [CloudStack](https://cloudstack.apache.org/) | | | | | ✔| -| [Canonical](https://www.ubuntu.com/kubernetes/docs/quickstart) | | ✔ | | ✔ |✔ | ✔ +| [Canonical](https://ubuntu.com/kubernetes) | ✔ | ✔ | ✔ | ✔ |✔ | ✔ | [Containership](https://containership.io/containership-platform) | ✔ |✔ | | | | | [Digital Rebar](https://provision.readthedocs.io/en/tip/README.html) | | | | | | ✔ | [DigitalOcean](https://www.digitalocean.com/products/kubernetes/) | ✔ | | | | | | [Docker Enterprise](https://www.docker.com/products/docker-enterprise) | |✔ | ✔ | | | ✔ | [Fedora (멀티 노드)](https://kubernetes.io/docs/getting-started-guides/fedora/flannel_multi_node_cluster/)  | | | | | ✔ | ✔ | [Fedora (단일 노드)](https://kubernetes.io/docs/getting-started-guides/fedora/fedora_manual_config/)  | | | | | | ✔ -| [Gardner](https://gardener.cloud/) | |✔ | | ✔ | | +| [Gardener](https://gardener.cloud/) | |✔ | | ✔ | | | [Giant Swarm](https://giantswarm.io/) | ✔ | ✔ | ✔ | | | [Google](https://cloud.google.com/) | [Google Kubernetes Engine (GKE)](https://cloud.google.com/kubernetes-engine/) | [Google Compute Engine (GCE)](https://cloud.google.com/compute/)|[GKE On-Prem](https://cloud.google.com/gke-on-prem/) | | | | | | | | | [IBM](https://www.ibm.com/in-en/cloud) | [IBM Cloud Kubernetes Service](https://cloud.ibm.com/kubernetes/catalog/cluster)| |[IBM Cloud Private](https://www.ibm.com/in-en/cloud/private) | | diff --git a/content/ko/docs/setup/learning-environment/minikube.md b/content/ko/docs/setup/learning-environment/minikube.md index 510013d88c86f..c5c02891ee125 100644 --- a/content/ko/docs/setup/learning-environment/minikube.md +++ b/content/ko/docs/setup/learning-environment/minikube.md @@ -452,10 +452,8 @@ export no_proxy=$no_proxy,$(minikube ip) ``` ## 알려진 이슈 -* 클라우드 공급자를 필요로 하는 기능은 Minikube에서 동작하지 않는다. 여기에는 다음이 포함된다. - * 로드밸런서 -* 다중 노드를 위한 기능들이다. 여기에는 다음이 포함된다. - * 진보된 스케쥴링 정책 + +다중 노드가 필요한 기능은 Minukube에서 동작하지 않는다. ## 설계 diff --git a/content/ko/docs/setup/production-environment/container-runtimes.md b/content/ko/docs/setup/production-environment/container-runtimes.md index 74a9489426bed..e4b3b2fdcdc46 100644 --- a/content/ko/docs/setup/production-environment/container-runtimes.md +++ b/content/ko/docs/setup/production-environment/container-runtimes.md @@ -187,7 +187,7 @@ apt-get install cri-o-1.13 {{< tab name="CentOS/RHEL 7.4+" codelang="bash" >}} # 선행 조건 설치 -yum-config-manager --add-repo=https://cbs.centos.org/repos/paas7-crio-311-candidate/x86_64/os/ +yum-config-manager --add-repo=https://cbs.centos.org/repos/paas7-crio-115-release/x86_64/os/ # CRI-O 설치 yum install --nogpgcheck cri-o diff --git a/content/ko/docs/setup/production-environment/tools/kubeadm/_index.md b/content/ko/docs/setup/production-environment/tools/kubeadm/_index.md new file mode 100644 index 0000000000000..091b2a31d211e --- /dev/null +++ b/content/ko/docs/setup/production-environment/tools/kubeadm/_index.md @@ -0,0 +1,4 @@ +--- +title: "kubeadm으로 클러스터 구성하기" +weight: 10 +--- diff --git a/content/ko/docs/setup/production-environment/tools/kubeadm/control-plane-flags.md b/content/ko/docs/setup/production-environment/tools/kubeadm/control-plane-flags.md new file mode 100644 index 0000000000000..12d213bb8fe3e --- /dev/null +++ b/content/ko/docs/setup/production-environment/tools/kubeadm/control-plane-flags.md @@ -0,0 +1,84 @@ +--- +reviewers: +title: kubeadm으로 컨트롤 플레인 사용자 정의하기 +content_template: templates/concept +weight: 40 +--- + +{{% capture overview %}} + +{{< feature-state for_k8s_version="1.12" state="stable" >}} + +kubeadm의 `ClusterConfiguration` 오브젝트는 API 서버, 컨트롤러매니저, 스케줄러와 같은 컨트롤 플레인 구성요소에 전달되는 기본 플래그 `extraArgs` 필드를 노출한다. 이 구성요소는 다음 필드를 사용하도록 정의되어 있다. + +- `apiServer` +- `controllerManager` +- `scheduler` + +`extraArgs` 필드는 `key: value` 쌍으로 구성되어 있다. 컨트롤 플레인 구성요소를 위한 플래그를 대체하려면 다음을 수행한다. + +1. 사용자 구성에서 적절한 필드를 추가한다. +2. 필드에 대체할 플래그를 추가한다. +3. `kubeadm init`에 `--config ` 파라미터를 추가해서 실행한다. + +각 필드의 구성에서 자세한 정보를 보려면, +[API 참고 문서](https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2#ClusterConfiguration)에서 확인해 볼 수 있다. + +{{< note >}} +`kubeadm config print init-defaults`를 실행하고 원하는 파일에 출력을 저장하여 기본값인 `ClusterConfiguration` 오브젝트를 생성할 수 있다. +{{< /note >}} + +{{% /capture %}} + +{{% capture body %}} + +## APIServer 플래그 + +자세한 내용은 [kube-apiserver에 대한 참고 문서](/docs/reference/command-line-tools-reference/kube-apiserver/)를 확인한다. + +사용 예: +```yaml +apiVersion: kubeadm.k8s.io/v1beta2 +kind: ClusterConfiguration +kubernetesVersion: v1.13.0 +apiServer: + extraArgs: + advertise-address: 192.168.0.103 + anonymous-auth: "false" + enable-admission-plugins: AlwaysPullImages,DefaultStorageClass + audit-log-path: /home/johndoe/audit.log +``` + +## 컨트롤러매니저 플래그 + +자세한 내용은 [kube-controller-manager에 대한 참고 문서](/docs/reference/command-line-tools-reference/kube-controller-manager/)를 확인한다. + +사용 예: +```yaml +apiVersion: kubeadm.k8s.io/v1beta2 +kind: ClusterConfiguration +kubernetesVersion: v1.13.0 +controllerManager: + extraArgs: + cluster-signing-key-file: /home/johndoe/keys/ca.key + bind-address: 0.0.0.0 + deployment-controller-sync-period: "50" +``` + +## 스케줄러 플래그 + +자세한 내용은 [kube-scheduler에 대한 참고 문서](/docs/reference/command-line-tools-reference/kube-scheduler/)를 확인한다. + +사용 예: +```yaml +apiVersion: kubeadm.k8s.io/v1beta2 +kind: ClusterConfiguration +kubernetesVersion: v1.13.0 +scheduler: + extraArgs: + address: 0.0.0.0 + config: /home/johndoe/schedconfig.yaml + kubeconfig: /home/johndoe/kubeconfig.yaml +``` + +{{% /capture %}} diff --git a/content/ko/docs/setup/production-environment/tools/kubeadm/ha-topology.md b/content/ko/docs/setup/production-environment/tools/kubeadm/ha-topology.md new file mode 100644 index 0000000000000..ac6cab8aa5334 --- /dev/null +++ b/content/ko/docs/setup/production-environment/tools/kubeadm/ha-topology.md @@ -0,0 +1,70 @@ +--- +reviewers: +title: 고가용성 토폴로지 선택 +content_template: templates/concept +weight: 50 +--- + +{{% capture overview %}} + +이 페이지는 고가용성(HA) 쿠버네티스 클러스터의 토플로지를 구성하는 두 가지 선택 사항을 설명한다. + +다음과 같이 HA 클러스터를 구성할 수 있다. + +- etcd 노드와 컨트롤 플레인 노드를 함께 위치시키는 중첩된(stacked) 컨트롤 플레인 노드 방식 +- etcd와 컨트롤 플레인이 분리된 노드에서 운영되는 외부 etcd 노드 방식 + +HA 클러스터를 구성하기 전에 각 토플로지의 장단점을 주의 깊게 고려해야 한다. + +{{% /capture %}} + +{{% capture body %}} + +## 중첩된 etcd 토플로지 + +중첩된 HA 클러스터는 etcd에서 제공하는 분산 데이터 저장소 클러스터를, +컨트롤 플레인 구성 요소를 실행하는 kubeadm으로 관리되는 노드에 의해서 형성된 클러스터 상단에 +중첩하는 [토플로지](https://en.wikipedia.org/wiki/Network_topology)이다. + +각 컨트롤 플레인 노드는 `kube-apiserver`, `kube-scheduler`, `kube-controller-manager` 인스턴스를 운영한다. +`kube-apiserver`는 로드 밸런서를 이용하여 워커 노드에 노출되어 있다. + +각 컨트롤 플레인 노드는 지역 etcd 맴버를 생성하고 +이 etcd 맴버는 오직 해당 노드의 `kube-apiserver`와 통신한다. +비슷한 방식이 지역의 `kube-controller-manager`와 `kube-scheduler`에도 적용된다. + +이 토플로지는 컨트롤 플레인과 etcd 맴버가 같은 노드에 묶여 있다. +이는 외부 etcd 노드의 클러스터를 구성하는 것보다는 단순하며 복제 관리도 간단하다. + +그러나 중첩된 클러스터는 커플링에 실패할 위험이 있다. 한 노드가 다운되면 etcd 맴버와 컨트롤 플레인을 모두 잃어버리고, +중복성도 손상된다. 더 많은 컨트롤 플레인 노드를 추가하여 이 위험을 완화할 수 있다. + +그러므로 HA 클러스터를 위해 최소 3개인 중첩된 컨트롤 플레인 노드를 운영해야 한다. + +이는 kubeadm의 기본 토플로지이다. 지역 etcd 맴버는 +`kubeadm init`와 `kubeadm join --control-plane` 을 이용할 때에 컨트롤 플레인 노드에 자동으로 생성된다. + +![중첩된 etcd 토플로지](/images/kubeadm/kubeadm-ha-topology-stacked-etcd.svg) + +## 외부 etcd 토플로지 + +외부 etcd를 이용하는 HA 클러스터는 etcd로 제공한 분산된 데이터 스토리지 클러스터가 컨트롤 플레인 구성 요소를 운영하는 노드로 형성하는 클러스터의 외부에 있는 [토플로지](https://en.wikipedia.org/wiki/Network_topology)이다. + +중첩된 etcd 토플로지와 유사하게, 외부 etcd 토플로지에 각 컨트롤 플레인 노드는 `kube-apiserver`, `kube-scheduler`, `kube-controller-manager`의 인스턴스를 운영한다. 그리고 `kube-apiserver`는 로드 밸런서를 이용하여 워커노드에 노출한다. 그러나 etcd 맴버는 분리된 호스트에서 운영되고, 각 etcd 호스트는 각 컨트롤 플레인 노드의 `kube-apiserver`와 통신한다. + +이 토플로지는 컨트롤 플레인과 etcd 맴버를 분리한다. 이는 그러므로 +컨트롤 플레인 인스턴스나 etcd 맴버를 잃는 충격이 덜하고, +클러스터 중복성에 있어 중첩된 HA 토플로지만큼 영향을 미치지 않는다. + +그러나, 이 토플로지는 중첩된 토플로지에 비해 호스트 개수가 두배나 필요하다. +이 토플로지로 HA 클러스터를 구성하기 위해서는 최소한 3개의 컨트롤 플레인과 3개의 etcd 노드가 필요하다. + +![외부 etcd 토플로지](/images/kubeadm/kubeadm-ha-topology-external-etcd.svg) + +{{% /capture %}} + +{{% capture whatsnext %}} + +- [kubeadm을 이용하여 고가용성 클러스터 구성하기](/docs/setup/production-environment/tools/kubeadm/high-availability/) + +{{% /capture %}} diff --git a/content/ko/docs/setup/production-environment/windows/_index.md b/content/ko/docs/setup/production-environment/windows/_index.md new file mode 100644 index 0000000000000..06562362393bf --- /dev/null +++ b/content/ko/docs/setup/production-environment/windows/_index.md @@ -0,0 +1,4 @@ +--- +title: "쿠버네티스에서 윈도우" +weight: 50 +--- diff --git a/content/ko/docs/setup/production-environment/windows/flannel-master-kubectl-get-ds.png b/content/ko/docs/setup/production-environment/windows/flannel-master-kubectl-get-ds.png new file mode 100644 index 0000000000000..cda93533164ca Binary files /dev/null and b/content/ko/docs/setup/production-environment/windows/flannel-master-kubectl-get-ds.png differ diff --git a/content/ko/docs/setup/production-environment/windows/flannel-master-kubectl-get-pods.png b/content/ko/docs/setup/production-environment/windows/flannel-master-kubectl-get-pods.png new file mode 100644 index 0000000000000..73da333fcfcaa Binary files /dev/null and b/content/ko/docs/setup/production-environment/windows/flannel-master-kubectl-get-pods.png differ diff --git a/content/ko/docs/setup/production-environment/windows/user-guide-windows-containers.md b/content/ko/docs/setup/production-environment/windows/user-guide-windows-containers.md new file mode 100644 index 0000000000000..af58c4965e105 --- /dev/null +++ b/content/ko/docs/setup/production-environment/windows/user-guide-windows-containers.md @@ -0,0 +1,138 @@ +--- +reviewers: +title: 쿠버네티스에서 윈도우 컨테이너 스케줄링을 위한 가이드 +content_template: templates/concept +weight: 75 +--- + +{{% capture overview %}} + +많은 조직에서 실행하는 서비스와 애플리케이션의 상당 부분이 윈도우 애플리케이션으로 구성된다. 이 가이드는 쿠버네티스에서 윈도우 컨테이너를 구성하고 배포하는 단계를 안내한다. + +{{% /capture %}} + +{{% capture body %}} + +## 목표 + +* 윈도우 노드에서 윈도우 컨테이너를 실행하는 예시 디플로이먼트를 구성한다. +* (선택) 그룹 매니지드 서비스 어카운트(GMSA)를 이용한 사용자 파드를 위한 액티브 디렉터리 신원(Active Directory Identity)을 구성한다. + +## 시작하기 전에 + +* [윈도우 서버에서 운영하는 마스터와 워커 노드](../user-guide-windows-nodes)를 포함한 쿠버네티스 클러스터를 생성한다. +* 쿠버네티스에서 서비스와 워크로드를 생성하고 배포하는 것은 리눅스나 윈도우 컨테이너 모두 비슷한 방식이라는 것이 중요하다. [Kubectl 커맨드](/docs/reference/kubectl/overview/)로 클러스터에 접속하는 것은 동일하다. 아래 단원의 예시는 윈도우 컨테이너를 경험하기 위해 제공한다. + +## 시작하기: 윈도우 컨테이너 배포하기 + +쿠버네티스에서 윈도우 컨테이너를 배포하려면, 먼저 예시 애플리케이션을 생성해야 한다. 아래 예시 YAML 파일은 간단한 웹서버 애플리케이션을 생성한다. 아래 내용으로 채운 서비스 스펙을 `win-webserver.yaml`로 생성하자. + +```yaml + apiVersion: v1 + kind: Service + metadata: + name: win-webserver + labels: + app: win-webserver + spec: + ports: + # 이 서비스에서 제공하는 포트 + - port: 80 + targetPort: 80 + selector: + app: win-webserver + type: NodePort + --- + apiVersion: extensions/v1beta1 + kind: Deployment + metadata: + labels: + app: win-webserver + name: win-webserver + spec: + replicas: 2 + template: + metadata: + labels: + app: win-webserver + name: win-webserver + spec: + containers: + - name: windowswebserver + image: mcr.microsoft.com/windows/servercore:ltsc2019 + command: + - powershell.exe + - -command + - "<#code used from https://gist.github.com/wagnerandrade/5424431#> ; $$listener = New-Object System.Net.HttpListener ; $$listener.Prefixes.Add('http://*:80/') ; $$listener.Start() ; $$callerCounts = @{} ; Write-Host('Listening at http://*:80/') ; while ($$listener.IsListening) { ;$$context = $$listener.GetContext() ;$$requestUrl = $$context.Request.Url ;$$clientIP = $$context.Request.RemoteEndPoint.Address ;$$response = $$context.Response ;Write-Host '' ;Write-Host('> {0}' -f $$requestUrl) ; ;$$count = 1 ;$$k=$$callerCounts.Get_Item($$clientIP) ;if ($$k -ne $$null) { $$count += $$k } ;$$callerCounts.Set_Item($$clientIP, $$count) ;$$ip=(Get-NetAdapter | Get-NetIpAddress); $$header='

Windows Container Web Server

' ;$$callerCountsString='' ;$$callerCounts.Keys | % { $$callerCountsString+='

IP {0} callerCount {1} ' -f $$ip[1].IPAddress,$$callerCounts.Item($$_) } ;$$footer='' ;$$content='{0}{1}{2}' -f $$header,$$callerCountsString,$$footer ;Write-Output $$content ;$$buffer = [System.Text.Encoding]::UTF8.GetBytes($$content) ;$$response.ContentLength64 = $$buffer.Length ;$$response.OutputStream.Write($$buffer, 0, $$buffer.Length) ;$$response.Close() ;$$responseStatus = $$response.StatusCode ;Write-Host('< {0}' -f $$responseStatus) } ; " + nodeSelector: + beta.kubernetes.io/os: windows +``` + +{{< note >}} +포트 매핑도 지원하지만, 간략한 예시를 위해 컨테이너 포트 80을 직접 서비스로 노출한다. +{{< /note >}} + +1. 모든 노드가 건강한지 확인한다. + + ```bash + kubectl get nodes + ``` + +1. 서비스를 배포하고 파드 갱신을 지켜보자. + + ```bash + kubectl apply -f win-webserver.yaml + kubectl get pods -o wide -w + ``` + + 이 서비스가 정확히 배포되면 모든 파드는 Ready로 표기된다. 지켜보기를 중단하려면, Ctrl+C 를 누르자. + +1. 이 디플로이먼트가 성공적인지 확인한다. 다음을 검토하자. + + * 윈도우 노드에 파드당 두 컨테이너, `docker ps`를 사용한다. + * 리눅스 마스터에서 나열된 두 파드, `kubectl get pods`를 사용한다. + * 네트워크를 통한 노드에서 파드 간에 통신, 리눅스 마스터에서 `curl`을 파드 IP 주소의 80 포트로 실행하여 웹 서버 응답을 확인한다. + * 파드와 파드 간에 통신, `docker exec` 나 `kubectl exec`를 이용해 파드 간에 핑(ping)한다(윈도우 노드를 여럿가지고 있다면 호스트를 달리하며). + * 서비스와 파드 간에 통신, 리눅스 마스터와 독립 파드에서 `curl`을 가상 서비스 IP 주소(`kubectl get services`로 보여지는)로 실행한다. + * 서비스 검색(discovery), 쿠버네티스 [기본 DNS 접미사](/docs/concepts/services-networking/dns-pod-service/#services)와 서비스 이름으로 `curl`을 실행한다. + * 인바운드 연결, 클러스터 외부 장비나 리눅스 마스터에서 NodePort로 `curl`을 실행한다. + * 아웃바운드 연결, `kubectl exec`를 이용해서 파드에서 외부 IP 주소로 `curl`을 실행한다. + +{{< note >}} +윈도우 컨테이너 호스트는 현재 윈도우 네트워킹 스택의 플랫폼 제한으로 인해, 그 안에서 스케줄링하는 서비스의 IP 주소로 접근할 수 없다. 윈도우 파드만 서비스 IP 주소로 접근할 수 있다. +{{< /note >}} + +## 그룹 매니지드 서비스 어카운트를 이용하여 워크로드 신원 관리하기 + +쿠버네티스 v1.14부터 윈도우 컨테이너 워크로드는 그룹 매니지드 서비스 어카운트(GMSA, Group Managed Service Account)를 이용하여 구성할 수 있다. 그룹 매니지드 서비스 어카운트는 액티브 디렉터리 어카운트의 특정한 종류로 자동 암호 관리 기능, 단순화된 서비스 주체 이름(SPN, simplified service principal name), 여러 서버의 다른 관리자에게 관리를 위임하는 기능을 제공한다. GMSA로 구성한 컨테이너는 GMSA로 구성된 신원을 들고 있는 동안 외부 액티브 디렉터리 도메인 리소스를 접근할 수 있다. 윈도우 컨테이너를 위한 GMSA를 이용하고 구성하는 방법은 [여기](/docs/tasks/configure-pod-container/configure-gmsa/)에서 알아보자. + +## 테인트(Taint)와 톨러레이션(Toleration) + +오늘날 사용자는 리눅스와 윈도우 워크로드를 특정 OS 노드별로 보존하기 위해 테인트와 노드 셀렉터(nodeSelector)의 조합을 이용해야 한다. 이것은 윈도우 사용자에게만 부담을 줄 것으로 보인다. 아래는 권장되는 방식의 개요인데, 이것의 주요 목표 중에 하나는 이 방식이 기존 리눅스 워크로드와 호환되어야 한다는 것이다. + +### 특정 OS 워크로드를 적절한 컨테이너 호스트에서 처리하도록 보장하기 + +사용자는 윈도우 컨테이너가 테인트와 톨러레이션을 이용해서 적절한 호스트에서 스케줄링되기를 보장할 수 있다. 오늘날 모든 쿠버네티스 노드는 다음 기본 레이블을 가지고 있다. + +* beta.kubernetes.io/os = [windows|linux] +* beta.kubernetes.io/arch = [amd64|arm64|...] + +파드 사양에 노드 셀렉터를 `"beta.kubernetes.io/os": windows`와 같이 지정하지 않았다면, 그 파드는 리눅스나 윈도우, 아무 호스트에나 스케줄링될 수 있다. 윈도우 컨테이너는 윈도우에서만 운영될 수 있고 리눅스 컨테이너는 리눅스에서만 운영될 수 있기 때문에 이는 문제를 일으킬 수 있다. 가장 좋은 방법은 노드 셀렉터를 사용하는 것이다. + +그러나 많은 경우 사용자는 이미 존재하는 대량의 리눅스 컨테이너용 디플로이먼트를 가지고 있을 뿐만 아니라, 헬름(Helm) 차트 커뮤니티 같은 상용 구성의 에코시스템이나, 오퍼레이터(Operator) 같은 프로그래밍 방식의 파드 생성 사례가 있음을 알고 있다. 이런 상황에서는 노드 셀렉터를 추가하는 구성 변경을 망설일 수 있다. 이에 대한 대안은 테인트를 사용하는 것이다. Kubelet은 등록하는 동안 테인트를 설정할 수 있기 때문에, 윈도우에서만 운영할 때에 자동으로 테인트를 추가하기 쉽다. + +예를 들면, `--register-with-taints='os=Win1809:NoSchedule'` + +모든 윈도우 노드에 테인트를 추가하여 아무 것도 거기에 스케줄링하지 않게 될 것이다(존재하는 리눅스 파드를 포함하여). 윈도우 파드가 윈도우 노드에 스케줄링되려면, 윈도우를 선택하기 위한 노드 셀렉터 및 적합하게 일치하는 톨러레이션이 모두 필요하다. + +```yaml +nodeSelector: + "beta.kubernetes.io/os": windows +tolerations: + - key: "os" + operator: "Equal" + value: "Win1809" + effect: "NoSchedule" +``` + +{{% /capture %}} diff --git a/content/ko/docs/setup/production-environment/windows/user-guide-windows-nodes.md b/content/ko/docs/setup/production-environment/windows/user-guide-windows-nodes.md new file mode 100644 index 0000000000000..3edff577bd425 --- /dev/null +++ b/content/ko/docs/setup/production-environment/windows/user-guide-windows-nodes.md @@ -0,0 +1,271 @@ +--- +reviewers: +title: 쿠버네티스에서 윈도우 노드 추가 가이드 +content_template: templates/concept +weight: 70 +--- + +{{% capture overview %}} + +쿠버네티스 플랫폼은 이제 리눅스와 윈도우 컨테이너 모두 운영할 수 있다. 윈도우 노드도 클러스터에 등록할 수 있다. 이 가이드는 다음을 어떻게 하는지 보여준다. + +* 윈도우 노드를 클러스터에 등록하기 +* 리눅스와 윈도우에서 동작하는 파드가 상호 간에 통신할 수 있게 네트워크를 구성하기 + +{{% /capture %}} + +{{% capture body %}} + +## 시작하기 전에 + +* 윈도우 컨테이너를 호스트하는 윈도우 노드를 구성하려면 [윈도우 서버 라이선스](https://www.microsoft.com/en-us/cloud-platform/windows-server-pricing)를 소유해야 한다. 클러스터를 위해서 소속 기관의 라이선스를 사용하거나, Microsoft, 리셀러로 부터 취득할 수 있으며, GCP, AWS, Azure와 같은 주요 클라우드 제공자의 마켓플레이스를 통해 윈도우 서버를 운영하는 가상머신을 프로비저닝하여 취득할 수도 있다. [사용시간이 제한된 시험판](https://www.microsoft.com/en-us/cloud-platform/windows-server-trial)도 활용 가능하다. + +* 컨트롤 플레인에 접근할 수 있는 리눅스 기반의 쿠버네티스 클러스터를 구축한다.(몇 가지 예시는 [kubeadm으로 단일 컨트롤플레인 클러스터 만들기](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/), [AKS Engine](/docs/setup/production-environment/turnkey/azure/), [GCE](/docs/setup/production-environment/turnkey/gce/), [AWS](/docs/setup/production-environment/turnkey/aws/)를 포함한다) + +## 시작하기: 사용자 클러스터에 윈도우 노드 추가하기 + +### IP 주소 체계 설계하기 + +쿠버네티스 클러스터 관리를 위해 실수로 네트워크 충돌을 일으키지 않도록 IP 주소에 대해 신중히 설계해야 한다. 이 가이드는 [쿠버네티스 네트워킹 개념](/docs/concepts/cluster-administration/networking/)에 익숙하다 가정한다. + +클러스터를 배포하려면 다음 주소 공간이 필요하다. + +| 서브넷 / 주소 범위 | 비고 | 기본값 | +| --- | --- | --- | +| 서비스 서브넷 | 라우트 불가한 순수한 가상 서브넷으로 네트워크 토플로지에 관계없이 파드에서 서비스로 단일화된 접근을 제공하기 위해 사용한다. 서비스 서브넷은 노드에서 실행 중인 `kube-proxy`에 의해서 라우팅 가능한 주소 공간으로(또는 반대로) 번역된다. | 10.96.0.0/12 | +| 클러스터 서브넷 | 클러스터 내에 모든 파드에 사용되는 글로벌 서브넷이다. 각 노드에는 파드가 사용하기 위한 /24 보다 작거나 같은 서브넷을 할당한다. 서브넷은 클러스터 내에 모든 파드를 수용할 수 있을 정도로 충분히 큰 값이어야 한다. *최소 서브넷*의 크기를 계산하려면: `(노드의 개수) + (노드의 개수 * 구성하려는 노드 당 최대 파드 개수)`. 예: 노드 당 100개 파드인 5 노드짜리 클러스터 = `(5) + (5 * 100) = 505.` | 10.244.0.0/16 | +| 쿠버네티스 DNS 서비스 IP | DNS 확인 및 클러스터 서비스 검색에 사용되는 서비스인 `kube-dns`의 IP 주소이다. | 10.96.0.10 | + +클러스터에 IP 주소를 얼마나 할당해야 할지 결정하기 위해 '쿠버네티스에서 윈도우 컨테이너: 지원되는 기능: 네트워킹'에서 소개한 네트워킹 선택 사항을 검토하자. + +### 윈도우에서 실행되는 구성 요소 + +쿠버네티스 컨트롤 플레인이 리눅스 노드에서 운영되는 반면, 다음 요소는 윈도우 노드에서 구성되고 운영된다. + +1. kubelet +2. kube-proxy +3. kubectl (선택적) +4. 컨테이너 런타임 + +v1.14 이후의 최신 바이너리를 [https://github.com/kubernetes/kubernetes/releases](https://github.com/kubernetes/kubernetes/releases)에서 받아온다. kubeadm, kubectl, kubelet, kube-proxy의 Windows-amd64 바이너리는 CHANGELOG 링크에서 찾아볼 수 있다. + +### 네트워크 구성 + +리눅스 기반의 쿠버네티스 마스터 노드를 가지고 있다면 네트워킹 솔루션을 선택할 준비가 된 것이다. 이 가이드는 단순화를 위해 VXLAN 방식의 플라넬(Flannel)을 사용하여 설명한다. + +#### 리눅스 컨트롤러에서 VXLAN 방식으로 플라넬 구성하기 + +1. 플라넬을 위해 쿠버네티스 마스터를 준비한다. + + 클러스터의 쿠버네티스 마스터에서 사소한 준비를 권장한다. 플라넬을 사용할 때에 iptables 체인으로 IPv4 트래픽을 브릿지할 수 있게 하는 것은 추천한다. 이는 다음 커맨드를 이용하여 수행할 수 있다. + + ```bash + sudo sysctl net.bridge.bridge-nf-call-iptables=1 + ``` + +1. 플라넬 다운로드 받고 구성하기 + + 가장 최신의 플라넬 메니페스트를 다운로드한다. + + ```bash + wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml + ``` + + VXLAN 네트워킹 벡엔드를 가능하게 하기 위해 수정할 곳은 두 곳이다. + + 아래 단계를 적용하면 `kube-flannel.yml`의 `net-conf.json`부분을 다음과 같게 된다. + + ```json + net-conf.json: | + { + "Network": "10.244.0.0/16", + "Backend": { + "Type": "vxlan", + "VNI" : 4096, + "Port": 4789 + } + } + ``` + + {{< note >}}리눅스의 플라넬과 윈도우의 플라넬이 상호운용하기 위해서 `VNI`는 반드시 4096이고, `Port`는 4789여야 한다. 다른 VNI는 곧 지원될 예정이다. [VXLAN 문서](https://github.com/coreos/flannel/blob/master/Documentation/backends.md#vxlan)에서 + 이 필드의 설명 부분을 보자.{{< /note >}} + +1. `kube-flannel.yml`의 `net-conf.json` 부분을 거듭 확인하자. + 1. 클러스터 서브넷(예, "10.244.0.0/16")은 IP 주소 설계에 따라 설정되어야 한다. + * VNI 4096 은 벡엔드에 설정한다. + * Port 4789 는 벡엔드에 설정한다. + 2. `kube-flannel.yml`의 `cni-conf.json` 부분에서 네트워크 이름을 `vxlan0`로 바꾼다. + + + `cni-conf.json`는 다음과 같다. + + ```json + cni-conf.json: | + { + "name": "vxlan0", + "plugins": [ + { + "type": "flannel", + "delegate": { + "hairpinMode": true, + "isDefaultGateway": true + } + }, + { + "type": "portmap", + "capabilities": { + "portMappings": true + } + } + ] + } + ``` + +1. 플라넬 yaml 을 적용하고 확인하기 + + 플라넬 구성을 적용하자. + + ```bash + kubectl apply -f kube-flannel.yml + ``` + + 다음은 플라넬 파드는 리눅스 기반이라 [여기](https://github.com/Microsoft/SDN/blob/1d5c055bb195fecba07ad094d2d7c18c188f9d2d/Kubernetes/flannel/l2bridge/manifests/node-selector-patch.yml) 나온 노드 셀렉터 패치를 플라넬 데몬셋 파드에 적용한다. + + ```bash + kubectl patch ds/kube-flannel-ds-amd64 --patch "$(cat node-selector-patch.yml)" -n=kube-system + ``` + + 몇 분 뒤에 플라넬 파드 네트워크가 배포되었다면, 모든 파드에서 운영 중인 것을 확인할 수 있다. + + ```bash + kubectl get pods --all-namespaces + ``` + + ![alt_text](../flannel-master-kubectl-get-pods.png "플라넬 마스터에서 kubectl get pods 스크린 캡춰") + + 플라넬 데몬셋에 노드 셀렉터가 적용되었음을 확인한다. + + ```bash + kubectl get ds -n kube-system + ``` + + ![alt_text](../flannel-master-kubectl-get-ds.png "플라넬 마스터에서 kubectl get ds 스크린 캡춰") + +#### 윈도우 워커 조인 + +이번 단원은 맨 땅에서부터 온프레미스 클러스터에 가입하기까지 윈도우 노드 구성을 다룬다. 클러스터가 클라우드상에 있다면, 다음 단원에 있는 클라우드에 특정한 가이드를 따르도록 된다. + +#### 윈도우 노드 준비하기 +{{< note >}} +윈도우 단원에서 모든 코드 부분은 높은 권한(Admin)으로 파워쉘(PowerShell) 환경에서 구동한다. +{{< /note >}} + +1. 도커(Docker) 설치(시스템 리부팅 필요) + + 쿠버네티스는 [도커](https://www.docker.com/)를 컨테이너 엔진으로 사용하므로, 도커를 설치해야 한다. [공식 문서 설치 요령](https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-docker/configure-docker-daemon#install-docker), [도커 명령](https://store.docker.com/editions/enterprise/docker-ee-server-windows)을 따라 해보거나 다음의 *권장하는* 단계를 시도하자. + + ```PowerShell + Enable-WindowsOptionalFeature -FeatureName Containers + Restart-Computer -Force + Install-Module -Name DockerMsftProvider -Repository PSGallery -Force + Install-Package -Name Docker -ProviderName DockerMsftProvider + ``` + + 네트워크 프록시 안쪽에서 작업한다면 다음 파워쉘 환경 변수를 반드시 정의하자. + + ```PowerShell + [Environment]::SetEnvironmentVariable("HTTP_PROXY", "http://proxy.example.com:80/", [EnvironmentVariableTarget]::Machine) + [Environment]::SetEnvironmentVariable("HTTPS_PROXY", "http://proxy.example.com:443/", [EnvironmentVariableTarget]::Machine) + ``` + + 리부팅 후에 다음 오류를 보게되면, 도커 서비스를 수동으로 재시작해야 한다. + + ![alt_text](../windows-docker-error.png "윈도우 도커 에러 스크린 캡춰") + + ```PowerShell + Start-Service docker + ``` + +{{< note >}} +`pause`(인프라스트럭처) 이미지는 Microsoft 컨테이너 레지스트리(MCR)에 등록되어 있다. `docker pull mcr.microsoft.com/k8s/core/pause:1.2.0`로 접근할 수 있다. `DOCKERFILE`은 https://github.com/kubernetes-sigs/sig-windows-tools/tree/master/cmd/wincat 에 있다. +{{< /note >}} + +1. 쿠버네티스를 위한 윈도우 디렉터리 준비하기 + + 쿠버네티스 바이너리와 배포 스크립트와 구성 파일을 저장할 "윈도우를 위한 쿠버네티스" 디렉터리를 생성한다. + + ```PowerShell + mkdir c:\k + ``` + +1. 쿠버네티스 인증서 복사하기 + + 쿠버네티스 인증서 파일인 `$HOME/.kube/config`을 [리눅스 컨트롤러](https://docs.microsoft.com/en-us/virtualization/windowscontainers/kubernetes/creating-a-linux-master#collect-cluster-information)에서 윈도우 노드의 새로운 `C:\k` 디렉터리로 복사한다. + + 팁: 노드 간에 구성 파일 전송을 위해 [xcopy](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/xcopy), [WinSCP](https://winscp.net/eng/download.php)나 [WinSCP 파워쉘 래퍼](https://www.powershellgallery.com/packages/WinSCP/5.13.2.0)같은 도구를 이용할 수 있다. + +1. 쿠버네티스 바이너리 다운로드 하기 + + 쿠버네티스르 운영을 가능하게 하기 위해 먼저 `kubelet`과 `kube-proxy` 바이너리를 다운로드해야 한다. 이 바이너리를 [최신 릴리스](https://github.com/kubernetes/kubernetes/releases/)의 CHANGELOG.md 파일에 노드 바이너리 링크에서 다운로드 한다. 예를 들어 'kubernetes-node-windows-amd64.tar.gz'. 또한 클라이언트 바이너리 항목에서 찾을 수 있는 윈도우에서 실행되는 `kubectl`을 선택적으로 다운로드 받을 수 있다. + + 압축 파일을 풀고, `C:\k`로 바이너리를 위치하기 위해 [Expand-Archive](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.archive/expand-archive?view=powershell-6) 파워쉘 커맨드를 이용할 수 있다. + +#### 윈도우 노드를 플라넬 클러스터에 가입하기 + +플라넬 오버레이 배포 스크립트와 문서는 [이 리포지터리](https://github.com/Microsoft/SDN/tree/master/Kubernetes/flannel/overlay)에 있다. 다음 단계는 그곳에 있는 자세한 요령을 따라서 단순히 진행하는 것이다. + +[Flannel start.ps1](https://github.com/Microsoft/SDN/blob/master/Kubernetes/flannel/start.ps1) 스크립트를 다운로드받고, 그 내용을 `C:\k`에 풀어 넣자. + +```PowerShell +cd c:\k +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +wget https://raw.githubusercontent.com/Microsoft/SDN/master/Kubernetes/flannel/start.ps1 -o c:\k\start.ps1 +``` + +{{< note >}} +[start.ps1](https://github.com/Microsoft/SDN/blob/master/Kubernetes/flannel/start.ps1)은 [install.ps1](https://github.com/Microsoft/SDN/blob/master/Kubernetes/windows/install.ps1)을 참고하는데, 이는 사용자를 위해 `flanneld` 실행 **파일 같은** 추가 파일과 [인프라스트럭처 파드를 위한 Dockerfile](https://github.com/Microsoft/SDN/blob/master/Kubernetes/windows/Dockerfile)을 다운로드하고 설치한다. 오버레이 네트워킹 방식에서 [방화벽](https://github.com/Microsoft/SDN/blob/master/Kubernetes/windows/helper.psm1#L111)은 지역 UDP 4789 포트에 대해 열려있다. 여러 파워쉘 윈도우가 열렸다 닫히며, 포드 네트워크를 위한 새로운 외부 vSwitch가 처음 생성되는 동안 몇 초간은 네트워크가 중단된다. 아래 지정한 인수를 사용하여 스크립트를 실행하자. +{{< /note >}} + +```PowerShell +.\start.ps1 -ManagementIP -NetworkMode overlay -ClusterCIDR -ServiceCIDR -KubeDnsServiceIP -LogDir +``` + +| 파라미터 | 기본값 | 비고 | +| --- | --- | --- | +| -ManagementIP | N/A (필요함) | 윈도우 노드에 할당할 IP 주소. 이 값을 찾기 위해 `ipconfig` 이용할 수 있다. | +| -NetworkMode | l2bridge | 여기서는 `overlay`를 사용한다. | +| -ClusterCIDR | 10.244.0.0/16 | 클러스터 IP 설계을 참고한다. | +| -ServiceCIDR | 10.96.0.0/12 | 클러스터 IP 설계을 참고한다. | +| -KubeDnsServiceIP | 10.96.0.10 | | +| -InterfaceName | Ethernet | 윈도우 호스트의 네트워크 인터페이스 이름. 이 값을 찾기 위해 ipconfig 이용할 수 있다. | +| -LogDir | C:\k | Kubelet과 Kube-proxy가 각각의 로그 출력 파일을 리다이렉션하는 디렉터리이다. | + +이제 다음을 실행하여 사용자 클러스터 내에 윈도우 노드를 볼 수 있다. + +```bash +kubectl get nodes +``` + +{{< note >}} +Kubelet, kueb-proxy 같은 윈도우 노드 구성요소를 윈도우 서비스로 구성할 수 있다. 추가적인 방법은 [문제 해결](#troubleshooting)의 서비스와 백그라운드 프로세스 단원을 보자. 노드의 구성요소를 서비스로 실행하면 로그 수집하는 것이 문제 해결에 있어 중요한 부분이 된다. 추가 지침으로 기여 가이드에서 [로그 수집하기](https://github.com/kubernetes/community/blob/master/sig-windows/CONTRIBUTING.md#gathering-logs) 단원을 보자. +{{< /note >}} + +### 공개 클라우드 제공자 + +#### Azure + +AKS-Engine은 완전하고, 맞춤 설정이 가능한 쿠버네티스 클러스터를 리눅스와 윈도우 노드에 배포할 수 있다. 단계별 안내가 [GitHub에 있는 문서](https://github.com/Azure/aks-engine/blob/master/docs/topics/windows.md)로 제공된다. + +#### GCP + +사용자가 [GitHub](https://github.com/kubernetes/kubernetes/blob/master/cluster/gce/windows/README-GCE-Windows-kube-up.md)에 있는 단계별 안내를 따라서 완전한 쿠버네티스 클러스터를 GCE 상에 쉽게 배포할 수 있다. + +#### kubeadm과 클러스터 API로 배포하기 + +Kubeadm은 쿠버네티스 클러스터를 배포하는 사용자에게 산업 표준이 되었다. Kubeadm에서 윈도우 노드 지원은 미래 릴리스에 나올 것이다. 또한 윈도우 노드가 올바르게 프로비저닝되도록 클러스터 API에 투자하고 있다. + +### 다음 단계 + +이제 클러스터 내에 윈도우 컨테이너를 실행하도록 윈도우 워커를 구성했으니, 리눅스 컨테이너를 실행할 리눅스 노드를 1개 이상 추가할 수 있다. 이제 윈도우 컨테이너를 클러스터에 스케줄링할 준비가 됬다. + +{{% /capture %}} diff --git a/content/ko/docs/setup/production-environment/windows/windows-docker-error.png b/content/ko/docs/setup/production-environment/windows/windows-docker-error.png new file mode 100644 index 0000000000000..d00528c0d4cc4 Binary files /dev/null and b/content/ko/docs/setup/production-environment/windows/windows-docker-error.png differ diff --git a/content/ko/docs/tasks/access-application-cluster/web-ui-dashboard.md b/content/ko/docs/tasks/access-application-cluster/web-ui-dashboard.md new file mode 100644 index 0000000000000..97eb33b87b2c9 --- /dev/null +++ b/content/ko/docs/tasks/access-application-cluster/web-ui-dashboard.md @@ -0,0 +1,165 @@ +--- +title: 웹 UI (대시보드) +content_template: templates/concept +weight: 10 +card: + name: tasks + weight: 30 + title: Use the Web UI Dashboard +--- + +{{% capture overview %}} +대시보드는 웹 기반 쿠버네티스 유저 인터페이스이다. 대시보드를 통해 컨테이너화 된 애플리케이션을 쿠버네티스 클러스터에 배포할 수 있고, 컨테이너화 된 애플리케이션을 트러블슈팅 할 수 있으며, 클러스터 리소스들을 관리할 수 있다. 대시보드를 통해 클러스터에서 동작중인 애플리케이션의 정보를 볼 수 있고, 개별적인 쿠버네티스 리소스들을(예를 들면 디플로이먼트, 잡, 데몬셋 등) 생성하거나 수정할 수 있다. 예를 들면, 디플로이먼트를 스케일하거나, 롤링 업데이트를 초기화하거나, 파드를 재시작하거나 또는 배포 마법사를 이용해 새로운 애플리케이션을 배포할 수 있다. + +또한 대시보드는 클러스터 내 쿠버네티스 리소스들의 상태와 발생하는 모든 에러 정보를 제공한다. + +![Kubernetes Dashboard UI](/images/docs/ui-dashboard.png) + +{{% /capture %}} + + +{{% capture body %}} + +## 대시보드 UI 배포 + +대시보드 UI는 기본으로 배포되지 않는다. 배포하려면 다음 커맨드를 동작한다. + +``` +kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta1/aio/deploy/recommended.yaml +``` + +## 대시보드 UI 접근 + +클러스터 데이터를 보호하기 위해, 대시보드는 기본적으로 최소한의 RBAC 설정을 제공한다. 현재, 대시보드는 Bearer 토큰으로 로그인 하는 방법을 제공한다. 본 시연을 위한 토큰을 생성하기 위해서는, [샘플 사용자 만들기](https://github.com/kubernetes/dashboard/wiki/Creating-sample-user) 가이드를 따른다. + +{{< warning >}} +시연 중에 생성한 샘플 사용자는 어드민 권한이 부여되며, 이는 교육 목적으로만 사용한다. +{{< /warning >}} + +### 커맨드 라인 프록시 +kubectl 커맨드라인 도구를 이용해 다음 커맨드를 실행함으로써 대시보드를 사용할 수 있다. + +``` +kubectl proxy +``` + +kubectl은 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ 에 대시보드를 사용하는 것을 가능하게 해줄 것이다. + +UI는 커맨드가 실행된 머신에서 _오직_ 접근 가능하다. 상세 내용은 `kubectl proxy --help` 옵션을 확인한다. + +{{< note >}} +Kubeconfig 인증 방법은 외부 아이덴티티 프로파이더 또는 x509 인증서를 지원하지 않는다. +{{< /note >}} + +## 웰컴 뷰 + +초기 클러스터 대시보드에 접근하면, 환영 페이지를 볼 수 있다. 이 페이지는 첫 애플리케이션을 배포하는 버튼이 있을 뿐만 아니라, 이 문서의 링크를 포함하고 있다. 게다가, 대시보드가 있는 클러스터에서 기본적으로 `kube-system` [네임스페이스](/docs/tasks/administer-cluster/namespaces/)이 동작중인 시스템 애플리케이션을 볼 수 있다. + +![Kubernetes Dashboard welcome page](/images/docs/ui-dashboard-zerostate.png) + +## 컨테이너화 된 애플리케이션 배포 + +대시보드를 이용하여 컨테이너화 된 애플리케이션을 디플로이먼트와 간단한 마법사를 통한 선택적인 서비스(Service) 로 생성하고 배포할 수 있다. 애플리케이션 세부 정보를 수동으로 지정할 수 있고, 또는 애플리케이션 구성을 포함한 YAML, JSON 파일을 업로드 할 수 있다. + +시작하는 페이지의 상위 오른쪽 코너에 있는 **CREATE** 버튼을 클릭한다. + +### 애플리케이션 세부 정보 지정 + +배포 마법사는 다음 정보를 제공한다. + +- **앱 이름** (필수): 애플리케이션 이름. [레이블](/docs/concepts/overview/working-with-objects/labels/) 이름은 배포할 모든 디플로이먼트와 서비스(Service)에 추가되어야 한다. + + 애플리케이션 이름은 선택된 쿠버네티스 [네임스페이스](/docs/tasks/administer-cluster/namespaces/) 안에서 유일해야 한다. 소문자로 시작해야하며, 소문자 또는 숫자로 끝나고, 소문자, 숫자 및 대쉬(-)만을 포함해야한다. 24 문자만을 제한한다. 처음과 끝의 스페이스는 무시된다. + +- **컨테이너 이미지** (필수): 레지스트리에 올라간 퍼블릭 도커 [컨테이너 이미지](/docs/concepts/containers/images/) 또는 프라이빗 이미지(대체로 Google Container Registry 또는 도커 허브에 올라간)의 URL. 컨테이너 이미지 사양은 콜론으로 끝난다. + +- **파드의 수** (필수): 배포하고 싶은 애플리케이션의 원하는 목표 파드 개수. 값은 양의 정수만 허용됩니다. + + 클러스터에 의도한 파드의 수를 유지하기 위해서 [디플로이먼트](/docs/concepts/workloads/controllers/deployment/)가 생성될 것이다. + +- **서비스(Service)** (선택): 일부 애플리케이션의 경우, (예를 들어, 프론트엔드) 아마도 클러스터 바깥의 퍼블릭 IP 주소를 가진 (외부 서비스) 외부에 [서비스(Service)](/docs/concepts/services-networking/service/)를 노출 시키고 싶을 수 있다. 외부 서비스들을 위해, 한개 또는 여러 개의 포트들을 열어 둘 필요가 있다. [이 곳](/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/) 내용을 참고한다. + + 클러스터 내부에서만 보고 싶은 어떤 서비스(Serivce)들이 있을 것인다. 이를 내부 서비스라고 한다. + + 서비스(Service) 타입과는 무관하게, 서비스(Service) 생성을 선택해서 컨테이너의 (들어오는 패킷의) 포트를 리슨한다면, 두 개의 포트를 정의해야 한다. 서비스(Service)는 컨테이너가 바라보는 타겟 포트와 (들어오는 패킷의) 맵핑하는 포트가 만들어져야 할 것이다. 서비스(Service)는 배포된 파드에 라우팅 될 것이다. 지원하는 프로토콜은 TCP와 UDP이다. 서비스(Service)가 이용하는 내부 DNS 이름은 애플리케이션 이름으로 지정한 값이 될 것이다. + +만약 필요하다면, 더 많은 세팅을 지정할 수 있는 **자세한 옵션 보기** 섹션에서 확장할 수 있다. + +- **설명**: 입력하는 텍스트값은 디플로이먼트에 [어노테이션](/docs/concepts/overview/working-with-objects/annotations/) 으로 추가될 것이고, 애플리케이션의 세부사항에 표시될 것이다. + +- **레이블**: 애플리케이션에 사용되는 기본적인 [레이블](/docs/concepts/overview/working-with-objects/labels/)은 애플리케이션 이름과 버전이다. 릴리스, 환경, 티어, 파티션, 그리고 릴리스 트랙과 같은 레이블을 디플로이먼트, 서비스(Service), 그리고 파드를 생성할 때 추가적으로 정의할 수 있다. + + 예를 들면: + + ```conf +release=1.0 +tier=frontend +environment=pod +track=stable +``` + +- **네임스페이스**: 쿠버네티스는 동일한 물리 클러스터를 바탕으로 여러 가상의 클러스터를 제공한다. 이러한 가상 클러스터들을 [네임스페이스](/docs/tasks/administer-cluster/namespaces/)라고 부른다. 논리적으로 명명된 그룹으로 리소스들을 분할 할 수 있다. + + 대시보드는 드롭다운 리스트로 가능한 모든 네임스페이스를 제공하고, 새로운 네임스페이스를 생성할 수 있도록 한다. 네임스페이스 이름은 최대 63개의 영숫자 단어와 대시(-)를 포함하고 있지만 대문자를 가지지 못한다. + 네임스페이스 이름은 숫자로만 구성할 수 없다. 만약 이름을 10이라는 숫자로 세팅한다면, 파드는 기본 네임스페이스로 배정하게 될 것이다. + + 네임스페이스 생성이 성공하는 경우, 생성된 네임스페이스가 기본으로 선택된다. 만약 생성에 실패하면, 첫번째 네임스페이스가 선택된다. + +- **이미지 풀(Pull) 시크릿**: 특정 도커 컨테이너 이미지가 프라이빗한 경우, [풀(Pull) 시크릿](/docs/concepts/configuration/secret/) 증명을 요구한다. + + 대시보드는 가능한 모든 시크릿을 드롭다운 리스트로 제공하며, 새로운 시크릿을 생성 할 수 있도록 한다. 시크릿 이름은 예를 들어 `new.image-pull.secret` 과 같이 DNS 도메인 이름 구문으로 따르기로 한다. 시크릿 내용은 base64 인코딩 방식이며, [`.dockercfg`](/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod) 파일로 정의된다. 시크릿 이름은 최대 253 문자를 포함할 수 있다. + + 이미지 풀(Pull) 시크릿의 생성이 성공한 경우, 기본으로 선택된다. 만약 생성에 실패하면, 시크릿은 허용되지 않는다. + +- **CPU 요구 사항 (cores)** 와 **메모리 요구 사항 (MiB)**: 컨테이너를 위한 최소 [리소스 상한](/docs/tasks/configure-pod-container/limit-range/)을 정의할 수 있다. 기본적으로, 파드는 CPU와 메모리 상한을 두지 않고 동작한다. + +- **커맨드 실행** 와 **커맨드 인수 실행**: 기본적으로, 컨테이너는 선택된 도커 이미지의 [기본 엔트리포인트 커맨드](/docs/user-guide/containers/#containers-and-commands)를 실행한다. 커맨드 옵션과 인자를 기본 옵션에 우선 적용하여 사용할 수 있다. + +- **특권을 가진(privileged) 상태로 실행**: 다음 세팅은 호스트에서 루트 권한을 가진 프로세스들이 [특권을 가진 컨테이너](/docs/user-guide/pods/#privileged-mode-for-pod-containers)의 프로세스들과 동등한 지 아닌지 정의한다. 특권을 가진(privileged) 컨테이너는 네트워크 스택과 디바이스에 접근하는 것을 조작하도록 활용할 수 있다. + +- **환경 변수**: 쿠버네티스 서비스(Service)를 [환경 변수](/docs/tasks/inject-data-application/environment-variable-expose-pod-information/)를 통해 노출한다. 환경 변수 또는 인자를 환경 변수들의 값으로 커맨드를 통해 구성할 수 있다. 애플리케이션들이 서비스(Service)를 찾는데 사용된다. 값들은 `$(VAR_NAME)` 구문을 사용하는 다른 변수들로 참조할 수 있다. + +### YAML 또는 JSON 파일 업로드 + +쿠버네티스는 선언적인 설정을 제공한다. 이 방식으로 모든 설정은 쿠버네티스 [API](/docs/concepts/overview/kubernetes-api/) 리소스 스키마를 이용하여 YAML 또는 JSON 설정 파일에 저장한다. + +배포 마법사를 통해 애플리케이션 세부사항들을 지정하는 대신, 애플리케이션을 YAML 또는 JSON 파일로 정의할 수 있고 대시보드를 이용해서 파일을 업로드할 수 있다. + +## 대시보드 사용 +다음 섹션들은 어떻게 제공하고 어떻게 사용할 수 있는지에 대한 쿠버네티스 대시보드 UI의 모습을 보여준다. + +### 탐색 + +클러스터에 정의된 쿠버네티스 오프젝트가 있으면, 대시보드는 초기화된 뷰를 제공한다. 기본적으로 _기본_ 네임스페이스의 오프젝트만이 보이는데, 이는 탐색 창에 위치한 네임스페이스 셀렉터를 이용해 변경할 수 있다. + +대시보드는 몇가지 메뉴 카테고리 중에서 대부분의 쿠버네티스 오브젝트 종류와 그룹을 보여준다. + +#### 어드민 개요 +클러스터와 네임스페이스 관리자에게 대시보드는 노드, 네임스페이스 그리고 퍼시스턴트 볼륨과 세부사항들이 보여진다. 노드는 모든 노드를 통틀어 CPU와 메모리 사용량을 보여준다. 세부사항은 각 노드들에 대한 사용량, 사양, 상태, 할당된 리소스, 이벤트 그리고 노드에서 돌아가는 파드를 보여준다. + +#### 워크로드 +선택된 네임스페이스에서 구동되는 모든 애플리케이션을 보여준다. 애플리케이션의 워크로드 종류(예를 들어, 디플로이먼트, 레플리카 셋, 스테이트풀 셋 등)를 보여주고 각각의 워크로드 종류는 따로 보여진다. 리스트는 예를 들어 레플리카 셋에서 준비된 파드의 숫자 또는 파드의 현재 메모리 사용량과 같은 워크로드에 대한 실용적인 정보를 요약한다. + +워크로드에 대한 세부적인 것들은 상태와 사양 정보, 오프젝트들 간의 관계를 보여준다. 예를 들어, 레플리카 셋으로 관리하는 파드들 또는 새로운 레플리카 셋과 디플로이먼트를 위한 Horizontal Pod Autoscalers 이다. + +#### 서비스(Service) +외부로 노출되는 서비스들과 클러스터 내에 발견되는 서비스들을 허용하는 쿠버네티스 리소스들을 보여준다. 이러한 이유로 서비스(Service)와 인그레스는 클러스터간의 연결을 위한 내부 엔드포인트들과 외부 사용자를 위한 외부 엔드포인트들에 의해 타게팅된 파드들을 보여준다. + +#### 스토리지 +스토리지는 애플리케이션이 데이터를 저장하기 위해 사용하는 퍼시턴트 볼륨 클레임 리소스들을 보여준다. + +#### 컨피그 맵과 시크릿 +클러스터에서 동작 중인 애플리케이션의 라이브 설정을 사용하는 모든 쿠버네티스 리소스들을 보여준다. 컨피그 오브젝트들을 수정하고 관리할 수 있도록 허용하며, 기본적으로는 숨겨져 있는 시크릿들을 보여준다. + +#### 로그 뷰어 +파드 목록과 세부사항 페이지들은 대시보드에 구현된 로그 뷰어에 링크된다. 뷰어는 단일 파드에 있는 컨테이너들의 로그들을 내려가면 볼 수 있도록 한다. + +![Logs viewer](/images/docs/ui-dashboard-logs-view.png) + +{{% /capture %}} + +{{% capture whatsnext %}} + +더 많은 정보는 [쿠버네티스 대시보드 프로젝트 페이지](https://github.com/kubernetes/dashboard)를 참고한다. + +{{% /capture %}} diff --git a/content/ko/docs/tasks/administer-cluster/highly-available-master.md b/content/ko/docs/tasks/administer-cluster/highly-available-master.md new file mode 100644 index 0000000000000..4f4a2ce184123 --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/highly-available-master.md @@ -0,0 +1,175 @@ +--- +reviewers: +title: 고가용성 쿠버네티스 클러스터 마스터 설정하기 +content_template: templates/task +--- + +{{% capture overview %}} + +{{< feature-state for_k8s_version="1.5" state="alpha" >}} + +구글 컴퓨트 엔진(Google Compute Engine, 이하 GCE)의 `kube-up`이나 `kube-down` 스크립트에 쿠버네티스 마스터를 복제할 수 있다. +이 문서는 kube-up/down 스크립트를 사용하여 고가용(HA) 마스터를 관리하는 방법과 GCE와 함께 사용하기 위해 HA 마스터를 구현하는 방법에 관해 설명한다. + +{{% /capture %}} + + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + +{{% /capture %}} + +{{% capture steps %}} + +## HA 호환 클러스터 시작 + +새 HA 호환 클러스터를 생성하려면, `kube-up` 스크립트에 다음 플래그를 설정해야 한다. + +* `MULTIZONE=true` - 서버의 기본 존(zone)과 다른 존에서 마스터 복제본의 kubelet이 제거되지 않도록 한다. +다른 존에서 마스터 복제본을 실행하려는 경우에 권장하고 필요하다. + +* `ENABLE_ETCD_QUORUM_READ=true` - 모든 API 서버에서 읽은 내용이 최신 데이터를 반환하도록 하기 위한 것이다. +true인 경우, Etcd의 리더 복제본에서 읽는다. +이 값을 true로 설정하는 것은 선택 사항이다. 읽기는 더 안정적이지만 느리게 된다. + +선택적으로 첫 번째 마스터 복제본이 생성될 GCE 존을 지정할 수 있다. +다음 플래그를 설정한다. + +* `KUBE_GCE_ZONE=zone` - 첫 마스터 복제본이 실행될 존. + +다음 샘플 커맨드는 europe-west1-b GCE 존에 HA 호환 클러스터를 구성한다. + +```shell +MULTIZONE=true KUBE_GCE_ZONE=europe-west1-b ENABLE_ETCD_QUORUM_READS=true ./cluster/kube-up.sh +``` + +위에 커맨드는 하나의 마스터로 클러스터를 생성한다. +그러나 후속 커맨드로 새 마스터 복제본을 추가할 수 있다. + +## 새 마스터 복제본 추가 + +HA 호환 클러스터를 생성한 다음 그것의 마스터 복제본을 추가할 수 있다. +`kube-up` 스크립트에 다음 플래그를 사용하여 마스터 복제본을 추가한다. + +* `KUBE_REPLICATE_EXISTING_MASTER=true` - 기존 마스터의 복제본을 +만든다. + +* `KUBE_GCE_ZONE=zone` - 마스터 복제본이 실행될 존. +반드시 다른 복제본 존과 동일한 존에 있어야 한다. + +HA 호환 클러스터를 시작할 때, 상속되는 `MULTIZONE`이나 `ENABLE_ETCD_QUORUM_READS` 플래그를 따로 +설정할 필요는 없다. + +다음 샘플 커맨드는 기존 HA 호환 클러스터에서 마스터를 복제한다. + +```shell +KUBE_GCE_ZONE=europe-west1-c KUBE_REPLICATE_EXISTING_MASTER=true ./cluster/kube-up.sh +``` + +## 마스터 복제본 제거 + +다음 플래그가 있는 `kube-down` 스크립트를 사용하여 HA 클러스터에서 마스터 복제본을 제거할 수 있다. + +* `KUBE_DELETE_NODES=false` - kubelet을 삭제하지 않기 위한 것이다. + +* `KUBE_GCE_ZONE=zone` - 마스터 복제본이 제거될 존. + +* `KUBE_REPLICA_NAME=replica_name` - (선택) 제거할 마스터 복제본의 이름. +비어있는 경우, 해당 존의 모든 복제본이 제거된다. + +다음 샘플 커맨드는 기존 HA 클러스터에서 마스터 복제본을 제거한다. + +```shell +KUBE_DELETE_NODES=false KUBE_GCE_ZONE=europe-west1-c ./cluster/kube-down.sh +``` + +## 마스터 복제 실패 처리 + +HA 클러스터의 마스터 복제본 중 하나가 실패하면, +클러스터에서 복제본을 제거하고 동일한 존에서 새 복제본을 추가하는 것이 가장 좋다. +다음 샘플 커맨드로 이 과정을 시연한다. + +1. 손상된 복제본을 제거한다. + + ```shell + KUBE_DELETE_NODES=false KUBE_GCE_ZONE=replica_zone KUBE_REPLICA_NAME=replica_name ./cluster/kube-down.sh + ``` + +1. 기존 복제본 대신 새 복제본을 추가한다. + + ```shell + KUBE_GCE_ZONE=replica-zone KUBE_REPLICATE_EXISTING_MASTER=true ./cluster/kube-up.sh + ``` + +## HA 클러스터에서 마스터 복제에 관한 모범 사례 + +* 다른 존에 마스터 복제본을 배치하도록 한다. 한 존이 실패하는 동안, 해당 존에 있는 마스터도 모두 실패할 것이다. +존 장애를 극복하기 위해 노드를 여러 존에 배치한다 +(더 자세한 내용은 [멀티 존](/docs/setup/best-practices/multiple-zones/)를 참조한다). + +* 두 개의 마스터 복제본은 사용하지 않는다. 두 개의 복제 클러스터에 대한 합의는 지속적 상태를 변경해야 할 때 두 복제본 모두 실행해야 한다. +결과적으로 두 복제본 모두 필요하고, 어떤 복제본의 장애에도 클러스터가 대부분 장애 상태로 변한다. +따라서 두 개의 복제본 클러스터는 HA 관점에서 단일 복제 클러스터보다 열등하다. + +* 마스터 복제본을 추가하면, 클러스터의 상태(Etcd)도 새 인스턴스로 복사된다. +클러스터가 크면, 이 상태를 복제하는 시간이 오래 걸릴 수 있다. +이 작업은 [여기](https://coreos.com/etcd/docs/latest/admin_guide.html#member-migration) 기술한 대로 +Etcd 데이터 디렉터리를 마이그레이션하여 속도를 높일 수 있다(향후에 Etcd 데이터 디렉터리 마이그레이션 지원 추가를 고려 중이다). + +{{% /capture %}} + +{{% capture discussion %}} + +## 구현 지침 + +![ha-master-gce](/images/docs/ha-master-gce.png) + +### 개요 + +각 마스터 복제본은 다음 모드에서 다음 구성 요소를 실행한다. + +* Etcd 인스턴스: 모든 인스턴스는 합의를 사용하여 함께 클러스터화 한다. + +* API 서버: 각 서버는 내부 Etcd와 통신한다. 클러스터의 모든 API 서버가 가용하게 된다. + +* 컨트롤러, 스케줄러, 클러스터 오토스케일러: 임대 방식을 이용한다. 각 인스턴스 중 하나만이 클러스터에서 활성화된다. + +* 애드온 매니저: 각 매니저는 애드온의 동기화를 유지하려고 독립적으로 작업한다. + +또한 API 서버 앞단에 외부/내부 트래픽을 라우팅하는 로드 밸런서가 있을 것이다. + +### 로드 밸런싱 + +두 번째 마스터 복제본을 시작할 때, 두 개의 복제본을 포함된 로드 밸런서가 생성될 것이고, 첫 번째 복제본의 IP 주소가 로드 밸런서의 IP 주소로 승격된다. +비슷하게 끝에서 두 번째의 마스터 복제본을 제거한 후에는 로드 밸런서가 제거되고 +해당 IP 주소는 마지막으로 남은 복제본에 할당된다. +로드 밸런서 생성 및 제거는 복잡한 작업이며, 이를 전파하는 데 시간(~20분)이 걸릴 수 있다. + +### 마스터 서비스와 Kubelet + +쿠버네티스 서비스에서 최신의 쿠버네티스 API 서버 목록을 유지하는 대신, +시스템은 모든 트래픽을 외부 IP 주소로 보낸다. + +* 단일 마스터 클러스터에서 IP 주소는 단일 마스터를 가리킨다. + +* 다중 마스터 클러스터에서 IP 주소는 마스터 앞에 로드밸런서를 가리킨다. + +마찬가지로 Kubelet은 외부 IP 주소를 사용하여 마스터와 통신한다. + +### 마스터 인증서 + +쿠버네티스는 각 복제본의 외부 퍼블릭 IP 주소와 내부 IP 주소를 대상으로 마스터 TLS 인증서를 발급한다. +복제본의 임시 공개 IP 주소에 대한 인증서는 없다. +임시 퍼블릭 IP 주소를 통해 복제본에 접근하려면, TLS 검증을 건너뛰어야 한다. + +### etcd 클러스터화 + +etcd를 클러스터로 구축하려면, etcd 인스턴스간 통신에 필요한 포트를 열어야 한다(클러스터 내부 통신용). +이러한 배포를 안전하게 하기 위해, etcd 인스턴스간의 통신은 SSL을 이용하여 승인한다. + +## 추가 자료 + +[자동화된 HA 마스터 배포 - 제안 문서](https://git.k8s.io/community/contributors/design-proposals/cluster-lifecycle/ha_master.md) + +{{% /capture %}} diff --git a/content/ko/docs/tasks/administer-cluster/network-policy-provider/_index.md b/content/ko/docs/tasks/administer-cluster/network-policy-provider/_index.md new file mode 100644 index 0000000000000..94d43ce6f08f5 --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/network-policy-provider/_index.md @@ -0,0 +1,4 @@ +--- +title: 네트워크 폴리시 제공자(Network Policy Provider) 설치 +weight: 30 +--- diff --git a/content/ko/docs/tasks/administer-cluster/network-policy-provider/calico-network-policy.md b/content/ko/docs/tasks/administer-cluster/network-policy-provider/calico-network-policy.md new file mode 100644 index 0000000000000..209d07a3b0396 --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/network-policy-provider/calico-network-policy.md @@ -0,0 +1,53 @@ +--- +reviewers: +title: 네트워크 폴리시로 캘리코(Calico) 사용하기 +content_template: templates/task +weight: 10 +--- + +{{% capture overview %}} +이 페이지는 쿠버네티스에서 캘리코(Calico) 클러스터를 생성하는 몇 가지 빠른 방법을 살펴본다. +{{% /capture %}} + +{{% capture prerequisites %}} +[클라우드](#creating-a-calico-cluster-with-google-kubernetes-engine-gke)나 [지역](#creating-a-local-calico-cluster-with-kubeadm) 클러스터 중에 어디에 배포할지 결정한다. +{{% /capture %}} + +{{% capture steps %}} +## 구글 쿠버네티스 엔진(GKE)에 캘리코 클러스터 생성하기 {#creating-a-calico-cluster-with-google-kubernetes-engine-gke} + +**사전요구사항**: [gcloud](https://cloud.google.com/sdk/docs/quickstarts). + +1. 캘리코로 GKE 클러스터를 시작하려면, `--enable-network-policy` 플래그를 추가하면 된다. + + **문법** + ```shell + gcloud container clusters create [클러스터_이름] --enable-network-policy + ``` + + **예시** + ```shell + gcloud container clusters create my-calico-cluster --enable-network-policy + ``` + +1. 배포를 확인하기 위해, 다음 커맨드를 이용하자. + + ```shell + kubectl get pods --namespace=kube-system + ``` + + 캘리코 파드는 `calico`로 시작한다. 각각의 상태가 `Running`임을 확인하자. + +## kubeadm으로 지역 캘리코 클러스터 생성하기 {#creating-a-local-calico-cluster-with-kubeadm} + +Kubeadm을 이용해서 15분 이내에 지역 단일 호스트 캘리코 클러스터를 생성하려면, +[캘리코 빠른 시작](https://docs.projectcalico.org/latest/getting-started/kubernetes/)을 참고한다. + +{{% /capture %}} + + +{{% capture whatsnext %}} +클러스터가 동작하면, 쿠버네티스 네트워크 폴리시(NetworkPolicy)를 시도하기 위해 +[네트워크 폴리시 선언하기](/docs/tasks/administer-cluster/declare-network-policy/)를 따라 할 수 있다. +{{% /capture %}} + diff --git a/content/ko/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy.md b/content/ko/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy.md new file mode 100644 index 0000000000000..b0cba9681ecad --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy.md @@ -0,0 +1,106 @@ +--- +reviewers: +title: 네트워크 폴리시로 실리움(Cilium) 사용하기 +content_template: templates/task +weight: 20 +--- + +{{% capture overview %}} +이 페이지는 어떻게 네트워크 폴리시(NetworkPolicy)로 실리움(Cilium)를 사용하는지 살펴본다. + +실리움의 배경에 대해서는 [실리움 소개](https://cilium.readthedocs.io/en/stable/intro)를 읽어보자. +{{% /capture %}} + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + +{{% /capture %}} + +{{% capture steps %}} +## 기본 시험을 위해 실리움을 Minikube에 배포하기 + +실리움에 쉽게 친숙해지기 위해 +Minikube에 실리움을 기본적인 데몬셋으로 설치를 수행하는 +[실리움 쿠버네티스 시작하기 안내](https://cilium.readthedocs.io/en/stable/gettingstarted/minikube/)를 따라 해볼 수 있다. + +Minikube를 시작하려면 최소 버전으로 >= v0.33.1 이 필요하고, +다음의 실행 파라미터로 실행한다. + +```shell +minikube version +``` +``` +minikube version: v0.33.1 +``` + +```shell +minikube start --network-plugin=cni --memory=4096 +``` + +Minikube에서 실리움의 데몬셋 구성과 Minikube에 배포된 etcd 인스턴스로 접속하는데 필요한 구성 뿐만 아니라 +RBAC 설정을 포함하는 필요한 구성을 +이 간단한 ``올인원`` YAML 파일로 배포할 수 있다. + +```shell +kubectl create -f https://raw.githubusercontent.com/cilium/cilium/v1.5/examples/kubernetes/1.14/cilium-minikube.yaml +``` +``` +configmap/cilium-config created +daemonset.apps/cilium created +clusterrolebinding.rbac.authorization.k8s.io/cilium created +clusterrole.rbac.authorization.k8s.io/cilium created +serviceaccount/cilium created +``` + +시작하기 안내서의 나머지 부분은 예제 애플리케이션을 이용하여 +L3/L4(예, IP 주소 + 포트) 모두의 보안 정책 뿐만 아니라 L7(예, HTTP)의 보안 정책을 +적용하는 방법을 설명한다. + +## 실리움을 실 서비스 용도로 배포하기 + +실리움을 실 서비스 용도의 배포에 관련한 자세한 방법은 +[실리움 쿠버네티스 설치 안내](https://cilium.readthedocs.io/en/stable/kubernetes/intro/)를 살펴본다. +이 문서는 자세한 요구사항, 방법과 +실제 데몬셋 예시를 포함한다. + +{{% /capture %}} + +{{% capture discussion %}} +## 실리움 구성요소 이해하기 + +실리움으로 클러스터를 배포하면 파드가 `kube-system` 네임스페이스에 추가된다. +파드의 목록을 보려면 다음을 실행한다. + +```shell +kubectl get pods --namespace=kube-system +``` + +다음과 유사한 파드의 목록을 볼 것이다. + +```console +NAME READY STATUS RESTARTS AGE +cilium-6rxbd 1/1 Running 0 1m +... +``` + +알고 있어야 할 두 가지 주요 구성요소는 다음과 같다. + +- 먼저는 `cilium` 파드가 클러스터의 각 노드에서 운영되고, +노드의 파드로 보내고/받는 트래픽을 리눅스 BPF를 이용하여 네트워크 폴리시를 적용한다. +- 실 서비스에 배포하는 경우 실리움은 키-값 저장소(예, etcd)를 활용해야 한다. +[실리움 쿠버네티스 설치 안내](https://cilium.readthedocs.io/en/stable/kubernetes/intro/)에서 +키-값 저장소를 설치하는 방법과 실리움에서 이를 구성하는 필수 단계를 +제공할 것이다. + +{{% /capture %}} + +{{% capture whatsnext %}} +클러스터가 동작하면, +실리움으로 쿠버네티스 네트워크 폴리시를 시도하기 위해 +[네트워크 폴리시 선언하기](/docs/tasks/administer-cluster/declare-network-policy/)를 따라 할 수 있다. +재미있게 즐기고, 질문이 있다면 +[실리움 슬랙 채널](https://cilium.herokuapp.com/)을 이용하여 연락한다. +{{% /capture %}} + + diff --git a/content/ko/docs/tasks/administer-cluster/network-policy-provider/kube-router-network-policy.md b/content/ko/docs/tasks/administer-cluster/network-policy-provider/kube-router-network-policy.md new file mode 100644 index 0000000000000..1ff8d7c4ccd7b --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/network-policy-provider/kube-router-network-policy.md @@ -0,0 +1,25 @@ +--- +reviewers: +title: 네트워크 폴리시로 큐브 라우터(Kube-router) 사용하기 +content_template: templates/task +weight: 30 +--- + +{{% capture overview %}} +이 페이지는 네트워크 폴리시(NetworkPolicy)로 [큐브 라우터(Kube-router)](https://github.com/cloudnativelabs/kube-router)를 사용하는 방법을 살펴본다. +{{% /capture %}} + +{{% capture prerequisites %}} +운영 중인 쿠버네티스 클러스터가 필요하다. 클러스터가 없다면, Kops, Bootkube, Kubeadm 등을 이용해서 클러스터를 생성할 수 있다. +{{% /capture %}} + +{{% capture steps %}} +## 큐브 라우터 애드온 설치하기 +큐브 라우터 애드온은 갱신된 모든 네트워크 폴리시 및 파드에 대해 쿠버네티스 API 서버를 감시하고, 정책에 따라 트래픽을 허용하거나 차단하도록 iptables 규칙와 ipset을 구성하는 네트워크 폴리시 컨트롤러와 함께 제공된다. 큐브 라우터 애드온을 설치하는 [큐브 라우터를 클러스터 인스톨러와 함께 사용하기](https://www.kube-router.io/docs/user-guide/#try-kube-router-with-cluster-installers) 안내서를 따라해 봅니다. +{{% /capture %}} + +{{% capture whatsnext %}} +큐브 라우터 애드온을 설치한 후에는, 쿠버네티스 네트워크 폴리시를 시도하기 위해 [네트워크 폴리시 선언하기](/docs/tasks/administer-cluster/declare-network-policy/)를 따라 할 수 있다. +{{% /capture %}} + + diff --git a/content/ko/docs/tasks/administer-cluster/network-policy-provider/romana-network-policy.md b/content/ko/docs/tasks/administer-cluster/network-policy-provider/romana-network-policy.md new file mode 100644 index 0000000000000..5e2c28a7c9164 --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/network-policy-provider/romana-network-policy.md @@ -0,0 +1,42 @@ +--- +reviewers: +title: 네트워크 폴리시로 로마나(Romana) +content_template: templates/task +weight: 40 +--- + +{{% capture overview %}} + +이 페이지는 네트워크 폴리시(NetworkPolicy)로 로마나(Romana)를 사용하는 방법을 살펴본다. + +{{% /capture %}} + +{{% capture prerequisites %}} + +[kubeadm 시작하기](/docs/getting-started-guides/kubeadm/)의 1, 2, 3 단계를 완료하자. + +{{% /capture %}} + +{{% capture steps %}} + +## kubeadm으로 로마나 설치하기 + +Kubeadm을 위한 [컨테이너화된 설치 안내서](https://github.com/romana/romana/tree/master/containerize)를 따른다. + +## 네트워크 폴리시 적용하기 + +네트워크 폴리시를 적용하기 위해 다음 중에 하나를 사용하자. + +* [Romana 네트워크 폴리시](https://github.com/romana/romana/wiki/Romana-policies). + * [Romana 네트워크 폴리시의 예](https://github.com/romana/core/blob/master/doc/policy.md). +* 네트워크 폴리시 API. + +{{% /capture %}} + +{{% capture whatsnext %}} + +로마나를 설치한 후에는, 쿠버네티스 네트워크 폴리시를 시도하기 위해 [네트워크 폴리시 선언하기](/docs/tasks/administer-cluster/declare-network-policy/)를 따라 할 수 있다. + +{{% /capture %}} + + diff --git a/content/ko/docs/tasks/administer-cluster/network-policy-provider/weave-network-policy.md b/content/ko/docs/tasks/administer-cluster/network-policy-provider/weave-network-policy.md new file mode 100644 index 0000000000000..91456a0385928 --- /dev/null +++ b/content/ko/docs/tasks/administer-cluster/network-policy-provider/weave-network-policy.md @@ -0,0 +1,58 @@ +--- +reviewers: +title: 네트워크 폴리시로 위브넷(Weave Net) 사용하기 +content_template: templates/task +weight: 50 +--- + +{{% capture overview %}} + +이 페이지는 네트워크 폴리시(NetworkPolicy)로 위브넷(Weave Net)를 사용하는 방법을 살펴본다. + +{{% /capture %}} + +{{% capture prerequisites %}} + +쿠버네티스 클러스터가 필요하다. 맨 땅에서부터 시작하기를 위해서 [kubeadm 시작하기 안내서](/docs/getting-started-guides/kubeadm/)를 따른다. + +{{% /capture %}} + +{{% capture steps %}} + +## Weave Net 애드온을 설치한다 + +[애드온을 통한 쿠버네티스 통합하기](https://www.weave.works/docs/net/latest/kube-addon/) 가이드를 따른다. + +쿠버네티스의 위브넷 애드온은 쿠버네티스의 모든 네임스페이스의 네크워크 정책 어노테이션을 자동으로 모니터링하며, 정책에 따라 트래픽을 허용하고 차단하는 `iptables` 규칙을 구성하는 [네트워크 폴리시 컨트롤러](https://www.weave.works/docs/net/latest/kube-addon/#npc)와 함께 제공된다. + +## 설치 시험 + +위브넷이 동작하는지 확인한다. + +다음 커맨드를 입력한다. + +```shell +kubectl get pods -n kube-system -o wide +``` + +출력은 다음과 유사하다. + +``` +NAME READY STATUS RESTARTS AGE IP NODE +weave-net-1t1qg 2/2 Running 0 9d 192.168.2.10 worknode3 +weave-net-231d7 2/2 Running 1 7d 10.2.0.17 worknodegpu +weave-net-7nmwt 2/2 Running 3 9d 192.168.2.131 masternode +weave-net-pmw8w 2/2 Running 0 9d 192.168.2.216 worknode2 +``` + +위브넷 파드를 가진 각 노드와 모든 파드는 `Running`이고 `2/2 READY`이다(`2/2`는 각 파드가 `weave`와 `weave-npc`를 가지고 있음을 뜻한다). + +{{% /capture %}} + +{{% capture whatsnext %}} + +위브넷 애드온을 설치하고 나서, 쿠버네티스 네트워크 폴리시를 시도하기 위해 [네트워크 폴리시 선언하기](/docs/tasks/administer-cluster/declare-network-policy/)를 따라 할 수 있다. 질문이 있으면 [슬랙 #weave-community 이나 Weave 유저그룹](https://github.com/weaveworks/weave#getting-help)에 연락한다. + +{{% /capture %}} + + diff --git a/content/ko/docs/tasks/debug-application-cluster/resource-metrics-pipeline.md b/content/ko/docs/tasks/debug-application-cluster/resource-metrics-pipeline.md index ca5003a98da77..b314f9683c0d4 100644 --- a/content/ko/docs/tasks/debug-application-cluster/resource-metrics-pipeline.md +++ b/content/ko/docs/tasks/debug-application-cluster/resource-metrics-pipeline.md @@ -6,7 +6,7 @@ content_template: templates/concept {{% capture overview %}} 쿠버네티스 1.8 부터 컨테이너 CPU 및 메모리 사용량과 같은 리소스 사용량 메트릭은 -쿠버네티스의 Metrics API를 통해 사용할 수 있다. 이 메트릭은 +쿠버네티스의 메트릭 API를 통해 사용할 수 있다. 이 메트릭은 `kubectl top` 커맨드 사용과 같이 사용자가 직접적으로 액세스하거나, Horizontal Pod Autoscaler 같은 클러스터의 컨트롤러에서 결정을 내릴 때 사용될 수 있다. @@ -15,9 +15,9 @@ Horizontal Pod Autoscaler 같은 클러스터의 컨트롤러에서 결정을 {{% capture body %}} -## Metrics API +## 메트릭 API -Metrics API를 통해 주어진 노드나 파드에서 현재 사용중인 +메트릭 API를 통해 주어진 노드나 파드에서 현재 사용중인 리소스의 양을 알 수 있다. 이 API는 메트릭 값을 저장하지 않으므로 지정된 노드에서 10분 전에 사용된 리소스의 양을 가져오는 것과 같은 일을 할 수는 없다. @@ -31,23 +31,23 @@ Metrics API를 통해 주어진 노드나 파드에서 현재 사용중인 리포지터리에서 이 API를 정의하고 있다. 여기에서 이 API에 대한 더 상세한 정보를 찾을 수 있다. {{< note >}} -이 API를 사용하려면 Metrics server를 클러스터에 배포해야 한다. 그렇지 않으면 사용할 수 없다. +이 API를 사용하려면 메트릭 서버를 클러스터에 배포해야 한다. 그렇지 않으면 사용할 수 없다. {{< /note >}} -## Metrics Server +## 메트릭 서버 -[Metrics server](https://github.com/kubernetes-incubator/metrics-server)는 클러스터 전역에서 리소스 사용량 데이터를 집계한다. -쿠버네티스 1.8 부터 `kube-up.sh` 스크립트에 의해 생성된 클러스터에는 기본적으로 Metrics server가 +[메트릭 서버](https://github.com/kubernetes-incubator/metrics-server)는 클러스터 전역에서 리소스 사용량 데이터를 집계한다. +쿠버네티스 1.8 부터 `kube-up.sh` 스크립트에 의해 생성된 클러스터에는 기본적으로 메트릭 서버가 디플로이먼트 오브젝트로 배포된다. 만약 다른 쿠버네티스 설치 메커니즘을 사용한다면, 제공된 -[배포 yaml들](https://github.com/kubernetes-incubator/metrics-server/tree/master/deploy)을 사용하여 Metrics server를 배포할 수 있다. +[배포 yaml들](https://github.com/kubernetes-incubator/metrics-server/tree/master/deploy)을 사용하여 메트릭 서버를 배포할 수 있다. 이 방식은 쿠버네티스 1.7 이상에서 지원된다. (상세 사항은 아래를 참조) -Metric server는 각 노드에서 [Kubelet](/docs/admin/kubelet/)에 의해 노출된 Summary API에서 메트릭을 수집한다. +메트릭 서버는 각 노드에서 [Kubelet](/docs/admin/kubelet/)에 의해 노출된 Summary API에서 메트릭을 수집한다. -Metrics server는 쿠버네티스 1.7에서 도입된 +메트릭 서버는 쿠버네티스 1.7에서 도입된 [쿠버네티스 aggregator](/docs/concepts/api-extension/apiserver-aggregation/)를 통해 메인 API 서버에 등록된다. -[설계 문서](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/instrumentation/metrics-server.md)에서 Metrics server에 대해 자세하게 배울 수 있다. +[설계 문서](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/instrumentation/metrics-server.md)에서 메트릭 서버에 대해 자세하게 배울 수 있다. {{% /capture %}} diff --git a/content/ko/docs/tasks/inject-data-application/define-command-argument-container.md b/content/ko/docs/tasks/inject-data-application/define-command-argument-container.md new file mode 100644 index 0000000000000..639668b3f9fdd --- /dev/null +++ b/content/ko/docs/tasks/inject-data-application/define-command-argument-container.md @@ -0,0 +1,158 @@ +--- +title: 컨테이너를 위한 커맨드와 인자 정의하기 +content_template: templates/task +weight: 10 +--- + +{{% capture overview %}} + +본 페이지는 {{< glossary_tooltip text="파드" term_id="pod" >}} 안에서 컨테이너를 실행할 +때 커맨드와 인자를 정의하는 방법에 대해 설명한다. + +{{% /capture %}} + + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} + +{{% /capture %}} + + +{{% capture steps %}} + +## 파드를 생성할 때 커맨드와 인자를 정의하기 + +파드를 생성할 때, 파드 안에서 동작하는 컨테이너를 위한 커맨드와 인자를 +정의할 수 있다. 커맨드를 정의하기 위해서는, 파드 안에서 실행되는 컨테이너에 +`command` 필드를 포함시킨다. 커맨드에 대한 인자를 정의하기 위해서는, 구성 +파일에 `args` 필드를 포함시킨다. 정의한 커맨드와 인자들은 파드가 생성되고 +난 이후에는 변경될 수 없다. + +구성 파일 안에서 정의하는 커맨드와 인자들은 컨테이너 이미지가 +제공하는 기본 커맨드와 인자들보다 우선시 된다. 만약 인자들을 +정의하고 커맨드를 정의하지 않는다면, 기본 커맨드가 새로운 인자와 +함께 사용된다. + +{{< note >}} +`command` 필드는 일부 컨테이너 런타임에서 `entrypoint`에 해당된다. +아래의 [참고사항](#참고사항)을 확인하자. +{{< /note >}} + +이 예제에서는 한 개의 컨테이너를 실행하는 파드를 생성한다. 파드를 위한 구성 +파일에서 커맨드와 두 개의 인자를 정의한다. + +{{< codenew file="pods/commands.yaml" >}} + +1. YAML 구성 파일을 활용해 파드를 생성한다. + + ```shell + kubectl apply -f https://k8s.io/examples/pods/commands.yaml + ``` + +1. 실행 중인 파드들의 목록을 조회한다. + + ```shell + kubectl get pods + ``` + + 출력은 command-demo라는 파드 안에서 실행된 컨테이너가 완료되었다고 표시할 + 것이다. + +1. 컨테이너 안에서 실행된 커맨드의 출력을 보기 위해, 파드의 로그를 +확인한다. + + ```shell + kubectl logs command-demo + ``` + + 출력은 HOSTNAME과 KUBERNETES_PORT 환경 변수들의 값들을 표시할 + 것이다. + + ``` + command-demo + tcp://10.3.240.1:443 + ``` + +## 인자를 정의하기 위해 환경 변수를 사용하기 + +이전 예제에서는, 문자열을 제공하면서 직접 인자를 정의해보았다. +문자열을 직접 제공하는 것에 대한 대안으로, 환경 변수들을 사용하여 인자들을 +정의할 수 있다. + +```yaml +env: +- name: MESSAGE + value: "hello world" +command: ["/bin/echo"] +args: ["$(MESSAGE)"] +``` + +이것은 [컨피그 맵](/docs/tasks/configure-pod-container/configure +-pod-configmap/)과 [시크릿](/docs/concepts/configuration/secret/)을 +포함해, 환경 변수를 정의하는데 활용할 수 있는 모든 방법들을 활용해서 파드를 위한 인자를 +정의할 +수 있다는 것을 의미한다. + +{{< note >}} +환경 변수는 `"$(VAR)"`와 같이 괄호 안에 나타난다. 이는 변수가 `command`나 `args` +필드 안에서 전개되기 위해 필요한 것이다. +{{< /note >}} + +## 셸 안에서 커맨드 실행하기 + +일부 경우들에서는 커맨드를 셸 안에서 실행해야할 필요가 있다. 예를 들어, 실행할 커맨드가 +서로 연결되어 있는 여러 개의 커맨드들로 구성되어 있거나, 셸 스크립트일 수도 있다. 셸 안에서 +커맨드를 실행하려고 한다면, 이런 방식으로 감싸주면 된다. + +```shell +command: ["/bin/sh"] +args: ["-c", "while true; do echo hello; sleep 10;done"] +``` + +## 참고사항 + +이 테이블은 도커와 쿠버네티스에서 사용되는 필드 이름들을 정리한 것이다. + +| 설명 | 도커 필드 이름 | 쿠버네티스 필드 이름 | +|----------------------------------------|------------------------|-----------------------| +| 컨테이너에서 실행되는 커맨드 | Entrypoint | command | +| 커맨드에 전달되는 인자들 | Cmd | arg | + +기본 Entrypoint와 Cmd 값을 덮어쓰려고 한다면, 아래의 규칙들이 적용된다. + +* 만약 컨테이너를 위한 `command` 값이나 `args` 값을 제공하지 않는다면, 도커 이미지 안에 +제공되는 기본 값들이 사용된다. + +* 만약 컨테이너를 위한 `command` 값을 제공하고, `args` 값을 제공하지 않는다면, +제공된 `command` 값만이 사용된다. 도커 이미지 안에 정의된 기본 EntryPoint 값과 기본 +Cmd 값은 덮어쓰여진다. + +* 만약 컨테이너를 위한 `args` 값만 제공한다면, 도커 이미지 안에 정의된 기본 EntryPoint +값이 정의한 `args` 값들과 함께 실행된다. + +* `command` 값과 `args` 값을 동시에 정의한다면, 도커 이미지 안에 정의된 기본 +EntryPoint 값과 기본 Cmd 값이 덮어쓰여진다. `command`가 `args` 값과 함께 +실행된다. + +여기 몇 가지 예시들이 있다. + +| 이미지 Entrypoint | 이미지 Cmd | 컨테이너 command | 컨테이너 args | 실행되는 커맨드 | +|--------------------|------------------|---------------------|--------------------|------------------| +| `[/ep-1]` | `[foo bar]` | <설정되지 않음> | <설정되지 않음> | `[ep-1 foo bar]` | +| `[/ep-1]` | `[foo bar]` | `[/ep-2]` | <설정되지 않음> | `[ep-2]` | +| `[/ep-1]` | `[foo bar]` | <설정되지 않음> | `[zoo boo]` | `[ep-1 zoo boo]` | +| `[/ep-1]` | `[foo bar]` | `[/ep-2]` | `[zoo boo]` | `[ep-2 zoo boo]` | + + +{{% /capture %}} + +{{% capture whatsnext %}} + +* [파드와 컨테이너를 구성하는 방법](/ko/docs/tasks/)에 대해 더 알아본다. +* [컨테이너 안에서 커맨드를 실행하는 방법](/docs/tasks/debug-application-cluster/get-shell-running-container/)에 대해 더 알아본다. +* [컨테이너](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#container-v1-core)를 확인한다. + +{{% /capture %}} + + diff --git a/content/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md b/content/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md index ee7cf0093aaad..f9520b6f6a1de 100644 --- a/content/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md +++ b/content/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough.md @@ -60,7 +60,7 @@ index.php는 CPU 과부하 연산을 수행한다. 첫 번째 단계로, 실행 중인 이미지의 디플로이먼트를 시작하고 서비스로 노출시킨다. ```shell -kubectl run php-apache --image=k8s.gcr.io/hpa-example --requests=cpu=200m --expose --port=80 +kubectl run php-apache --image=k8s.gcr.io/hpa-example --requests=cpu=200m --limits=cpu=500m --expose --port=80 ``` ``` service/php-apache created diff --git a/content/ko/docs/tasks/tools/install-minikube.md b/content/ko/docs/tasks/tools/install-minikube.md index 80100f534d654..5d80c63981d2b 100644 --- a/content/ko/docs/tasks/tools/install-minikube.md +++ b/content/ko/docs/tasks/tools/install-minikube.md @@ -18,17 +18,19 @@ card: {{< tabs name="minikube_before_you_begin" >}} {{% tab name="리눅스" %}} 리눅스에서 가상화 지원 여부를 확인하려면, 아래의 명령을 실행하고 출력이 비어있지 않은지 확인한다. -```shell -egrep --color 'vmx|svm' /proc/cpuinfo +``` +grep -E --color 'vmx|svm' /proc/cpuinfo ``` {{% /tab %}} + {{% tab name="맥OS" %}} 맥OS에서 가상화 지원 여부를 확인하려면, 아래 명령어를 터미널에서 실행한다. ``` -sysctl -a | grep machdep.cpu.features +sysctl -a | grep -E --color 'machdep.cpu.features|VMX' ``` -만약 출력 중에 `VMX`를 볼 수 있다면 VT-x 기능을 운영체제에서 지원한다. +만약 출력 중에 (색상으로 강조된) `VMX`를 볼 수 있다면, VT-x 기능이 머신에서 활성화된 것이다. {{% /tab %}} + {{% tab name="윈도우" %}} 윈도우 8 이후 버전에서 가상화 지원 여부를 확인하려면, 다음 명령어를 윈도우 터미널이나 명령 프롬프트에서 실행한다. ``` @@ -73,7 +75,7 @@ kubectl이 설치되었는지 확인한다. kubectl은 [kubectl 설치하고 설 • [VirtualBox](https://www.virtualbox.org/wiki/Downloads) {{< note >}} -Minikube는 쿠버네티스 컴포넌트를 VM이 아닌 호스트에서도 동작하도록 `--vm-driver=none` 옵션도 지원한다. 이 드라이버를 사용하기 위해서는 하이퍼바이저가 아닌 [도커](https://www.docker.com/products/docker-desktop)와 리눅스 환경을 필요로 한다. +Minikube는 쿠버네티스 컴포넌트를 VM이 아닌 호스트에서도 동작하도록 `--vm-driver=none` 옵션도 지원한다. {{< /note >}} ### 패키지를 이용하여 Minikube 설치 @@ -158,14 +160,14 @@ Hyper-V는 다음 세 버전의 윈도우 10에서 실행할 수 있다. Windows 윈도우에서 Minikube를 설치하는 가장 쉬운 방법은 [Chocolatey](https://chocolatey.org/)를 사용하는 것이다(관리자 권한으로 실행). ```shell -choco install minikube kubernetes-cli +choco install minikube ``` Minikube 설치를 마친 후, 현재 CLI 세션을 닫고 재시작한다. Minikube 실행 파일의 경로는 실행 경로(path)에 자동으로 추가된다. ### 인스톨러 실행파일을 통한 Minikube 설치 -윈도우에서 수동으로 [Windows 인스톨러](https://docs.microsoft.com/en-us/windows/desktop/msi/windows-installer-portal)로 설치하려면, [`minikube-installer.exe`](https://github.com/kubernetes/minikube/releases/latest/minikube-installer.exe)를 다운로드 받고, 이 인스톨러를 실행한다. +[윈도우 인스톨러](https://docs.microsoft.com/en-us/windows/desktop/msi/windows-installer-portal)를 사용하여 윈도우에 Minikube를 수동으로 설치하려면, [`minikube-installer.exe`](https://github.com/kubernetes/minikube/releases/latest/download/minikube-installer.exe)를 다운로드 받고, 이 인스톨러를 실행한다. ### 직접 다운로드하여 Minikube 설치 diff --git a/content/ko/docs/tutorials/configuration/configure-redis-using-configmap.md b/content/ko/docs/tutorials/configuration/configure-redis-using-configmap.md index be7cb5f61d548..27db50cdf19c2 100644 --- a/content/ko/docs/tutorials/configuration/configure-redis-using-configmap.md +++ b/content/ko/docs/tutorials/configuration/configure-redis-using-configmap.md @@ -96,6 +96,11 @@ kubectl exec -it redis redis-cli 2) "allkeys-lru" ``` +생성된 파드를 삭제한다. +```shell +kubectl delete pod redis +``` + {{% /capture %}} {{% capture whatsnext %}} diff --git a/content/ko/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro.html b/content/ko/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro.html index a7f8e8bfec54c..c2e4d9f4a3343 100644 --- a/content/ko/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro.html +++ b/content/ko/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro.html @@ -102,13 +102,13 @@

쿠버네티스에 첫 번째 애플리케이션 배
+

+ 첫 번째 디플로이먼트로, 도커 컨테이너로 패키지된 Node.js 애플리케이션을 사용해보자. + (Node.js 애플리케이션을 작성하고 Node.js 애플리케이션을 배포하고, 컨테이너를 활용해서 배포해보지 않았다면, + Hello Minikube 튜토리얼의 지시를 따른다.)

+

-

우리의 첫 번째 디플로이먼트로, Docker 컨테이너로 패키지된 Node.js 애플리케이션을 사용해보자. - Node.js 애플리케이션을 작성하고 Docker 컨테이너를 배포하기 위해서, - Hello Minikube 튜토리얼의 지시를 따른다.

- -

이제 디플로이먼트를 이해했으니, 온라인 튜토리얼을 통해 우리의 첫 번째 애플리케이션을 배포해보자!

- +

이제 디플로이먼트를 이해했으니, 온라인 튜토리얼을 통해 우리의 첫 번째 애플리케이션을 배포해보자!


diff --git a/content/ko/docs/tutorials/online-training/overview.md b/content/ko/docs/tutorials/online-training/overview.md index 402cb29a10872..63115403917b0 100644 --- a/content/ko/docs/tutorials/online-training/overview.md +++ b/content/ko/docs/tutorials/online-training/overview.md @@ -43,6 +43,8 @@ content_template: templates/concept * [Kubernetes for the Absolute Beginners with Hands-on Labs (KodeKloud)](https://kodekloud.com/p/kubernetes-for-the-absolute-beginners-hands-on) +* [Kubernetes Fundamentals (LFS258) (The Linux Foundation)](https://training.linuxfoundation.org/training/kubernetes-fundamentals/) + * [Kubernetes Quick Start with Hands-On Labs (Linux Academy)] (https://linuxacademy.com/linux/training/course/name/kubernetes-quick-start) * [Kubernetes the Hard Way with Hands-On Labs (Linux Academy)](https://linuxacademy.com/linux/training/course/name/kubernetes-the-hard-way) diff --git a/content/ko/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume.md b/content/ko/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume.md index 2014c301a7d4b..991d43262cede 100644 --- a/content/ko/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume.md +++ b/content/ko/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume.md @@ -92,6 +92,13 @@ EOF {{< codenew file="application/wordpress/mysql-deployment.yaml" >}} +다음의 매니페스트는 단일-인스턴스 WordPress 디플로이먼트를 기술한다. WordPress 컨테이너는 +웹사이트 데이터 파일을 위해 `/var/www/html`에 퍼시스턴트볼륨을 마운트한다. `WORDPRESS_DB_HOST` 환경 변수에는 +위에서 정의한 MySQL 서비스의 이름이 설정되며, WordPress는 서비스를 통해 데이터베이스에 접근한다. +`WORDPRESS_DB_PASSWORD` 환경 변수에는 kustomize가 생성한 데이터베이스 패스워드가 설정된다. + +{{< codenew file="application/wordpress/wordpress-deployment.yaml" >}} + 1. MySQL 디플로이먼트 구성 파일을 다운로드한다. ```shell diff --git a/content/ko/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk.md b/content/ko/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk.md new file mode 100644 index 0000000000000..01c24a16f9524 --- /dev/null +++ b/content/ko/docs/tutorials/stateless-application/guestbook-logs-metrics-with-elk.md @@ -0,0 +1,401 @@ +--- +title: "예제: PHP / Redis 방명록 예제에 로깅과 메트릭 추가" +reviewers: +content_template: templates/tutorial +weight: 21 +card: + name: tutorials + weight: 31 + title: "예제: PHP / Redis 방명록 예제에 로깅과 메트릭 추가" +--- + +{{% capture overview %}} +이 튜토리얼은 [Redis를 이용한 PHP 방명록](../guestbook) 튜토리얼을 기반으로 한다. Elastic의 경량 로그, 메트릭, 네트워크 데이터 오픈소스 배송기인 *Beats* 를 방명록과 동일한 쿠버네티스 클러스터에 배포한다. Beats는 데이터를 수집하고 구문분석하여 Elasticsearch에 색인화하므로, Kibana에서 동작 정보를 결과로 보며 분석할 수 있다. 이 예시는 다음과 같이 구성되어 있다. + +* [Redis를 이용한 PHP 방명록](../guestbook)을 실행한 인스턴스 +* Elasticsearch와 Kibana +* Filebeat +* Metricbeat +* Packetbeat + +{{% /capture %}} + +{{% capture objectives %}} +* Redis를 이용한 PHP 방명록 시작. +* kube-state-metrics 설치. +* 쿠버네티스 시크릿 생성. +* Beats 배포. +* 로그와 메트릭의 대시보드 보기. +{{% /capture %}} + +{{% capture prerequisites %}} + +{{< include "task-tutorial-prereqs.md" >}} +{{< version-check >}} + +추가로 다음이 필요하다. + +* 실행 중인 [Redis를 이용한 PHP 방명록](../guestbook) 튜토리얼의 배포본. + +* 실행 중인 Elasticsearch와 Kibana 디플로이먼트. [Elastic Cloud의 Elasticsearch 서비스](https://cloud.elastic.co)를 사용하거나, [파일을 내려받아](https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-elastic-stack.html) 워크스테이션이나 서버에서 운영하거나, [Elastic의 Helm 차트](https://github.com/elastic/helm-charts)를 이용한다. + +{{% /capture %}} + +{{% capture lessoncontent %}} + +## Redis를 이용한 PHP 방명록 시작 +이 튜토리얼은 [Redis를 이용한 PHP 방명록](../guestbook)을 기반으로 한다. 방명록 애플리케이션을 실행 중이라면, 이를 모니터링할 수 있다. 실행되지 않은 경우라면 지침을 따라 방명록을 배포하고 **정리하기** 단계는 수행하지 말자. 방명록을 실행할 때 이 페이지로 돌아오자. + +## 클러스터 롤 바인딩 추가 +[클러스터 단위 롤 바인딩](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#rolebinding-and-clusterrolebinding)을 생성하여, 클러스터 수준(kube-system 안에)으로 kube-state-metrics와 Beats를 배포할 수 있게 한다. + +```shell +kubectl create clusterrolebinding cluster-admin-binding \ + --clusterrole=cluster-admin --user= +``` + +## kube-state-metrics 설치 + +[*kube-state-metrics*](https://github.com/kubernetes/kube-state-metrics)는 쿠버네티스 API 서버를 모니터링하며 오브젝트 상태에 대한 메트릭을 생성하는 간단한 서비스이다. 이런 메트릭을 Metricbeat이 보고한다. 방명록이 실행된 쿠버네티스 클러스터에서 kube-state-metrics을 추가한다. + +### kube-state-metrics 실행 여부 확인 +```shell +kubectl get pods --namespace=kube-system | grep kube-state +``` +### 필요하면 kube-state-metrics 설치 + +```shell +git clone https://github.com/kubernetes/kube-state-metrics.git kube-state-metrics +kubectl create -f kube-state-metrics/kubernetes +kubectl get pods --namespace=kube-system | grep kube-state +``` +kube-state-metrics이 실행 중이고 준비되었는지 확인한다. +```shell +kubectl get pods -n kube-system -l k8s-app=kube-state-metrics +``` + +출력 +```shell +NAME READY STATUS RESTARTS AGE +kube-state-metrics-89d656bf8-vdthm 2/2 Running 0 21s +``` +## Elastic의 예제를 GitHub 리포지터리에 클론한다. +```shell +git clone https://github.com/elastic/examples.git +``` + +나머지 커맨드는 `examples/beats-k8s-send-anywhere` 디렉터리의 파일을 참조할 것이라서, 그쪽으로 현재 디렉터리를 변경한다. +```shell +cd examples/beats-k8s-send-anywhere +``` + +## 쿠버네티스 시크릿 만들기 +쿠버네티스 {{< glossary_tooltip text="시크릿" term_id="secret" >}}은 암호나 토큰, 키 같이 소량의 민감한 데이터를 포함하는 오브젝트이다. 이러한 정보는 다른 방식으로도 파드 스펙이나 이미지에 넣을 수 있을 것이다. 시크릿 오브젝트에 넣으면 이것이 어떻게 사용되는지 다양하게 제어할 수 있고, 우발적인 노출 사고의 위험이 줄일 수 있다. + +{{< note >}} +여기에는 방식이 나뉘는데, 하나는 *자체 관리(Self managed)* 로 Elasticsearch와 Kibana(Elastic의 Helm 차트를 이용하여 사용자 서버를 구동하는)를 사용하는 경우이고 다른 경우는 Elastic Cloud의 Elasticsearch 서비스의 *관리 서비스(Managed service)* 를 사용하는 방식이다. 이 튜토리얼에서는 사용할 Elasticsearch와 Kibana 시스템의 종류에 따라 시크릿을 만들어야 한다. +{{< /note >}} + +{{< tabs name="tab_with_md" >}} +{{% tab name="자체 관리(Self Managed)" %}} + +### 자체 관리 +Elastic Cloud의 Elasticsearch 서비스로 연결한다면 **관리 서비스** 탭으로 전환한다. + +### 자격증명(credentials) 설정 +자체 관리 Elasticsearch와 Kibana(자체 관리는 사실상 Elastic Cloud의 관리 서비스 Elasticsearch와 다르다) 서비스에 접속할 때에 4개 파일을 수정하여 쿠버네티스 시크릿을 생성한다. 파일은 다음과 같다. + +1. ELASTICSEARCH_HOSTS +1. ELASTICSEARCH_PASSWORD +1. ELASTICSEARCH_USERNAME +1. KIBANA_HOST + +이 정보를 Elasticsearch 클러스터와 Kibana 호스트에 지정한다. 여기 예시가 있다. + +#### `ELASTICSEARCH_HOSTS` +1. Elastic의 Elasticsearch Helm 차트에서 노드 그룹(nodeGroup). + + ```shell + ["http://elasticsearch-master.default.svc.cluster.local:9200"] + ``` +1. Mac을 위한 Docker에서 Beats를 운영 중인 Mac에서 운영하는 단일 Elasticsearch 노드. + + ```shell + ["http://host.docker.internal:9200"] + ``` +1. VM이나 물리 장비에서 운영 중인 두 개의 ELASTICSEARCH 노드. + + ```shell + ["http://host1.example.com:9200", "http://host2.example.com:9200"] + ``` +`ELASTICSEARCH_HOSTS` 수정한다. +```shell +vi ELASTICSEARCH_HOSTS +``` + +#### `ELASTICSEARCH_PASSWORD` +화이트 스페이스나 인용 부호나 <> 도 없는 암호이다. + + <사용자의 시크릿 암호> + +`ELASTICSEARCH_PASSWORD` 수정한다. +```shell +vi ELASTICSEARCH_PASSWORD +``` + +#### `ELASTICSEARCH_USERNAME` +화이트 스페이스나 인용 부호나 <> 도 없는 이름이다. + + + +`ELASTICSEARCH_USERNAME` 수정한다. +```shell +vi ELASTICSEARCH_USERNAME +``` + +#### `KIBANA_HOST` + +1.Elastic의 Kibana Helm 차트의 인스턴스이다. 하위 도메인 `default`는 기본 네임스페이스를 참조한다. 다른 네임스페이스를 사용하여 Helm 차트를 배포한 경우 하위 도메인이 다릅니다. + + ```shell + "kibana-kibana.default.svc.cluster.local:5601" + ``` +1. Mac 용 Docker에서 실행하는 Beats가 있는 Mac에서 실행하는 Kibana 인스턴스 + + ```shell + "host.docker.internal:5601" + ``` +1. 가상머신이나 물리적 하드웨어에서 실행 중인 두 개의 Elasticsearch 노드 + + ```shell + "host1.example.com:5601" + ``` +`KIBANA_HOST`를 편집한다. +```shell +vi KIBANA_HOST +``` + +### 쿠버네티스 시크릿 만들기 +이 커맨드는 방금 편집한 파일을 기반으로 쿠버네티스의 시스템 수준의 네임스페이스(kube-system)에 시크릿을 만든다. + + kubectl create secret generic dynamic-logging \ + --from-file=./ELASTICSEARCH_HOSTS \ + --from-file=./ELASTICSEARCH_PASSWORD \ + --from-file=./ELASTICSEARCH_USERNAME \ + --from-file=./KIBANA_HOST \ + --namespace=kube-system + +{{% /tab %}} +{{% tab name="관리 서비스(Managed service)" %}} + +## 관리 서비스 +이 탭은 Elastic Cloud에서 Elasticsearch 서비스 만에 대한 것으로, 이미 자체 관리 Elasticsearch와 Kibana 배포로 시크릿을 생성했다면, [Beats 배포](#deploy-the-beats)를 계속한다. +### 자격증명(credentials) 설정 +Elastic Cloud에서 관리되는 Elastic 서비스에 연결할 때, 쿠버네티스 시크릿을 생성하기 위해 편집할 두 파일이 있다. 파일은 다음과 같다. + +1. ELASTIC_CLOUD_AUTH +1. ELASTIC_CLOUD_ID + +디플로이먼트를 생성할 때에 Elasticsearch 콘솔에서 제공한 정보로 이를 설정한다. 여기 예시들이 있다. + +#### ELASTIC_CLOUD_ID +```shell +devk8s:ABC123def456ghi789jkl123mno456pqr789stu123vwx456yza789bcd012efg345hijj678klm901nop345zEwOTJjMTc5YWQ0YzQ5OThlN2U5MjAwYTg4NTIzZQ== +``` + +#### ELASTIC_CLOUD_AUTH +사용자 이름, 콜론(`:`) 및 비밀번호인데, 공백 또는 따옴표는 없다. +```shell +elastic:VFxJJf9Tjwer90wnfTghsn8w +``` + +### 필요 파일 편집하기 +```shell +vi ELASTIC_CLOUD_ID +vi ELASTIC_CLOUD_AUTH +``` +### 쿠버네티스 시크릿 생성하기 +이 커맨드는 방금 편집한 파일을 기반으로 쿠버네티스의 시스템 수준의 네임스페이스(kube-system)에 시크릿을 생성한다. + + kubectl create secret generic dynamic-logging \ + --from-file=./ELASTIC_CLOUD_ID \ + --from-file=./ELASTIC_CLOUD_AUTH \ + --namespace=kube-system + + {{% /tab %}} +{{< /tabs >}} + +## Beats 배포하기 {#deploy-the-beats} +각 Beat마다 메니페스트 파일을 제공한다. 이 메니페스트 파일은 앞서 생성한 시크릿을 사용하여, Elasticsearch 및 Kibana 서버에 연결하도록 Beats를 구성한다. + +### Filebeat에 대해 +Filebeat는 쿠버네티스 노드와 해당 노두에서 실행되는 각 파드에서 실행되는 컨테이너의 로그를 수집한다. Filebeat는 {{< glossary_tooltip text="데몬 셋" term_id="daemonset" >}}으로 배포한다. Filebeat는 쿠버네티스 클러스터에서 실행 중인 애플리케이션을 자동 검색할 수 있다. 시작시에 Filebeat는 기존 컨테이너를 검색하고 이에 적절한 구성을 시작하고 새 시작/종료 이벤트를 감시한다. + +아래 내용은 Filebeat가 방명록 애플리케이션과 함께 배포된 Redis 컨테이너에서 Redis 로그를 찾아 구문분석할 수 있게 하는 자동 검색 구성이다. 이 구성은 `filebeat-kubernetes.yaml`파일에 있다. + +```yaml +- condition.contains: + kubernetes.labels.app: redis + config: + - module: redis + log: + input: + type: docker + containers.ids: + - ${data.kubernetes.container.id} + slowlog: + enabled: true + var.hosts: ["${data.host}:${data.port}"] +``` +이것은 `redis` 컨테이너가 `app` 문자열을 포함하는 레이블로 감지될 때에 Filebeat 모듈 `redis`를 적용하도록 Filebeat를 구성한다. Redis 모듈은 Docker 입력 유형을 사용하여 컨테이너에서 `로그` 스트림을 수집할 수 있다(이 Redis 컨테이너의 STDOUT 스트림과 연관된 쿠버네티스 노드에서 파일 읽기). 또한 이 모듈은 컨테이너 메타 데이터에 제공되는 적절한 파드 호스트와 포트에 연결하여 Redis의 `slowlog` 항목을 수집할 수 있다. + +### Filebeat 배포 +```shell +kubectl create -f filebeat-kubernetes.yaml +``` + +#### 확인 +```shell +kubectl get pods -n kube-system -l k8s-app=filebeat-dynamic +``` + +### Metricbeat에 대해 +Metricbeat 자동 검색은 Filebeat와 같은 방식으로 구성된다. 다음은 Redis 컨테이너에 대한 Metricbeat의 자동 검색 구성이다. 이 구성은 `metricbeat-kubernetes.yaml`에 있다. +```yaml +- condition.equals: + kubernetes.labels.tier: backend + config: + - module: redis + metricsets: ["info", "keyspace"] + period: 10s + + # Redis hosts + hosts: ["${data.host}:${data.port}"] +``` +이것은 컨테이너가 `tier` 레이블이 `backend` 문자열과 같은 레이블로 감지될 때에 Metricbeat 모듈 `redis`를 적용하도록 Metricbeat를 구성한다. `redis` 모듈은 컨테이너 메타데이터에 제공되는 적절한 파드 호스트와 포트에 연결하여 컨테이너에서 `info` 및 `keyspace` 메트릭을 수집할 수 있다. + +### Metricbeat 배포 +```shell +kubectl create -f metricbeat-kubernetes.yaml +``` +#### 확인 +```shell +kubectl get pods -n kube-system -l k8s-app=metricbeat +``` + +### Packetbeat에 대해 +Packetbeat 구성은 Filebeat와 Metricbeat와는 다르다. 컨테이너 레이블과 일치시킬 패턴을 지정하지 않고, 구성은 관련 프로토콜 및 포트 번호를 기반으로 한다. 아래는 포트 번호의 하위 집합이다. + +{{< note >}} +비표준 포트로 서비스를 실행했다면 해당 포트를 `filebeat.yaml`에 적절한 유형에 추가하고, Packetbeat 데몬 셋을 삭제하고 생성한다. +{{< /note >}} + +```yaml +packetbeat.interfaces.device: any + +packetbeat.protocols: +- type: dns + ports: [53] + include_authorities: true + include_additionals: true + +- type: http + ports: [80, 8000, 8080, 9200] + +- type: mysql + ports: [3306] + +- type: redis + ports: [6379] + +packetbeat.flows: + timeout: 30s + period: 10s +``` + +#### Packetbeat 배포하기 +```shell +kubectl create -f packetbeat-kubernetes.yaml +``` + +#### 확인하기 +```shell +kubectl get pods -n kube-system -l k8s-app=packetbeat-dynamic +``` + +## Kibana에서 보기 + +브라우저에서 Kibana를 열고, **대시보드** 애플리케이션을 열어보자. 검색창에 kubernetes를 입력하고 쿠버네티스를 위한 Metricbeat 대시보드를 클릭한다. 이 대시보드에는 노드 상태, 배포 등의 보고 내용이 있다. + +대시보드 페이지에 Packetbeat를 검색하고 Packetbeat의 개요 페이지를 살펴보자. + +마찬가지로 Apache와 Redis를 위한 대시보드를 확인한다. 각 로그와 메트릭에 대한 대시보드가 표시된다. 이 Apache Metricbeat 대시보드는 비어 있다. Apache Filebeat 대시보드를 보고, 맨 아래로 스크롤하여 Apache 오류 로그를 확인한다. Apache에서 보여줄 메트릭이 없는 이유를 알려줄 것이다. + +Metricbeat에서 Apache 메트릭을 가져올 수 있게 하려면, mod-status 구성 파일을 포함한 컨피그맵을 추가하고 방명록을 재배포하여 서버 상태를 활성화해야 한다. + + +## 디플로이먼트를 확장하고 모니터링중인 새 파드를 확인하기 +기존 디플로이먼트를 확인한다. +```shell +kubectl get deployments +``` + +출력 +```shell +NAME READY UP-TO-DATE AVAILABLE AGE +frontend 3/3 3 3 3h27m +redis-master 1/1 1 1 3h27m +redis-slave 2/2 2 2 3h27m +``` + +front의 디플로이먼트를 두 개의 파드로 축소한다. +```shell +kubectl scale --replicas=2 deployment/frontend +``` +출력 +```shell +deployment.extensions/frontend scaled +``` + +## Kibana에서 변화 확인하기 +스크린 캡처를 확인하여, 표시된 필터를 추가하고 해당 열을 뷰에 추가한다. ScalingReplicaSet 항목이 표시되고, 여기에서 이벤트 목록의 맨 위에 풀링되는 이미지, 마운트된 볼륨, 파드 시작 등을 보여준다. +![Kibana 디스커버리](https://raw.githubusercontent.com/elastic/examples/master/beats-k8s-send-anywhere/scaling-discover.png) + +{{% /capture %}} + +{{% capture cleanup %}} +디플로이먼트와 서비스를 삭제하면 실행중인 파드도 삭제된다. 한 커맨드로 여러 개의 리소스를 삭제하기 위해 레이블을 이용한다. + +1. 다음 커맨드를 실행하여 모든 파드, 디플로이먼트, 서비스를 삭제한다. + + ```shell + kubectl delete deployment -l app=redis + kubectl delete service -l app=redis + kubectl delete deployment -l app=guestbook + kubectl delete service -l app=guestbook + kubectl delete -f filebeat-kubernetes.yaml + kubectl delete -f metricbeat-kubernetes.yaml + kubectl delete -f packetbeat-kubernetes.yaml + kubectl delete secret dynamic-logging -n kube-system + ``` + +1. 실행 중인 파드가 없음을 확인하기 위해 파드 목록을 조회한다. + + ```shell + kubectl get pods + ``` + + 커맨드의 출력은 다음과 같아야 한다. + + ``` + No resources found. + ``` + +{{% /capture %}} + +{{% capture whatsnext %}} +* [리소스 모니터링 도구](/docs/tasks/debug-application-cluster/resource-usage-monitoring/)를 공부한다. +* [로깅 아키텍처](/docs/concepts/클러스터-administration/logging/)를 더 읽어본다. +* [애플리케이션 검사 및 디버깅](/docs/tasks/debug-application-cluster/)을 더 읽어본다. +* [애플리케이션 문제 해결](/docs/tasks/debug-application-cluster/resource-usage-monitoring/)을 더 읽어본다. +{{% /capture %}} diff --git a/content/ko/examples/application/mysql/mysql-statefulset.yaml b/content/ko/examples/application/mysql/mysql-statefulset.yaml index e0c04007a872e..b69af02c596b2 100644 --- a/content/ko/examples/application/mysql/mysql-statefulset.yaml +++ b/content/ko/examples/application/mysql/mysql-statefulset.yaml @@ -106,16 +106,16 @@ spec: cd /var/lib/mysql # Determine binlog position of cloned data, if any. - if [[ -f xtrabackup_slave_info ]]; then + if [[ -f xtrabackup_slave_info && "x$( change_master_to.sql.in # Ignore xtrabackup_binlog_info in this case (it's useless). - rm -f xtrabackup_binlog_info + rm -f xtrabackup_slave_info xtrabackup_binlog_info elif [[ -f xtrabackup_binlog_info ]]; then # We're cloning directly from master. Parse binlog position. [[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1 - rm xtrabackup_binlog_info + rm -f xtrabackup_binlog_info xtrabackup_slave_info echo "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\ MASTER_LOG_POS=${BASH_REMATCH[2]}" > change_master_to.sql.in fi @@ -126,16 +126,15 @@ spec: until mysql -h 127.0.0.1 -e "SELECT 1"; do sleep 1; done echo "Initializing replication from clone position" + mysql -h 127.0.0.1 \ + -e "$(