Skip to main content

03B. Nginx 웹서버 실행하기

About 2 minKubernetescrashcoursedigitaloceankubernetesminkubekubctl

03B. Nginx 웹서버 실행하기 관련


Unit 3.2 Nginx 웹서버 실행하기

언제나 최신 Kubernetes

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

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

kubectl create deployment hello-nginx --image=nginx:latest
#
# deployment.apps/hello-nginx created
kubectl create deployment <DEPLOYMENT_NAME> --image=<IMAGE_NAME>:<TAG> 형식입니다. 이미지는 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 <SERVICE_TYPE> <SERVICE_NAME> --tcp=<PORT>:<TARGET_PORT> 형식입니다. 서비스 종류(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 <RESOURCE_TYPE/RESOURCE_NAME> <LOCAL_PORT>:<REMOTE_PORT> 형식입니다. 즉, 쿠버네티스 클러스터 안의 서비스 포트를 로컬 포트로 포워딩 하는 기능입니다.
<FontIcon icon="iconfont icon-shell"/>
kubectl port-forward

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

파드 포트 포워딩

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

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 <RESOURCE_NAME> <OBJECT_NAME> 형식입니다. 참고로 파드는 삭제하면 레플리카셋에 의해 계속 복구되고, 레플리카셋은 삭제하면 디플로이먼트에 의해 계속 복구됩니다. 파드, 레플리카셋, 디플로이먼트를 모두 삭제하려면 디플로이먼트만 삭제하면 됩니다.

이찬희 (MarkiiimarK)
Never Stop Learning.