Profile picture

[Docker Swarm] 기본 웹 애플리케이션 서비스 구축해보기

JaehyoJJAng2024년 04월 10일

▶︎ 개요

도커스웜 실습을 위해 간단한 웹 애플리케이션 서비스 구축해보기.


▶︎ 사전 준비

  • 도커스웜 클러스터

▶︎ 노드 목록

docker node ls
ID                            HOSTNAME     STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
vtuwstlmajmx0ysqpqujvm2mn *   k8s-master   Ready     Active         Leader           26.1.0
20j9efhhyfv2339hp0ovipkez     k8s-node1    Ready     Active                          26.1.0

▶︎ 실습

‣ 서비스 생성

service create 명령을 사용하여 서비스를 생성합니다.

docker service create --name whoami \
-p 3333:4567 \
subicura/whoami:1

subicura/whoami:1 이미지는 서버의 hostname을 출력하는 단순한 웹 애플리케이션입니다.

여기서는 서비스의 이름을 whoami로 지정했고 호스트의 3333번 포트를 오픈하였습니다.

서비스가 잘 생성되었는지 service ls 명령어로 확인해봅시다.

docker service ls
ID             NAME      MODE         REPLICAS   IMAGE               PORTS
ysaamkq21iga   whoami    replicated   0/1        subicura/whoami:1   *:3333->4567/tcp

whoami 서비스가 보입니다. 아직 컨테이너가 생성되지 않아 REPLICA 상태가 0/1입니다. 좀 더 상세한 상태를 확인하기 위해 service ps 명령어를 입력해봅니다.

docker service ps whoami
ID             NAME       IMAGE               NODE         DESIRED STATE   CURRENT STATE                ERROR     PORTS
mwx0161ujelx   whoami.1   subicura/whoami:1   k8s-master   Running         Running about a minute ago

서비스의 상태와 어떤 노드에서 실행 중인지를 상세하게 확인할 수 있습니다.

현재 상태가 Running 인 것을 보니 정상적으로 실행된걸로 확인 됩니다.


HTTP 요청을 보내 웹 서비스가 정상적으로 실행됐는지 테스트해보겠습니다.

curl k8s-master:3333

# output
0b828b9f2497

첫 번째 서비스를 성공적으로 생성하였습니다!.

다른 노드인 k8s-node1에서도 테스트를 해볼까요?

curl k8s-node1:3333

# output
0b828b9f2497

분명 컨테이너는 k8s-master 노드에서 실행 중인데 왜 k8s-node1 노드에서도 응답하는걸까요?


‣ Ingress network

도커 스웜은 서비스를 외부에 쉽게 노출하기 위해 모든 노드가 ingress라는 가상 네트워크에 속해있습니다.

ingress는 routing mesh라는 개념을 가지고 있는데,

이 개념은 서비스가 포트를 오픈할 경우 모든 노드에 포트가 오픈되고 어떤 노드에 요청을 보내도 실행 중인 컨테이너에 자동으로 전달해줍니다.
image
위의 예제에서는 3333 포트를 오픈했기 때문에 2개의 노드 전체에 3333 포트가 오픈되었고,

어디에서 테스트를 하든 간에 k8s-node1 노드에 실행된 컨테이너로 요청이 전달됩니다.

컨테이너가 여러 개라면 내부 로드밸런서를 이용하여 여러 개의 컨테이너로 분산처리됩니다.


‣ 서비스 복제 replication

앞에서 생성한 웹 애플리케이션에 부하가 발생했다고 가정하고 컨테이너를 5개 늘려봅시다.

노드가 2개인데 컨테이너를 5개로 늘리면 서버 각각에 3/2개 또는 2/3개의 컨테이너가 생성될 것입니다.

어차피 각각은 독립된 컨테이너이기 때문에 여러 개를 생성해도 상관없고 ingress 네트워크가 알아서 요청을 분산해줍니다.
image


service scale 명령어를 이용하여 서비스 개수를 늘려보겠습니다.

docker service scale whoami=5
verify: Service whoami converged

service ps 명령어를 입력하여 상태를 확인합니다.

docker service ps whoami
ID             NAME       IMAGE               NODE         DESIRED STATE   CURRENT STATE            ERROR     PORTS
mwx0161ujelx   whoami.1   subicura/whoami:1   k8s-master   Running         Running 27 minutes ago
mruf7801f5q8   whoami.2   subicura/whoami:1   k8s-node1    Running         Running 26 seconds ago
uppk6l7ocznf   whoami.3   subicura/whoami:1   k8s-master   Running         Running 39 seconds ago
xxi74art7x1k   whoami.4   subicura/whoami:1   k8s-node1    Running         Running 26 seconds ago
ng0saglisv23   whoami.5   subicura/whoami:1   k8s-master    Running         Running 26 seconds ago

5개의 컨테이너가 모두 실행되었습니다.


분산 테스트를 위해 k8s-master 노드에 반복문을 사용하여 1초 단위로 curl 명령을 날려보도록 하겠습니다.

while true; do curl -w '\n' k8s-master:3333; sleep 1; done

# output
75c06d83acba
ed786d4c7dcb
cbec2ddd19e8
0b828b9f2497
5aea29da7816
75c06d83acba
...

5개의 컨테이너에 각각 바쁘게 요청이 분산되고 있습니다.

이것을 통해 알 수 있는 것은 아무런 설정이 없어도 ingress 네트워크가 알아서 로드 밸런서 역할을 해주고 있다는 것입니다.


Loading script...