Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'issue-11748-architecture-nodes' of https://github.com/z…
Browse files Browse the repository at this point in the history
…er0big/website into issue-11748-architecture-nodes

# Conflicts:
#	content/ko/docs/concepts/architecture/nodes.md
zer0big committed Jan 7, 2019
2 parents c22c493 + 6895838 commit aa5b768
Showing 17 changed files with 856 additions and 2 deletions.
4 changes: 2 additions & 2 deletions content/ko/docs/concepts/architecture/nodes.md
Original file line number Diff line number Diff line change
@@ -59,7 +59,7 @@ weight: 10
ready 컨티션의 상태가 [kube-controller-manager](/docs/admin/kube-controller-manager/)에 인수로 넘겨지는 `pod-eviction-timeout` 보다 더 길게 `Unknown` 또는 `False`로 유지되는 경우, 노드 상에 모든 파드는 노드 컨트롤러에 의해 삭제되도록 스케줄 된다. 기본 축출 타임아웃 기간은 **5분** 이다. 노드에 접근이 불가할 때와 같은 경우, apiserver는 노드 상의 kubelet과 통신이 불가하다. apiserver와의 통신이 재개될 때까지 파드 삭제에 대한 결정은 kubelet에 전해질 수 없다. 그 사이, 삭제되도록 스케줄 되어진 파드는 분할된 노드 상에서 계속 동작할 수도 있다.

