[클라우드/Docker 기본(18) - Docker Swarm Mode(3) : 클러스터 네트워크]

SooYeon Yeon·2022년 9월 13일
0

클라우드 Docker

목록 보기
19/24

클러스터에서의 네트워크

rapa@manager:~/0824$ docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
557f0603f760   bridge            bridge    local
**#** 스웜에서 오버레이 네트워크 사용. 외부로 나가는 통신 및 오버레이 네트워크 트래픽의 종단 점 역할 #
**7fccabc7204a   docker_gwbridge   bridge    local # 각 호스트에서만 영향을 미침**
3ead376f089f   host              host      local
**# 로드밸런싱과 라우팅 메시에 사용되며 서비스 내의 컨테이너에 대한 접근을 라운드 로빈 방시으로 분산하는 로드밸런싱을 담당 #**
**iq8afj4dexmr   ingress           overlay   swarm # 클러스터 전체에 하나의 네트워크로 동작**
39430d1f4412   none              null      local

7fccabc7204a docker_gwbridge bridge local

  • 각 호스트에서만 영향을 미침
  • 스웜에서 오버레이 네트워크 사용. 외부로 나가는 통신 및 오버레이 네트워크 트래픽의 종단 점 역할

iq8afj4dexmr ingress overlay swarm

  • 클러스터 전체에 하나의 네트워크로 동작
  • 로드밸런싱과 라우팅 메시에 사용되며 서비스 내의 컨테이너에 대한 접근을 라운드 로빈 방시으로 분산하는 로드밸런싱을 담당

서비스 생성시 별도의 네트워크를 지정하지 않은 경우 클러스터 환경에서는 ingress 네트워크에 컨테이너가 연결되고, ingress에서 제공하는 dhcp 기능을 통해 주소를 동적으로 할당 받는다.

docker service create --name test1 --replicas 3 --constraint node.role!=manager -p 80:80 nginx
rapa@manager:~$ docker service inspect test1 --pretty

...
UpdateConfig:
 Parallelism:	1
 On failure:	pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
...

업데이트 관련

UpdateConfig:

Parallelism: 1 → 1컨테이너/1 task만 업데이트 하므로 하나 끝나고 또 다음 하나 ..

On failure: pause → 업데이트 진행 시 오류가 발생하면 중단된다. continue로 변경하면 오류가 발생하더라도

실제 환경에서는 다음과 같은 방식으로 Update를 진행한다.

스웜모드로 생성된 모든 서비스의 컨테이너가 외부로 노출되기 위해서는 무조건 ingress 네트워크를 사용해야 하는 것은 아니다. docker run -p를 사용해 외부에 노출했던 것처럼 특정 포트를 사용하도록 설정 할 수도 있다.

다음은 ingress를 사용하지 않고 호스트의 8888포트를 직접 컨테이너의 80포트에 연결하는 방식이다.

docker service create --publish mode=host,target=80,published=8080,protocol=tcp --name web nginx

네트워크 실습

rapa@manager:~$ docker service create --name test1 --mode global nginx

rapa@manager:~$ docker service create --name test2 -p 8001:80 --mode global nginx
  • test1의 IP 정보확인
docker container inspect 89297b1b1299
"Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }

test1 서비스에 속한 컨테이너는 172.17.x.x IP가 부여됨 (-p옵션 없는 경우 = docker0에 연결됨)

클러스터 상에 배치되는 것이 아님

  • test2의 IP 정보 확인
docker container inspect 336cf4b393e9
"Gateway": "",
                    "IPAddress": "10.0.0.39",
                    "IPPrefixLen": 24,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:0a:00:00:27",
                    "DriverOpts": null
                }

test2 서비스에 속한 컨테이너는 10.10.x.x IP가 부여됨 (-p 옵션 있는 경우 = ingress에 연결됨)

스웜 클러스터 상에서 배치가 되는 상태

  • ingress 네트워크 정보 보기
rapa@manager:~$ docker network inspect ingress

추가적으로 overlay 네트워크를 생성한다. overlay 드라이버를 이용한 네트워크는 전 클러스터 상에 동일한 네트워크 영역을 제공하고, 터널을 통해 물리적 위치와 상관없이 통신된다.

  • overlay 네트워크 생성
rapa@manager:~$ docker network create --subnet 20.20.20.0/24 -d overlay testoverlay
59yre93329ot0p4lzsbsdjzer
  • 네트워크 확인
rapa@manager:~$ docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
1cf13e62e4aa   bridge            bridge    local
7fccabc7204a   docker_gwbridge   bridge    local
3ead376f089f   host              host      local
iq8afj4dexmr   ingress           overlay   swarm
39430d1f4412   none              null      local
59yre93329ot   testoverlay       overlay   swarm

SCOPE가 swarm으로 클러스터 전반에 걸쳐 네트워크가 만들어져 있는 것

  • 만든 overlay 네트워크를 이용하여 컨테이너 배치
rapa@manager:~$ docker service create --name test3 -p 8002:80 --network testoverlay --mode global nginx
  • 생성된 컨테이너의 아이디를 확인해 inspect
rapa@manager:~$ docker container ls | grep test3
3770aa65aa61   nginx:latest          "/docker-entrypoint.…"   50 seconds ago   Up 46 seconds   80/tcp                                                test3.mmq3j418myp0x5pktz3o0k1jt.sg899gbgdlzx67kvmqnzvb5br

rapa@manager:~$ docker container inspect 3770aa65aa61

IP주소가 2개가 보인다.

"Networks": {
                "ingress": {
                    "IPAMConfig": {
                        "IPv4Address": "10.0.0.45"
                    },
...
                    "IPAddress": "10.0.0.45",
...
"testoverlay": {
                    "IPAMConfig": {
                        "IPv4Address": "20.20.20.5"
                    },
...
                    "IPAddress": "20.20.20.5",

                }

-p : ingress와 붙음, ingress와 붙으면 외부와 연결이 가능해지는 것

docker container run으로 생성한 컨테이너는 —network myoverlay를 (클러스터 네트워크에 연결) 하는 것이 불가능하다.

다음과 같이 overlay 네트워크를 생성할 때 —attachable을 부착하면 가능해진다.

docker network create -d overlay --attachable myoverlay2

만약 외부 사용자가 worker1로 들어온다고 가정했을 때, eth0으로 들어와 docker_gwbridge를 거쳐서 ingress로 연결된다. vip는 10.10.10.2라고 했을 때, (이건 모두 manager에 있는 것) 매니저의 etcd파일에 클러스터 노드정보와 컨테이너 id등이 들어있는데,

사용자가 만약 port8001로 들어온다고 치면 서비스에 등록된 vip를 보고, 이 서비스가 etcd의 컨테이너 정보를 보고 Round Robin으로 컨테이너에 연결한다.

docker_gwbridge는 서로(manager의 docker_gwbridge, worker1의 docker_gwbridge 등)에게 영향을 주지 않는다. eth0을 통해 외부와의 연결이 가능하다.

ingress는 전체에 걸쳐 overlay가 되는데, docker_gwbridge와 연결되어 외부와의 연결이 가능해진다.

myoverlay라는 overlay네트워크를 생성했을 때, 컨테이너를 만들 때 —network로 myoverlay와 연결이 되고, -p를 하면 (ingress연결) 이 된다. ( -p를 하지 않으면 ingress와 연결이 되지 않아 외부와의 통신X)

0개의 댓글