- 도커스웜
- 도커스웜 컨테이너
- Cluster 기능을 컨테이너로써 제공.
- (Cluster 각 서버를 조율하는) '분산 코디네이터'를 외부에 별도로 설치해야함.
- (Cluster 각 서버를 제어하는) '에이전트'는 컨테이너로써 제공.
- 여러대의 도커서버를 하나의 지점에서 사용하도록하는... 단일 접근점... 으로써의 기능.
- 도커 스웜모드으로 통합될지도 모름... 레거시 같은 상황...
- 도커 스웜모드
- 도커 자체적으로도 Cluster 기능 제공.
- ('분산 코디네이터' 및 '에이전트' 모두 제공)
- (새로운 서버나 컨테이너 디스커버링)
- (노드에 스케줄 및 로드밸런싱)
- (HA 등등)
- Manager 및 Worker 노드로 구성
- (Manager노드는 홀수개를 유지하는것이 좋고, 그중 하나가 Leader으로 선출 됨)
- ex) docker swarm init --advertise-addr 111.222.333.444
- Manager노드 서버에서 클러스터를 시작
- --advertise-addr : 해당 클러스터에 접근하기 위한 주소 (즉, Manager 서버 IP)
- ex) docker swarm join --token xxxxxx 111.222.333.444:2377
- 새로운 Worker노드를 클러스터에 참여
- (스웜 매니저 포트 == 2377 , 노드간 통신 == 7946 , ingress오버레이 == 4789)
- ex) docker node ls 으로 확인 가능. (docker info)
- ex) docker swarm join-token manager 혹은 worker 으로 참가토큰을 확인 가능.
- ex) docker swarm leave -> docker node rm {이름} 식으로... 특정 노드 제거 가능.
- Service
- 같은 이미지에서 생성된 "컨테이너 집합".
- 도커스웜 은 Service 단위로 제어를 하는것!
- Task
- Service 내에서 명령을 수행하는 '컨테이너'.
- 그냥 도커 컨테이너라고 생각하면 된다.
- 도커스웜 → Service 단위 → Task(컨터이너) 단위
- Manager노드 Scheduler에 의해, Service 단위로 설정한 replica만큼~ Task(컨테이너)에서 분산처리.
- (계속 실행이 되는 -detached 가능한 이미지를 사용 해야 함!)
- (하나의 클러스터으로 묶여!어떤 노드IP으로 접근하든... RR방식으로 Task에 리다이렉트 됨)
- ex) docker service create -name '이름' --replicas 복제수 -p 포트:포트 "이미지:태그"
- ex) docker service ls 으로 확인 가능. (docker serivce ps 이름)
- ex) docker service rm {이름} 으로 삭제 가능.
- 롤링 업데이트 제공
- 클러스터 내 replica만큼 분배되있는 Task(컨테이너)의 이미지를 무중단 재배포.
- (Service 생성시, --update-delay 및 --update-parallelism 및 --update-failure-action 등 옵션 제공)
- ex) docker service update --image "이미지:태그" '이름'
- global 서비스 모드
- 클러스터의 각각의 노드에 무조건 하나씩 Task(컨테이너)를 배치하는 모드.
- 클러스터의 각 노드를 모니터링 하는 등에 유용함.
- (물론 replica 서비스 모드가 디폴트)
- ex) docker service create --mode global ... (당연 replica는 지정할필요없음)
- 자동 fail-over 및 수동 rebalance
- 특정 Service에서 Task(컨테이너)가 정지 하거나, 노드가 다운되면~ 자동으로 fail-over 한다.
- 하지만, 노드 전체적으로 균등하게 분배되는것 아니라서~ 수동으로 rebalance 해줘야 한다.
- ex) docker service scale 서비스명=1 -> docker service scale 서비스명=3 (scale 명령으로 재균형)
- 오버레이 네트워크
- 클러스터의 여러게의 도커 데몬들을 -> 하나의 '네트워크 풀' 로 묶는 가상화 기술.
- 즉, 스웜에서만 유료한 하나의 내부망! (내부망이니, 각각에 Task들의 상호통신에 유용)
- ex) docker network ls (Manager노드에서 확인 가능.)
- ex) docker exe '컨테이너ID' ifconfig (각Task에서 확인 가능.)
-
- docker_gwbridge 브릿지 네트워크 드라이버
- 모든 'Overlay Network'가 외부로 나가는 종단점(VTEP).
- ingress 오버레이 네트워크 드라이버
- 기본적으로 모든 Task에 자동으로 생성됨. (swarm에서만 유효한 SCOPE)
- 당연히... 한 클러스터를 아우르는 기본적인 내부망 하나는 있어야 하는것!
- Routing-Mesh으로 사용됨. (모든 Task에 접근할수있도록 하여 RR로드벨런스가 될수있도록)
- `사용자정의` 오버레이 네트워크 드라이버
- 클러스터 내부적으로 별도의 망을 추가해야 할떄!
- 클러스터 아무노드에서나 생성하면, 전체노드에서 사용가능.
- ex) docker network create -d overlay {이름} --subnet 10.0.9.0/24
- ex) docker service create --network {사용자정의 오버레이}
- swarm에서만 유효한 SCOPE 이니... 일반적인 "docker run --net" 은 사용불가!
- 특별히 swarm외에서 사용하려면~ 꼭! --attachable 옵션써서 overlay를 만들어 함.
- docker_gwbridge 브릿지 네트워크 드라이버
- (참고적으로, docker service create 명령에서 -p 옵션을 사용하지 않으면,)
- (해당 Service는 외부로 노출 하지 않음)
- (즉, Task에 "오버레이 네트워크 드라이버"가 존재하지 않게 됨)
- 서비스 디스커버리
- Task(컨테이너)의 생성 및 삭제 를 자동감지 하도록 되어있음. (쥬키퍼같은 분산코디네이터 기능내장)
- Sevice간에 통신시, 같은 "오버레이 네트워크" 이면~ 'Sevice이름' 만으로 호출. (스웜DNS가 VIP로 변환)
- 추가 및 삭제된 Task(컨테이너)는... Sevice단 내부는 알아서 처리! 돈캐어! 그냥 잘 쓰면 됨!
- 볼륨
- 좋은예)
- 각각의 노드를 모두 잘 동기화 하기 어려우니, (NAS같은) "공통 퍼시스턴트 스토리지"를 사용하는것이 좋다.
- 도커 자체적으로 제공되는 기능은 아니니... 3rd 플러그인, nfs, dfs 등을 별로로 구성하면 됨.
- 일반예)
- 도커볼륨 사용 : docker service create --mount type=volume, source=myvol, target=/root ...
- bind볼륨 사용 : docker service create --mount type=bind, source=/root/host, target=/root/container ...
- (bind볼륨은 호스트의 디렉토리를 그대로 사용하는 것)
- 좋은예)
- 노드 Availability 변경
- ex) docker node update --availability {active|drain|pause}
- Active : 노드의 기본적인 활성 상태
- Drain : 해당 노드 중단. (기존 Task 이사 및 신규 Task 할당안함)
- Pause : 해당 노드 할당중지. (기존 Task는 유지 및 신규 Task만 할당안함)
- 노드 Label
- ... 이름표 와 제약설정 ...
- 도커 자체적으로도 Cluster 기능 제공.
- 도커스웜 컨테이너
-끝-
'DevOps' 카테고리의 다른 글
K8S 리소스 (0) | 2020.07.17 |
---|---|
Dockerfile (0) | 2020.07.09 |
Kubernetes 란? (0) | 2019.11.04 |
Docker 란? (0) | 2019.11.04 |
maven (0) | 2019.10.23 |