이재홍의 언제나 최신 Kubernetes - Unit 3.2 Nginx 웹서버 실행하기

저작권 안내
  • 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
  • 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.

Nginx 웹서버 실행하기

이재홍 http://www.pyrasis.com

Nginx 웹 서버 실행하기

MiniKube 클러스터를 생성했으니 이제 간단한 명령으로 Nginx 웹 서버를 실행해보겠습니다.

다음 명령을 입력하여 Nginx 디플로이먼트를 생성합니다.

$ kubectl create deployment hello-nginx --image=nginx:latest
deployment.apps/hello-nginx created

kubectl create deployment <디플로이먼트 이름> --image=<이미지 이름>:<태그> 형식입니다. 이미지는 Docker 이미지를 사용합니다.

kubectl get all 명령을 실행해봅니다.

$ kubectl get all
NAME                               READY   STATUS    RESTARTS   AGE
pod/hello-nginx-59b74ddd97-qf88t   1/1     Running   0          2m8s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   21h

NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hello-nginx   1/1     1            1           2m8s

NAME                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/hello-nginx-59b74ddd97   1         1         1       2m8s

디플로이먼트 deployment.apps/hello-nginx와 이 디플로이먼트가 생성한 레플리카셋 replicaset.apps/hello-nginx-59b74ddd97 그리고 이 레플리카셋이 생성한 파드 pod/hello-nginx-59b74ddd97-qf88t가 표시됩니다. 즉, 디플로이먼트를 생성하면 디플로이먼트, 레플리카셋, 파드 이렇게 3개의 오브젝트가 생성됩니다.

  • 디플로이먼트: 파드를 실행할 때 사용하는 리소스입니다. 상태가 없는 배포 단위이며 레플리카셋을 포함하고 있습니다.
  • 레플리카셋: 파드를 몇 개 생성(복제)하여 유지할지 결정하는 리소스입니다.
  • 파드: 컨테이너를 생성하는 리소스입니다. 파드 안에는 여러 개의 컨테이너가 들어갈 수도 있습니다.

그림 3-2 디플로이먼트, 레플리카셋, 파드, 컨테이너

리소스와 오브젝트

쿠버네티스에는 리소스와 오브젝트라는 개념이 있습니다. 프로그래밍 언어로 비유하자면 리소스는 클래스, 오브젝트는 인스턴스와 흡사합니다.

그다음에는 파드를 쿠버네티스 네트워크에 노출할 수 있도록 서비스를 생성해보겠습니다.

$ kubectl create service clusterip hello-nginx --tcp=80:80
service/hello-nginx created

kubectl create service <서비스 종류> <서비스 이름> --tcp=<포트>:<타겟 포트> 형식입니다. 서비스 종류(type)는 여러 가지가 있지만 여기서는 clusterip로 설정했습니다.

다시 kubectl get all 명령을 실행해봅니다.

$ kubectl get all
NAME                               READY   STATUS    RESTARTS   AGE
pod/hello-nginx-59b74ddd97-qf88t   1/1     Running   0          14m

NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/hello-nginx   ClusterIP   10.109.191.40   <none>        80:31206/TCP   2m14s
service/kubernetes    ClusterIP   10.96.0.1       <none>        443/TCP        21h

NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hello-nginx   1/1     1            1           14m

NAME                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/hello-nginx-59b74ddd97   1         1         1       14m

서비스에 service/hello-nginx가 생성된 것을 볼 수 있습니다.

  • 서비스: 쿠버네티스 클러스터 내부에 있는 파드 등의 오브젝트를 쿠버네티스 네트워크나 외부에 노출시킬 때 사용하는 리소스입니다.

하지만 아직 로컬호스트에서는 MiniKube의 서비스에 접근할 수는 없습니다. 완전한 쿠버네티스식 사용법은 좀더 복잡하므로 여기서는 kubectlport-forward 기능을 사용해서 접근해보겠습니다. 완전한 쿠버네티스식 사용법은 뒤에서 다시 설명하겠습니다.

$ kubectl port-forward service/hello-nginx 8000:80
Forwarding from 127.0.0.1:8000 -> 80
Forwarding from [::1]:8000 -> 80

kubectl port-forward <리소스 종류/이름> <로컬 포트>:<리모트 포트> 형식입니다. 즉, 쿠버네티스 클러스터 안의 서비스 포트를 로컬 포트로 포워딩 하는 기능입니다.

그림 3-3 kubectl port-forward

웹 브라우저를 열고 http://127.0.0.1:8000에 접속하면 Welcome to nginx!가 표시될 것입니다.

파드 포트 포워딩

앞에서는 서비스의 포트 80번을 포트 포워딩했지만 파드를 그대로 포트 포워딩하는 것도 가능힙니다. 다음과 같이 pod/<파드 이름>을 지정해주면 파드의 포트를 포워딩할 수 있습니다.

$ kubectl port-forward pod/hello-nginx-59b74ddd97-qf88t 8000:80
Forwarding from 127.0.0.1:8000 -> 80
Forwarding from [::1]:8000 -> 80

마찬가지로 웹 브라우저를 열고 http://127.0.0.1:8000에 접속하면 Welcome to nginx!가 표시될 것입니다.

port-forward를 쓰는 이유

쿠버네티스의 파드와 서비스는 쿠버네티스 클러스터 내부 네트워크의 IP 주소를 할당받아 사용하고 있습니다. 그런데, 이 IP 주소는 클러스터 바깥에서 접근할 수 없도록 되어 있습니다. 실제 서비스에서는 외부에서 접근할 수 있도록 클라우드의 로드밸런서(예: AWS의 ELB)를 통해 EXTERNAL-IP를 할당받습니다. 하지만, 지금처럼 Minikube를 사용하는 실습에서는 클라우드의 로드밸런서를 사용할 수 없으므로 kubectl port-forward 명령을 사용하여 임시로 서비스에 접근하는 것입니다. port-forward는 테스트용이며 실제 서비스에서는 사용하지 않습니다. 로드밸런서를 통해 EXTERNAL-IP를 받고 외부에서 접속하는 방법은 뒤에서 자세히 설명하겠습니다.

디플로이먼트와 서비스 삭제

앞에서 생성한 디플로이먼트와 서비스를 삭제하고 싶다면 다음과 같은 명령을 사용하면 됩니다.

$ kubectl delete service hello-nginx
service "hello-nginx" deleted
$ kubectl delete deployment hello-nginx
deployment.apps "hello-nginx" deleted

kubectl delete <리소스 이름> <오브젝트 이름> 형식입니다. 참고로 파드는 삭제하면 레플리카셋에 의해 계속 복구되고, 레플리카셋은 삭제하면 디플로이먼트에 의해 계속 복구됩니다. 파드, 레플리카셋, 디플로이먼트를 모두 삭제하려면 디플로이먼트만 삭제하면 됩니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

2022-10-22