- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
Nginx 웹서버 실행하기
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의 서비스에 접근할 수는 없습니다. 완전한 쿠버네티스식 사용법은 좀더 복잡하므로 여기서는 kubectl
의 port-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 공유는 허용합니다.