website/content/ko/docs/tasks/access-application-cluster/service-access-application-...

159 lines
5.4 KiB
Markdown

---
title: 클러스터 내 애플리케이션에 접근하기 위해 서비스 사용하기
content_type: tutorial
weight: 60
---
<!-- overview -->
이 문서는 외부 클라이언트가 클러스터에서 실행 중인 애플리케이션에 접근하기
위해 사용하는 쿠버네티스 서비스 오브젝트를 생성하는 방법을 설명한다. 서비스는
실행 중인 두 개의 인스턴스를 갖는 애플리케이션에 대한 로드 밸런싱을 제공한다.
## {{% heading "prerequisites" %}}
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
## {{% heading "objectives" %}}
* Hello World 애플리케이션 인스턴스 두 개를 실행한다.
* 노드 포트를 노출하는 서비스 오브젝트를 생성한다.
* 실행 중인 애플리케이션에 접근하기 위해 서비스 오브젝트를 사용한다.
<!-- lessoncontent -->
## 두 개의 파드에서 실행 중인 애플리케이션에 대한 서비스 생성하기
다음은 애플리케이션 디플로이먼트(Deployment) 설정 파일이다.
{{< codenew file="service/access/hello-application.yaml" >}}
1. 클러스터 내 Hello World 애플리케이션을 실행하자.
위 파일을 사용하여 애플리케이션 디플로이먼트를 생성하자.
```shell
kubectl apply -f https://k8s.io/examples/service/access/hello-application.yaml
```
앞의 명령은
{{< glossary_tooltip text="디플로이먼트" term_id="deployment" >}}
오브젝트와 연관된
{{< glossary_tooltip term_id="replica-set" text="레플리카셋(ReplicaSet)" >}}
오브젝트를 생성한다. 레플리카셋은 두 개의
{{< glossary_tooltip text="파드" term_id="pod" >}}를 갖고,
각각은 Hello World 애플리케이션을 실행한다.
1. 디플로이먼트에 대한 정보를 보여준다.
```shell
kubectl get deployments hello-world
kubectl describe deployments hello-world
```
1. 레플리카셋 오브젝트에 대한 정보를 보여준다.
```shell
kubectl get replicasets
kubectl describe replicasets
```
1. 디플로이먼트를 노출하는 서비스 오브젝트를 생성한다.
```shell
kubectl expose deployment hello-world --type=NodePort --name=example-service
```
1. 서비스에 대한 정보를 보여준다.
```shell
kubectl describe services example-service
```
결과는 아래와 같다.
```shell
Name: example-service
Namespace: default
Labels: run=load-balancer-example
Annotations: <none>
Selector: run=load-balancer-example
Type: NodePort
IP: 10.32.0.16
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 31496/TCP
Endpoints: 10.200.1.4:8080,10.200.2.5:8080
Session Affinity: None
Events: <none>
```
서비스의 노드포트(NodePort) 값을 메모하자. 예를 들어,
앞선 결과에서, 노드포트 값은 31496이다.
1. Hello World 애플리케이션이 실행 중인 파드를 나열한다.
```shell
kubectl get pods --selector="run=load-balancer-example" --output=wide
```
결과는 아래와 같다.
```shell
NAME READY STATUS ... IP NODE
hello-world-2895499144-bsbk5 1/1 Running ... 10.200.1.4 worker1
hello-world-2895499144-m1pwt 1/1 Running ... 10.200.2.5 worker2
```
1. Hello World 파드가 실행 중인 노드들 중 하나의 노드에 대해 공용
IP 주소를 얻자. 이 주소를 얻는 방법은 어떻게 클러스터를 설치했는지에
따라 다르다. 예를 들어, Minikube를 사용하면, `kubectl cluster-info`
실행하여 노드 주소를 알 수 있다. Google Compute Engine 인스턴스를
사용하면, `gcloud compute instances list` 명령어를
사용하여 노드들의 공용 주소를 알 수
있다.
1. 선택한 노드에서 노드 포트에 대해 TCP 통신을 허용하도록 방화벽 규칙을
생성하자. 예를 들어, 서비스의 노드포트 값이 31568인 경우,
31568 포트로 TCP 통신을 허용하도록 방화벽 규칙을 생성하자. 다른
클라우드 공급자는 방화벽 규칙을 설정하는 다른 방법을 제공한다.
1. Hello World 애플리케이션 접근을 위해 노드 주소와 노드 포트를 사용하자.
```shell
curl http://<public-node-ip>:<node-port>
```
`<public-node-ip>`는 노드의 공용 IP 주소이고,
`<node-port>`는 서비스의 노드포트 값이다.
성공적인 요청에 대한 응답은 hello 메시지이다.
```shell
Hello Kubernetes!
```
## 서비스 설정 파일 사용하기
`kubectl expose`를 사용하는 대신,
[서비스 설정 파일](/ko/docs/concepts/services-networking/service/)을 사용해
서비스를 생성할 수 있다.
## {{% heading "cleanup" %}}
서비스를 삭제하기 위해 다음 명령어를 입력하자.
kubectl delete services example-service
디플로이먼트, 레플리카셋, Hello World 애플리케이션이 실행 중인 파드를
삭제하기 위해 다음 명령어를 입력하자.
kubectl delete deployment hello-world
## {{% heading "whatsnext" %}}
[서비스와 애플리케이션 연결하기](/ko/docs/concepts/services-networking/connect-applications-service/)에
대해 더 알아본다.