EKS 1.31 → 1.32 업그레이드 검토사항

1.32 릴리즈된 내용 검토 https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/kubernetes-versions-standard.html

  1. 버전 1.32에서 FlowSchema 및 PriorityLevelConfiguration의 flowcontrol.apiserver.k8s.io/v1beta3 API 버전이 제거 이 API를 사용하는 경우 업그레이드하기 전에 지원되는 최신 버전을 사용하도록 구성을 업데이트 ㄴ 영향도 없음 (해당 API 미사용)

    # FlowSchema / PriorityLevelConfiguration 존재 여부 확인
    # API 버전 상관없이 모든 리소스 확인
    kubectl get flowschemas -o json | jq -r '.items[] | "\\(.metadata.name) - \\(.apiVersion)"'
    kubectl get prioritylevelconfigurations -o json | jq -r '.items[] | "\\(.metadata.name) - \\(.apiVersion)"'
    ㄴ 정상 출력 확인
    
    # v1beta3 버전 사용하는 리소스가 있는지 확인
    kubectl get flowschemas -o json | jq -r '.items[] | select(.apiVersion == "[flowcontrol.apiserver.k8s.io/v1beta3](<http://flowcontrol.apiserver.k8s.io/v1beta3>)") | .metadata.name'
    kubectl get prioritylevelconfigurations -o json | jq -r '.items[] | select(.apiVersion == "[flowcontrol.apiserver.k8s.io/v1beta3](<http://flowcontrol.apiserver.k8s.io/v1beta3>)") | .metadata.name'
    ㄴ v1beta3를 사용하는 FlowSchema가 없음
    
  2. ServiceAccount metadata.annotations[kubernetes.io/enforce-mountable-secrets]는 버전 1.32에서 더 이상 사용되지 않으며 향후 Kubernetes 마이너 버전 릴리스에서 제거될 예정 ㄴ 영향도 없음 (ServiceAccount 리소스에서 해당 annotation 미사용)

    # null이 아닌 annotations를 가진 SA 찾기
    kubectl get serviceaccounts -A -o json | jq -r '.items[] | select(.metadata.annotations != null) | "\\(.metadata.namespace)/\\(.metadata.name)"' | head -10
    ㄴ 정상 출력 확인
    
    # 모든 네임스페이스의 ServiceAccount에서 해당 annotation 확인
    kubectl get serviceaccounts -A -o json | \\
    jq -r '.items[] | select(.metadata.annotations["[kubernetes.io/enforce-mountable-secrets](<http://kubernetes.io/enforce-mountable-secrets>)"] != null) |
    "\\(.metadata.namespace)/\\(.metadata.name)"'
    
    # 또는 상세 정보 포함
    kubectl get serviceaccounts -A -o json | \\
    jq '.items[] | select(.metadata.annotations["[kubernetes.io/enforce-mountable-secrets](<http://kubernetes.io/enforce-mountable-secrets>)"] != null) |
    {namespace: .metadata.namespace, name: .metadata.name, annotation: .metadata.annotations["[kubernetes.io/enforce-mountable-secrets](<http://kubernetes.io/enforce-mountable-secrets>)"]}'
    ㄴ 해당 annotation을 사용하는 ServiceAccount가 없음
    
  3. Kubernetes 버전 1.32는 Amazon EKS가 Amazon Linux 2(AL2) AMI를 출시하는 마지막 버전 ㄴ 영향도 없음 ㄴ 사전에 AL2023 AMI 로 노드그룹 전환 완료

  4. 1.32 버전 추가 반영사항 (4-1)Memory Manager 기능은 Kubernetes 버전 1.32의 정식 버전(GA) 상태로 전환 (4-2) StatefulSets에서 생성한 PersistentVolumeClaims(PVC)에 자동 정리 기능이 포함 (4-3) 사용자 지정 리소스 필드 선택기(Field Selectors) 기능이 도입되어 개발자가 사용자 지정 리소스에 필드 선택기를 추가할 수 있음

  5. 익명 인증 관련 변경 사항 Amazon EKS 1.32부터 익명 인증은 다음 API 서버 상태 확인 엔드포인트로 제한 /healthz, /livez, /readyz ㄴ 해당 엔드포인트를 사용하지 않으면, 엔드포인트에 대한 요청은 401 Unauthorized HTTP 응답을 수신 ㄴ 노드 Target Group의 health check path가 /healthz ㄴ 영향도 없음 (/healthz는 1.32 이후에도 익명 접근 가능하므로 헬스체크는 정상 동작)

system:unauthenticated 권한 확인

ㄴ public-info-viewer RBAC 역할은 위에 나열된 상태 확인 엔드포인트에 계속 적용

# # kubectl get clusterrolebindings -o json | \\
> jq -r '.items[] | select(.subjects[]?.name == "system:unauthenticated" or .subjects[]?.name == "system:anonymous") | .metadata.name'
system:public-info-viewer
  1. Amazon Linux 2 AMI 사용 중단 Kubernetes 버전 1.33 이상의 경우 EKS는 사전 빌드된 최적화된 Amazon Linux 2(AL2) Amazon Machine Image(AMI)를 제공하지 않음 ㄴ Amazon Linux 2023(AL2023) 또는 Bottlerocket과 같은 최신 운영 체제로 마이그레이션할 것을 제안 ㄴ EKS 1.32 업그레이드 전, AL2023 노드그룹으로 전환 선작업 완료

사전준비

  1. 업그레이드할 EKS 버전에 맞는 Add-On(coredns, kube-proxy, vpc-cni) 버전 확인 및 검토

    Cluster Version 및 Add-Ons 버전 확인 (1.31 > 1.32) 
    cluster_version = "1.31"
    ㄴ 1.32
    
    변경할 Add-On 버전 조사
    coredns_version = "v1.11.3-eksbuild.1"          
    ㄴ "v1.11.4-eksbuild.2"							  # 1.32   default 버전 
    kube-proxy_version =  "v1.31.2-eksbuild.3"   	
    ㄴ "v1.32.6-eksbuild.12"							# 1.32   default 버전
    vpc-cni_version = "v1.19.0-eksbuild.1"            
    ㄴ "v1.20.4-eksbuild.1"							  # 1.32   default 버전
    
    aws 명령어로 차세대 bastion 에서 확인함
    $ eksctl utils describe-addon-versions --kubernetes-version 1.32 --name coredns |grep AddonVersion
    aws eks describe-addon-versions --kubernetes-version 1.32 --addon-name coredns --output json
    
    $ eksctl utils describe-addon-versions --kubernetes-version 1.32 --name kube-proxy  |grep AddonVersion
    aws eks describe-addon-versions --kubernetes-version 1.32 --addon-name kube-proxy --output json