Kubernetes/03. k8s 오브젝트 기본 및 관리

[쿠버네티스] 명령형 커맨드를 사용한 애플리케이션 실행

Jaden Park 2021. 6. 16. 23:27

들어가며

명령행 커맨드를 사용한 애플리케이션 실행

  • 디플로이먼트 생성
  • 리소스 확인
  • 서비스 생성
  • 서비스 확인
  • 서비스 접근
  • 파드 스케일링
  • 서비스 요청 시 분산된 접근 확인
  • 생성한 리소스 삭제

 

끝마치며: 명령형 커맨드(Imperative Commands) 란?(반복)


들어가며

쿠버네티스 오브젝트(=매니페스트)를 생성하여 실행 및 관리하는 방법은 세 가지가 있습니다.
이 글은 관리 방법 중 명령형 커맨드를 사용한 애플리케이션 실행을 다룬 글 입니다.

 


명령형 커맨드를 사용한 애플리케이션 실행

명령형 커맨드를 이용하여 쿠버네티스 오브젝트를 생성해 애플리케이션을 관리하는 방법을 알아보겠습니다.

 

1. deployment 생성

Usage:
  kubectl create deployment NAME --image=image -- [COMMAND] [args...] [options]

kubectl create 명령을 사용하여 deployment 리소스를 생성할 수 있습니다.
디플로이먼트 컨트롤러의 이름은 myapp 이며, 컨테이너에 사용할 이미지는 httpd 이미지를 사용했습니다.

$ kubectl create deployment myapp --image=ghcr.io/c1t1d0s7/go-myweb

deployment.apps/myapp created

 

 

2. 리소스 확인

$ kubectl get deployments,replicasets,pods
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/myapp   1/1     1            1           37s

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/myapp-748ff96db8   1         1         1       37s

NAME                         READY   STATUS    RESTARTS   AGE
pod/myapp-748ff96db8-26prn   1/1     Running   0          37s

현재 myapp deployment 컨트롤러 리소스가 배포되었습니다.
deployment 에 의해 myapp-748ff96db8 replicaset 리소스가 생성되었으며,
replicaset 리소스에 의해 myapp-replicaset-26prn pod 가 생성되었습니다.
별도의 복제본 개수는 지정하지 않았기에 파드는 1개가 생성되었습니다.

$ watch -n1 -d kubectl get deployments,replicasets,pods -o wide

Every 1.0s: kubectl get deployments,replicasets,pods -o wide               kube-control1: Wed Jun 16 01:55:58 2021

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                      SELECTOR
deployment.apps/myapp   1/1     1            1           3m21s   go-myweb     ghcr.io/c1t1d0s7/go-myweb   app=myap
p

NAME                               DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES                      SE
LECTOR
replicaset.apps/myapp-748ff96db8   1         1         1       3m21s   go-myweb     ghcr.io/c1t1d0s7/go-myweb   ap
p=myapp,pod-template-hash=748ff96db8

NAME                         READY   STATUS    RESTARTS   AGE     IP                NODE         NOMINATED NODE
READINESS GATES
pod/myapp-748ff96db8-26prn   1/1     Running   0          3m21s   192.168.233.198   kube-node2   <none>
<none>

watch 명령을 사용하면 2초마다 변경사항을 확인할 수 있습니다.

  • -n1 : 실행간격을 1초마다
  • -d : 변경사항 하이라이트
  • -o wide : 노드의 주소 등을 알 수 있음

 

 

3. 서비스 생성

외부에서 클러스터 내부의 컨테이너에 접근할 수 있도록 서비스 오브젝트를 생성하여 노출해야 합니다.

$ kubectl expose deployment myapp --port=80 --protocol=TCP --target-port=8080 --name myapp-svc --type=LoadBalancer

생성하는 서비스 이름은 myapp-svc 입니다. 서비스 타입은 나중에 알아보겠습니다.

 

 

4. 서비스 확인

$ kubectl get services myapp-svc

CLUSTER-IP 는 서비스의 ip, EXTERNAL-IP 는 로드밸런서의 ip 를 의미합니다. 로드밸런서의 ip 가 "pending" 이 되는 이유는 로드밸런서는 쿠버네티스의 영역 밖 입니다. addon으로 구성을 따로 해줘야하기 때문에 할당이 되지 못합니다.
포트번호는 노드의 포트번호를 의미합니다.

 

