시작하기
카카오클라우드 스쿨 엔지니어 2기를 진행하며 첫 번째 개인프로젝트인 도커 프로젝트를 진행하게 되었고 이런 저런 고민끝에 쉘 스크립트를 사용하여 도커 오토스케일링 구현하기 라는 주제를 선정하고 구현하게 되었는데, 이 과정을 정리해보려 한다.
1. 프로젝트 주제 선정 이유 및 목표
가. 주제 선정의 이유(문제 정의)
docker swarm은 기본적으로 Auto-scale을 지원하지 않고, docker service 명령어를 통한 수동적인 컨테이너 배포만 가능하다. 이로 인해 컨테이너에 과부하가 발생하면 서비스 운영에 문제가 발생할 수 있기 때문에, docker swarm 환경에서 Auto-scaling을 구현하고자 한다.
나. 프로젝트 목표
매니저 노드 1대와 워커 노드 2대로 구성된 docker swarm 환경에서 실행되는 nginx(웹 서비스) 컨테이너의 CPU자원 상태를 확인하여 임계치를 넘게 되면 Scale-Out을 진행하여 안정적인 서비스 운영 환경을 제공하고, 자원 활용도를 향상시킨다.
2. 프로젝트 결과 개요
가. 기능 구현 목록
순번 | 구분 | 설명 |
---|---|---|
1 | Docker Swarm | 1대의 마스터 노드와 2대의 워커노드로 Docker Swarm 구성 |
2 | Web Service | docker deploy를 통한 웹 서비스 배포 - default replicas는 2개로 설정 |
3 | HA Proxy | Web Service 컨테이너들의 Load Balancing 처리를 위한 Proxy 구성 |
4 | Auto-scale | 쉘 스크립트를 직접 작성하여 컨테이너 Auto scaling 구현 - 쉘 스크립트 사용 - Web Service 컨테이너의 CPU 사용률 확인 후 Scale out, in 진행 - Manager Node에서 5초마다 실행 |
5 | Monitoring Service | 컨테이너의 자원 사용률 수집 및 시각화 구성 - Manager Node 1. Prometheus 구성 : Worker Node의 컨테이너 자원 사용률 수집 2. Grafana 구성 : Prometheus가 수집한 자원 사용을 시각화 하여 표현 - Worker Node 1. cAdvisor 설치 : Node에서 띄워진 컨테이너 자원 사용량 게시 |
나. 구성도
3. 프로젝트 기능 구현 결과
가. Docker Swarm
1) 개요
GCP(Google Cloud Platform)에 VM 인스턴스 서비스를 사용하여 Ubuntu 서버 3대 생성 후 1대의 Manager, 2대의 Worker Node로 Docker Swarm Cluster를 구성하였다.
2) 구성 확인
가) GCP에 구성된 VM 인스턴스
나) docker node ls 명령어를 통해 Cluster 구성 확인
나. Web Service & HA Proxy
1) 개요
Docker Swarm Cluster에 아래와 같이 Deploy를 진행했다.
- Nginx 이미지를 사용한 웹 컨테이너 2개 배포
- HA Proxy 이미지를 사용한 컨테이너 배포 및 Nginx 컨테이너와 연결
2) 구성 확인
가) web.yaml 구성 파일 내용
version: '3'
services:
nginx:
image: nginx
deploy:
replicas: 2
resources:
limits:
cpus: '1'
memory: '32M'
placement:
constraints: [node.role != manager]
restart_policy:
condition: on-failure
max_attempts: 3
environment:
SERVICE_PORTS: 80
networks:
- web
proxy:
image: dockercloud/haproxy
depends_on:
- nginx
volumes:
- /var/run/docker.sock:/var/run/docker.sock
ports:
- 80:80
networks:
- web
deploy:
mode: global
placement:
constraints: [node.role == manager]
networks:
web:
external: true
나) docker stack service web을 통한 서비스 상태 확인
다) 웹 페이지 접속 화면
다. Auto Scaling 구현
1) 개요
Docker stack으로 배포한 web 서비스 컨테이너의 cpu 사용률을 반복적으로 확인하고, 임계치 이상 사용중이면 컨테이너 수를 증가시키고, 임계치 이하로 떨어지게 되면 기본 배포수인 2개의 컨테이너를 배포한다. 해당 스크립트는 web으로 시작하는 컨테이너이름을 인식하기 때문에 반드시 web 이라는 이름으로 컨테이너를 배포 해야 한다.
2) 구성 확인
가) 스크립트 구동 Process
나) Scale.sh 내용(Auto-scale 쉘 스크립트)
#!/bin/bash
while true
do
clear
# 노드의 web 컨테이너 리소스 가져오기, container-name:cpu use(percent)
# sshpass로 워커노드의 docker stats를 불러오는 방식이기 때문에 각 서버의 ssh 접속 정보를 입력해야 함
sshpass -p {ssh-password} ssh root@{worker1-ip} 'docker stats -a --no-stream --format ":" | sed 's/..$//' | grep web' > test.txt && sshpass -p {ssh-password} ssh root@{worker2-ip} 'docker stats -a --no-stream --format ":" | sed 's/..$//' | grep web' >> test.txt
# tot에 web컨테이너 개수 저장
tot=$(cat test.txt | grep "web" | wc -w)
# scale 필요 시 1, pass 시 0
check=0
echo "==============SCALE CHECK=============="
# test.txt에 있는 리소스 값으로 scale 지정
for list in `cat test.txt`
do
#scale cpu 기준 값
max=10
#한 줄씩 컨테이너 이름, cpu 리소스 불러오기
cont_name=$(echo $list | cut -d":" -f1)
used_cpu=$(echo $list | cut -d":" -f2)
#소수점 제거 후 max와 비교
for rounded_used_cpu in $(printf %.0f $used_cpu);do
if [ "$rounded_used_cpu" -gt "$max" ]; then
# 70 초과인 경우
check=1
echo $(echo $cont_name | cut -c 1-15)" CPU USE: "$rounded_used_cpu"%"
else
# 70 이하인 경우
echo $(echo $cont_name | cut -c 1-15)" CPU USE: "$rounded_used_cpu"%"
fi
done
done
echo "- - - - - - - - - - - - - "
# scale 이 필요한 경우
if [ $check -eq 1 ]; then
if [ $tot -ge 10 ]; then
echo "🔴 컨테이너가 10개 이상입니다. scale out을 하지 않습니다."
else
echo "🟠 scal out을 진행합니다."
docker service scale web_nginx=$(expr $tot + 1)
fi
elif [ $tot -eq 2 ]; then
echo "🟢 정상입니다."
else
echo "🟡 scal in을 진행합니다."
docker service scale web_nginx=2
fi
echo "======================================="
sleep 5
done
다) Scale.sh 실행 결과
컨테이너 CPU의 부하는 Stress 패키지를 사용하여 증가 시켰고, 컨테이너의 CPU 상태에 따른 Scale 변화는 아래와 같다.
(1) 컨테이너의 평균 CPU 사용률이 70% 미만인 경우 현재 배포된 모든 web 컨테이너의 상세 이름과 CPU 사용량을 표시하고, 아무런 행위를 하지 않는다.
(2) 컨테이너의 평균 CPU 사용률이 70% 이상인 경우 아래 사진과 같이 web_nginx2… 컨테이너의 CPU 사용률이 100%인 것과 Scale out을 진행하여 3개의 컨테이너를 배포하는 것을 확인할 수 있다.
(3) 배포된 컨테이너가 10개를 초과한 경우 무한적인 Scale out을 방지하기 위해 최대 10개의 컨테이너만 배포하도록 적용했다. 아래와 같이 Scale out을 계속 진행하여 컨테이너 개수가 10개에 도달했기 때문에 더이상 Scale out을 진행하지 않는다.
(4) 컨테이너의 평균 CPU 사용률이 70% 미만인 경우 web 컨테이너 기본 배포 개수인 2개로 Scale in을 진행한다.
라. Monitoring Service
1) 개요
Prometheus + Grafana를 Manager노드에 구성하고 cAdvisor를 Worker노드에 구성하여 컨테이너 리소스 모니터링 서비스를 구현하였다. 아래 사진을 살펴보면 Scale out을 진행하며 점진적으로 컨테이너 cpu 사용률이 줄어드는 것을 확인할 수 있다.
2) 구성확인
'클라우드' 카테고리의 다른 글
[k8s] Deployment (0) | 2023.03.08 |
---|---|
[k8s]Replication Controller & Replicaset (0) | 2023.03.08 |
[k8s] Kubectl 명령어 자동완성 설정하기 (0) | 2023.03.08 |
[k8s] 클러스터 구성하기 (0) | 2023.03.08 |
[k8s]쿠버네티스 시작하기 (0) | 2023.03.08 |