Skip to content

Latest commit

 

History

History
214 lines (193 loc) · 10.9 KB

orchestration.md

File metadata and controls

214 lines (193 loc) · 10.9 KB

High availabiltiy, Auto Scailing 테스트

이번 lab 은 High availabiltiy, Auto Scailing 관련하여 해보도록 하겠습니다.

Auto Scailing 설정

OpenShfit 는 아래와 같이 내장되어 있는 Prometheus 를 이용하여 OpenShift 내의 Pod metric 을 수집하고 모니터링을 할수있도록 지원하고 있습니다.

또한 Horizontal Pod Autoscaler(이하 HPA) 를 이용하여 설정한 CPU 사용률을 기반으로 Replicaset, Deployment 의 Pod 수를 자동으로 Scaling 할 수 있습니다.

$ oc adm top node
NAME                    CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
master1.ocp.chhan.com   755m         21%    2259Mi          15%
master2.ocp.chhan.com   1104m        31%    3161Mi          21%
master3.ocp.chhan.com   1325m        37%    3823Mi          25%
worker1.ocp.chhan.com   218m         6%     948Mi           6%
worker2.ocp.chhan.com   985m         28%    4403Mi          29%
$ oc adm top pod
NAME             CPU(cores)   MEMORY(bytes)   
phpapp-1-6sj2z   3m           66Mi
phpapp-1-9s9lp   3m           59Mi
phpapp-1-lddgd   2m           57Mi
phpapp-1-s8z9z   3m           63Mi

HPA 를 이용한 Auto-Scaling 구현

PHP Source 를 이용해서 세션 접속을 할 때, 부하가 발생되는 PHP APP 을 배포하도록 하겠습니다.

<?php
  $x = 0.0001;
  for ($i = 0; $i <= 1000000; $i++) {
    $x += sqrt($x);
  }
  echo "OK!";
?>

Dockerfile 도 생성합니다.

FROM php:5-apache
ADD index.php /var/www/html/index.php
RUN chmod a+rx index.php

위 소스들을 이용하여 PHP APP 을 배포합니다.

$ oc login -u developer
$ oc new-project hpa-project

신규 Project 생성합니다.

$ oc login -u admin                                 << SCC 추가를 위해 
$ oc adm policy add-scc-to-user anyuid -z default   << SCC 추가

SCC 추가 작업 진행합니다.

$ oc login -u developer
$ oc new-build --name=hpa-app --binary=true
$ oc start-build hpa-app --from-dir=/root/hpa/
$ oc new-app hpa-app
$ oc expose service hpa-app
$ oc set resources deploymentconfigs hpa-app --limits=cpu=200m --requests=cpu=100m

신규 PHP APP 배포합니다.

$ curl hpa-app-hpa-project.apps.ocp.chhan.com

APP 이 정상적으로 배포 되었습니다.

HPA 생성

$ oc autoscale deploymentconfig hpa-app --min=1 --max=10 --cpu-percent=20

위와 같이 HPA 를 생성하고 HPA 를 통해 hpa-app 이 metric 정보를 받아올때까지 약간의 시간이 필요합니다.
모니터링이 진행되면 아래와 같이 HPA 를 확인 할 수 있습니다.

$ oc get hpa -w
NAME      REFERENCE                  TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
hpa-app   DeploymentConfig/hpa-app   <unknown>/20%   1         10        1          66s
hpa-app   DeploymentConfig/hpa-app   4%/20%          1         10        1          118s

load generator 생성

동일한 namespace 에 Load generator 를 생성합니다.

$ oc run -it --rm load-generator --image=busybox /bin/sh
while true; do wget -q -O- http://hpa-app; done

위 명령을 입력하여 부하 발생을 시작합니다.

HPA 동작

$ oc get hpa
NAME      REFERENCE                  TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
hpa-app   DeploymentConfig/hpa-app   131%/20%   1         10        6          9m58s
$ oc get pod
NAME                      READY   STATUS      RESTARTS   AGE
hpa-app-1-build           0/1     Completed   0          14m
hpa-app-1-deploy          0/1     Completed   0          13m
hpa-app-2-cp74l           1/1     Running     0          13m
hpa-app-2-deploy          0/1     Completed   0          13m
hpa-app-2-h6xdl           1/1     Running     0          2m45s
hpa-app-2-hvk4g           1/1     Running     0          74s
hpa-app-2-mbz8v           1/1     Running     0          104s
hpa-app-2-wwhj8           1/1     Running     0          2m15s
hpa-app-2-zgntw           1/1     Running     0          43s
load-generator-1-deploy   0/1     Completed   0          3m53s
load-generator-1-kknll    1/1     Running     0          3m50s

HPA-1
HPA-2
HPA-3
HPA-4

High availabiltiy

OpenShift 는 고가용성 유지를 위해 어떻게 동작하는지 알아보도록 하겠습니다.
OpenShift 는 Kubernetes 라는 Container Orchestration 를 이용하여 고가용성을 유지합니다.

