Docker - Swarm 기본

최정환·2023년 12월 12일
0

Docker

목록 보기
8/8

Swarm은 여러 Docker 호스트를 하나의 논리적인 단위로 그룹화하여 컨테이너를 관리합니다.

이 개념으로 여러 호스트들을 관리하기 위해 update 같은 기능들을 이용해 컨테이너들의 이미지를 업데이트 하던가 워커 노드에서 매니저 노드로 승급 등 다양한 기능들이 있었습니다.

이제 컨테이너들간에 통신이 가능한 네트워크가 필요한 경우도 있습니다.
이를 위해 가상 네트워크(VIP)를 사용합니다.

Overlay Network

Overlay 네트워크는 Docker Swarm 클러스터 내의 다양한 노드에서 실행되는 컨테이너 간의 통신을 가능하게 하는 가상 네트워크입니다.

기능

서로 다른 노드에 있는 컨테이너들이 마치 같은 네트워크에 있는 것처럼 서로 통신할 수 있게 합니다.

암호화

필요에 따라 IPSec(AES) 암호화를 활성화하여 통신의 보안을 강화할 수 있습니다.

다중 네트워크 연결

컨테이너는 여러 Overlay 네트워크에 연결될 수 있으며, 이를 통해 서비스 간의 네트워크 격리를 구현할 수 있습니다.

Overlay 네트워크 생성

swarm 생성

docker swarm init

네트워크 생성

docker network create -d overlay font-end
docker network create -d overlay back-end

암호화

docker network create -d overlay --opt encrypted my_secure_overlay_network

사용자 정의 서브넷

docker network create -d overlay --subnet=10.0.9.0/24 my_custom_subnet_network

Overlay 네트워크 연결

새로운 컨테이너(서비스)를 생성하며 연결

docker service create --name my_font_service --network front-end nginx:latest

이미 존재하는 컨테이너에 Overlay 연결하기

docker network connect [network_name] [container_name] 

네트워크 확인

docker inspect [container_name]

일반적인 상황에선 서비스를 생성하거나 업데이트할 때 네트워크를 지정합니다.
서비스의 각 태스크는 자동으로 지정된 네트워크에 연결됩니다.

Routing Mesh

Docker Swarm 클러스터의 모든 노드에 걸쳐 인바운드 트래픽을 적절한 컨테이너로 라우팅하는 기능입니다.

로드 밸런싱

라우팅 메시는 상태 비저장(stateless) 로드 밸런싱을 제공하며, OSI Layer 3(TCP)에서 작동합니다.

동작 방식

단일 진입점(VIP)

Swarm 서비스가 생성되면, 해당 서비스는 Virtual IP(VIP)를 할당받습니다. 이 VIP는 서비스에 대한 단일 진입점으로 작동하며, 외부 요청은 이 VIP를 통해 서비스에 도달합니다.

내부 로드 밸런싱

Swarm 클러스터의 내부 로드 밸런서는 VIP를 통해 들어오는 요청을 서비스의 태스크 중 하나로 라우팅합니다. 이 과정은 자동으로 이루어지며, 사용자는 이를 별도로 구성할 필요가 없습니다.

노드 간의 트래픽 분산

요청은 클러스터 내의 어떤 노드로도 보낼 수 있으며, Swarm의 내부 로드 밸런서가 해당 요청을 실행 중인 태스크 중 하나로 자동으로 라우팅합니다.

인그레스 네트워킹

이 기능을 사용하여 인그레스 네트워크(외부로부터 들어오는 트래픽을 처리하는 네트워크)를 구성합니다. 인그레스 네트워크는 클러스터의 모든 노드에서 서비스의 공개 포트를 리스닝하고, 들어오는 요청을 적절한 컨테이너로 전달합니다.

고급 구성

Nginx 또는 HAProxy와 같은 외부 로드 밸런서를 사용하여 보다 고급 설정을 구현할 수 있습니다.

Stack

스택(Stacks)은 여러 서비스, 네트워크, 볼륨을 포함한 애플리케이션을 전체적으로 관리하는 데 사용되는 추상화된 단위입니다.

스택(Stacks)의 특징

선언적 배포

Compose 파일을 사용하여 서비스, 네트워크, 볼륨 등을 정의하고, 이를 기반으로 전체 애플리케이션 스택을 배포할 수 있습니다.

간편한 관리

스택을 사용하면 docker service create 명령을 사용하여 개별적으로 서비스를 관리하는 대신, 관련된 모든 리소스를 하나의 스택으로 관리할 수 있습니다.

네트워크 통합

스택은 각 스택별로 별도의 Overlay 네트워크를 관리할 수 있으며, 스택 이름은 네트워크 이름 앞에 자동으로 추가되어 이름 충돌을 방지합니다.

스택을 사용하면 Swarm 환경에서 복잡한 멀티-서비스 애플리케이션을 효율적으로 배포하고 운영할 수 있습니다. 스택은 여러 컨테이너화된 서비스들이 서로 연결되고 상호작용하는 더 큰 애플리케이션의 일부로 작동하도록 설계되었습니다.

Example

docker compose 파일을 사용해 swarm에서 스택을 정의하고 관리합니다.

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - webnet

  database:
    image: postgres:latest
    environment:
      POSTGRES_PASSWORD: mypassword
    networks:
      - dbnet

# compose 환경에선 bridge
# swarm 환경에선 overlay network
networks:
  webnet:
  dbnet:

volumes:
  dbdata:

docker docker-compose.yml이라는 파일을 compose 파일로 지정하고 stack을 배포하는데 사용합니다.

docker stack deploy -c docker-compose.yml myapp

Secrets Storage

시크릿 저장소(Secrets Storage) 기능은 민감한 데이터를 안전하게 저장하고 관리할 수 있게 해줍니다.
시크릿은 Docker Swarm 클러스터의 매니저 노드에 의해 암호화되어 저장되며, 해당 시크릿을 사용하도록 구성된 서비스에만 접근이 허용됩니다.

시크릿 저장소의 기능과 장점

암호화된 저장

시크릿은 Docker Swarm 클러스터에서 TLS 연결을 통해 전송되며, 매니저 노드에서 암호화되어 저장됩니다.

제한된 액세스

시크릿은 실행 중인 서비스의 컨테이너에서만 접근할 수 있으며, 서비스 정의에서 시크릿을 사용하도록 지정한 경우에만 해당 컨테이너에서 마운트됩니다.

임시 파일 시스템에 마운트

시크릿은 서비스 컨테이너 내의 임시 파일 시스템(in-memory file system)에 마운트되므로 디스크에 기록되지 않습니다.

자동 회전

시크릿의 변경이 필요한 경우, 새로운 시크릿을 업데이트하고 서비스를 재배포하여 시크릿을 갱신할 수 있습니다.

Example

secret 생성

파일로

docker secret create my_app_secrets my_secrets.env

my_secrets.env 파일을 my_app_secrets 라는 이름으로 저장합니다.
이 파일은 어떤 포맷이든 사용할 수 있습니다.

ex) json, yaml, .env ...

텍스트로

echo "my_secret_data" | docker secret create my_app_secrets -

마지막에 위치한 -는 표준 입력(stdin)으로부터 데이터를 읽어서 시크릿을 생성하라는 의미입니다. 쉘에서 파이프(|)를 사용할 때, -는 표준 입력으로부터 전달된 데이터를 사용하라는 Docker 명령어의 일반적인 표기법입니다.

secret 사용

version: '3.8'
services:
  my_service:
    image: my_service_image
    secrets:
      - my_app_secrets

secrets:
  my_app_secrets:
    external: true

0개의 댓글