2개의 파드가 종료된 것을 확인 할 수 있다.
티스토리 뷰
09 Kubernetes Basics - Running Multiple Instances of Your App
zerobig-k8s 2018. 8. 23. 21:04<출처>
https://kubernetes.io/docs/tutorials/kubernetes-basics/scale/scale-intro/
Objectives
- kubectl 을 통해 앱을 스케일링 해본다.
Scaling an application
이전 모듈에서 우리는 디플로이먼트를 생성해봤고, 서비스를 통해 그것을 외부에 노출해 봤다. 애플리케이션을 동작시키기 위해 단지 하나의 파드를 생성하는 디플로이먼트 였다. 트래픽이 증가할 때, 우리는 사용자의 요구에 맞출 수 있도록 애플리케이션을 스케일링 해야만 할 것이다.
스케일링은 디플로이먼트에서 레플리카의 수를 변경함으로써 처리 할 수 있다.
여러분은 kubectl run 명령에 --replicas 파라미터를 이용하여 다중 인스턴스 디플로이먼틑가 시작되도록 생성해 볼 수 있다.
Scaling overview
디플로이먼트 스케일링 아웃은 새로운 파드가 생성되도록 해주고 가용한 자원을 보유한 노드에게 스케줄되도록 보장해 줄 것이다. 스케일링은 새로 의도한 상태(desired state) 에 도달될 때까지 파드의 수를 증가시킬 것이다. K8S는 또한 파드의 자동스케일링을 지원한다. 그러나 지금 강좌에서 다루고자 하는 범위에서 벗어난다. 0 값으로 스케일링 하는 것도 가능한데, 이는 특정 디플로이먼트의 모든 파드를 소멸시킬 것이다.
애플리케이션을 다중 인스턴스로 동작시키려면 모든 인스턴스들에게 트래픽을 분산시켜주는 방법이 필요로하게 된다. 서비스는 노출된 디플로이먼트의 모든 파드에게 네트워크 트래픽을 분산시켜 줄 통합 로드 밸런서를 갖는다. 서비스는 지속적으로 엔드포인트를 이용하는 동작상태의 파드를 대상으로 모니터링 하다가, 오직 사용 가능한 상태의 파드에게만 트래픽이 전달되도록 보장해 줄 것이다.
스케일링은 디플로이먼트 내 레플리카의 수를 변경함으로써 이루어 진다.
일단 다중 인스턴스의 애플리케이션이 동작하게 되면, 서비스 중단 없이 롤링 업데이트를 할 수 있을 것이다. 다음 모듈에서는 이 부분을 다루어 볼 것이다. 자, 이제 온라인 터미널로 이동하여, 애플리케이션을 스케일 해보자.
Interactive Tutorial - Scaling Your App
이번 대화형 시나리오의 목표는 kubectl scale 을 이용해 디플로이먼트를 스케일하고 로드밸런싱이 처리 되는 것을 확인하는 것이다.
Step 1: Scaling a deployment
디플로이먼트의 리스트를 확인해본다.
1 2 3 | root@zerobig-vm:~# kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 1 1 1 1 20h | cs |
우리는 현재 하나의 파드를 가지고 있어야 한다. 아니라면, 명령어를 다시 수행한다. (출력결과는) 이러한 내용을 보여준다:
DESIRED 상태란 설정된 레플리카의 수를 나타낸다.
CURRENT 상태란 현재 몇 개의 레플리카가 동작하고 있는지를 나타낸다.
UP-TO-DATE 는 의도한(설정된) 상태를 맞추기 위해 업데이트 되어진 레플리카 수를 나타낸다.
AVAILABLE 상태란 얼마나 많은 레플리카가 실제로 사용자에게 사용가능 한지를 보여준다.
자, 이제 디플로이먼트 수를 4개의 레플리카로 스케일 해보자. 우리는 "kubectl sacle" 명령 바로 뒤에 디플로이먼트 타입, 이름 그리고 의도하는 인스턴스들의 수를 함께 넣어 명령을 내릴 것이다.
1 2 | root@zerobig-vm:~# kubectl scale deployment/kubernetes-bootcamp --replicas=4 deployment.extensions/kubernetes-bootcamp scaled | cs |
디플로이먼트의 리스트를 다시 확인해보기 위해, "get deployments" 를 이용한다.
1 2 3 4 | root@zerobig-vm:~# kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 4 4 4 4 20h | cs |
변경이 적용되었다, 그리고 사용가능한 인스턴스가 4개가 되었다. 이제 다시 파드의 수가 변경되었는지 확인 해 보자.
1 2 3 4 5 6 7 | root@zerobig-vm:~# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE kubernetes-bootcamp-5c69669756-2559z 1/1 Running 0 1m 172.17.0.7 minikube kubernetes-bootcamp-5c69669756-d4kgp 1/1 Running 2 20h 172.17.0.5 minikube kubernetes-bootcamp-5c69669756-jlqrw 1/1 Running 0 1m 172.17.0.8 minikube kubernetes-bootcamp-5c69669756-w2cs6 1/1 Running 0 1m 172.17.0.9 minikube | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | root@zerobig-vm:~# kubectl describe deployments/kubernetes-bootcamp Name: kubernetes-bootcamp Namespace: default CreationTimestamp: Thu, 09 Aug 2018 00:31:44 +0900 Labels: run=kubernetes-bootcamp Annotations: deployment.kubernetes.io/revision=1 Selector: run=kubernetes-bootcamp Replicas: 4 desired | 4 updated | 4 total | 4 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: run=kubernetes-bootcamp Containers: kubernetes-bootcamp: Image: gcr.io/google-samples/kubernetes-bootcamp:v1 Port: 8080/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Progressing True NewReplicaSetAvailable Available True MinimumReplicasAvailable OldReplicaSets: <none> NewReplicaSet: kubernetes-bootcamp-5c69669756 (4/4 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 2m deployment-controller Scaled up replica set kubernetes-bootcamp-5c69669756 to 4 | cs |
여러분은 또한 이 명령의 출력내용에서 이제 4개의 레플리카가 존재함을 볼 수 있다.
Step 2: Load Balancing
서비스가 트래픽을 로드밸런싱 하는지 확인해 보자. 외부로 노출되어질 아이피와 포트를 확인하려면 이전 모듈에서 살펴본 바와 같이 서비스를 describe 해보면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | root@zerobig-vm:~# kubectl describe services/kubernetes-bootcamp Name: kubernetes-bootcamp Namespace: default Labels: run=kubernetes-bootcamp Annotations: <none> Selector: run=kubernetes-bootcamp Type: NodePort IP: 10.102.90.35 Port: <unset> 8080/TCP TargetPort: 8080/TCP NodePort: <unset> 31988/TCP Endpoints: 172.17.0.5:8080,172.17.0.7:8080,172.17.0.8:8080 + 1 more... Session Affinity: None External Traffic Policy: Cluster Events: <none> | cs |
Node Port 라는 값을 갖도록 NODE_PORT 라는 환경변수를 만들어 보자.
1 2 3 | root@zerobig-vm:~# export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}') root@zerobig-vm:~# echo NODE_PORT=$NODE_PORT NODE_PORT=31988 | cs |
다음, 노출되어진 아이피, 포트를 대상으로 "curl" 을 여러 번 수행해 보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | root@zerobig-vm:~# curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-d4kgp | v=1 root@zerobig-vm:~# curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-jlqrw | v=1 root@zerobig-vm:~# curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-w2cs6 | v=1 root@zerobig-vm:~# curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-w2cs6 | v=1 root@zerobig-vm:~# curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-w2cs6 | v=1 root@zerobig-vm:~# curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-jlqrw | v=1 root@zerobig-vm:~# curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-w2cs6 | v=1 root@zerobig-vm:~# curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-d4kgp | v=1 root@zerobig-vm:~# curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-w2cs6 | v=1 root@zerobig-vm:~# curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-jlqrw | v=1 root@zerobig-vm:~# curl $(minikube ip):$NODE_PORT Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-w2cs6 | v=1 | cs |
우리가 매번 요청할 때마다 다른 Pod 에 접근하게 된다. 이는 로드밸런싱이 동작하고 있다는 것을 보여주는 것이다.
Step 3: Scale Down
서비스를 2개의 레플리카로 스케일 다운시켜 보자. 다시 "scale" 명령을 수행한다.
1 2 3 | root@zerobig-vm:~# kubectl scale deployment/kubernetes-bootcamp --replicas=2 deployment.extensions/kubernetes-bootcamp scaled | cs |
"get deployments" 명령으로 변경이 적용되었는지 디플로이먼트를 리스트 해본다.
1 2 3 | root@zerobig-vm:~# kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 2 2 2 2 21h | cs |
1 2 3 4 5 | root@zerobig-vm:~# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE kubernetes-bootcamp-5c69669756-d4kgp 1/1 Running 2 21h 172.17.0.5 minikube kubernetes-bootcamp-5c69669756-jlqrw 1/1 Running 0 23m 172.17.0.8 minikube | cs |
'Kubernetes' 카테고리의 다른 글
12 Stateless Application - Exposing an External IP Address to Access an Application in a Cluster (0) | 2018.08.27 |
---|---|
10 Kubernetes Basics - Performing a Rolling Update (0) | 2018.08.23 |
08 Kubernetes Basics - Using a Service to Expose Your App (0) | 2018.08.23 |
07 Kubernetes Basics - Viewing Pods and Nodes (0) | 2018.08.19 |
06 Kubernetes Basics - Using kubectl to Create a Deployment (4) | 2018.08.19 |