5. 서비스 접근

a. LoadBalancer 타입의 서비스 접근
  ip 는 로드밸런서의 external-ip로 접근

$ curl http://192.168.100.100

Hello world!
myapp-748ff96db8-26prn

b. NodePort 타입의 서비스 접근
  노드의 ip(192.168.100.21~23)와 port의 콜론 구분자의 두 번째 포트로 접근하겠습니다.

$ curl http://192.168.100.21:31266

Hello world!
myapp-748ff96db8-26prn

 

 

6. 파드 스케일링

  현재 myapp 디플로이먼트 컨트롤러는 하나의 파드를 가지고 있었습니다. 이를 3개의 복제본으로 스케일링 해보겠습니다.

$ kubectl scale deployment myapp --replicas=3

스케일링 결과 확인은 "2. 리소스 확인" 에서 작성한 명령어로 알 수 있습니다.

$ watch -n1 -d kubectl get deployments,replicasets,pods -o wide

Every 1.0s: kubectl get deployments,replicasets,pods -o wide               kube-control1: Wed Jun 16 01:55:58 2021

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES                      SELECTOR
deployment.apps/myapp   1/1     1            1           3m21s   go-myweb     ghcr.io/c1t1d0s7/go-myweb   app=myap
p

NAME                               DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES                      SE
LECTOR
replicaset.apps/myapp-748ff96db8   1         1         1       3m21s   go-myweb     ghcr.io/c1t1d0s7/go-myweb   ap
p=myapp,pod-template-hash=748ff96db8

NAME                         READY   STATUS    RESTARTS   AGE     IP                NODE         NOMINATED NODE
READINESS GATES
pod/myapp-748ff96db8-26prn   1/1     Running   0          3m21s   192.168.233.198   kube-node2   <none>
<none>
pod/myapp-748ff96db8-255x1   1/1     Running   0          21s     192.168.233.198   kube-node1   <none>
<none>
pod/myapp-748ff96db8-to312   1/1     Running   0          21s     192.168.233.198   kube-node2   <none>
<none>

 

 

7. 서비스 요청 시 분산된 접근 확인

조금의 시간차를 두고 같은 주소를 여러번 확인해보겠습니다.

$ curl 192.168.100.11

Hello world!
myapp-748ff96db8-26prn

$ curl 192.168.100.11

Hello world!
myapp-748ff96db8-to312

$ curl 192.168.100.11

Hello world!
myapp-748ff96db8-26prn

동일한 서비스 주소에 접근하더라도 서로 다른 결과를 보여줍니다. 즉, 다른 파드의 컨테이너에 접근한 것을 확인할 수 있습니다.
이처럼 서비스에도 분산을 시켜주는 것을 알 수 있습니다.

 

 

8. 생성한 리소스 삭제

이제까지 명령으로 생성한 리소스를 삭제하고 확인해보겠습니다.
전체 오브젝트의 목록을 확인하겠습니다.

$ kubectl get all

특정 파드를 삭제해보겠습니다.

kubectl delete pod myapp-748ff96db8-26prn

다시 목록을 확인해보면 또 다른 파드 1개가 생성되어 3개의 파드를 유지하는 것을 확인할 수 있습니다. (replicaset을 삭제해도 다시 생성되는 것을 확인할 수 있습니다.)
이는 deployment가 replicaset을 생성하고, replicaset이 pod를 생성하기 때문이며 복제본 3개의 pod를 유지해야하기 때문입니다.
따라서, deployment 컨트롤러를 삭제해야 합니다.

kubectl delete deployments myapp

삭제 후 목록을 조회해보면 파드와 레플리카셋 모두 삭제된 것을 확인할 수 있습니다.

 

 

kubectl delete pod --all

별도의 확인없이 모든 목록을 제거하고 싶다면 --all 옵션을 사용하면 됩니다.


끝마치며: 명령형 커맨드(Imperative Commands) 란?(반복)

  • kubectl 명령에 인수 또는 옵션을 사용하여 애플리케이션을 관리하는 방법입니다.
  • 일회성 작업에서 주로 사용합니다
  • 개발 환경에서 권장하는 방법이며, 가장 단순한 방법입니다.