반응형

쿠버네티스 클러스터를 생성하여 nginx 웹 서버를 배포해보겠습니다.

먼저 로컬에서 쿠버네티스를 테스트해보기 위해 minikube, 쿠버네티스 CLI 도구인 kubectl과 virtualbox를 설치해줍니다.

minikube로 클러스터를 생성해줍니다.

$ minikube start --memory=4084 --cpus=2 --disk-size=30g \
  --vm-driver=virtualbox -p my-profile

생성된 프로필 my-profile을 확인하고, 그 프로필로 전환해줍니다.

$ minikube profile list
$ minikube profile my-profile

nginx 웹 서버를 배포할 샘플 디플로이먼트를 생성해보겠습니다.

kubectl 컨텍스트의 기본 namespace를 새로 만들어서 지정해줍니다.

$ kubectl create namespace my-namespace
$ kubectl config set-context $(kubectl config current-context) --namespace=my-namespace

 

 

deployment를 생성하기 위해 다음과 같은 nginx-deployment.yaml 파일을 작성해줍니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-app
  template:
    metadata:
      labels:
        app: nginx-app
    spec:
      containers:
      - name: nginx-container
        image: nginx:latest
        ports:
        - containerPort: 80

오브젝트 이름은 nginx-deploy이고, replicas의 값을 1로 설정해서 팟을 하나만 실행합니다.

deployment가 app labels의 값이 nginx-app인 팟을 찾도록 합니다.

template에서는 팟 생성 방법을 작성하는데, 팟을 식별할 때 사용하는 labels과 nginx 이미지를 지정해줍니다.

 

$ kubectl apply -f nginx-deployment.yaml

다음 커맨드로 클러스터에 deployment를 생성하고 확인해봅니다.

 

$ kubectl get all
NAME                                READY   STATUS    RESTARTS   AGE
pod/nginx-deploy-684c7956fd-s7f2r   1/1     Running   0          18s

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deploy   1/1     1            1           74s

NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deploy-684c7956fd   1         1         1       74s

1개의 pod, 1개의 deployment, 1개의 replicaset을 확인할 수 있습니다.

생성되어있는 하나의 팟을 임의로 제거해보겠습니다.

 

$ kubectl delete pod --selector app=nginx-app

replicaset이 지정한 상태와의 차이를 감지하고 새로운 팟을 다시 생성하게 됩니다.

 

$ kubectl get all
NAME                                READY   STATUS              RESTARTS   AGE
pod/nginx-deploy-684c7956fd-s7f2r   0/1     ContainerCreating   0          3s

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deploy   0/1     1            0           59s

NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deploy-684c7956fd   1         1         0       59s

$ kubectl get all
NAME                                READY   STATUS    RESTARTS   AGE
pod/nginx-deploy-684c7956fd-s7f2r   1/1     Running   0          5s

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deploy   1/1     1            1           61s

NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deploy-684c7956fd   1         1         1       61s

 

 

nginx-deployment.yaml의 replica 값을 3으로 변경하고 다시 적용해보겠습니다.

$ kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deploy configured

$ kubectl get all
NAME                                READY   STATUS    RESTARTS   AGE
pod/nginx-deploy-684c7956fd-blxsb   1/1     Running   0          14s
pod/nginx-deploy-684c7956fd-kkm7p   1/1     Running   0          14s
pod/nginx-deploy-684c7956fd-s7f2r   1/1     Running   0          76s

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deploy   3/3     3            3           2m12s

NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deploy-684c7956fd   3         3         3       2m12s

세 개의 팟을 확인할 수 있습니다.

생성된 nginx 웹 서버가 외부와 통신할 수 있도록 서비스 객체를 만들기 위해 nginx-service.yaml 파일을 작성해보겠습니다.

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx-app
  ports:
    - targetPort: 80
      port: 80
      nodePort: 30080

서비스 오브젝트의 이름은 nginx-service로 지정하고, 타입은 NodePort로 선언하여 외부에서 클러스터 노드에 접근하기 위한 전용 포트를 지정해주겠습니다.

요청이 전달될 팟의 포트는 80, 클러스터 내부에서 사용하는 포트는 80, 외부에서 서비스에 접근할 때 사용할 노드의 포트는 30080으로 지정하였습니다.

 

$ kubectl apply -f nginx-service.yaml
$ kubectl get svc
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
nginx-service   NodePort   10.97.136.21   <none>        80:30080/TCP   6s

서비스 객체를 생성하여 확인해줍니다.

다음 커맨드로 클러스터 노드의 IP 주소를 알아내서 배포한 웹 서버에 접속해봅니다.

$ minikube ip
$ curl -s $(minikube ip):30080

nginx 웹 페이지가 출력되는 것을 확인할 수 있습니다.

 

 

$ kubectl delete namespace my-namespace

배포했던 namespace를 제거하고 마무리해줍니다.

 

$ minikube stop
* Stopping node "my-profile"  ...
* 1개의 노드가 중지되었습니다.

$ minikube start

$ minikube delete --profile my-profile

다음과 같이 클러스터를 일시 정지 및 시작하거나, 종료시킬 수 있습니다.

* '스프링으로 하는 마이크로서비스 구축 / 매그너스 라슨' 을 보면서 실습해본 내용입니다.

반응형

+ Recent posts