요즘 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에 접속할 수 있다.
답글 남기기