Docker Swarm 써 보기

요즘 Kubernetes를 많이 들어본다

Kubernetes란 Docker 같은 컨테이너를 종합적으로 관리해 주는 것인데 이게 요긴하게 쓰인다고 한다.

근데 Kubernetes는 너무 어렵다.

그래서 Docker Compose를 쓰던 나는 이것에 익숙한 Docker Swarm이란걸 써 보기로 했다.

우선 3개의 가상머신에 우분투 서버를 설치해 줬다.

2개는 서버 컴퓨터에 1개는 시놀로지에 깔았다.

우선 Docker Swarm이 사용할 공유 스토리지를 만들어 줘야 한다.

Ceph 가 그 중에 하나인데 우분투에서 지원하며 설정하기 편한 microceph를 사용해 보겠다.

우선 각각의 VM에 microceph를 설치해 준다

sudo snap install microceph

그 다음 마스터가 될 컴퓨터에 클러스터를 만들어 준다.

sudo microceph cluster bootstrap

그 다음에 새로운 노드를 추가할 준비를 한다.

sudo microceph cluster add cm-server-2

cm-server-2 자리에 원하는 이름으로 넣어주면 된다.

그러면 토큰 값이 나오는데 그 토큰 값을 가지고 다음 명령어를 추가할 컴퓨터에서 실행한다.

sudo microceph cluster join <토큰값>

그 다음에 각각의 컴퓨터에 저장소로 사용할 빈 공간이 필요하다. 이 빈공간을 ceph 스토리지에 추가해 준다.

나는 우분투 설치할 때 15기가 짜리 볼륨을 만들어 두었다. 그걸 사용하겠다.

sudo microceph disk add /dev/mapper/ubuntu--vg-data--lv --wipe

이제 모든 노드가 추가 되었는지 확인한다.

sudo microceph status

위 명령어를 실행했을 때 추가한 노드가 다 생기면 정상이고

sudo ceph status

위 명령어를 실행했을 때 HEALTH_OK가 뜨면 정상이다.

이제 만든 이 스토리지에 풀을 만들고 마운트를 해 줄것이다.

우선 메인 컴퓨터에 와서 풀 부터 만들어 준다.

sudo ceph osd pool create cephfs_meta
sudo ceph osd pool create cephfs_data

이제 CepfFS 공유폴더를 만들어 준다.

sudo ceph fs new <공유폴더이름> cephfs_meta cephfs_data
sudo ceph osd pool set cephfs_data bulk true

아래 명령어를 입력했을때 추가한 공유폴더가 보여야 한다.

sudo ceph fs ls

이제 만든 공유폴더를 마운트 해 줄것이다.

각각의 컴퓨터에서 설정해 주어야 한다.

우선 ceph-common 패키지를 설치해 줄것이다

sudo apt install ceph-common

그다음에 ceph-common과 snap의 ceph를 연결해 줄것이다.

sudo ln -s /var/snap/microceph/current/conf/ceph.keyring /etc/ceph/ceph.keyring
sudo ln -s /var/snap/microceph/current/conf/ceph.conf /etc/ceph/ceph.conf

이제 마운트할 폴더를 만들고 마운트 해 주면 된다.

sudo mkdir /mnt/data
sudo mount -t ceph :/ /mnt/data/ -o name=admin,fs=<공유폴더이름>

이제 임시로 파일을 만들어 주면 모든 컴퓨터에 파일이 똑같이 생기는 걸 볼 수 있다.

sudo dd if=/dev/zero of=/mnt/data/random.img count=1 bs=50M

이제 자동 마운트를 설정해 줄 것이다.

보통은 /etc/fstab 파일을 수정하는데 이러면 종종 오류가 발생하므로 microceph가 실행된 후에 마운트하도록 서비스로 만들어 줄 것이다.

다음 명령어를 써서 서비스 파일을 만들어준다.

sudo nano /etc/systemd/system/mount-data.service

파일 안에 다음 내용을 넣어주고 저장한다.

[Unit]
Description=Mount CephFS after MicroCeph is loaded
After=snap.microceph.daemon.service network-online.target
Requires=snap.microceph.daemon.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/mount -t ceph :/ /mnt/data -o name=admin,fs=<공유폴더이름>
ExecStop=/bin/umount /mnt/data

[Install]
WantedBy=multi-user.target

그다음 이 서비스를 시작시에 실행하도록 한다.

sudo systemctl enable mount-data.service

이제 공유 스토리지는 다 만들었으며 이제 본격적으로 Docker Swarm을 설정할 것이다.

우선 모든 컴퓨터에 docker 부터 설치해 준다.

sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -a -G docker $USER

그 다음에 메인 컴퓨터에서 Swarm을 활성화 해 준다.

docker swarm init

이렇게 하면 노드를 추가할 수 있는 토큰이 나오지만 나는 한쪽이 죽어도 살릴 수 있는 매니저 노드를 추가할 것이다.

다음 명령어를 사용해 토큰을 발급해 준다.

docker swarm join-token manager

이제 여기서 나온 명령어(토큰값)를 가지고 나머지 컴퓨터에 실행해 준다.

docker swarm join --token <토큰값>

이러면 Docker Swarm의 설정은 끝이 났고 이제 관리하게 편하게 Portainer를 설치해 줄 것이다.

다음 명령어를 실행해 Portainer 설정을 다운 받는다.

curl -L https://downloads.portainer.io/ce-lts/portainer-agent-stack.yml -o portainer-agent-stack.yml

나는 Dokcer 볼륨을 안 쓰고 아까 만든 공유 스토리지를 쓸 것이기에 파일을 수정해 줄 것이다.

version: '3.2'

services:
  agent:
    image: portainer/agent:lts
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    networks:
      - agent_network
    deploy:
      mode: global
      placement:
        constraints: [node.platform.os == linux]

  portainer:
    image: portainer/portainer-ce:lts
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    ports:
      - "9443:9443"
      - "9000:9000"
      - "8000:8000"
    volumes:
      - /mnt/data/portainer/data:/data
    networks:
      - agent_network
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.role == manager]

networks:
  agent_network:
    driver: overlay
    attachable: true

Portainer 볼륨을 없애고 data를 아까만든 CephFS 스토리지에 저장하게끔 했다.

그리고 이제 아래 명령어를 실행해 주면 된다.

docker stack deploy -c portainer-agent-stack.yml portainer

그러면 이제 모든 설치가 끝났다.

이제 추가한 노드들 중의 하나의 ip 주소로 접속하면 Portainer 설정 페이지를 볼 수 있다

https://192.168.10.101:9443

셋 중의 하나가 죽으면 그 IP로는 접속을 못하기 때문에 이제 가상IP 설정을 해서 고정된 IP로 접속할 수 있게 해야 한다

그래서 나는 keepalived를 사용할 것이다.

우선 모든 노드에 keepalived를 설치해 준다

sudo apt install keepalived

그다음에 /etc/keepalived/keepalived.conf 파일만들어 준다

global_defs {
   notification_email {
     [email protected]
   }
   router_id SWARM_HA
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens18
    virtual_router_id 51
    priority 200
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass your-password
    }
    virtual_ipaddress {
        192.168.10.5
    }
}

virtual_server_group ALL_PORTS {
    192.168.10.5 1-65535
}

virtual_server 192.168.10.5 1-65535 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.10.101 1-65535 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.10.104 1-65535 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.10.51 1-65535 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

위에서 파란색으로 칠한 부분을 자신의 상황에 맞게 수정하면 되겠다.

이제 설정한 가상 IP로 접속하면 어느 노드가 죽어도 Docker Swarm에 접속할 수 있다.

Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다