목차
1. 컨테이너 분산 오케스트레이션
2. 도커 스웜 모드의 노드
3. 도커 서비스
4. 도커 스웜 네트워크
5. 서비스 디스커버리
6. 볼륨
7. 스케줄링 전략
컨테이너 분산 오케스트레이션
도커 스웜은 도커의 클러스터링 기능을 제공하여 여러 대의 호스트를 하나의 가상 컴퓨터로 관리할 수 있습니다. 도커 컨테이너를 분산 처리하여 안정적인 서비스 제공을 가능하게 합니다. 따라서, 대규모 애플리케이션 개발 및 운영에 적합합니다. + 쉽게 스케일 아웃 가능!!
도커 스웜 모드의 노드
도커 스웜 모드의 구조
매니저와 워커 노드로 구성된다. 둘다 도커 서버이기 때문에 컨테이너를 생성할 수 있다. 용도는 다르다.
- 매니저 : 워커 노드 관리
- 리더 매니저 : 모든 매니저 동기화 및 관리, 다운되면 새로 선출됨
- 워커 : 생성된 실제 컨테이너가 동작
매니저는 노드 관리의 책임이 있으므로 반드시 1개 이상 있어야 한다. 또 장애가 발생했을 때를 대비해 매니저 노드를 다중화하고, 파티셔닝을 대비해 홀수 개의 클러스터로 구성한다.
스웜에 노드 할당하기
스웜에 참여할 노드들을 등록해야 한다. 스웜을 최초로 만든 노드가 매니저고, 매니저가 발급한 토큰을 사용해 워커에서 스웜에 참여한다. 매니저도 토큰으로 새로 등록할 수 있다.
✅ 스웜 생성(매니저)
스웜을 생성하는 노드가 매니저가 된다.
docker swarm init --advertise-addr xxx.xx.x.xx
Swarm initialized: current node (rz6370r7f21iyyupp06daid6s) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-########### xxx.xx.x.xx:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
→ 매니저 노드는 2327번 포트를 쓰는구나~
✅ 워커 추가
스웜 생성 결과로 받은 토큰 포함 명령어를 워커 노드에서 입력한다.
docker swarm join --token SWMTKN-1-########### xxx.xx.x.xx:2377
마스터에서 docker node ls 명령어로 추가된 워커 노드를 확인한다.
✅ 매니저 추가
docekr swarm join-token manager
매니저 노드 조인을 위한 토큰 포함 join 명령어를 준다. 새로운 노드에서 이 명령어를 실행하면 추가됨!
✅ 토큰 갱신
매니저 토큰은 보안상 정기적으로 바꿔주면 좋다.
docker swarm join-token rotate --manager
✅ 워커 삭제
워커 노드에서 : docker swam leave
마스터 노드에서 : docker node rm 다운된워커이름
✅ 매니저 삭제
당연히 한개일때는 안됨..
docker swarm leave --force
✅ 워커, 매니저 전환
매니저에서 실행
- 워커 → 매니저 : docker node promote swarm-worker1
- 매니저 → 워커 : docker node demote swarm-worker1
- 매니저 한개일 때는 사용할 수 없음
- 리드 노드가 demote되면 새로운 리더 선출
도커 서비스
스웜 모드의 제어 단위인 서비스를 알아보자!
도커 서비스 용어 정리
- 서비스 : 스웜 모드의 제어 단위, 동일한 이미지에서 생성된 컨테이너의 집합
- 태스크 : 서비스 내의 컨테이너, 노드에 할당된다.
- 스웜 스케줄러 : 컨테이너를 노드에 할당하는 역할
- 클러스터 : 매니저와 워커로 구성된 노드 집합
- 레플리카 : 스케줄러에 의해 함께 생성된 태스크
레플리카는 서비스에 설정된 레플리카 수만큼의 컨테이너가 스웜 클러스터 안에 존재하야 한다. 만약 컨테이너가 다운되거나 정지된 상태라면 새로운 컨테이너를 클러스터에 생성한다.
→ 종합 : 하나의 이미지로 생성된 여러 컨테이너를 여러 노드에 분산해서 실행시키고 싶다! 성능 때문에 최소로 유지해야하는 컨테이너 개수가 있는데, 관리 귀찮으니 자동화하자. 할당은 스웜 스케줄러가 해준다.
도커 서비스 생성
서비스 제어 명령어는 전부 매니저 노드에서 실행한다.
- 서비스 생성 : docker service create --name myweb --replicas 2 -p 80:80 nginx
- 서비스 스케일 아웃 : docker service scale myweb=4
- 서비스 삭제 : docker service rm myweb (상태 상관없이 바로 삭제)
글로벌 모드
보통 사용되는 스웜은 복제 모드다. 레플리카 수 만큼 컨테이너를 생성한다. 반면 글로벌 모드는 모든 노드에 컨테이너를 반드시 하나씩 생성한다. 스웜 클러스터를 모니터링하기 위한 에이전트 컨테이너를 생성할 때 유용하다.
글로벌 모드로 서비스 생성 : docker service create --name global_web --mode global nginx
장애 복구
컨테이너가 정지하거나 노드가 다운됐는데 레플리카 수를 만족하지 못한다면 새로운 컨테이너를 생성해 자동으로 복구한다. 새로운 컨테이너가 어느 노드에 할당될지는 스케줄러가 결정하며, 죽은 노드가 다시 복구되어도 새로 만들어진 컨테이너가 옮겨지지는 않는다.
롤링 업데이트
롤링 업데이트는 클러스터 설정이나 데이터 변경사항을 클러스터 안의 전체 노드와 컨테이너에 무중단으로 적용하기 위한 방법이다. 서버나 컨테이너를 하나씩 업데이트해서 실행 가능한 노드를 남겨둘 수 있다. 설정을 변경하고 ps 찍어보면 \_가 붙어있는 컨테이너들이 있는데, 동작을 멈춘 컨테이너를 말한다. 롤링 업데이트로 인해서 삭제된 컨테이너다.
롤링 업데이트 설정을 지정해서 서비스를 만들 수 있다.
docker service create \\
--replicas 4 \\ # 컨테이너 최소 개수
--name myweb3 \\
--update-delay 10s \\ # 업데이트 주기
--update-parallelism 2 \\ # 동시에 업데이트 진행할 컨테이너 수
nginx:1.10
컨테이너에 설정 정보 공유
설정 정보 공유 방법 비교
- 이미지 내부에 박기 : 변경 어려움, 확장성 떨어짐
- 볼륨 공유 : 뒤에 나오는데, 모든 호스트에 볼륨 두는 것은 비효율적이고 보안성 나쁨
- 스웜이 제공하는 secret과 config : 스웜에선 이거 쓰자!
스웜이 제공하는 설정 정보 공유 기능
- secret : 보안에 민감한 데이터 전송 → 컨테이너 /run/secrets/에 마운트됨
- config : 암호화할 필요가 없는 설정값 전송 → 컨테이너 /etc/docker/registry/config.yml에 복사됨
- 주의할 것 : 애플리케이션 개발할 때 각종 설정 변수를 파일로부터 동적으로 읽어올 수 있도록 설계해야함
# secret 만들기
cat pw.txt | docker secret create my_sql_password -
# secret 확인
docker secret ls
# secret 설정값 공유
docker service create \\
--name mysql \\
--replicas 1 \\
--secret source=my_mysq1_password, target=mysql_root_password \\
--secret source=my_mysq-_password, target=mysq__password \\
-e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" \\
-e MYSQL_PASSWORD_FILE="/run/secrets/mysql_password" \\
-e MYSQL_DATABASE="wordpress" \\
mysq1:5.7
# config 만들기
docker config create registry-config config.yml
# config 확인 - base64로 인코딩된 내용
docker config ls
# config 설정값 공유
docker service create --name yml_registry -p 5000:5000 \\
--config source=registry-config,target=/etc/docker/registry/config.yml \\
registry:2.6
도커 스웜 네트워크
분산 환경이니까 노드와 노드 간의 네트워크, 노드와 내부의 컨테이너를 연결하는 네트워크가 필요하다.
Ingress Network
- 라우팅 메시 : 외부에서 어떤 스웜 노드에 접근하더라도 서비스 안의 컨테이너에 접근할 수 있게 설정한다. ingress 네트워크가 설정한다.
- 로드밸런싱 : 서비스 내의 컨테이너에 대한 접근을 라운드 로빈 방식으로 분산한다.
- 접근 시나리오 : 사용자1이 특정 스웜 노드에 접근하면 라우팅에 의해 컨테이너에 접근한다. 직후에 사용자2가 스웜 노드에 접근하면 그 다음 컨테이너에 접근한다. 이때 선택되는 컨테이너는 노드와는 상관 없다. 접근한 노드의 컨테이너가 선택될 수도 있고 다른 노드 컨테이너가 선택될 수도 있다.
'Cloud > Docker' 카테고리의 다른 글
도커 컴포즈 (0) | 2023.04.22 |
---|---|
도커 데몬 (0) | 2023.04.22 |
Dockerfile (1) | 2023.04.22 |
도커 이미지 (0) | 2023.04.22 |
컨테이너 로깅, 컨테이너 자원 할당 제한 (0) | 2023.04.22 |