Kubernetes 의 주요 기능은 아래와 같습니다.

  1. 서비스 디스커버리와 로드 밸런싱 쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있다.
    컨테이너에 대한 트래픽이 많으면, 쿠버네티스는 네트워크 트래픽을 로드밸런싱하고 배포하여 배포가 안정적으로 이루어질 수 있다.
  2. 스토리지 오케스트레이션 쿠버네티스를 사용하면 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재 할 수 있다. 자동화된 롤아웃과 롤백 쿠버네티스를 사용하여 배포된 컨테이너의 원하는 상태를 서술할 수 있으며 현재 상태를 원하는 상태로 설정한 속도에 따라 변경할 수 있다. 예를 들어 쿠버네티스를 자동화해서 배포용 새 컨테이너를 만들고, 기존 컨테이너를 제거하고, 모든 리소스를 새 컨테이너에 적용할 수 있다.
  3. 자동화된 빈 패킹(bin packing) 컨테이너화된 작업을 실행하는데 사용할 수 있는 쿠버네티스 클러스터 노드를 제공한다.
    각 컨테이너가 필요로 하는 CPU와 메모리(RAM)를 쿠버네티스에게 지시한다. 쿠버네티스는 컨테이너를 노드에 맞추어서 리소스를 가장 잘 사용할 수 있도록 해준다.
  4. 자동화된 복구(self-healing) 쿠버네티스는 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체하며,
    ‘사용자 정의 상태 검사’에 응답하지 않는 컨테이너를 죽이고, 서비스 준비가 끝날 때까지 그러한 과정을 클라이언트에 보여주지 않는다.
  5. 시크릿과 구성 관리 쿠버네티스를 사용하면 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리 할 수 있다. 컨테이너 이미지를 재구성하지 않고 스택 구성에 시크릿을 노출하지 않고도 시크릿 및 애플리케이션 구성을 배포 및 업데이트 할 수 있다.

위와 같이 제공되는 주요 기능중, Self-Healing 기능이 Container 환경에서 Kubernetes/OpenShift 를 사용하게 되는 주요 이유입니다.

Pod 단위

Deployment4 인 APP 에서 Pod 하나를 강제로 종료하여 복구가 되는 것을 확인합니다.

$ oc new-build php --name phpapp --binary=true
$ oc start-build phpapp --from-file=index.php
$ oc new-app phpapp
$ oc expose service phpapp
$ oc scale deploymentconfig --replicas=4 phpapp
$ oc get pod -o wide
$ oc delete pod phpapp-X-XXXXX
$ oc get pod -o wide

Node 단위

Worker node 장애 발생 테스트를 해보도록 하겠습니다.

$ oc get pod -o wide | grep -v Comp
NAME              READY   STATUS      RESTARTS   AGE     IP             NODE                    NOMINATED NODE   READINESS GATES
phpapp-1-675qm    1/1     Running     0          3h43m   10.131.0.124   worker1.ocp.chhan.com   <none>           <none>
phpapp-1-9s9lp    1/1     Running     0          3h43m   10.128.2.127   worker2.ocp.chhan.com   <none>           <none>
phpapp-1-ml9fp    1/1     Running     0          3h43m   10.131.0.123   worker1.ocp.chhan.com   <none>           <none>
phpapp-1-s8z9z    1/1     Running     0          3h44m   10.128.2.126   worker2.ocp.chhan.com   <none>           <none>

worker1.ocp.chhan.com 장애가 발생되는 경우,

$ oc get nodes
NAME                    STATUS     ROLES    AGE   VERSION
master1.ocp.chhan.com   Ready      master   21d   v1.17.1
master2.ocp.chhan.com   Ready      master   21d   v1.17.1
master3.ocp.chhan.com   Ready      master   21d   v1.17.1
worker1.ocp.chhan.com   NotReady   worker   21d   v1.17.1
worker2.ocp.chhan.com   Ready      worker   21d   v1.17.1

Pod Self-healing 진행,

oc get pod -o wide
NAME              READY   STATUS        RESTARTS   AGE     IP             NODE                    NOMINATED NODE   READINESS GATES
phpapp-1-675qm    1/1     Terminating   0          3h52m   10.131.0.124   worker1.ocp.chhan.com   <none>           <none>
phpapp-1-6sj2z    1/1     Running       0          42s     10.128.2.132   worker2.ocp.chhan.com   <none>           <none>
phpapp-1-9s9lp    1/1     Running       0          3h52m   10.128.2.127   worker2.ocp.chhan.com   <none>           <none>
phpapp-1-build    0/1     Completed     0          3h54m   10.128.2.124   worker2.ocp.chhan.com   <none>           <none>
phpapp-1-deploy   0/1     Completed     0          3h53m   10.128.2.125   worker2.ocp.chhan.com   <none>           <none>
phpapp-1-lddgd    1/1     Running       0          42s     10.128.2.140   worker2.ocp.chhan.com   <none>           <none>
phpapp-1-ml9fp    1/1     Terminating   0          3h52m   10.131.0.123   worker1.ocp.chhan.com   <none>           <none>
phpapp-1-s8z9z    1/1     Running       0          3h53m   10.128.2.126   worker2.ocp.chhan.com   <none>           <none>

장애 복구 절차,

$ oc adm cordon <NODE NAME>

Worker node 장애 복구 진행,

$ oc get nodes
NAME                    STATUS                     ROLES    AGE   VERSION
master1.ocp.chhan.com   Ready                      master   21d   v1.17.1
master2.ocp.chhan.com   Ready                      master   21d   v1.17.1
master3.ocp.chhan.com   Ready                      master   21d   v1.17.1
worker1.ocp.chhan.com   Ready,SchedulingDisabled   worker   21d   v1.17.1
worker2.ocp.chhan.com   Ready                      worker   21d   v1.17.1

장애의 문제점이 해결는 동안 cordon 옵션을 통해 Pod 이 Scheduling 이 안되도록 설정합니다.

$ oc adm uncordon worker1.ocp.chhan.com
node/worker1.ocp.chhan.com uncordoned

장애 복구 완료 후, Pod 이 Scheduling 이 가능하도록 uncordon 옵션을 이용하여 Scheduling Enabled 을 합니다.

참고 자료