EKS 와 어플리케이션 무중단 배포 #1

YL. Gho·2022년 11월 24일
0

Kubernetes

목록 보기
3/5
post-thumbnail

intro

EKS 에서 AWS Load Balancer Controller 를 Ingress 의 백엔드로 사용하는 환경의 경우, deployment 의 rolling update 를 이용하는 배포는 완전한 무중단 배포를 보장하지 않는다.

하지만 아래 설정을 통해 무중단 배포에 좀 더 다가갈 수 있다.

  • pod readiness gate
  • TerminationGracePeriodSeconds
  • 어플리케이션 내의 graceful shutdown 구현

TL,DR

  • AWS Load Balancer Controller 를 사용한다면, pod readiness gate 꼭 사용하자!

Disclaimer

  • 테스트 과정 전체가 다 결과가 되다보니 글이 길어질 수 밖에 없었다...

무중단 배포 실패

배포 과정에서 신규 또는 기존 요청 처리를 실패하면 무중단 배포라 할 수 없다.
아래의 시나리오를 통해 케이스를 알아보자.

1. 배포 과정에서 인입되는 신규 요청에 대해 응답 실패가 발생하는 경우

  • 배포가 시작되고 신규로 생성된 new pod 의 상태가 ready 가 된다.
  • 하지만 new pod 과 연결되는 ALB 의 타겟 상태도 반드시 동시에 healthy 가 되진 않는다.
    • pod 의 상태는 ready 이지만 ALB 의 타겟은 아직 등록 진행 중이라 initial 상태일 수 있다.
    • initial 상태인 타겟은 요청을 받을 수 없다.
  • k8s 는 new pod 의 상태가 ready 임을 확인하고 old pod 을 제거하기 시작한다.
  • old pod 이 제거되면서 연결되는 ALB 의 타겟 상태가 draining 이 된다.
    • draining 상태인 타겟은 요청을 받을 수 없다.
  • 만약 타겟 그룹의 두 타겟 상태가 동시에 아래와 같다면 요청을 받을 수 있는 pod 이 하나도 없다.
    • new pod 타겟은 initial 상태
    • old pod 타겟은 draining 상태
  • 이 상태는 얼마간 지속되다 new pod 타켓의 상태가 healthy 가 되며 해소되나 이 기간 동안은 다수의 신규 요청은 5xx 에러를 응답하게 된다.

2. 배포 과정에서 아직 처리 중인 기존 요청에 대해 응답 실패가 발생하는 경우

  • 배포가 시작되고 new pod 의 상태가 ready 가 되고 old pod 의 제거가 시작된다.
    • pod 으로 SIGTERM 이 전달된다.
  • 특별한 설정을 안했다면 SIGTERM 을 받은 pod 의 어플리케이션은 바로 중단된다.
    • 이때 아직 처리 중인 기존 요청들은 모두 5xx 에러를 응답하게 된다.

이번 포스트는 위 두 가지 경우 중 첫 번째인 "배포 과정에서 인입되는 신규 요청에 대해 응답 실패가 발생하는 경우" 에 대한 보완책으로 pod readiness gate 를 적용하고 이를 확인하기 위한 테스트를 진행한다.


테스트 환경

아래와 같은 환경 아래에서 테스트 진행했다.

  • eks 1.21 사용
  • 테스트 용 어플리케이션으로 간단한 go 기반 어플리케이션을 만들어 사용, 아래는 핸들러 내용이다.
