높은 DNS 트래픽을 위한 CoreDNS Pod 스케일링
높은 DNS 트래픽을 위한 CoreDNS Pod 스케일링
노드를 하나 이상 포함해 Amazon EKS 클러스터를 시작하면 클러스터에 배포된 노드 수와 관계없이 CoreDNS 이미지 복제본 두 개의 Deployment가 기본적으로 배포됩니다. CoreDNS Pod는 클러스터의 모든 Pod에 이름 확인을 제공합니다. 애플리케이션은 이름 확인을 사용해 클러스터 안의 Pod와 서비스에 연결하고 클러스터 밖의 서비스에도 연결합니다. Pod에서 이름 확인(쿼리) 요청 수가 늘어나면 CoreDNS Pod가 과부하되어 느려지고, 처리가 불가능한 요청을 거부할 수 있습니다.
CoreDNS Pod의 증가한 부하를 처리하려면 CoreDNS용 자동 스케일링 시스템을 고려하세요. Amazon EKS는 CoreDNS의 EKS Add-on 버전에서 CoreDNS Deployment의 자동 스케일링을 관리할 수 있습니다. 이 CoreDNS 자동 스케일러는 노드 수와 CPU 코어 수를 포함한 클러스터 상태를 지속적으로 모니터링합니다. 이를 기반으로 컨트롤러는 EKS 클러스터에서 CoreDNS 배포의 복제본 수를 동적으로 조정합니다. 이 기능은 CoreDNS v1.9 이상에서 작동합니다. CoreDNS Autoscaling과 호환되는 버전에 대한 자세한 내용은 다음 섹션을 참조하세요.
기본적으로 이 시스템은 클러스터의 노드 수와 CPU 코어 수를 모두 기반으로 하는 동적 공식을 사용해 CoreDNS 복제본을 자동으로 관리합니다. 공식은 (numberOfNodes를 16으로 나눈 값)과 (numberOfCPUCores를 256으로 나눈 값) 중 최대값을 계산합니다. 시스템은 10분 피크 기간 동안 수요를 평가하고 DNS 쿼리 부하 증가를 처리하기 위해 필요할 때 즉시 스케일 업합니다. 시스템은 3분마다 복제본을 33%씩 줄여 시스템 안정성을 유지하고 중단을 피하며 점진적으로 스케일 다운합니다.
EKS Add-on 구성을 통해 nodesPerReplica와 cpuCoresPerReplica 스케일링 매개변수를 조정할 수 있습니다.
nodesPerReplica: CoreDNS 복제본당 노드 수. 기본값은16입니다. 값이 작을수록 특정 노드 수에 대해 자동 스케일링이 유지하는 복제본 수가 늘어납니다.cpuCoresPerReplica: CoreDNS 복제본당 CPU 코어 수. 기본값은256입니다. 값이 작을수록 특정 CPU 코어 수에 대해 자동 스케일링이 유지하는 복제본 수가 늘어납니다.
자동 스케일링은 계산된 두 복제본 수 중 더 큰 값을 사용하고 결과를 minReplicas와 maxReplicas 사이로 제한합니다. nodesPerReplica 또는 cpuCoresPerReplica를 사용하려면 CoreDNS Add-on이 클러스터의 Kubernetes 버전에 대한 최소 버전이어야 합니다. 자세한 내용은 고급 스케일링 매개변수의 최소 EKS Add-on 버전을 참조하세요.
이 기능을 다른 EKS Cluster Autoscaling 모범 사례와 함께 사용해 전체 애플리케이션 가용성과 클러스터 확장성을 개선할 것을 권장합니다.
출처: 문서
본문
사전 요구 사항
Amazon EKS가 CoreDNS 배포를 스케일링하려면 다음 사전 요구 사항을 충족해야 합니다.
- CoreDNS의 EKS Add-on 버전을 사용해야 합니다.
nodesPerReplica또는cpuCoresPerReplica를 구성하려면 다음 섹션에 표시된 대로 클러스터의 Kubernetes 버전에 기반한 최소 CoreDNS Add-on 버전을 사용해야 합니다.
고급 스케일링 매개변수의 최소 EKS Add-on 버전
다음 표는 nodesPerReplica와 cpuCoresPerReplica 스케일링 매개변수를 사용하기 위해 각 Kubernetes 버전에 필요한 최소 CoreDNS Add-on 버전을 나열합니다.
| Kubernetes 버전 | CoreDNS 버전 |
|---|---|
| 1.36 | v1.14.3-eksbuild.16 |
| 1.35 | v1.14.3-eksbuild.16 |
| 1.34 | v1.13.2-eksbuild.24 |
| 1.33 | v1.12.4-eksbuild.31 |
| 1.32 | v1.11.4-eksbuild.53 |
| 1.31 | v1.11.4-eksbuild.53 |
CoreDNS용 EKS Add-on( self-managed CoreDNS Deployment가 아닌)이 있는지 확인합니다.
클러스터를 만든 도구에 따라 현재 Amazon EKS 추가 기능 유형이 클러스터에 설치되어 있지 않을 수 있습니다. 클러스터에 어떤 유형의 추가 기능이 설치되어 있는지 확인하려면 다음 명령을 실행할 수 있습니다. my-cluster를 클러스터 이름으로 바꿉니다.
aws eks describe-addon --cluster-name my-cluster --addon-name coredns --query addon.addonVersion --output text
버전 번호가 반환되면 클러스터에 Amazon EKS 유형의 추가 기능이 설치되어 있는 것이므로 다음 단계로 계속할 수 있습니다. 오류가 반환되면 클러스터에 Amazon EKS 유형의 추가 기능이 설치되어 있지 않은 것입니다. self-managed 버전을 Amazon EKS 추가 기능으로 교체하려면 CoreDNS Amazon EKS 추가 기능 생성 절차의 나머지 단계를 완료하세요.
CoreDNS용 EKS Add-on이 최소 EKS Add-on 버전과 같거나 높은 버전인지 확인합니다.
클러스터에 설치된 추가 기능 버전을 확인합니다. AWS Management Console에서 확인하거나 다음 명령을 실행할 수 있습니다.
kubectl describe deployment coredns --namespace kube-system | grep coredns: | cut -d : -f 3
예시 출력은 다음과 같습니다.
v1.10.1-eksbuild.13
이 버전을 이전 섹션의 최소 EKS Add-on 버전과 비교합니다. 필요한 경우 CoreDNS Amazon EKS 추가 기능 업데이트 절차에 따라 EKS Add-on을 더 높은 버전으로 업그레이드합니다.
AWS Management Console로 자동 스케일링 구성
EKS Add-on의 Optional configuration settings에 자동 스케일링 구성을 추가합니다.
- Amazon EKS 콘솔을 엽니다.
- 왼쪽 탐색 창에서 클러스터(Clusters)를 선택한 다음 추가 기능을 구성할 클러스터의 이름을 선택합니다.
- Add-ons 탭을 선택합니다.
- CoreDNS 추가 기능 상자 오른쪽 위의 체크박스를 선택한 다음 편집(Edit)을 선택합니다.
- Configure CoreDNS 페이지에서:
- 사용할 버전(Version)을 선택합니다. 이전 단계와 같은 버전을 유지하고 버전과 구성을 별도의 작업으로 업데이트할 것을 권장합니다.
- Optional configuration settings를 펼칩니다.
- Configuration values에 JSON 키
"autoscaling":과 키"enabled":·값true를 가진 중첩 JSON 객체 값을 입력합니다. 결과 텍스트는 유효한 JSON 객체여야 합니다. 이 키와 값이 텍스트 상자의 유일한 데이터라면 키와 값을 중괄호{ }로 감쌉니다. 다음 예시는 자동 스케일링이 활성화된 것을 보여 줍니다.
다음 예시는 최소/최대 복제본 값과 함께 자동 스케일링이 활성화된 것을 보여 줍니다. 클러스터의 DNS 서비스에 복원력을 제공하려면 CoreDNS Pod의 최소 수가 항상 2보다 크도록 권장합니다.{ "autoScaling": { "enabled": true } }
다음 예시는{ "autoScaling": { "enabled": true, "minReplicas": 2, "maxReplicas": 10 } }nodesPerReplica와cpuCoresPerReplica스케일링 매개변수도 설정합니다. 이 키에는 최소 CoreDNS Add-on 버전이 필요합니다. 자세한 내용은 고급 스케일링 매개변수의 최소 EKS Add-on 버전을 참조하세요.{ "autoScaling": { "enabled": true, "minReplicas": 2, "maxReplicas": 10, "nodesPerReplica": 5, "cpuCoresPerReplica": 256 } }
- CoreDNS Pod를 교체해 새 구성을 적용하려면 변경 사항 저장(Save changes)을 선택합니다.
Amazon EKS는 CoreDNS용 Kubernetes Deployment의 롤아웃을 사용해 EKS Add-on에 변경 사항을 적용합니다. AWS Management Console의 추가 기능 Update history와 kubectl rollout status deployment/coredns --namespace kube-system으로 롤아웃 상태를 추적할 수 있습니다.
kubectl rollout에는 다음 명령이 있습니다.
kubectl rollout
history -- View rollout history
pause -- Mark the provided resource as paused
restart -- Restart a resource
resume -- Resume a paused resource
status -- Show the status of the rollout
undo -- Undo a previous rollout
롤아웃이 너무 오래 걸리면 Amazon EKS가 롤아웃을 되돌리며, 추가 기능의 Update history에 유형이 Addon Update이고 상태가 Failed인 메시지가 추가됩니다. 문제를 조사하려면 롤아웃의 history부터 시작하고 CoreDNS Pod에서 kubectl logs를 실행해 CoreDNS 로그를 확인하세요.
Update history의 새 항목 상태가 Successful이면 롤아웃이 완료되었으며 추가 기능이 모든 CoreDNS Pod에서 새 구성을 사용하고 있는 것입니다. 클러스터의 노드 수와 노드의 CPU 코어 수를 변경하면 Amazon EKS가 CoreDNS 배포의 복제본 수를 스케일링합니다.
AWS CLI로 자동 스케일링 구성
CoreDNS용 EKS Add-on( self-managed CoreDNS Deployment가 아닌)이 있는지 확인합니다.
클러스터를 만든 도구에 따라 현재 Amazon EKS 추가 기능 유형이 클러스터에 설치되어 있지 않을 수 있습니다. 클러스터에 어떤 유형의 추가 기능이 설치되어 있는지 확인하려면 다음 명령을 실행할 수 있습니다. my-cluster를 클러스터 이름으로 바꿉니다.
aws eks describe-addon --cluster-name my-cluster --addon-name coredns --query addon.addonVersion --output text
버전 번호가 반환되면 클러스터에 Amazon EKS 유형의 추가 기능이 설치되어 있는 것입니다. 오류가 반환되면 클러스터에 Amazon EKS 유형의 추가 기능이 설치되어 있지 않은 것입니다. self-managed 버전을 Amazon EKS 추가 기능으로 교체하려면 CoreDNS Amazon EKS 추가 기능 생성 절차의 나머지 단계를 완료하세요.
CoreDNS용 EKS Add-on이 최소 EKS Add-on 버전과 같거나 높은 버전인지 확인합니다.
클러스터에 설치된 추가 기능 버전을 확인합니다. AWS Management Console에서 확인하거나 다음 명령을 실행할 수 있습니다.
kubectl describe deployment coredns --namespace kube-system | grep coredns: | cut -d : -f 3
예시 출력은 다음과 같습니다.
v1.10.1-eksbuild.13
이 버전을 이전 섹션의 최소 EKS Add-on 버전과 비교합니다. 필요한 경우 CoreDNS Amazon EKS 추가 기능 업데이트 절차에 따라 EKS Add-on을 더 높은 버전으로 업그레이드합니다.
EKS Add-on의 Optional configuration settings에 자동 스케일링 구성을 추가합니다.
다음 AWS CLI 명령을 실행합니다. my-cluster를 클러스터 이름으로, IAM 역할 ARN을 사용 중인 역할로 바꿉니다.
aws eks update-addon --cluster-name my-cluster --addon-name coredns \
--resolve-conflicts PRESERVE --configuration-values '{"autoScaling":{"enabled":true}}'
Amazon EKS는 CoreDNS용 Kubernetes Deployment의 롤아웃을 사용해 EKS Add-on에 변경 사항을 적용합니다. AWS Management Console의 추가 기능 Update history와 kubectl rollout status deployment/coredns --namespace kube-system으로 롤아웃 상태를 추적할 수 있습니다.
kubectl rollout에는 다음 명령이 있습니다.
kubectl rollout
history -- View rollout history
pause -- Mark the provided resource as paused
restart -- Restart a resource
resume -- Resume a paused resource
status -- Show the status of the rollout
undo -- Undo a previous rollout
롤아웃이 너무 오래 걸리면 Amazon EKS가 롤아웃을 되돌리며, 추가 기능의 Update history에 유형이 Addon Update이고 상태가 Failed인 메시지가 추가됩니다. 문제를 조사하려면 롤아웃의 history부터 시작하고 CoreDNS Pod에서 kubectl logs를 실행해 CoreDNS 로그를 확인하세요.
(선택 사항) 자동 스케일링이 CoreDNS Pod 수를 스케일링할 수 있는 최소 및 최대 값을 제공할 수 있습니다.
다음 예시는 최소/최대 복제본 값과 함께 자동 스케일링이 활성화된 것을 보여 줍니다. 클러스터의 DNS 서비스에 복원력을 제공하려면 CoreDNS Pod의 최소 수가 항상 2보다 크도록 권장합니다.
aws eks update-addon --cluster-name my-cluster --addon-name coredns \
--resolve-conflicts PRESERVE --configuration-values '{"autoScaling":{"enabled":true,"minReplicas":2,"maxReplicas":10}}'
(선택 사항) nodesPerReplica와 cpuCoresPerReplica 스케일링 매개변수도 설정할 수 있습니다. 이 키에는 최소 CoreDNS Add-on 버전이 필요합니다. 자세한 내용은 고급 스케일링 매개변수의 최소 EKS Add-on 버전을 참조하세요.
aws eks update-addon --cluster-name my-cluster --addon-name coredns \
--resolve-conflicts PRESERVE --configuration-values '{"autoScaling":{"enabled":true,"minReplicas":2,"maxReplicas":10,"nodesPerReplica":5,"cpuCoresPerReplica":256}}'
다음 명령을 실행해 추가 기능 업데이트 상태를 확인합니다.
aws eks describe-addon --cluster-name my-cluster --addon-name coredns
"status": "ACTIVE" 줄이 보이면 롤아웃이 완료되었으며 추가 기능이 모든 CoreDNS Pod에서 새 구성을 사용하고 있는 것입니다. 클러스터의 노드 수와 노드의 CPU 코어 수를 변경하면 Amazon EKS가 CoreDNS 배포의 복제본 수를 스케일링합니다.