▶︎ 개요
도커스웜 실습을 위해 간단한 웹 애플리케이션 서비스 구축해보기.
▶︎ 사전 준비
- 도커스웜 클러스터
▶︎ 노드 목록
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라는 개념을 가지고 있는데,
이 개념은 서비스가 포트를 오픈할 경우 모든 노드에 포트가 오픈되고 어떤 노드에 요청을 보내도 실행 중인 컨테이너에 자동으로 전달해줍니다.
위의 예제에서는 3333 포트를 오픈했기 때문에 2개의 노드 전체에 3333 포트가 오픈되었고,
어디에서 테스트를 하든 간에 k8s-node1
노드에 실행된 컨테이너로 요청이 전달됩니다.
컨테이너가 여러 개라면 내부 로드밸런서를 이용하여 여러 개의 컨테이너로 분산처리됩니다.
‣ 서비스 복제 replication
앞에서 생성한 웹 애플리케이션에 부하가 발생했다고 가정하고 컨테이너를 5개 늘려봅시다.
노드가 2개인데 컨테이너를 5개로 늘리면 서버 각각에 3/2
개 또는 2/3
개의 컨테이너가 생성될 것입니다.
어차피 각각은 독립된 컨테이너이기 때문에 여러 개를 생성해도 상관없고 ingress 네트워크가 알아서 요청을 분산해줍니다.
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 네트워크가 알아서 로드 밸런서 역할을 해주고 있다는 것입니다.