func RunHTTPServer(wg *sync.WaitGroup) *http.Server {
	mux := http.NewServeMux()
	
    // pod 의 호스트네임을 응답한다.
	mux.HandleFunc("/hostname", func(w http.ResponseWriter, r *http.Request) {
		wg.Add(1)
		defer wg.Done()

		w.Header().Set("Content-Type", "text/plain; charset=utf-8")
		hostname, _ := os.Hostname()
		io.WriteString(w, hostname)
	})

	// query string 으로 받은 시간 만큼 sleep 을 한 후 응답한다.
	mux.HandleFunc("/sleep", func(w http.ResponseWriter, r *http.Request) {
		wg.Add(1)
		defer wg.Done()

		w.Header().Set("Content-Type", "text/plain; charset=utf-8")
		period, err := strconv.Atoi(r.URL.Query().Get("period"))
		if err != nil {
			io.WriteString(w, err.Error())
			io.WriteString(w, "\nwrong parameter\n")
			return
		}
		log.Printf("sleep for %v secs then respond to %v\n", period, r.Host)
		time.Sleep(time.Duration(period) * time.Second)
		io.WriteString(w, fmt.Sprintf("awoke after %v secs\n", period))

	})

...

	go server.ListenAndServe()

	return &server
}    
  • namespace 에 pod readiness gate 설정
$ k create ns testns
namespace/testns created
$ k label namespace testns elbv2.k8s.aws/pod-readiness-gate-inject=enabled
namespace/testns labeled
$ k describe namespace testns
Name:         testns
Labels:       elbv2.k8s.aws/pod-readiness-gate-inject=enabled
              kubernetes.io/metadata.name=testns
Annotations:  <none>
Status:       Active

No resource quota.

No LimitRange resource.
  • 테스트 용 deployment, service, ingress 생성
    • 생성된 deployment 는 위의 테스트 용 어플리케이션을 실행한다.
$ k get all,ing -o wide
NAME                      READY   STATUS    RESTARTS   AGE     IP              NODE                                                NOMINATED NODE   READINESS GATES
testapp-fc9974c74-qc6v9   1/1     Running   0          3m42s   10.171.232.42   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-fc9974c74-w4kwj   1/1     Running   0          3m42s   10.171.187.36   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1

NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE   SELECTOR
service/test-service   ClusterIP   10.107.223.76   <none>        8080/TCP   14h   app.kubernetes.io/name=testapp

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                                     SELECTOR
deployment.apps/testapp   2/2     2            2           14h   testapp      public.ecr.aws/g4h1q6d9/srepractice:v0.4   app.kubernetes.io/name=testapp

NAME                                 DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES                                     SELECTOR
replicaset.apps/testapp-57d4d54f4    0         0         0       13h   testapp      public.ecr.aws/g4h1q6d9/srepractice:v0.4   app.kubernetes.io/name=testapp,pod-template-hash=57d4d54f4

NAME                                     CLASS                          HOSTS                             ADDRESS
                                 PORTS   AGE
ingress.networking.k8s.io/test-ingress   aws-load-balancer-controller   test-ingress.yldot.service   internal-test-ingress-313265382.ap-northeast-2.elb.amazonaws.com   80      14h



테스트 시나리오

테스트를 위해 먼저 pod readiness gate 기능을 적용시킨다. 이 후 배포 상황을 강제로 만들고 배포 과정 내부를 모니터링한다.

  • 배포 상황을 강제로 만들기 위해 아래 커맨드 실행한다.
    • $ k rollout restart deploy testapp
  • 내부 모니터링을 위해 주기적으로 아래의 액션을 수행한다.
    • 신규 인입 요청의 상태 확인을 위해 테스트 용 어플리케이션으로 1초마다 아래 요청을 보낸다.
      • $ curl -s test-ingress.yldot.service/hostname
      • 응답으로 요청을 처리한 pod 의 호스트네임을 받는다.
    • pod 상태를 확인을 위해 1초마다 아래 명령을 실행한다
      • $ k get pod -o wide
    • 타겟 그룹의 타겟 상태를 확인을 위해 1초마다 아래 명령을 실행한다
      • $ aws elbv2 describe-target-health --target-group-arn TG_ARN | jq .TargetHealthDescriptions[].TargetHealth.State
  • 테스트 진행은 아래의 세 단계로 나눈다. 각 단계마다 pod 상태, 타겟 상태, 신규 요청 상태를 확인한다
    • 배포 시작 단계
    • new pod 1 생성 완료 단계
    • new pod 2 생성 완료 단계


