고기 대신 SW 한점/Public Cloud

Amazon EKS Version

지식한점 2022. 11. 9. 13:37
반응형

EKS는 기본적으로 오픈 소스 Kubernetes(이하, k8s)를 수정하지 않습니다. EKS는 업스트림 및 인증된 k8s 버전을 포함해서 오픈 소스와의 일관성을 유지하기 위해 보안 수정 사항을 backporting를 진행합니다.

k8s 운영의 복잡도를 줄이기 위한 EKS는 k8s API의 모든 GA 기능을 지원하고, 기본적으로 활성화되어 있는 알파 기능을 제외한 모든 베타 기능도 지원합니다.

또한, 업스트림 버전을 장기간 지원하는데 EKS는 최대 4가지 버전의 k8s를 지원하기 때문에 운영단에서 롤아웃 업그레이드를 수행할 수 있는 충분한 시간을 제공합니다. 그 일환으로 AWS는 현재 커뮤니티에서 지원하지 않을 수도 있는 k8s에 대한 패치, 수정 및 업그레이드를 backporting하고 있습니다. 업스트림 k8s가 EKS에서 제공되는 버전을 더 이상 지원하지 않는 경우를 포함해서 EKS에서 처음 제공된 후 14개월 동안 지원됩니다. 서비스 지원 끝나기 60일 이전부터 notfication이 발생하고 서포트 기간이 끝나면 control plane이 다음 버전으로 자동 업그레이드됩니다.

https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html

 

Amazon EKS Kubernetes versions - Amazon EKS

If you update the control plane, you must still update the Fargate nodes yourself. To update Fargate nodes, delete the Fargate pod represented by the node and redeploy the pod. The new pod is deployed with a kubelet version that's the same version as your

docs.aws.amazon.com

Amazon EKS Kubernetes versions - Amazon EKS

이후, 클러스터 add-on 및 worker node는 수동으로 업그레이드가 필요합니다. worker node의 경우, 고객 어카운트에 있기 때문에 AWS가 컨트롤이 불가능합니다. (책임 공유 모델)

2022년 5월 시점 사용가능한 EKS 마이너 버전은 1.22 , 1.21, 1.20, 1.19 입니다.

 

권고사항

EKS 관리 기능을 사용하여 업그레이드 간소화를 하고, 점진적으로 1년에 2~3 회의 버전 업그레이드를 진행하는 것이 Best Practice입니다.

  • 테스트 환경에서 먼저 프로세스 진행 후, 프로덕션에서 진행
  • 실제 application 테스트 진행 권고
  • 애플리케이션 manifest 테스트 (클러스터 버전에 따라 deprecated API 존재)
  • Add-on 호환 버전 확인
    • Amazon VPC CNI
    • CoreDNS
    • kube-proxy
    • Amazon EBS CSI
    • AWS Load Balancer Controller
    • Fluent Bit
    • AWS NTF(node termination handler)
    • 3rd Party (argo-cd, prometheus, cluster autoscaler, KEDA, Metrics Server, Istio, Karpenter, cert-manager)
  • Deprecated API 혹은 apiVersion 업그레이드 시 kubectl convert로 가능합니다.
    Amazon EKS Kubernetes versions - Amazon EKS
  • Dockershim 지원 중단
    • AWS EKS v1.23 부터는 Dockershim 지원이 제거 될 예정입니다. CRI 를 Containerd 나 CRI-O 로 변경을 진행해야 합니다.
    • Detector for Docker Socket (DDS) 도구를 이용해서 클러스터 내에 docker.sock 볼륨을 사용하는 파드(deployment, job/cron, statefulset, daemonset) 를 검출할 수 있습니다.
# Detector for Docker Socket (DDS) 플러그인 설치 
kubectl krew install dds

# 검출 테스트를 위해 샘플 리소스 배포
git clone https://github.com/aws-containers/kubectl-detector-for-docker-socket 
kubectl apply -f kubectl-detector-for-docker-socket/test/manifests/

# 모든 네임스페이스 내에서 검출 
kubectl dds

