[Docker] Swarm Mode 클러스터 구성1 - 예제, Manager-Worker 개념, 클러스터 구현

Hoon·2022년 8월 24일
0

Docker

목록 보기
9/13
post-thumbnail

들어가기전

  • (참고)웹 서비스 데몬의 위치
이미지웹 서비스 경로
httpd/usr/local/apache2/htdocs
nignx/usr/share/nginx/html
centos+httpd/var/www/html
ubuntu+nginx/var/www/html
ubuntu+httpd/var/www/html
  • python docker 설치
sudo apt -y install pip
pip install docker
rapa@manager:~$ which python3
/usr/bin/python3

간단 예제

example1)
vi ctn.py

import docker
client = docker.from_env()
print(client.containers.run("alpine", ["echo", "hello", "all"]))
chmod +x ctn.py # 실행 퍼미션 설정
./ctn.py
docker container ls

example2) nginx 컨테이너 실행
cp ctn.py ctn1.py

#!/usr/bin/python3
import docker
client = docker.from_env()
test = client.containers.run("nginx", detach=True)
print(test.id)

example3) for문으로 container list 출력

#!/usr/bin/python3
import docker
client = docker.from_env()
for ctn in client.containers.list():
    print(ctn.id)

결과

도커 스웜 모드 모니터링

도커스웜 모드 시각화 도구: 도커 스웜 모드 클러스터는 여러 호스트와 서비스를 처리하는 오케스트레이션 도구다. 따라서, 도커 스웜 명령을 통한 조회보다 시각적 피드백이 더욱 유용하다.

/var/run/docker.sock 에 도커 컨테이너에 관한 정보들이 저장되는데 이를, 각 컨테이너와 마운트 해서 모니터링 할 수 있게 한다.

docker container run -d --restart always -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --name portainer portainer/portainer

portainer 사용
9000번 포트로 들어가서 비밀번호 test1234, docker로 시작 설정

Docker swarm

환경 셋팅

manager(private-registry)CPURAMNIC(Vmnet10)
manager24211.183.3.100
worker122211.183.3.101
worker222211.183.3.102
worker322211.183.3.103

manger를 clone하여 worker node들을 생성한다.

  • ip설정
    sudo vi /etc/netplan/01-network-manager-all.yaml

    sodu netplan aplly#변경한 ip 적용
    ip a로 확인
  • 모든 노드의 /etc/hosts 아래에 다음 내용 추가
    211.183.3.100 manager
    211.183.3.101 worker1
    211.183.3.102 worker2
    211.183.3.103 worekr3
  • 모든 노드에서 동작중인 컨테이너 삭제
  • 모든 노드에서 시간을 확인하여 동일한 시간인지 여부 확인

Manager, Worker, MSA 개념

cluster 환경에서는 자원을 pool에 담아 하나의 자원(computing, network, storage)로 활용될 수 있다. 기능적으로 두 가지 기능이 호스트에 부여된다.

  • manager(master@k8s)
    • controller 역할 수행
    • worker의 기능 포함
    • 일반적으로 매니저는 컨테이너 배포에서 제외하고 주로 컨트롤, 관리, 모니터링 역할에 주력해야 한다.
  • worker(node@k8s): 컨트롤러로 부터 명령을 전달받고 이를 수행하는 역할
  • maneger, worker는 처음 클러스터 생성시 자동으로 node.role이 각 노드에 부여된다. 또는 추가적으로 label을 각 노드에 부여하여 컨테이너 배포시 활용할 수 있다.
  • 쿠버네티스의 master는 worker의 기능을 수행하지 않는다.

MSA(Micro Service Architecture)

  • 고도화를 위해 다수의 컨테이너나 VM을 이용하여 개발을 진행할 수 있다.
  • 개발 속도를 향상시키고 모듈 형식으로 기능을 구별하여 개발하므로 문제발생시 해당 컨테이너나 코드, VM만 확인하면 되므로 관리가 용이하다.
  • Scale out에 유리
  • 각 기능에서 언어를 지정하지 않으므로 필요한 언어를 선택하여 개발하면 된다.
  • 각 기능별 데이터는 API를 통해 주고 받으면 된다.

클러스터 환경 구현하기

  • 매니저 역할을 수행할 노드에서 토큰을 발행하고 워커는 해당 토큰을 이용하여 조인한다.

  • manager에서 token 생성 후 worker에서 조인