테스트 진행

old pod 과 new pod 은 아래 pod 을 지칭한다.

  • old pod 1: testapp-fc9974c74-w4kwj
  • old pod 2: testapp-fc9974c74-qc6v9
  • new pod 1: testapp-5f6c5545cd-lprdh
  • new pod 2: testapp-5f6c5545cd-7gkq7

1. 배포 시작

  • Pod 상태 확인
    • old pod 1, old pod 2 는 Running 상태이다
    • new pod 1 생성이 시작되고 pod readiness gate 확인을 진행한다
      • READINESS GATES 값이 0/1 로 남아있다
Wed 30 Nov 2022 09:49:37 PM KST
NAME                      READY   STATUS    RESTARTS   AGE     IP              NODE                                                NOMINATED NODE   READINESS GATES
testapp-fc9974c74-qc6v9   1/1     Running   0          3m42s   10.171.232.42   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-fc9974c74-w4kwj   1/1     Running   0          3m42s   10.171.187.36   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1

Wed 30 Nov 2022 09:49:39 PM KST		## 배포 시작
NAME                      READY   STATUS    RESTARTS   AGE     IP              NODE                                                NOMINATED NODE   READINESS GATES
testapp-fc9974c74-qc6v9   1/1     Running   0          3m43s   10.171.232.42   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-fc9974c74-w4kwj   1/1     Running   0          3m43s   10.171.187.36   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1

Wed 30 Nov 2022 09:49:40 PM KST		## new pod 1 생성 시작
NAME                       READY   STATUS              RESTARTS   AGE     IP              NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-lprdh   0/1     ContainerCreating   0          1s      <none>          ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           0/1
testapp-fc9974c74-qc6v9    1/1     Running             0          3m45s   10.171.232.42   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-fc9974c74-w4kwj    1/1     Running             0          3m45s   10.171.187.36   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1

Wed 30 Nov 2022 09:49:42 PM KST
NAME                       READY   STATUS              RESTARTS   AGE     IP              NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-lprdh   0/1     ContainerCreating   0          2s      <none>          ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           0/1
testapp-fc9974c74-qc6v9    1/1     Running             0          3m46s   10.171.232.42   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-fc9974c74-w4kwj    1/1     Running             0          3m46s   10.171.187.36   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1

Wed 30 Nov 2022 09:49:43 PM KST	
NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-lprdh   0/1     Running   0          4s      10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           0/1
testapp-fc9974c74-qc6v9    1/1     Running   0          3m48s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-fc9974c74-w4kwj    1/1     Running   0          3m48s   10.171.187.36    ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1

Wed 30 Nov 2022 09:49:44 PM KST
NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-lprdh   0/1     Running   0          5s      10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           0/1
testapp-fc9974c74-qc6v9    1/1     Running   0          3m49s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-fc9974c74-w4kwj    1/1     Running   0          3m49s   10.171.187.36    ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1

...

Wed 30 Nov 2022 09:50:03 PM KST
NAME                       READY   STATUS    RESTARTS   AGE    IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-lprdh   1/1     Running   0          24s    10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           0/1
testapp-fc9974c74-qc6v9    1/1     Running   0          4m8s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-fc9974c74-w4kwj    1/1     Running   0          4m8s   10.171.187.36    ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1

Wed 30 Nov 2022 09:50:05 PM KST		## new pod 1 타겟 등록 시작
NAME                       READY   STATUS    RESTARTS   AGE    IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-lprdh   1/1     Running   0          25s    10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           0/1
testapp-fc9974c74-qc6v9    1/1     Running   0          4m9s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-fc9974c74-w4kwj    1/1     Running   0          4m9s   10.171.187.36    ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1

