들어가며
명령행 커맨드를 사용한 애플리케이션 실행
- 디플로이먼트 생성
- 리소스 확인
- 서비스 생성
- 서비스 확인
- 서비스 접근
- 파드 스케일링
- 서비스 요청 시 분산된 접근 확인
- 생성한 리소스 삭제
끝마치며: 명령형 커맨드(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 명령에 인수 또는 옵션을 사용하여 애플리케이션을 관리하는 방법입니다.
- 일회성 작업에서 주로 사용합니다
- 개발 환경에서 권장하는 방법이며, 가장 단순한 방법입니다.
'Kubernetes > 03. k8s 오브젝트 기본 및 관리' 카테고리의 다른 글
[쿠버네티스] 명령형 오브젝트 구성 방법 / yaml 의 기초 설명 (0) | 2021.06.17 |
---|---|
[쿠버네티스] k8s 오브젝트의 일반적인 구성 종류 (0) | 2021.06.16 |
[쿠버네티스] 오브젝트 관리 방법 (명령형 커맨드, 명령형 오브젝트 구성, 선언형 오브젝트 구성) (0) | 2021.06.16 |