서비스에 롤링 업데이트 적용하기

서비스에 롤링 업데이트 적용하기

튜토리얼의 이전 단계에서 서비스 인스턴스 수를 스케일링하는 방법을 배웠어요. 이번 단계에서는 Redis 7.4.0 컨테이너 태그로 서비스를 배포한 다음, 롤링 업데이트를 사용해 Redis 7.4.1 컨테이너 이미지로 업그레이드하는 과정을 직접 따라 해 볼 거예요. 롤링 업데이트를 활용하면 서비스 중단 없이 태스크를 순차적으로 갱신할 수 있어요.

출처: 공식문서

본문

1단계: 매니저 노드에 접속하기

아직 터미널을 열지 않았다면 터미널을 열고 매니저 노드가 실행 중인 머신에 SSH로 접속해요. 예를 들어 이 튜토리얼에서는 manager1이라는 머신을 사용하고 있어요.

2단계: Redis 서비스 배포 및 업데이트 지연 설정

Redis 태그를 스웜에 배포하고, 업데이트 지연 시간을 10초로 설정해 볼게요. 아래 예시는 이전 Redis 태그를 보여주고 있어요.

$ docker service create \
 --replicas 3 \
 --name redis \
 --update-delay 10s \
 redis:7.4.0

0u6a4s31ybk7yw2wyvtikmu50

롤링 업데이트 정책은 서비스를 배포할 때 설정해요.

--update-delay 플래그는 서비스 태스크 또는 태스크 집합에 대한 업데이트 사이의 시간 지연을 설정해요. 시간 T는 초 Ts, 분 Tm, 시 Th의 조합으로 표현할 수 있어요. 예를 들어 10m30s는 10분 30초 지연을 의미해요.

기본적으로 스케줄러는 한 번에 1개의 태스크만 업데이트해요. --update-parallelism 플래그를 전달하면 스케줄러가 동시에 업데이트할 최대 태스크 수를 설정할 수 있어요.

기본적으로 개별 태스크에 대한 업데이트가 RUNNING 상태를 반환하면, 스케줄러는 모든 태스크가 업데이트될 때까지 다음 태스크를 업데이트해요. 업데이트 중 어떤 태스크가 FAILED를 반환하면, 스케줄러는 업데이트를 일시 중지해요. 이 동작은 docker service create 또는 docker service update 명령에서 --update-failure-action 플래그로 제어할 수 있어요.

3단계: redis 서비스 확인하기

redis 서비스를 조사해 볼게요.

$ docker service inspect --pretty redis

ID: 0u6a4s31ybk7yw2wyvtikmu50
Name: redis
Service Mode: Replicated
 Replicas: 3
Placement:
 Strategy: Spread
UpdateConfig:
 Parallelism: 1
 Delay: 10s
ContainerSpec:
 Image: redis:7.4.0
Resources:
Endpoint Mode: vip

4단계: 컨테이너 이미지 업데이트하기

이제 redis 서비스의 컨테이너 이미지를 업데이트할 수 있어요. 스웜 매니저는 UpdateConfig 정책에 따라 노드에 업데이트를 적용해요.

$ docker service update --image redis:7.4.1 redis
redis

스케줄러는 기본적으로 다음과 같은 순서로 롤링 업데이트를 적용해요.

  1. 첫 번째 태스크를 중지해요.
  2. 중지된 태스크에 대한 업데이트를 예약해요.
  3. 업데이트된 태스크의 컨테이너를 시작해요.
  4. 태스크 업데이트가 RUNNING을 반환하면 지정된 지연 시간만큼 기다린 후 다음 태스크를 시작해요.
  5. 업데이트 중 어떤 태스크가 FAILED를 반환하면 업데이트를 일시 중지해요.

5단계: 업데이트 결과 확인하기

docker service inspect --pretty redis 명령을 실행해서 원하는 상태(desired state)에 새 이미지가 반영되었는지 확인해 볼게요.

$ docker service inspect --pretty redis

ID: 0u6a4s31ybk7yw2wyvtikmu50
Name: redis
Service Mode: Replicated
 Replicas: 3
Placement:
 Strategy: Spread
UpdateConfig:
 Parallelism: 1
 Delay: 10s
ContainerSpec:
 Image: redis:7.4.1
Resources:
Endpoint Mode: vip

service inspect 출력에서 업데이트가 실패로 인해 일시 중지되었는지도 확인할 수 있어요.

$ docker service inspect --pretty redis

ID: 0u6a4s31ybk7yw2wyvtikmu50
Name: redis
...snip...
Update status:
 State: paused
 Started: 11 seconds ago
 Message: update paused due to failure or early termination of task 9p7ith557h8ndf0ui9s0q951b
...snip...

일시 중지된 업데이트를 다시 시작하려면 docker service update <SERVICE-ID> 명령을 실행해요. 예를 들어:

$ docker service update redis

특정 업데이트 실패가 반복되지 않도록 하려면 docker service update에 플래그를 전달하여 서비스를 재구성해야 할 수도 있어요.

6단계: 롤링 업데이트 과정 관찰하기

docker service ps <SERVICE-ID> 명령을 실행해서 롤링 업데이트 과정을 지켜봐요.

$ docker service ps redis

NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
redis.1.dos1zffgeofhagnve8w864fco redis:7.4.1 worker1 Running Running 37 seconds
 \_ redis.1.88rdo6pa52ki8oqx6dogf04fh redis:7.4.0 worker2 Shutdown Shutdown 56 seconds ago
redis.2.9l3i4j85517skba5o7tn5m8g0 redis:7.4.1 worker2 Running Running About a minute
 \_ redis.2.66k185wilg8ele7ntu8f6nj6i redis:7.4.0 worker1 Shutdown Shutdown 2 minutes ago
redis.3.egiuiqpzrdbxks3wxgn8qib1g redis:7.4.1 worker1 Running Running 48 seconds
 \_ redis.3.ctzktfddb2tepkr45qcmqln04 redis:7.4.0 mmanager1 Shutdown Shutdown 2 minutes ago

스웜이 모든 태스크를 업데이트하기 전에는 일부 태스크가 redis:7.4.0을 실행하고 다른 태스크는 redis:7.4.1을 실행하는 모습을 볼 수 있어요. 위 출력은 롤링 업데이트가 완료된 후의 상태를 보여줘요.

다음 단계

다음으로 스웜에서 노드를 드레인(drain)하는 방법을 배워볼게요.

노드 드레인하기

더 알아보기 (Learn more)