Wed 30 Nov 2022 09:50:06 PM KST
NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-lprdh   1/1     Running   0          27s     10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           0/1
testapp-fc9974c74-qc6v9    1/1     Running   0          4m11s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-fc9974c74-w4kwj    1/1     Running   0          4m11s   10.171.187.36    ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1
  • 타겟 그룹 상태 확인
    • old pod 1 의 타겟, old pod 2 의 타겟은 Healthy 상태이다
    • new pod 1 의 생성이 시작되고 new pod 1 의 타겟이 initial 상태로 등록된다.
Wed 30 Nov 2022 09:49:38 PM KST
"healthy"
"healthy"

Wed 30 Nov 2022 09:49:39 PM KST		## 배포 시작
"healthy"
"healthy"

Wed 30 Nov 2022 09:49:41 PM KST		## new pod 1 생성 시작
"healthy"
"healthy"

Wed 30 Nov 2022 09:49:42 PM KST
"healthy"
"healthy"

Wed 30 Nov 2022 09:49:44 PM KST
"healthy"
"healthy"

Wed 30 Nov 2022 09:49:45 PM KST
"healthy"
"healthy"

...

Wed 30 Nov 2022 09:50:03 PM KST
"healthy"
"healthy"

Wed 30 Nov 2022 09:50:04 PM KST		## new pod 1 타겟 등록 시작
"healthy"
"initial"
"healthy"

Wed 30 Nov 2022 09:50:06 PM KST
"healthy"
"initial"
"healthy"
  • 신규 요청 상태 확인
    • old pod 1 ,old pod 2 에게 요청이 전달된다
    • new pod 1 로는 아직 요청이 전달되지 않는다
$ curl -s test-ingress.stg.kurly.services/hostname

Wed 30 Nov 2022 09:49:38 PM KST
 - testapp-fc9974c74-w4kwj
 
Wed 30 Nov 2022 09:49:39 PM KST		## 배포 시작
 - testapp-fc9974c74-qc6v9
 
Wed 30 Nov 2022 09:49:40 PM KST		## new pod 1 생성 시작
 - testapp-fc9974c74-qc6v9
 
Wed 30 Nov 2022 09:49:41 PM KST
 - testapp-fc9974c74-w4kwj
 
Wed 30 Nov 2022 09:49:43 PM KST
 - testapp-fc9974c74-w4kwj
 
Wed 30 Nov 2022 09:49:44 PM KST
 - testapp-fc9974c74-qc6v9

...

 Wed 30 Nov 2022 09:50:03 PM KST
 - testapp-fc9974c74-w4kwj

Wed 30 Nov 2022 09:50:05 PM KST		## new pod 1 타겟 등록 시작
 - testapp-fc9974c74-qc6v9
 
Wed 30 Nov 2022 09:50:06 PM KST
 - testapp-fc9974c74-w4kwj

2. New Pod 1 생성 완료

  • Pod 상태 확인
    • old pod 2 는 계속 Running 상태이다
    • new pod 1 의 pod readiness gate 가 통과하여 생성이 완료된다.
      • READINESS GATES 값이 1/1 로 변경되고 Running 상태가 된다
    • old pod 1 이 제거된다
    • new pod 2 생성이 시작된다
Wed 30 Nov 2022 09:50:15 PM KST
NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-lprdh   1/1     Running   0          35s     10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           0/1
testapp-fc9974c74-qc6v9    1/1     Running   0          4m19s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-fc9974c74-w4kwj    1/1     Running   0          4m19s   10.171.187.36    ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1

Wed 30 Nov 2022 09:50:16 PM KST		## new pod 1 타겟 등록 완료
NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-lprdh   1/1     Running   0          37s     10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           0/1
testapp-fc9974c74-qc6v9    1/1     Running   0          4m21s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-fc9974c74-w4kwj    1/1     Running   0          4m21s   10.171.187.36    ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1

