k8s Graceful Node Shutdown #1

YL. Gho·2022년 9월 12일
0

Kubernetes

목록 보기
1/5
post-thumbnail

intro

현재 팀에서 사용하고 있는 eks 는 k8s 1.21 버전이다.
작년에 올라온 kubernetes blog 포스트 중에 1.21 버전에서 Graceful Node Shutdown 이 베타로 승격되었다는 내용이 있었다. 참고

뒤늦게 해당 포스트를 본 나는 "그럼 우리가 사용하는 eks 클러스터는 어떻게 되어 있지?" 하는 궁금증이 생겼다.
특히 현재 운영 중인 eks 클러스터의 노드는 다수가 Spot Instance 로 되어 있기 때문에 언제든 노드 셧다운이 발생할 수 있어서 위 기능이 꽤 필수적인 기능으로 생각되었다.

Graceful Node Shutdown

먼저 Graceful Node Shutdown 이 어떤 내용인지 간단하게 알아보면,

k8s 노드가 셧다운되거나 재시작이 되면 해당 노드에서 실행 중인 워크로드는 당연히 종료가 된다. 이때 노드를 바로 종료시키는 것이 아니고 각 어플리케이션에서 아직 실행 중인 요청을 정리하고 정상적으로 어플리케이션을 종료할 수 있도록 일정 시간(Grace Period) 동안 대기하는 것을 보장해주는 옵션이 있는데 이것이 Graceful Node Shutdown 이다.

블로그에 따르면 해당 기능은 systemdInhibitor Locks 기능을 통하여 구현됐다고 한다.

노드 옵션 확인

먼저 각 노드에서 실행 중인 kubelet 옵션 정보를 살펴보기 위해 아래와 같이 진행했다.

  1. k8s 클러스터 API 와 통신을 위해 proxy 셋업을 실행한다(필수는 아니다)
$ kubectl proxy
Starting to serve on 127.0.0.1:8001
  1. 노드 정보를 확인한다.
$ kubectl get node
NAME                                                STATUS   ROLES    AGE     VERSION
ip-xxx-xxx-112-112.ap-northeast-2.compute.internal   Ready    <none>   9d      v1.21.5-eks-9017834
ip-xxx-xxx-119-110.ap-northeast-2.compute.internal   Ready    <none>   45d     v1.21.5-eks-9017834
ip-xxx-xxx-126-61.ap-northeast-2.compute.internal    Ready    <none>   62d     v1.21.5-eks-9017834
ip-xxx-xxx-129-57.ap-northeast-2.compute.internal    Ready    <none>   45d     v1.21.5-eks-9017834
...
~이하 생략~
  1. Custom API 요청을 전달한다.
$ curl -sSL "http://localhost:8001/api/v1/nodes/ip-xxx-xxx-112-112.ap-northeast-2.compute.internal/proxy/configz" | jq

{
  "kubeletconfig": {
    "enableServer": true,
    "syncFrequency": "1m0s",
    "fileCheckFrequency": "20s",
    "httpCheckFrequency": "20s",
    "address": "0.0.0.0",
    "port": 10250,
    "tlsCipherSuites": [
      "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
      "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
      "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
      "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
      "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
      "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
      "TLS_RSA_WITH_AES_256_GCM_SHA384",
      "TLS_RSA_WITH_AES_128_GCM_SHA256"
    ],
...  
~중략~
...
    "enableSystemLogHandler": true,
    "shutdownGracePeriod": "0s",
    "shutdownGracePeriodCriticalPods": "0s",
    "enableProfilingHandler": true,
    "enableDebugFlagsHandler": true
  }
}

위의 요청 결과를 보면 아랫 부분에 shutdownGracePeriodshutdownGracePeriodCriticalPods 설정이 있는데 해당 부분이 Graceful Node Shutdown 에 대한 옵션이다.

그런데 0s 로 되어있다.

그렇다면 노드 종료시 아직 처리 중인 요청의 완료를 기다려주지 않고 바로 종료시키는 것으로 보이는데...
설마 진짜로?

outro

그래도 eks 인데 설마하는 생각에 추가로 간단한 웹어플리케이션을 올려서 직접 노드를 내리는 테스트를 해봐야지 생각했다.
그런데 소스 빌드하고 도커이미지 만들고 레지스트리 등록하고 클러스터에 배포하고...
너무 성가신 절차를 거쳐야 하기에 해당 테스트는 다음 포스트에서 이어서 하고자 한다. :)

profile
YLdot Padomaic

0개의 댓글

관련 채용 정보