티스토리 뷰

<출처> 

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


이제 4개의 파드가 서로 다른 아이피 주소를 갖고 생성되었다. 변경내역은 디플로이먼트 이벤트 로그에 등록되는데 이를 확인하기 위해, describe 명령을 이용해보자.

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


레플리카의 수가 2개로 감소 된 것을 확인할 수 있으며, "get pods" 를 통해 파드를 리스트 해본다.

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


2개의 파드가 종료된 것을 확인 할 수 있다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
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
글 보관함