Wed 30 Nov 2022 09:50:18 PM KST
NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-lprdh   1/1     Running   0          38s     10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           0/1
testapp-fc9974c74-qc6v9    1/1     Running   0          4m22s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-fc9974c74-w4kwj    1/1     Running   0          4m22s   10.171.187.36    ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1

Wed 30 Nov 2022 09:50:19 PM KST		## new pod 1 생성 완료, old pod 1 제거 시작, new pod 2 생성 시작
NAME                       READY   STATUS              RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-7gkq7   0/1     ContainerCreating   0          1s      <none>           ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           0/1
testapp-5f6c5545cd-lprdh   1/1     Running             0          40s     10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1
testapp-fc9974c74-qc6v9    1/1     Running             0          4m24s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-fc9974c74-w4kwj    0/1     Terminating         0          4m24s   10.171.187.36    ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1

Wed 30 Nov 2022 09:50:21 PM KST
NAME                       READY   STATUS              RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-7gkq7   0/1     ContainerCreating   0          2s      <none>           ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           0/1
testapp-5f6c5545cd-lprdh   1/1     Running             0          41s     10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1
testapp-fc9974c74-qc6v9    1/1     Running             0          4m25s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-fc9974c74-w4kwj    0/1     Terminating         0          4m25s   10.171.187.36    ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1

...

Wed 30 Nov 2022 09:50:25 PM KST
NAME                       READY   STATUS        RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-7gkq7   0/1     Running       0          7s      10.171.230.156   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           0/1
testapp-5f6c5545cd-lprdh   1/1     Running       0          46s     10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1
testapp-fc9974c74-qc6v9    1/1     Running       0          4m30s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-fc9974c74-w4kwj    0/1     Terminating   0          4m30s   10.171.187.36    ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1

Wed 30 Nov 2022 09:50:27 PM KST		## old pod 1 제거 완료
NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-7gkq7   0/1     Running   0          8s      10.171.230.156   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           0/1
testapp-5f6c5545cd-lprdh   1/1     Running   0          47s     10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1
testapp-fc9974c74-qc6v9    1/1     Running   0          4m31s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1

Wed 30 Nov 2022 09:50:28 PM KST
NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-7gkq7   0/1     Running   0          10s     10.171.230.156   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           0/1
testapp-5f6c5545cd-lprdh   1/1     Running   0          49s     10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1
testapp-fc9974c74-qc6v9    1/1     Running   0          4m33s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1

...

Wed 30 Nov 2022 09:50:41 PM KST
NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-7gkq7   1/1     Running   0          23s     10.171.230.156   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           0/1
testapp-5f6c5545cd-lprdh   1/1     Running   0          62s     10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1
testapp-fc9974c74-qc6v9    1/1     Running   0          4m46s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1

Wed 30 Nov 2022 09:50:43 PM KST		## new pod 2 타겟 등록 시작
NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-7gkq7   1/1     Running   0          24s     10.171.230.156   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           0/1
testapp-5f6c5545cd-lprdh   1/1     Running   0          63s     10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1
testapp-fc9974c74-qc6v9    1/1     Running   0          4m47s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1

Wed 30 Nov 2022 09:50:44 PM KST
NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-7gkq7   1/1     Running   0          26s     10.171.230.156   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           0/1
testapp-5f6c5545cd-lprdh   1/1     Running   0          65s     10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1
testapp-fc9974c74-qc6v9    1/1     Running   0          4m49s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
  • 타겟 그룹 상태 확인
    • old pod 2 의 타겟은 Healthy 상태이다
    • new pod 1 생성이 완료되어 타겟 상태가 Healthy 가 된다.
    • old pod 1 의 타겟에 대한 제거가 시작된다.
      • deregister 가 시작되어 타겟 상태가 draining 이 된다.
      • 타겟이 draining 상태 변환 이후부턴 요청 인입 안되야 하나 전환 초기에는 몇몇 요청이 인입되는 것으로 보인다.
    • new pod 2 의 생성이 시작되고 new pod 2 의 타겟이 initial 상태로 등록된다.
