프로젝트 제목 : AWS (RDS) + Docker Swram Cluster
프로젝트 기간 : 2022.12.22 ~ 2022.12.26
프로젝트 개요 : 외부 퍼블릭 클라우드 (AWS 의 RDS) 와 Docker Swarm Cluster 가 함께 동작하는 간단한 Hybrid Architecture 구현
프로젝트 주제 선정 이유 : 많은 애플리케이션은 데이터를 저장할 Database 가 필요하고, 쌓이는 자료를 위한 별도의 저장공간도 요구한다.
보통 Docker Swarm Node 들의 Manager Node 가 DB 컨테이너를 운영했지만, 이번엔 외부의 클라우드에 Data base 를 띄어 어느 서비스에서나 접근 할 수 있는 DB를 구현해 Docker Swarm 개발환경의 안정성을 높여 보고 싶었다.
AWS RDS 콘솔의 Cloud Watch DB 를 통한 모니터링 기능
시나리오를 통한 고가용성 (HA) 테스트
Portainer 를 통한 컨테이너 모니터링
각 서비스들이 소통할 Overlay Network 생성
컨테이너 오케스트레이션을 위해 Docker Swarm 토큰을 발행하여 worker 노드들에게 docker swarm 에 참여 시킨다
컨테이너 모니터링을 위하여 Docker Portainer 를 Manager Node에 제약조건을 걸어 서비스를 생성하고 port는 9000번으로 하여 외부로 노출 시킨다.
< docker-compose1.yml>
version: '3'
services:
portainer:
image: portainer/portainer
ports:
- 9000:9000
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
mode: global
placement:
constraints: [node.role == manager]
networks:
traefik-net:
external: true
Wordpress 웹 어플리케이션은 Worker 1, Worker 2 노드들이 담당할 것이며, Docker-compose 파일을 작성하여 Wordpress 를 stack deploy 할것이다.
RDS 데이터 베이스를 생성하였지만, 아직 RDS 데이터베이스 내의 Data base 를 생성하진 않았다.
maria db 컨테이너를 하나 띄어서 RDS 계정으로 접속해 data base를 생성할 수도 있지만, MySQL Workbench 에 RDS 데이터베이스를 연결해 data base를 생성해 볼 것이다.
< docker-compose2.yml>
version: "3"
services:
wp:
image: wordpress
deploy:
replicas: 3
placement:
constraints: [node.role != manager]
environment:
WORDPRESS_DB_HOST: "<RDS End Point>"
WORDPRESS_DB_USER: "<RDS Data Base USER>"
WORDPRESS_DB_PASSWORD: "<RDS Database Password>"
WORDPRESS_DB_NAME: "<Data base Name>"
ports:
- "1006:80"
networks:
- traefik-net
volumes:
-
networks:
traefik-net:
external: true
정상적으로 배포가 완료된 것을 확인
root@manager:/hybrid# docker node update --availability drain worker1
worker1
worker 1이 하던 task 를 worker 2가 대신 task 를 수행하고 있는 것을 확인할 수 있음.
root@manager:/hybrid# docker node update --availability active worker1
worker1
하지만, worker 1 을 다시 active mode 로 바꾼다고 해서 task 가 전환되지는 않는다.
다시 task 를 할당하고 싶다면 wordpress 서비스의 replicas를 늘리면 가능하다.
root@manager:/hybrid# docker service scale wp_wp=5 # replicas = 5
wp_wp scaled to 5
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
현재 상태는 wordpress 웹어플리케이션이 worker1,2 에서만 동작하기 때문에 모든 노드에서 동작이 가능하도록 이전의 wp stack 을 제거하고 docker-compose 파일의 수정을 거쳐 다시 wp를 stack deploy 한다.
<수정된 docker-compose2.yml 파일>
version: "3"
services:
wp:
image: wordpress
deploy:
replicas: 3
environment:
WORDPRESS_DB_HOST: "database.cv0mjqsao6wx.ap-northeast-2.rds.amazonaws.com:3306"
WORDPRESS_DB_USER: "leeeuijoo"
WORDPRESS_DB_PASSWORD: "dmlwn3232"
WORDPRESS_DB_NAME: "wordpress"
ports:
- "1006:80"
networks:
- traefik-net
networks:
traefik-net:
external: true
root@manager:/hybrid# docker node promote worker1
Node worker1 promoted to a manager in the swarm.
root@manager:/hybrid# docker node promote worker2
Node worker2 promoted to a manager in the swarm.
현재 Leader 인 Manager node인 VM 을 Suspend 시키고 worker1 Node 에서 node의 상태를 확인해본다.
worker2 가 Leader 의 권한을 부여 받았다.
하지만, 이상한 점은 Manager Node 의 CURRNET STATE 가 Running 인 상태이다
다시 Manager 노드를 Start 시켜 본다.
Reachable 상태로 전환됨을 확인할 수 있고
wp 서비스의 상태를 보면 Manager Node 의 CURRNET STATE 가 Shut Down 으로 완벽히 전환됐음을 볼 수 있다.
상황을 시나리오화 하고 각 노드들의 task 분배를 직접 확인하면서 Docker Swarm 의 똑똑한 기능을 증명해 볼 수 있었던 좋은 기회를 제공한 프로젝트 였고 적절한 환경변수로 외부 클라우드와의 연결도 가능하다는 것을 이해할 수 있었다.
하지만 기능적인 측면의 아쉬운점은 wordpress 와 DB, 단 두개의 아키텍처로 구현해 아쉬운 부분이 있긴 하다.
또한, AWS 의 S3 Bucket 을 생성해 서비스들의 Volumes을 영구저장 해보고 싶었지만 docker plugin 으로 S3 bucket 과 연결은 됐으나 deploy 과정에서 오류가 발생해 아쉬운점이 있다.