[Docker] Swarm Mode 클러스터 구성3- 네트워크, 볼륨, 가용성

Hoon·2022년 8월 25일
0

Docker

목록 보기
11/13
post-thumbnail

들어가기에 앞서 config, secret 복습

업데이트 관련
UpdateConfig:
Parallelism: 1 -> 1컨테이너/1 task 만 업데이트 하므로 하나 끝나고 또 다음 하나..
On failure: pause -> 업데이트 진행시 오류가 발생하면 중단된다.
continue 로 변경하면 오류가 발생하더라도 업데이트는 계속 진행
config/secret
-> 기존 명령에서 password 를 지정하거나 변수를 선언했던 것 처럼 하는것이 아니라 별도의 config 또는 secret 객체를 생성하고 이를 컨테이너에 적용하는 방식으로 운영하는 것
config -> 레지스트리 설정파일, 변수 선언, index.html 과 같은 보안성이 낮은 파일 자체
secret -> DB 패스워드, SSH Key(Public Key), 인증서

rapa@manager:~$ echo "test1234" | docker secret create testsecret -
6egmrya5bguf84mrxyrhnrcjx
rapa@manager:~$ docker secret ls
ID                          NAME         DRIVER    CREATED          UPDATED
6egmrya5bguf84mrxyrhnrcjx   testsecret             11 seconds ago   11 seconds ago
rapa@manager:~$ 
rapa@manager:~$ echo "HELLO ALL" > index.html
rapa@manager:~$ docker config create testconfig index.html
4t6pne4bpev5xoh0kdnx1iyit
rapa@manager:~$ docker config ls
ID                          NAME         CREATED          UPDATED
4t6pne4bpev5xoh0kdnx1iyit   testconfig   19 seconds ago   19 seconds ago
rapa@manager:~$ 
rapa@manager:~$ docker secret inspect testsecret
[
    {
        "ID": "6egmrya5bguf84mrxyrhnrcjx",
        "Version": {
            "Index": 1084
        },
        "CreatedAt": "2022-08-25T01:46:11.59250558Z",
        "UpdatedAt": "2022-08-25T01:46:11.59250558Z",
        "Spec": {
            "Name": "testsecret",
            "Labels": {}
        }
    }
]
rapa@manager:~$ docker config inspect testconfig
[
    {
        "ID": "4t6pne4bpev5xoh0kdnx1iyit",
        "Version": {
            "Index": 1085
        },
        "CreatedAt": "2022-08-25T01:47:08.534254336Z",
        "UpdatedAt": "2022-08-25T01:47:08.534254336Z",
        "Spec": {
            "Name": "testconfig",
            "Labels": {},
            "Data": "SEVMTE8gQUxMCg=="
        }
    }
]
rapa@manager:~$ 
rapa@manager:~$ echo "SEVMTE8gQUxMCg==" | base64 -d
HELLO ALL
rapa@manager:~$ 

secret 은 기본적으로 컨테이너의 /run/secrets 이라는 디렉토리 아래에 파일 형태로 보관된다. 또한 컨테이너내에서는 평문으로 보관된다.
[secret 확인]

docker service create --name sql --constraint node.role==worker --replicas 3 --secret source=testsecret,target=testsecret -e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/testsecret" -e MYSQL_DATABASE=testdb mysql:5.7
rapa@worker1:~$ docker container ls
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                 NAMES
5c428b465a0f   mysql:5.7      "docker-entrypoint.s…"   13 minutes ago   Up 13 minutes   3306/tcp, 33060/tcp   sql.3.n54caefnc631migodg95u0ser
rapa@worker1:~$ docker exec 5c428b465a0f ls /run/secrets -l
total 4
-r--r--r-- 1 root root 9 Aug 25 01:58 testsecret
rapa@worker1:~$ docker exec 5c428b465a0f cat /run/secrets/testsecret
test1234
rapa@worker1:~$ 
[config 확인]
rapa@manager:~$ docker service create --name nginx1 \
--replicas 3 --constraint node.role==worker \
-p 8003:80 \
--config source=testconfig,target=/usr/share/nginx/html/index.html \
nginx

http://211.183.3.X:8003 으로 웹접속을 시도하면 config 에 적용해 두었던 "HELLO ALL" 이 보여야 한다

도커 네트워크

docker service create --name test1 --mode global nginx
docker service create --name test2 -p 8001:80 --mode global nginx

