- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
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개의 오브젝트가 생성됩니다.
- 디플로이먼트: 파드를 실행할 때 사용하는 리소스입니다. 상태가 없는 배포 단위이며 레플리카셋을 포함하고 있습니다.
- 레플리카셋: 파드를 몇 개 생성(복제)하여 유지할지 결정하는 리소스입니다.
- 파드: 컨테이너를 생성하는 리소스입니다. 파드 안에는 여러 개의 컨테이너가 들어갈 수도 있습니다.
리소스와 오브젝트
쿠버네티스에는 리소스와 오브젝트라는 개념이 있습니다. 프로그래밍 언어로 비유하자면 리소스는 클래스, 오브젝트는 인스턴스와 흡사합니다.
그다음에는 파드를 쿠버네티스 네트워크에 노출할 수 있도록 서비스를 생성해보겠습니다.
$ 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 <리소스 종류/이름> <로컬 포트>:<리모트 포트>
형식입니다. 즉, 쿠버네티스 클러스터 안의 서비스 포트를 로컬 포트로 포워딩 하는 기능입니다.
웹 브라우저를 열고 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 공유는 허용합니다.