Wed 30 Nov 2022 09:50:15 PM KST
"healthy"
"initial"
"healthy"

Wed 30 Nov 2022 09:50:16 PM KST		## new pod 1 타겟 등록 완료
"healthy"
"healthy"
"healthy"

Wed 30 Nov 2022 09:50:18 PM KST
"healthy"
"healthy"
"healthy"

Wed 30 Nov 2022 09:50:19 PM KST		## new pod 1 생성 완료, old pod 1 제거 시작, new pod 2 생성 시작
"draining"							<- old pod 1 의 타겟이 draining 상태 변환 이후부턴 요청 인입 안되야 하나 실제로는 전환 초기에 몇몇 요청이 인입된다
"healthy"
"healthy"

Wed 30 Nov 2022 09:50:21 PM KST
"draining"
"healthy"
"healthy"

...

Wed 30 Nov 2022 09:50:25 PM KST
"draining"
"healthy"
"healthy"

Wed 30 Nov 2022 09:50:27 PM KST		## old pod 1 제거 완료
"draining"
"healthy"
"healthy"

Wed 30 Nov 2022 09:50:28 PM KST
"draining"
"healthy"
"healthy"

...

Wed 30 Nov 2022 09:50:41 PM KST
"draining"
"healthy"
"healthy"

Wed 30 Nov 2022 09:50:43 PM KST		## new pod 2 타겟 등록 시작
"initial"
"healthy"
"draining"
"healthy"

Wed 30 Nov 2022 09:50:44 PM KST
"initial"
"healthy"
"draining"
"healthy"
  • 신규 요청 상태 확인
    • old pod 1 ,old pod 2 로 요청을 보내다가 new pod 1 생성 완료 후부터 new pod 1 로 요청이 인입되기 시작한다
      • 이 후부턴 old pod 1 로는 더 이상 요청 인입이 안된다.
    • old pod 1 이 삭제 완료된 후 1건의 요청 실패가 발생한다.
      • 타겟이 draining 상태 변환 이후부턴 요청 인입 안되야 하나 전환 초기에는 몇몇 요청이 인입되는 것으로 보인다.
      • 대략 10초간 old pod 1 로 인입되는 요청은 응답 실패, 이 후부터 정상 응답한다.
Wed 30 Nov 2022 09:50:15 PM KST
 - testapp-fc9974c74-w4kwj

Wed 30 Nov 2022 09:50:16 PM KST		## new pod 1 타겟 등록 완료
 - testapp-fc9974c74-qc6v9

Wed 30 Nov 2022 09:50:17 PM KST
 - testapp-fc9974c74-w4kwj
 
Wed 30 Nov 2022 09:50:18 PM KST
 - testapp-5f6c5545cd-lprdh

Wed 30 Nov 2022 09:50:19 PM KST		## new pod 1 생성 완료, old pod 1 제거 시작, new pod 2 생성 시작
 - testapp-fc9974c74-qc6v9

Wed 30 Nov 2022 09:50:20 PM KST		## 요청 실패 발생
 </html>><h1>504 Gateway Time-out</h1></center>d>	<- old pod 1 의 타겟이 draining 상태 변환 이후부턴 요청 인입 안되야 하나 전환 초기에는 몇몇 요청이 인입되는 것으로 예상된다.

Wed 30 Nov 2022 09:50:32 PM KST		### 대략 10초간 old pod 1 로 인입되는 요청은 응답 실패하다 이 후부터 정상 응답한다.
 - testapp-5f6c5545cd-lprdh

...

Wed 30 Nov 2022 09:50:41 PM KST
 - testapp-5f6c5545cd-lprdh
 
Wed 30 Nov 2022 09:50:42 PM KST		## new pod 2 타겟 등록 시작
 - testapp-fc9974c74-qc6v9
 
Wed 30 Nov 2022 09:50:44 PM KST
 - testapp-5f6c5545cd-lprdh