1.5 이전의 쿠버네티스 버전에서는, 노드 컨트롤러가 apiserver로부터 접근 불가한 이러한 파드를 [강제 삭제](/docs/concepts/workloads/pods/pod/#force-deletion-of-pods)
시킬 것이다. 그러나 1.5 이상에서는, 노드 컨트롤러가 클러스터 내 동작 중지된 것을 확신할 때까지는 파드를 강제로 삭제하지 않는다. 파드가 `Terminating` 또는 `Unknown` 상태로 있을 때 접근 불가한 노드 상에서 동작되고 있는 것을 보게 될 수도 있다. 노드가 영구적으로 클러스터에서 삭제되었는지에 대한 여부를 쿠버네티스가 기반 인프라로부터 유추할 수 없는 경우, 노드가 클러스터를 영구적으로 탈퇴하게 되면, 클러스터 관리자는 손수 노드 오브젝트를 삭제해야 할 수도 있다. 쿠버네티스에서 노드 오브젝트를 삭제하면 노드 상에서 동작중인 모든 파드 오브젝트가 apiserver로부터 삭제되어 그 이름이 해소되는 결과를 야기한다.
시킬 것이다. 그러나 1.5 이상에서는, 노드 컨트롤러가 클러스터 내 동작 중지된 것을 확신할 때까지는 파드를 강제로 삭제하지 않는다. 파드가 `Terminating` 또는 `Unknown` 상태로 있을 때 접근 불가한 노드 상에서 동작되고 있는 것을 보게 될 수도 있다. 노드가 영구적으로 클러스터에서 삭제되었는지에 대한 여부를 쿠버네티스가 기반 인프라로부터 유추할 수 없는 경우, 노드가 클러스터를 영구적으로 탈퇴하게 되면, 클러스터 관리자는 손수 노드 오브젝트를 삭제해야 할 수도 있다. 쿠버네티스에서 노드 오브젝트를 삭제하면 노드 상에서 동작중인 모든 파드 오브젝트가 apiserver로부터 삭제되어 그 이름을 사용할 수 있는 결과가 이루어진다.

1.12 버전에서, `TaintNodesByCondition` 기능은 베타가 되어, 노드 수명주기 컨트롤러는 자동으로 컨티션을 나타내는
[taints](/docs/concepts/configuration/taint-and-toleration/)를 생성한다. 마찬가지로 스케줄러가 노드를 고려할 때, 노드의 컨디션을 무시한다. 대신 노드의 taint와 toleration을 살펴본다.
@@ -195,4 +195,4 @@ spec:

노드는 쿠버네티스 REST API 내 탑-레벨 리소스 이다. API 오브젝트에 대한 보다 자세한 내용은 [노드 API 오브젝트](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#node-v1-core)에서 확인할 수 있다.

{{% /capture %}}
{{% /capture %}}
5 changes: 5 additions & 0 deletions content/ko/docs/tutorials/configuration/_index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: "설정"
weight: 30
---

Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
---
title: 컨피그 맵을 사용해서 Redis 설정하기
content_template: templates/tutorial
---

{{% capture overview %}}

이 페이지에서는 컨피그 맵을 사용해서 Redis를 설정하는 방법에 대한 실세계 예제를 제공하고, [컨피그 맵을 사용해서 컨테이너 설정하기](/docs/tasks/configure-pod-container/configure-pod-configmap/) 태스크로 빌드를 한다.

{{% /capture %}}

{{% capture objectives %}}

* 컨피그 맵을 생성한다.
* 컨피그 맵을 사용해서 파드 명세를 생성한다.
* 파드를 생성한다.
* 설정이 올바르게 적용되었는지 검증한다.

{{% /capture %}}

{{% capture prerequisites %}}

* {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
* [컨피그 맵을 사용해서 컨테이너 설정하기](/docs/tasks/configure-pod-container/configure-pod-configmap/)를 이해한다.

{{% /capture %}}

{{% capture lessoncontent %}}


## 실세상 예제: 컨피그 맵을 사용해서 Redis 설정하기

아래의 단계를 통해서 컨피그 맵에 저장된 데이터를 사용해서 Redis 캐시를 설정할 수 있다.

첫째, `redis-config` 파일에서 컨피그 맵을 생성한다.

{{< codenew file="pods/config/redis-config" >}}

```shell
curl -OL https://k8s.io/examples/pods/config/redis-config
kubectl create configmap example-redis-config --from-file=redis-config
```

```shell
configmap/example-redis-config created
```

생성된 컨피그 맵을 점검한다.

```shell
kubectl get configmap example-redis-config -o yaml
```

```yaml
apiVersion: v1
data:
redis-config: |
maxmemory 2mb
maxmemory-policy allkeys-lru
kind: ConfigMap
metadata:
creationTimestamp: 2016-03-30T18:14:41Z
name: example-redis-config
namespace: default
resourceVersion: "24686"
selfLink: /api/v1/namespaces/default/configmaps/example-redis-config
uid: 460a2b6e-f6a3-11e5-8ae5-42010af00002
```
이제, 컨피그 맵에 저장된 설정 데이터를 사용하는 파드 명세를 생성한다.
{{< codenew file="pods/config/redis-pod.yaml" >}}
파드를 생성한다.
```shell
kubectl create -f https://k8s.io/examples/pods/config/redis-pod.yaml
```

이 예제에서는 설정 볼륨이 `/redis-master`에 마운트되어 있다.
`redis-config` 키를 `redis.conf`라는 이름의 파일에 추가하기 위해 `path`를 사용한다.
따라서, Redis 설정을 위한 파일 경로는 `/redis-master/redis.conf`이다.
이곳이 이미지가 Redis 마스터를 위한 설정 파일을 찾는 곳이다.

설정이 올바르게 적용되었는지 확인하기 위해서, `kubectl exec`를 사용해 파드 속에서 `redis-cli` 툴을 실행해 본다.

```shell
kubectl exec -it redis redis-cli
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "2097152"
127.0.0.1:6379> CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-lru"
```

{{% /capture %}}

{{% capture whatsnext %}}

* [컨피그 맵](/docs/tasks/configure-pod-container/configure-pod-configmap/) 배우기.

{{% /capture %}}


5 changes: 5 additions & 0 deletions content/ko/docs/tutorials/online-training/_index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: "온라인 트레이닝 코스"
weight: 20
---

34 changes: 34 additions & 0 deletions content/ko/docs/tutorials/online-training/overview.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
title: 쿠버네티스 온라인 트레이닝 개요
content_template: templates/concept
---

{{% capture overview %}}

이 페이지에서는 쿠버네티스 온라인 트레이닝을 제공하는 사이트를 소개한다:

{{% /capture %}}

{{% capture body %}}

* [Scalable Microservices with Kubernetes (Udacity)](https://www.udacity.com/course/scalable-microservices-with-kubernetes--ud615)

* [Introduction to Kubernetes (edX)](https://www.edx.org/course/introduction-kubernetes-linuxfoundationx-lfs158x)

* [Getting Started with Kubernetes (Pluralsight)](https://www.pluralsight.com/courses/getting-started-kubernetes)

* [Hands-on Introduction to Kubernetes (Instruqt)](https://play.instruqt.com/public/topics/getting-started-with-kubernetes)

* [Learn Kubernetes using Interactive Hands-on Scenarios (Katacoda)](https://www.katacoda.com/courses/kubernetes/)

* [Certified Kubernetes Administrator Preparation Course (LinuxAcademy.com)](https://linuxacademy.com/linux/training/course/name/certified-kubernetes-administrator-preparation-course)

* [Kubernetes the Hard Way (LinuxAcademy.com)](https://linuxacademy.com/linux/training/course/name/kubernetes-the-hard-way)

* [Certified Kubernetes Application Developer Preparation Course (KodeKloud.com)](https://kodekloud.com/p/kubernetes-certification-course)

{{% /capture %}}




5 changes: 5 additions & 0 deletions content/ko/docs/tutorials/stateless-application/_index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: "상태 유지를 하지 않는 애플리케이션"
weight: 40
---

Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
---
title: 외부 IP 주소를 노출하여 클러스터의 애플리케이션에 접속하기
content_template: templates/tutorial
weight: 10
---

{{% capture overview %}}

이 페이지에서는 외부 IP 주소를 노출하는 쿠버네티스 서비스 오브젝트를 생성하는 방법에 대해 설명한다.

{{% /capture %}}


{{% capture prerequisites %}}

* [kubectl](/docs/tasks/tools/install-kubectl/)을 설치한다.

* Google Kubernetes Engine 또는 Amazon Web Services와 같은 클라우드 공급자를 사용하여 쿠버네티스 클러스터를 생성한다. 이 튜토리얼은 [외부 로드 밸런서](/docs/tasks/access-application-cluster/create-external-load-balancer/)를 생성하는데, 클라우드 공급자가 필요하다.

* `kubectl`이 쿠버네티스 API 서버와 통신하도록 설정한다. 자세한 내용은 클라우드 공급자의 설명을 참고한다.

{{% /capture %}}


{{% capture objectives %}}

* Hello World 애플리케이션을 다섯 개의 인스턴스로 실행한다.
* 외부 IP 주소를 노출하는 서비스를 생성한다.
* 실행 중인 애플리케이션에 접근하기 위해 서비스 오브젝트를 사용한다.

{{% /capture %}}


{{% capture lessoncontent %}}

## 다섯 개의 파드에서 실행되는 애플리케이션에 대한 서비스 만들기

1. 클러스터에서 Hello World 애플리케이션을 실행한다.

kubectl run hello-world --replicas=5 --labels="run=load-balancer-example" --image=gcr.io/google-samples/node-hello:1.0 --port=8080

위의 명령어는 [디플로이먼트](/docs/concepts/workloads/controllers/deployment/)
오브젝트와 관련된
[레플리카 셋](/docs/concepts/workloads/controllers/replicaset/)
오브젝트를 생성한다. 레플리카 셋은 다섯 개의
[파드](/docs/concepts/workloads/pods/pod/)가 있으며,
각 파드는 Hello World 애플리케이션을 실행한다.

1. 디플로이먼트에 대한 정보를 확인한다.

kubectl get deployments hello-world
kubectl describe deployments hello-world

1. 레플리카 셋 오브젝트에 대한 정보를 확인한다.

kubectl get replicasets
kubectl describe replicasets

1. 디플로이먼트를 외부로 노출시키는 서비스 오브젝트를 생성한다.

kubectl expose deployment hello-world --type=LoadBalancer --name=my-service

1. 서비스에 대한 정보를 확인한다.

kubectl get services my-service

결과는 아래와 같은 형태로 나타난다.

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-service ClusterIP 10.3.245.137 104.198.205.71 8080/TCP 54s

참고: 만약 외부 IP 주소가 \<pending\>으로 표시되면 잠시 기다린 다음, 동일한 명령어를 다시 입력한다.

1. 서비스에 대한 자세한 정보를 확인한다.

kubectl describe services my-service

결과는 아래와 같은 형태로 나타난다.

Name: my-service
Namespace: default
Labels: run=load-balancer-example
Annotations: <none>
Selector: run=load-balancer-example
Type: LoadBalancer
IP: 10.3.245.137
LoadBalancer Ingress: 104.198.205.71
Port: <unset> 8080/TCP
NodePort: <unset> 32377/TCP
Endpoints: 10.0.0.6:8080,10.0.1.6:8080,10.0.1.7:8080 + 2 more...
Session Affinity: None
Events: <none>

서비스에 의해 노출된 외부 IP 주소 (`LoadBalancer Ingress`)를 기억해두자.
예시에서 외부 IP 주소는 104.198.205.71이다.
그리고 `Port``NodePort`의 값을 기억해두자. 예시에서 `Port`는 8080이고 `NodePort`는 32377이다.

1. 위의 출력 결과를 통해, 서비스에 여러 엔드포인트가 있음을 알 수 있다.
10.0.0.6:8080,10.0.1.6:8080,10.0.1.7:8080 + 2. 이 주소는 Hello World 애플리케이션을 실행 중인 파드의 내부 주소다. 해당 주소가 파드 주소인지 확인하려면, 아래 명령어를 입력하면 된다.

kubectl get pods --output=wide

결과는 아래와 같은 형태로 나타난다.

NAME ... IP NODE
hello-world-2895499144-1jaz9 ... 10.0.1.6 gke-cluster-1-default-pool-e0b8d269-1afc
hello-world-2895499144-2e5uh ... 10.0.1.8 gke-cluster-1-default-pool-e0b8d269-1afc
hello-world-2895499144-9m4h1 ... 10.0.0.6 gke-cluster-1-default-pool-e0b8d269-5v7a
hello-world-2895499144-o4z13 ... 10.0.1.7 gke-cluster-1-default-pool-e0b8d269-1afc
hello-world-2895499144-segjf ... 10.0.2.5 gke-cluster-1-default-pool-e0b8d269-cpuc

1. Hello World 애플리케이션에 접근하기 위해 외부 IP 주소 (`LoadBalancer Ingress`)를 사용한다.

curl http://<external-ip>:<port>

`<external-ip>`는 서비스의 외부 IP 주소 (`LoadBalancer Ingress`)를 의미하며,
`<port>`는 서비스 정보에서 `Port` 값을 의미한다.
만약 minikube를 사용하고 있다면, `minikube service my-service` 명령어를 통해 자동으로 브라우저 내에서 Hello World 애플리케이션에 접근할 수 있다.

성공적인 요청에 대한 응답으로 hello 메세지가 나타난다.

Hello Kubernetes!

{{% /capture %}}


{{% capture cleanup %}}

서비스를 삭제하려면, 아래의 명령어를 입력한다.

kubectl delete services my-service

Hello World 애플리케이션을 실행 중인 디플로이먼트, 레플리카 셋, 파드를 삭제하려면, 아래의 명령어를 입력한다.

kubectl delete deployment hello-world

{{% /capture %}}


{{% capture whatsnext %}}

[애플리케이션과 서비스 연결하기](/docs/concepts/services-networking/connect-applications-service/)에 대해 더 배워 본다.
{{% /capture %}}
Loading

0 comments on commit aa5b768

Please sign in to comment.