현재 팀에서 사용하고 있는 eks 는 k8s 1.21 버전이다.
작년에 올라온 kubernetes blog 포스트 중에 1.21 버전에서 Graceful Node Shutdown 이 베타로 승격되었다는 내용이 있었다. 참고
뒤늦게 해당 포스트를 본 나는 "그럼 우리가 사용하는 eks 클러스터는 어떻게 되어 있지?" 하는 궁금증이 생겼다.
특히 현재 운영 중인 eks 클러스터의 노드는 다수가 Spot Instance 로 되어 있기 때문에 언제든 노드 셧다운이 발생할 수 있어서 위 기능이 꽤 필수적인 기능으로 생각되었다.
먼저 Graceful Node Shutdown 이 어떤 내용인지 간단하게 알아보면,
k8s 노드가 셧다운되거나 재시작이 되면 해당 노드에서 실행 중인 워크로드는 당연히 종료가 된다. 이때 노드를 바로 종료시키는 것이 아니고 각 어플리케이션에서 아직 실행 중인 요청을 정리하고 정상적으로 어플리케이션을 종료할 수 있도록 일정 시간(Grace Period) 동안 대기하는 것을 보장해주는 옵션이 있는데 이것이 Graceful Node Shutdown 이다.
블로그에 따르면 해당 기능은 systemd
의 Inhibitor Locks
기능을 통하여 구현됐다고 한다.
먼저 각 노드에서 실행 중인 kubelet 옵션 정보를 살펴보기 위해 아래와 같이 진행했다.
$ kubectl proxy
Starting to serve on 127.0.0.1:8001
$ 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
...
~이하 생략~
$ 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
}
}
위의 요청 결과를 보면 아랫 부분에 shutdownGracePeriod
와 shutdownGracePeriodCriticalPods
설정이 있는데 해당 부분이 Graceful Node Shutdown 에 대한 옵션이다.
그런데 0s
로 되어있다.
그렇다면 노드 종료시 아직 처리 중인 요청의 완료를 기다려주지 않고 바로 종료시키는 것으로 보이는데...
설마 진짜로?
그래도 eks 인데 설마하는 생각에 추가로 간단한 웹어플리케이션을 올려서 직접 노드를 내리는 테스트를 해봐야지 생각했다.
그런데 소스 빌드하고 도커이미지 만들고 레지스트리 등록하고 클러스터에 배포하고...
너무 성가신 절차를 거쳐야 하기에 해당 테스트는 다음 포스트에서 이어서 하고자 한다. :)