3. New Pod 2 생성 완료

  • Pod 상태 확인
    • new pod 1 은 계속 Running 상태이다
    • new pod 2 의 pod readiness gate 가 통과하여 생성이 완료된다.
      • READINESS GATES 값이 1/1 로 변경되고 Running 상태가 된다.
    • old pod 2 가 제거된다.
Wed 30 Nov 2022 09:50:53 PM KST
NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-7gkq7   1/1     Running   0          35s     10.171.230.156   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           0/1
testapp-5f6c5545cd-lprdh   1/1     Running   0          74s     10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1
testapp-fc9974c74-qc6v9    1/1     Running   0          4m58s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1

Wed 30 Nov 2022 09:50:55 PM KST		## new pod 2 타겟 등록 완료
NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-7gkq7   1/1     Running   0          36s     10.171.230.156   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           0/1
testapp-5f6c5545cd-lprdh   1/1     Running   0          75s     10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1
testapp-fc9974c74-qc6v9    1/1     Running   0          4m59s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1

Wed 30 Nov 2022 09:50:56 PM KST
NAME                       READY   STATUS    RESTARTS   AGE    IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-7gkq7   1/1     Running   0          38s    10.171.230.156   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           0/1
testapp-5f6c5545cd-lprdh   1/1     Running   0          77s    10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1
testapp-fc9974c74-qc6v9    1/1     Running   0          5m1s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1

Wed 30 Nov 2022 09:50:58 PM KST		## new pod 2 생성 완료
NAME                       READY   STATUS        RESTARTS   AGE    IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-7gkq7   1/1     Running       0          39s    10.171.230.156   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-5f6c5545cd-lprdh   1/1     Running       0          78s    10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1
testapp-fc9974c74-qc6v9    1/1     Terminating   0          5m2s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1

Wed 30 Nov 2022 09:50:59 PM KST
NAME                       READY   STATUS        RESTARTS   AGE    IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-7gkq7   1/1     Running       0          41s    10.171.230.156   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-5f6c5545cd-lprdh   1/1     Running       0          80s    10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1
testapp-fc9974c74-qc6v9    0/1     Terminating   0          5m4s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1

...

Wed 30 Nov 2022 09:51:06 PM KST
NAME                       READY   STATUS        RESTARTS   AGE     IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-7gkq7   1/1     Running       0          48s     10.171.230.156   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-5f6c5545cd-lprdh   1/1     Running       0          87s     10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1
testapp-fc9974c74-qc6v9    0/1     Terminating   0          5m11s   10.171.232.42    ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1

Wed 30 Nov 2022 09:51:08 PM KST		## old pod 2 제거 완료
NAME                       READY   STATUS    RESTARTS   AGE   IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-7gkq7   1/1     Running   0          50s   10.171.230.156   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-5f6c5545cd-lprdh   1/1     Running   0          89s   10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1

Wed 30 Nov 2022 09:51:09 PM KST
NAME                       READY   STATUS    RESTARTS   AGE   IP               NODE                                                NOMINATED NODE   READINESS GATES
testapp-5f6c5545cd-7gkq7   1/1     Running   0          51s   10.171.230.156   ip-10-171-227-94.ap-northeast-2.compute.internal    <none>           1/1
testapp-5f6c5545cd-lprdh   1/1     Running   0          90s   10.171.179.106   ip-10-171-184-203.ap-northeast-2.compute.internal   <none>           1/1
  • 타겟 그룹 상태 확인
    • new pod 1 의 타겟은 Healthy 상태이다
    • new pod 2 생성이 완료되어 타겟 상태가 Healthy 가 된다.
    • old pod 2 의 타겟에 대한 제거가 시작된다.
      • deregister 가 시작되어 타겟 상태가 draining 이 된다.
      • 타겟이 draining 상태 변환 이후부턴 요청 인입 안되야 하나 전환 초기에는 몇몇 요청이 인입되는 것으로 보인다.
    • old pod 1,2 의 타겟은 ALB Deregistration Delay 에 설정된 값만큼 draining 상태를 지속하다 제거된다 (default 5분)