docker container inspect 'id'하면 정보 나옴

  • test1 서비스에 속한 컨테이너 "IPAddress": "172.17.0.2" (-p 옵션 없음. docker0에 연걸됨)
  • test2 서비스에 속한 컨테이너 "IPAddress": "10.0.0.38" (-p 옵션 있음. ingress에 연결되있음.)
  • p 옵션이 없으면 클러스터에 배치된게아님
  • 추가적으로 overlay 네트워크를 생성한다. overlay 드라이버를 이용한 네트워크는 전 클러스터상에 동일한
    docker network create --subnet 20.20.20.0/24 -d overlay testoverlay: overlay network 생성
    docker service create --name test3 -p 8002:80 --network testoverlay --mode global nginx: 위에서 만든 overlay 네트워크를 사용해서 서비스 배포
  • 결과: IP 2개 생성됨. 기본적으로 p 옵션을 사용하면 ingress network에 연결되고 --network 설정으로 testoverlay network에도 연결 됌.
  • "IPAddress": "10.0.0.42"
  • "IPAddress": "20.20.20.3"

docker_gwbridge 역할: 외부와의 연결,
ingress는 클러스터를 만들어 gwbridge와 연결.
여기서 별도의 overlay network를 만들면 스웜 클러스터 상에서 통신이 되는 네트워크이고 외부와의 통신을 관여하는 것은 아니다. 외부와의 통신은 ingress가 관여한다. ingress에 보이지 않는 ip;vip가 있다.

docker container run으로 생성한 컨테이너는 --network myoverlay를 하면(클러스터 네트워크에 연결)하는 것이 불가능하다.
다음과 같이 overlay 네트워크를 생성할때 --attachable 을 부착하면 가능해진다.
docker network create -d overlay --attachable myoverlay2

volume 사용하기

docker container run ... -v testvolume:/var/lib/mysql: 볼륨마운트
docker container run ... -v /testdir:/var/www/html: 바인딩(NFS 사용)

  • 호스트의 볼륨을 사용할 경우
    1. 노드자체(호스트)에 문제가 있을 경우 볼륨 접근 불가
    2. 스케일의 축소/확장 등으로 인하여 신규 컨테이너가 기존 볼륨과 연결되지 않는 문제
    3. 각 호스트 별로 별도의 볼륨을 사용하므로 데이터의 동기화가 되지 않아 각 볼륨별로 별도의 데이터베이스가 동작하는 문제
  • 최종적으로 로컬 볼륨은 좋은 선택이 아니다. 외부에있는 스토리지를 사용해야 한다
  • 서비스 생성시 볼륨 생성을 동시에 진행할 수 있다. 단, 기존 컨테이너에서 -v 옵션을 이용하는 방법의 경우 volume, nfs 구분이 어려울 수 있으므로 서비스에서는 이를 명확히 구분해주어야 한다.
    • type=volume: volume
    • type=bind: nfs
    • docker service create --name testvol1 --mount type=volume,source=vol1,target=/root --replicas 1 --constraint node.role==manager nginx: volume과 마운트
    • 확인
    • nfs mount
rapa@manager:~$ mkdir testvol3
rapa@manager:~$ docker service create --name testvol3 --mount type=bind,source=/home/rapa/testvol3,target=/root --replicas 1 --constraint node.role==manager nginx
image nginx:latest could not be accessed on a registry to record
its digest. Each node will access nginx:latest independently,
possibly leading to different nodes running different
versions of the image.
tpxzvdb5vyoano82oocojcisq
overall progress: 1 out of 1 tasks 
1/1: running   
verify: Service converged 
  • mount 확인
rapa@manager:~$ ls testvol3/
rapa@manager:~$ touch testvol3/test_from_host.txt
rapa@manager:~$ docker exec 7c8881996d63 ls /root
test_from_host.txt

가용성

node AVAILABILITY

  • Active: 노드가 컨테이너를 동작시키고 생성할 수 있는 준비가 된 상태
  • drain: 컨테이너를 해당 노드에 배치시키지 않는다.
  • pause: 컨테이너를 해당 노드에 배치시키지 않는다. 컨테이너가 일시중지 된다.
    docker service create --name test1 --replicas 3 --constraint node.role==worker -p 8001:80 nginx

    docker node update --availability drain worker3: drain으로 상태 변경


    worker1에 컨테이너 2개 배치 됌.

    active로 상태를 바꿔도 worker3에 배치되지는 않는다. worker3에 배치하려면 scale을 줄인 후 늘리는 방법밖에 없다.

라벨 적용하기

기존의 node.role과 비슷하게 누드에 key:value 형식의 라벨을 부착하고 이를 기반으로 컨테이너를 배치하고자 할 때 활용된다.
노드 구분

  • node.role
  • node.id
  • node.hostname
  • 라벨은 여러 개 부착가능

0개의 댓글