Docker Toy Project

LEE EUI JOO·2022년 12월 25일
0

Project

목록 보기
1/3
post-thumbnail

💻 Docker Toy Project


  • 프로젝트 구상도


1. 프로젝트 소개


  • 프로젝트 제목 : 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 개발환경의 안정성을 높여 보고 싶었다.


2. 프로젝트 주요 기능


  • AWS RDS 콘솔의 Cloud Watch DB 를 통한 모니터링 기능

  • 시나리오를 통한 고가용성 (HA) 테스트

  • Portainer 를 통한 컨테이너 모니터링

  • 각 서비스들이 소통할 Overlay Network 생성


3. 프로젝트 구현


1. Ubuntu 20.04.5 운영 체제 기반의 Virtual Machine 3개 생성

  • 스펙
    RAM : 2GB
    Core : 2 core
    Image : Ubuntu - 20.04.5
    Network : Nat
  • IP
    - Manager : 211.183.3.100
    - Worker1 : 211.183.3.110
    - Worker2 : 211.183.3.120


2. Docker Swarm Init

컨테이너 오케스트레이션을 위해 Docker Swarm 토큰을 발행하여 worker 노드들에게 docker swarm 에 참여 시킨다

  • Manager Node

  • Worker 1 Node

  • Worker 2 Node

  • Docker Node 리스트


3. Overlay Network 구성

  • traefik-net 이라는 이름의 Overlay Network 생성


4. Docker Stack Deploy Portainer

컨테이너 모니터링을 위하여 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

  • Docker compose file 1 을 기반으로 하여 Deploy 한다.

  • 211.183.3.100:9000 으로 접속했을 때, portainer 에 접속 가능하다

  • local 의 현재 running 중인 컨테이너, 서비스, 컨테이너 이미지, 네트워크 등을 볼 수 있다.

  • 이전에 portainer 서비스를 Stack Deploy 했기 때문에 정상적으로 stack 이 올라와 있다.


5. AWS 콘솔에 접속해 AWS 에서 제공하는 RDS 기반의 Data Base 생성

  • Maria DB 엔진 선택


  • 프리티어 선택


  • DB name, DB master name, DB password 설정


  • 인스턴스 - db.t3.micro
  • 스토리지 - 범용 SSD / 20GB


  • 퍼블릭 액세스가 가능해야 Wordpress 웹어플리케이션의 Data base 로 사용이 가능하다


  • 데이터 베이스의 인증은 암호 인증으로 진행한다.


  • 정상적으로 Data base 가 생성되었다.
    데이터 베이스 설정에서 보안 그룹 규칙(Rule) 을 수정한다.


  • Inbound Rule 수정


  • Outbound Rule 수정


  • 이제 생성된 RDS data base 의 End Point 를 기록해둔다. 앤드포인트와 포트는 나중에 Wordpress 웹어플리케이션 Docker-compose 파일의 Data base HOST & PORT 가 된다.


6. Word Press 웹 어플리케이션과 Data base 를 Connect

Wordpress 웹 어플리케이션은 Worker 1, Worker 2 노드들이 담당할 것이며, Docker-compose 파일을 작성하여 Wordpress 를 stack deploy 할것이다.

RDS 데이터 베이스를 생성하였지만, 아직 RDS 데이터베이스 내의 Data base 를 생성하진 않았다.

maria db 컨테이너를 하나 띄어서 RDS 계정으로 접속해 data base를 생성할 수도 있지만, MySQL Workbench 에 RDS 데이터베이스를 연결해 data base를 생성해 볼 것이다.


  • My SQL Workbench 로 접속해 RDS database 와 연결

  • wordpress 라는 이름의 data base를 생성

  • 이제 docker-compose2.yml 파일을 작성해 wordpress 웹어플리케이션을 db 연동 과 더불어 worker1,2 노드에 deploy 한다.

< 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

  • Stack Deploy


  • Portainer

  • Docker stack ps wp


정상적으로 배포가 완료된 것을 확인

  • Worker Node 1

  • Worker Node 2


7. 고가용성(HA) 시나리오


시나리오 1 - 현재 노드의 상태에서 worker 1 에서 유지 보수 할일이 생겼다


  • worker 1 유지 보수 모드(drain) 진입
root@manager:/hybrid# docker node update --availability drain worker1
worker1
  • node 상태 확인

  • Stack wp 확인

worker 1이 하던 task 를 worker 2가 대신 task 를 수행하고 있는 것을 확인할 수 있음.

  • 유지보수를 끝내고 Worker 1 을 drain 모드에서 active 모드로 바꾼다
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   [==================================================>] 
  • 정상적으로 worker1 에도 task가 분배되었다


시나리오 2 - 부서는 Docker Swarm 의 고가용성 환경 지침에 따라 Manager 가 3개 이상으로 되길 원한다.


현재 상태는 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
                           
  • 골고루 task 가 분배되어 있다

  • worker node 1, 2 를 신분상승 시킨다
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 노드가 shutdown 이 되었는데 task 가 node를 기다리지 않고 다른 노드인 worker1 이 manager node 의 일을 대신하고 있다.

  • 하지만, 이상한 점은 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 과정에서 오류가 발생해 아쉬운점이 있다.


시연영상 너튜브 링크

profile
무럭무럭 자라볼까

0개의 댓글