Wed 30 Nov 2022 09:50:53 PM KST
"initial"
"healthy"
"draining"
"healthy"

Wed 30 Nov 2022 09:50:55 PM KST		## new pod 2 타겟 등록 완료
"healthy"
"healthy"
"draining"
"healthy"

Wed 30 Nov 2022 09:50:56 PM KST
"healthy"
"healthy"
"draining"
"healthy"

Wed 30 Nov 2022 09:50:58 PM KST		## new pod 2 생성 완료
"healthy"
"healthy"
"draining"
"healthy"

Wed 30 Nov 2022 09:50:59 PM KST
"healthy"
"healthy"
"draining"
"draining"

...

Wed 30 Nov 2022 09:51:06 PM KST
"healthy"
"healthy"
"draining"
"draining"

Wed 30 Nov 2022 09:51:08 PM KST		## old pod 2 제거 완료
"healthy"
"healthy"
"draining"
"draining"

Wed 30 Nov 2022 09:51:09 PM KST
"healthy"
"healthy"
"draining"
"draining"
  • 신규 요청 상태 확인
    • old pod 2 와 new pod 1 로 요청을 보내다가 new pod 2 생성 완료 후부터 new pod 2 로 요청이 인입되기 시작한다
      • 이 후부턴 old pod 2 로는 더 이상 요청 인입이 안된다.
    • old pod 2 이 삭제 완료된 후 1건의 요청 실패가 발생한다.
      • 위와 동일한 이유로 예상된다
Wed 30 Nov 2022 09:50:54 PM KST
 - testapp-fc9974c74-qc6v9

Wed 30 Nov 2022 09:50:55 PM KST		## new pod 1 타겟 등록 완료
 - testapp-5f6c5545cd-lprdh
 
Wed 30 Nov 2022 09:50:56 PM KST
 - testapp-5f6c5545cd-lprdh

Wed 30 Nov 2022 09:50:57 PM KST		## new pod 2 생성 완료
 - testapp-5f6c5545cd-7gkq7
 
Wed 30 Nov 2022 09:50:59 PM KST		## 요청 실패 발생
 </html>><h1>504 Gateway Time-out</h1></center>d>	<- old pod 2 의 타겟이 draining 상태 변환 이후부턴 요청 인입 안되야 하나 전환 초기에는 몇몇 요청이 인입되는 것으로 예상된다.

Wed 30 Nov 2022 09:51:10 PM KST
 - testapp-5f6c5545cd-lprdh
 



테스트 결과

pod readiness gate 를 적용한 배포 테스트의 결과는 아래와 같다.

  1. 신규로 생성되는 pod 은 완전히 요청 처리가 가능한 상태일때만 Ready 상태가 된다.
    그로 인해 타겟 그룹은 항상 설정된 replica 수 만큼의 healthy 한 타겟을 확보할 수 있다.
  2. 이론적으로 draining 상태가 되면 해당 타겟으론 요청이 인입되선 안되지만 실제 환경에선 대략 10초간 인입이 있었고 응답 실패가 발생했다.

pod readiness gate 적용으로 인해 배포 간 인입되는 신규 요청에 대한 응답 실패는 상당히 줄일 수 있으나 AWS 내부적인 문제로 인해 완전한 무중단 배포를 구현하기는 다소 어려운 것으로 보인다.


outro

다소 제약이 있었지만 pod readiness gate 적용에 대한 의의와 효과는 충분히 확인되었다.
다음 포스트에서는 무중단 배포 실패의 두번째 경우인 "배포 과정에서 아직 처리 중인 기존 요청에 대해 응답 실패가 발생하는 경우" 에 대해 얘기하고자 한다.

profile
YLdot Padomaic

0개의 댓글

관련 채용 정보