NAMESPACE    TYPE        NAME            STATUS
default        deployment    deploy-docker-volume    mounted
default        daemonset    ds-docker-volume    mounted
default        statefulset    ss-docker-volume    mounted
default        job        job-docker-volume    mounted
kube-system    pod        pod-docker-volume    mounted
test1        deployment    deploy-docker-volume    mounted

# 삭제 
kubectl delete -f kubectl-detector-for-docker-socket/test/manifests/

KS 업그레이드 기본 권장 순서

Amazon EKS 클러스터 Kubernetes 버전 업데이트 - Amazon EKS 

  1. Upgrade the cluster control plane
  2. Upgrade the nodes in your cluster
  3. Update your Kubernetes add-ons and custom controllers, as required
  4. Update your Kubernetes manifests, as require

관리형 노드 그룹 업그레이드

  • Auto Scaling Group 생성 후 클러스터와 연결
  • EKS Optimized AMI, Ubuntu Optimized AMI, Bottlerocket AMI, 혹은 custom AMI 지원
  • ContainerD 등 추가 요구사항을 반영한 Launch Template 생성
  • 인스턴스 상태를 모니터링하고 이슈 발생 시 콘솔이나 CloudWatch를 통해 정보 제공
  • k8s API를 이용하여 Termination 과정에서 노드에 대한 자동화된 drain
  • AMI에 대한 롤링 업데이트 지원 및 Pod Disruption Budget 지원

업그레이드 프로세스

  1. 신규 Launch Configuration (Template) 생성
  2. Auto Scaling Group 을 1로 변경
  3. 노드에 대한 Drain 및 Cordon
  4. 구버전 AMI 종료
  5. Auto Scaling Group을 기존 설정으로 변경

 

싱글 클러스터 업그레이드 전략

  • 적은 비용으로 업그레이드 가능
  • 기존 시스템을 크게 변경할 필요가 없습니다.
  • 노드 그룹과 cordon, drain, eviction 을 사용하여 무중단 업그레이드 가능
  • 테스트 환경, 소규모 워크로드 등에 적합

Control Plane

  • 하나의 버전씩 업그레이드를 진행합니다.

Data Plane(Worker Node)

  • 노드 그룹 버전 업데이트
    • 기본적으로 노드는 한 번에 하나씩 업데이트를 진행합니다. 배포된 애플리케이션이 높은 수준의 중단을 허용할 경우, 작업 병렬 수준을 높여 노드 그룹 버전 업데이트를 완료하는데 걸리는 시간을 줄일 수 있습니다. 노드 개수가 많을 경우 비율로 설정하는 것이 유용합니다.
    • 서비스 불가능 노드(최대)는 숫자 혹은 비율로 설정가능
    • Rolling Update(PDB 준수)/Force Update
  • Launch Template 버전 변경
    • 관리형 노드 그룹(managed node group)은 항상 EC2 Auto Scaling 그룹에서 사용할 시작 템플릿과 함께 배포하고 실제 콘솔창에서 확인 가능합니다. Amazon EKS API는 사용자가 제공한 템플릿을 복사하거나 계정의 기본값으로 자동 생성해서 시작 템플릿을 생성합니다. 커스텀한 옵션이 많을 경우 사용하는 것이 적절. 업데이트 시, 새로운 노드 그룹 생성 후, 진행합니다.

Add-ons

Workloads

 

용어 설명

  • Cordon: 특정 노드를 선택하여 스케줄 대상에서 제외합니다. 선택한 특정 노드가 SchedulingDisabled 상태로 변함.
  • Drain: 지정된 노드에 있는 파드를 다른 곳으로 이동시킴 (drain 완료하면 cordon 상태가 됨)
  • Pod Disruption Budget(PDB): 1.21 이상 버전에서 stable한 기능으로 자발적 중단이 발생하는 경우, 고가용성 애플리케이션을 실행하는데 도움이 되는 기능입니다. PDB는 자발적 중단으로 일시에 중지되는 복제된 애플리케이션 파드 수를 제한하고 쿼럼 방식을 사용합니다.
  • Eviction API: 예를 들어 5개 replica가 있는 경우, PDB가 특정 시점에 파드를 4개 허용한다면 Eviction API는 한 번에 1개의 파드의 자발적인 중단을 허용합니다.

 

*참고

 
반응형