최신 Amazon Machine Image(AMI) 버전을 사용하여 Amazon Elastic Kubernetes Service(Amazon EKS) 노드 그룹을 업데이트하고 싶습니다.
간략한 설명
Amazon EKS의 최신 릴리스에는 노드 그룹 업데이트를 위한 새 버전의 Amazon AMI도 포함되어 있습니다. 워크로드가 여러 노드 그룹에 배포되어 있는 고객은 릴리스 주기에 맞춰 노드를 업데이트해야 하는 과제에 직면합니다.
관리형 노드 그룹 업데이트를 시작하면 Amazon EKS가 자동으로 노드를 업데이트해 줍니다. Amazon EKS에 최적화된 AMI를 사용하는 경우, Amazon EKS는 최신 AMI 릴리스 버전의 일부로 최신 보안 패치와 운영 체제 업데이트를 노드에 자동으로 적용합니다. 업데이트를 구현하기 위해 AWS Auto Scaling은 노드 그룹에 노드가 있는 모든 가용 영역에서 노드를 시작합니다. 또한 이 서비스는 가용 영역을 재조정합니다. 기존 노드는 한 번만 드레인되므로 시작 단계는 성공합니다. 스케일 다운 단계에서는 Auto Scaling 그룹의 최대 크기와 원하는 크기를 하나씩 줄여 업데이트 이전 값으로 되돌립니다. 자세한 내용은 관리형 노드 업데이트 동작의 ‘스케일 다운 단계’를 참조하세요.
해결 방법
이 업데이트 프로세스 중에 다음 오류 중 일부가 표시될 수 있으며, 발생되는 오류에 따라 자체적으로 완화 단계를 수행해야 합니다. 이러한 문제를 미리 파악하면 가동 중지 시간을 최소화할 수 있습니다. 업데이트 오류에 대한 자세한 내용은 관리형 노드 업데이트 동작을 참조하세요.
PodEvictionFailure로 인한 업데이트 실패
Error message : Reached max retries while trying to evict pods from nodes in node group.
이 오류는 PodEvictionFailure가 업그레이드를 차단했음을 나타냅니다. 포드가 15분 이내에 노드를 떠나지 않고 force 플래그가 없으면 PodEvictionFailure 오류와 함께 업그레이드 단계가 실패합니다.
업그레이드 단계에서 PodEvictionFailure 오류가 발생하는 이유는 다음과 같습니다.
적극적인 PDB(포드 중단 예산)
동일한 포드에 대한 PDB가 여러 개 있는 경우 포드에 적극적 PDB가 정의됩니다.
PDB는 특정 포드 클래스에 대해 주어진 시간에 허용되는 중단 횟수(장애 예산)를 나타냅니다. 자발적 중단으로 인해 서비스의 포드가 예산 이하로 떨어질 때마다 예산이 유지될 때까지 운영이 일시 중지됩니다. 노드 드레인 이벤트는 더 많은 포드를 사용할 수 있게 될 때까지 일시적으로 중단되므로 포드 제거로 인해 예산이 초과되는 일이 발생하지 않습니다. 자세한 내용은 Kubernetes 웹 사이트의 Disruptions(중단)를 참조하세요.
원활한 관리형 노드 그룹 업데이트를 확인하려면 포드 중단 예산을 일시적으로 제거하거나 force 옵션을 사용하여 업데이트해야 합니다. 이 옵션은 포드 중단 예산을 따르지 않습니다. 대신 이 옵션은 노드를 강제로 재시작하여 업데이트를 구현합니다.
참고: 앱이 Quorum 기반 애플리케이션인 경우 force 옵션을 사용하면 애플리케이션이 일시적으로 사용 불가 상태가 될 수 있습니다.
다음 명령을 실행하여 클러스터에 PDB가 구성되어 있는지 확인합니다.
$ kubectl get pdb --all-namespaces
또는 Amazon EKS 콘솔에서 감사 로깅을 설정한 경우 다음 단계를 따릅니다.
1. Clusters(클러스터) 탭의 목록에서 원하는 클러스터(예: rpam-eks-qa2-control-plane)를 선택합니다.
2. Logging(로깅) 탭에서 Audit(감사)을 선택합니다. 그러면 Amazon CloudWatch 콘솔로 리디렉션됩니다.
3. CloudWatch 콘솔에서 Logs(로그)를 선택합니다. 그런 다음 Log Insights(로그 인사이트)를 선택하고 다음 쿼리를 실행합니다.
fields @timestamp, @message
| filter @logStream like "kube-apiserver-audit"
| filter ispresent(requestURI)
| filter objectRef.subresource = "eviction"
| display @logStream, requestURI, responseObject.message
| stats count(*) as retry by requestURI, responseObject.message
4. 오른쪽 상단에서 Custom(사용자 지정)을 선택하여 업데이트 날짜를 확인합니다. 적극적인 PDB로 인해 노드 그룹 업데이트가 실패하는 경우 resposeObject.message는 포드 제거 실패의 원인을 설명합니다.
5. PDB로 인해 오류가 발생한 경우 다음 명령을 사용하여 PDB를 수정합니다. 그런 다음 노드 그룹을 다시 업그레이드합니다.
$ kubectl edit pdb pdb_name;
모든 테인트를 허용하는 배포
모든 포드가 제거되면 이전 단계에서 노드가 오염되었기 때문에 노드가 비어 있게 됩니다. 그러나 배포가 모든 테인트를 허용한다면 노드가 비어 있지 않을 가능성이 커서 포드 제거 실패로 이어질 수 있습니다. 자세한 내용은 Kubernetes 웹 사이트의 Taints and tolerations(테인트 및 허용)를 참조하세요.
잘못된 릴리스 버전으로 인한 업데이트 실패
Error Message: Requested release version 1.xx is not valid for kubernetes version 1.xx.
이 문제를 해결하려면 upgrade 명령을 다시 실행합니다. 이 명령은 노드 그룹을 컨트롤 플레인의 Kubernetes 버전과 동일한 버전으로 업그레이드합니다.
eksctl upgrade nodegroup --name=test --cluster=test --kubernetes-version=1.xx
참고: 1.xx 버전을 Amazon EKS 컨트롤 플레인에서 지원하는 버전으로 교체하세요.
노드 그룹에 상태 문제가 있어서 업데이트 실패
Error message: Nodegroup has health issue other than [ AsgInstanceLaunchFailures, InstanceLimitExceeded, InsufficientFreeAddresses, ClusterUnreachable]
이 오류는 노드 그룹의 Auto Scaling 그룹을 다른 버전의 Amazon Elastic Compute Cloud(Amazon EC2) 시작 템플릿을 사용하도록 수동으로 수정한 경우 발생합니다. 또는 노드 그룹과 연결된 템플릿 버전을 삭제했을 수 있습니다. EKS 노드 그룹이 Auto Scaling 그룹의 시작 템플릿과 충돌하는 기본 시작 템플릿을 사용합니다. 이 시작 템플릿으로 인해 EKS는 노드 그룹을 성능이 저하된 것으로 표시합니다.
시작 템플릿을 아직 삭제하지 않은 경우 Auto Scaling 그룹의 시작 템플릿 버전을 다시 적절한 버전으로 직접 변경합니다. 이 작업은 노드 그룹을 정상 및 활성 상태로 되돌립니다. 이제 업데이트 프로세스를 다시 시작할 수 있습니다.