rapa@manager:~/0824$ docker swarm init --advertise-addr ens32
Swarm initialized: current node (084qs3331s62phkgh2vz3flq1) is now a manager.
To add a worker to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-4jgyfeymuhfupq79k318nnf614851htt4mmz47kak33zo83llu-a86jbfg4b4ltczikamxfr4fef 211.183.3.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
rapa@worker1:~$ docker swarm join --token SWMTKN-1-4jgyfeymuhfupq79k318nnf614851htt4mmz47kak33zo83llu-a86jbfg4b4ltczikamxfr4fef 211.183.3.100:2377
This node joined a swarm as a worker.
  • 결과
  • AVAILABILITY
    • Active: 컨테이너 생성이 가능한 상태
    • drain: 동작중인 모든 컨테이너가 종료되고 새로운 컨테이너를 생성할 수 없는 상태
    • pause: 새로운 컨테이너를 생성할 수는 없다. 하지만, drain과는 달리 기존 컨테이너가 종료되지는 않는다.
    • 유지보수를 위해 drain 또는 pause로 변경한다.

worker 관리

  • 처음 매니저가 토큰을 발행하면 manager 용, worker 용 토큰이 발행된다. worker 외에 추가로 manager를 두고 싶다면, 별도의 노드에서는 manager 용 토큰으로 스웜 클러스터에 join 한다.
  • 만약 manager가 한 개인 상태에서 해당 매니저가 다운된다면 전체 클러스터를 관리할 수 없으므로 실제 환경에서는 최소한 2대의 매니저를 두어야 한다.
    • 예) manger1(Leader), manager2, worker1, worker2
rapa@manager:~/0824$ docker swarm join-token worker
To add a worker to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-4jgyfeymuhfupq79k318nnf614851htt4mmz47kak33zo83llu-a86jbfg4b4ltczikamxfr4fef 211.183.3.100:2377
rapa@manager:~/0824$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-4jgyfeymuhfupq79k318nnf614851htt4mmz47kak33zo83llu-7153hz2kv4mmzkdubv0onzxho 211.183.3.100:2377
  • 만약 현재 상태에서 worker1을 manger로 변경하고 싶다면?
    • 등급을 올려준다. docker node promote worker1
    • 등급 올리기전
    • 등급 올린 후
    • worker1에서 node 상태 확인 가능해졌다. worker2에서는 확인 불가능
    • docker node demote worker1: worker1을 다시 worker로 내림
  • 각 노드에서 클러스터를 벗어나기
    • worker에서 leave, manager에서 rm
    • docker swarm leave <- worker에서 실행
    • manger에서 확인
    • docker node rm worker1 : manager에서 지워주면 끝

클러스터에 nginx 배포

  • 단일 노드에서는 컨테이너 단위로 배포
    • docker service create --name web --constraint node.role==worker --replicas 3 -p 80:80 nginx
    • docker service ls: 클러스터에 동작중인 서비스의 목록확인, 동작컨테이너 개수 / 요청 컨테이너 개수
    • docker service ps web: 각 컨테이너가 어떤 노드에서 동작중인가?
    • 결과
    • 컨테이너가 생성되지 않는 이유
      1. 이미지가 다운로드 되지 않은 상태에서 생성하려고 할 때
      2. 이미지 다운로드를 위한 인증정보가 없을 경우: 자원사용의 불균형이 발생할 수 있다. 즉, 현대의 노드에서 여러 컨테이너가 동작하고 몇 노드에서는 컨테이너 생성이 되지 않는 문제
    • 각 노드에 저장소 접근을 위한 인증정보가 config.json에 없다면 이를 해결하기 위해
      1. manager에서 로그인을 하고 config.json 정보를 일일이 각 노드의 config.json 에 붙여넣기 한다.
      2. manager에서 로그인을 하고 config.json 정보를 docker service create 시 넘겨준다. --with-registry-auth
    • [실습 상황]각 노드에 config.json 파일을 넘겨주지 않았는데 생긴이유
      1. manager노드를 클론하면서 worker 노드에 생긴 경우
      2. docker hub에서 IP를 확인하고 하루 100개 이하로 요청이 왔다면 인증정보를 준다.
  • scale 조정하기
    • docker service scale web=1
    • 이렇게해도 211.183.3.100~103 모두 접속 가능하다.
  • docker serivice rm web: 동작중인 서비스 삭제하기

0개의 댓글