Answer:
---
search:
  exclude: true
---

# EKS 데이터 플레인

가용성과 복원력이 뛰어난 애플리케이션을 운영하려면 가용성과 복원력이 뛰어난 데이터 플레인이 필요합니다. 탄력적인 데이터 플레인을 사용하면 쿠버네티스가 애플리케이션을 자동으로 확장하고 복구할 수 있습니다. 복원력이 뛰어난 데이터 플레인은 2개 이상의 워커 노드로 구성되며, 워크로드에 따라 확장 및 축소될 수 있으며 장애 발생 시 자동으로 복구할 수 있습니다.

EKS를 사용하는 워커 노드에는 [EC2 인스턴스](https://docs.aws.amazon.com/eks/latest/userguide/worker.html)와 [Fargate] (https://docs.aws.amazon.com/eks/latest/userguide/fargate.html)라는 두 가지 옵션이 있습니다. EC2 인스턴스를 선택하면 워커 노드를 직접 관리하거나 [EKS 관리 노드 그룹](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html)을 사용할 수 있습니다. 관리형 워커 노드와 자체 관리형 워커 노드와 Fargate가 혼합된 클러스터를 구성할 수 있습니다.

Fargate의 EKS는 복원력이 뛰어난 데이터 플레인을 위한 가장 쉬운 방법을 제공합니다. Fargate는 격리된 컴퓨팅 환경에서 각 파드를 실행합니다. Fargate에서 실행되는 각 파드에는 자체 워커 노드가 있습니다. 쿠버네티스가 파드를 확장함에 따라 Fargate는 데이터 플레인을 자동으로 확장합니다. [horizontal pod autoscaler](https://docs.aws.amazon.com/eks/latest/userguide/horizontal-pod-autoscaler.html)를 사용하여 데이터 플레인과 워크로드를 모두 확장할 수 있습니다.

EC2 워커 노드를 확장하는 데 선호되는 방법은 [쿠버네티스 Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md), [EC2 Auto Scaling 그룹](https://docs.aws.amazon.com/autoscaling/ec2/userguide/AutoScalingGroup.html) 또는 [Atlassian's Esclator](https://github.com/atlassian/escalator)와 같은 커뮤니티 프로젝트를 사용하는 것입니다.

## 권장 사항

### EC2 오토 스케일링 그룹을 사용하여 워커 노드 생성

개별 EC2 인스턴스를 생성하여 클러스터에 조인하는 대신 EC2 오토 스케일링 그룹을 사용하여 워커 노드를 생성하는 것이 가장 좋습니다. 오토 스케일링 그룹은 종료되거나 장애가 발생한 노드를 자동으로 교체하므로 클러스터가 항상 워크로드를 실행할 수 있는 용량을 확보할 수 있습니다.

### 쿠버네티스 Cluster Autoscaler를 사용하여 노드를 확장하세요

Cluster Autoscaler는 클러스터의 리소스가 충분하지 않아 실행할 수 없는 파드가 있을 때 데이터 플레인 크기를 조정하며, 다른 워커 노드를 추가하여 도움을 줍니다. Cluster Autoscaler는 반응형 프로세스이긴 하지만 클러스터의 용량이 충분하지 않아 파드가 *pending* 상태가 될 때까지 기다립니다. 이러한 이벤트가 발생하면 클러스터에 EC2 인스턴스가 추가됩니다. 클러스터의 용량이 부족해지면 워커 노드가 추가될 때까지 새 복제본 또는 새 파드를 사용할 수 없게 됩니다(*Pending 상태*). 데이터 플레인이 워크로드 수요를 충족할 만큼 충분히 빠르게 확장되지 않는 경우 이러한 지연은 애플리케이션의 신뢰성에 영향을 미칠 수 있습니다. 워커 노드의 사용률이 지속적으로 낮고 해당 노드의 모든 파드를 다른 워커 노드에 스케줄링할 수 있는 경우 Cluster Autoscaler는 해당 워커 노드를 종료합니다.

### Cluster Autoscaler를 사용하여 오버 프로비저닝을 구성합니다.

Cluster Autoscaler는 클러스터의 파드가 이미 *pending* 상태일 때 데이터 플레인 스케일링을 트리거합니다. 따라서 애플리케이션에 더 많은 복제본이 필요한 시점과 실제로 더 많은 복제본을 가져오는 시점 사이에 지연이 있을 수 있습니다. 이러한 지연을 방지할 수 있는 방법은 필요한 것보다 많은 복제본을 추가하여 애플리케이션의 복제본 수를 늘리는 것입니다.

Cluster Autoscaler에서 권장하는 또 다른 패턴은 [*pause* 파드와 우선순위 선점 기능](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#how-can-i-configure-overprovisioning-with-cluster-autoscaler)입니다. *pause 파드*는 [pause 컨테이너](https://github.com/kubernetes/kubernetes/tree/master/build/pause)를 실행하는데, 이름에서 알 수 있듯이 클러스터의 다른 파드에서 사용할 수 있는 컴퓨팅 용량의 placeholder 역할을 하는 것 외에는 아무것도 하지 않습니다. *매우 낮은 할당 우선 순위*로 실행되기 때문에, 다른 파드를 생성해야 하고 클러스터에 가용 용량이 없을 때 일시 중지 파드가 노드에서 제거됩니다. 쿠버네티스 스케줄러는 pause 파드의 축출을 감지하고 스케줄을 다시 잡으려고 합니다. 하지만 클러스터가 최대 용량으로 실행되고 있기 때문에 일시 중지 파드는 *pending* 상태로 유지되며, Cluster Autoscaler는 이에 대응하여 노드를 추가합니다.

### 여러 오토 스케일링 그룹과 함께 Cluster Autoscaler 사용

`--node-group-auto-discovery` 플래그를 활성화한 상태로 Cluster Autoscaler를 실행합니다.이렇게 하면 Cluster Autoscaler가 정의된 특정 태그가 포함된 모든 오토스케일링 그룹을 찾을 수 있으므로 매니페스트에서 각 오토스케일링 그룹을 정의하고 유지할 필요가 없습니다.

### 로컬 스토리지와 함께 Cluster Autoscaler 사용

기본적으로 Cluster Autoscaler는 로컬 스토리지가 연결된 상태로 배포된 파드가 있는 노드를 축소하지 않습니다. `--skip-nodes-with-local-storage` 플래그를 false로 설정하면 Cluster Autoscaler가 이러한 노드를 축소할 수 있습니다.

### 워커 노드와 워크로드를 여러 AZ에 분산합니다.

여러 AZ에서 워커 노드와 파드를 실행하여 개별 AZ에서 장애가 발생하지 않도록 워크로드를 보호할 수 있습니다. 노드를 생성하는 서브넷을 사용하여 워커 노드가 생성되는 AZ를 제어할 수 있습니다.

쿠버네티스 1.18+를 사용하는 경우 AZ에 파드를 분산하는 데 권장되는 방법은 [파드에 대한 토폴로지 분산 제약](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods)을 사용하는 것입니다.

아래 디플로이먼트는 가능한 경우 AZ에 파드를 분산시키고, 그렇지 않을 경우 해당 파드는 그냥 실행되도록 합니다.

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-server
  template:
    metadata:
      labels:
        app: web-server
    spec:
      topologySpreadConstraints:
        - maxSkew: 1
          whenUnsatisfiable: ScheduleAnyway
          topologyKey: topology.kubernetes.io/zone
          labelSelector:
            matchLabels:
              app: web-server
      containers:
      - name: web-app
        image: nginx
        resources:
          requests:
            cpu: 1
```

!!! note
    `kube-scheduler`는 해당 레이블이 있는 노드를 통한 토폴로지 도메인만 인식합니다. 위의 디플로이먼트를 단일 존에만 노드가 있는 클러스터에 배포하면, `kube-scheduler`가 다른 존을 인식하지 못하므로 모든 파드가 해당 노드에서 스케줄링됩니다. 이 Topology Spread가 스케줄러와 함께 예상대로 작동하려면 모든 존에 노드가 이미 있어야 합니다. 이 문제는 쿠버네티스 1.24에서 `MinDomainsInPodToplogySpread` [기능 게이트](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#api)가 추가되면서 해결될 것입니다. 이 기능을 사용하면 스케줄러에 적격 도메인 수를 알리기 위해 `MinDomains` 속성을 지정할 수 있습니다.

!!! warning
    `whenUnsatisfiable`를 `Donot Schedule`로 설정하면 Topology Spread Constraints을 충족할 수 없는 경우 파드를 스케줄링할 수 없게 됩니다. Topology Spread Constraints을 위반하는 대신 파드를 실행하지 않는 것이 더 좋은 경우에만 설정해야 합니다.

이전 버전의 쿠버네티스에서는 파드 anti-affinity 규칙을 사용하여 여러 AZ에 걸쳐 파드를 스케줄링할 수 있습니다. 아래 매니페스트는 쿠버네티스 스케줄러에게 별개의 AZ에서 파드를 스케줄링하는 것을 *선호*한다고 알려줍니다.

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
  labels:
    app: web-server
spec:
  replicas: 4
  selector:
    matchLabels:
      app: web-server
  template:
    metadata:
      labels:
        app: web-server
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - web-server
              topologyKey: failure-domain.beta.kubernetes.io/zone
            weight: 100
      containers:
      - name: web-app
        image: nginx
```

!!! warning
    파드를 서로 다른 AZ에 스케줄할 필요는 없습니다. 그렇지 않으면 디플로이먼트의 파드 수가 AZ 수를 절대 초과하지 않습니다.

### EBS 볼륨을 사용할 때 각 AZ의 용량을 확보하십시오.

[Amazon EBS를 사용하여 영구 볼륨 제공](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html)을 사용하는 경우 파드 및 관련 EBS 볼륨이 동일한 AZ에 있는지 확인해야 합니다. 이 글을 쓰는 시점에서 EBS 볼륨은 단일 AZ 내에서만 사용할 수 있습니다. 파드는 다른 AZ에 위치한 EBS 지원 영구 볼륨에 액세스할 수 없습니다. 쿠버네티스 [스케줄러는 워커 노드가 어느 AZ에 위치하는지 알고 있습니다](https://kubernetes.io/docs/reference/kubernetes-api/labels-annotations-taints/#topologykubernetesiozone). 쿠버네티스는 해당 볼륨과 동일한 AZ에 EBS 볼륨이 필요한 파드를 항상 스케줄링합니다. 하지만 볼륨이 위치한 AZ에 사용 가능한 워커 노드가 없는 경우 파드를 스케줄링할 수 없습니다.

클러스터가 항상 필요한 EBS 볼륨과 동일한 AZ에 파드를 스케줄링할 수 있는 용량을 확보할 수 있도록 충분한 용량을 갖춘 각 AZ에 오토 스케일링 그룹을 생성하십시오. 또한 클러스터 오토스케일러에서 `--balance-similar-similar-node groups` 기능을 활성화해야 합니다.

EBS 볼륨을 사용하지만 가용성을 높이기 위한 요구 사항이 없는 애플리케이션을 실행 중인 경우 애플리케이션 배포를 단일 AZ로 제한할 수 있습니다. EKS에서는 워커 노드에 AZ 이름이 포함된 `failure-domain.beta.kubernetes.io/zone` 레이블이 자동으로 추가됩니다. `kubectl get nodes --show-labels`를 실행하여 노드에 첨부된 레이블을 확인할 수 있습니다. 빌트인 노드 레이블에 대한 자세한 내용은 [여기] (https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#built-in-node-labels)에서 확인할 수 있습니다. 노드 셀렉터를 사용하여 특정 AZ에서 파드를 스케줄링할 수 있습니다.

아래 예시에서는 파드가 `us-west-2c` AZ에서만 스케줄링됩니다.

```
apiVersion: v1
kind: Pod
metadata:
  name: single-az-pod
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: failure-domain.beta.kubernetes.io/zone
            operator: In
            values:
            - us-west-2c
  containers:
  - name: single-az-container
    image: kubernetes/pause
```

퍼시스턴트 볼륨(EBS 지원) 역시 AZ 이름으로 자동 레이블이 지정됩니다. `kubectl get pv -L topology.ebs.csi.aws.com/zone` 명령을 실행해 퍼시스턴트 볼륨이 어느 AZ에 속하는지 확인할 수 있습니다. 파드가 생성되고 볼륨을 요청하면, 쿠버네티스는 해당 볼륨과 동일한 AZ에 있는 노드에 파드를 스케줄링합니다.

노드 그룹이 하나인 EKS 클러스터가 있는 시나리오를 생각해 보십시오. 이 노드 그룹에는 3개의 AZ에 분산된 세 개의 워커 노드가 있습니다. EBS 지원 퍼시스턴트 볼륨을 사용하는 애플리케이션이 있습니다. 이 애플리케이션과 해당 볼륨을 생성하면 해당 파드가 세 개의 AZ 중 첫 번째 AZ에 생성됩니다. 그러면 이 파드를 실행하는 워커 노드가 비정상 상태가 되고 이후에는 사용할 수 없게 된다. Cluster Autoscaler는 비정상 노드를 새 워커 노드로 교체합니다. 그러나 자동 확장 그룹이 세 개의 AZ에 걸쳐 있기 때문에 상황에 따라 새 워커 노드가 두 번째 또는 세 번째 AZ에서 시작될 수 있지만 첫 번째 AZ에서는 실행되지 않을 수 있습니다. AZ 제약이 있는 EBS 볼륨은 첫 번째 AZ에만 존재하고 해당 AZ에는 사용 가능한 워커 노드가 없으므로 파드를 스케줄링할 수 없습니다. 따라서 각 AZ에 노드 그룹을 하나씩 생성해야 합니다. 그래야 다른 AZ에서 스케줄링할 수 없는 파드를 실행할 수 있는 충분한 용량이 항상 확보됩니다.

또는 영구 스토리지가 필요한 애플리케이션을 실행할 때 [EFS] (https://github.com/kubernetes-sigs/aws-efs-csi-driver)를 사용하여 클러스터 자동 크기 조정을 단순화할 수 있습니다. 클라이언트는 리전 내 모든 AZ에서 동시에 EFS 파일 시스템에 액세스할 수 있습니다. EFS 기반 퍼시스턴트 볼륨을 사용하는 파드가 종료되어 다른 AZ에 스케줄되더라도 볼륨을 마운트할 수 있습니다.

### 노드 문제 감지기 실행

워커 노드의 장애는 애플리케이션의 가용성에 영향을 미칠 수 있습니다. [node-problem-detector](https://github.com/kubernetes/node-problem-detector)는 클러스터에 설치하여 워커 노드 문제를 탐지할 수 있는 쿠버네티스 애드온입니다. [npd의 치료 시스템](https://github.com/kubernetes/node-problem-detector#remedy-systems)을 사용하여 노드를 자동으로 비우고 종료할 수 있습니다.

### 시스템 및 쿠버네티스 데몬을 위한 리소스 예약

[운영 체제 및 쿠버네티스 데몬을 위한 컴퓨팅 용량를 예약](https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/)하여 워커 노드의 안정성을 개선할 수 있습니다. 파드, 특히 `limits`이 선언되지 않은 파드는 시스템 리소스를 포화시켜 운영체제 프로세스와 쿠버네티스 데몬 (`kubelet`, 컨테이너 런타임 등)이 시스템 리소스를 놓고 파드와 경쟁하는 상황에 놓이게 됩니다.`kubelet` 플래그 `--system-reserved`와 `--kube-reserved`를 사용하여 시스템 프로세스 (`udev`, `sshd` 등)와 쿠버네티스 데몬을 위한 리소스를 각각 예약할 수 있습니다.

[EKS에 최적화된 Linux AMI](https://docs.aws.amazon.com/eks/latest/userguide/eks-optimized-ami.html)를 사용하는 경우 CPU, 메모리 및 스토리지는 기본적으로 시스템 및 쿠버네티스 데몬용으로 예약됩니다. 이 AMI를 기반으로 하는 워커 노드가 시작되면 [`bootstrap.sh` 스크립트](https://github.com/awslabs/amazon-eks-ami/blob/master/files/bootstrap.sh) 를 트리거하도록 EC2 사용자 데이터가 구성됩니다. 이 스크립트는 EC2 인스턴스에서 사용할 수 있는 CPU 코어 수와 총 메모리를 기반으로 CPU 및 메모리 예약을 계산합니다. 계산된 값은 `/etc/kubernetes/kubelet/kubelet-config.json`에 있는 `KubeletConfiguration` 파일에 기록됩니다.

노드에서 사용자 지정 데몬을 실행하고 기본적으로 예약된 CPU 및 메모리 양이 충분하지 않은 경우 시스템 리소스 예약을 늘려야 할 수 있습니다.

`eksctl`은 [시스템 및 쿠버네티스 데몬의 리소스 예약](https://eksctl.io/usage/customizing-the-kubelet/)을 사용자 지정하는 가장 쉬운 방법을 제공합니다.

### QoS 구현

중요한 애플리케이션의 경우, 파드의 컨테이너에 대해 `requests`=`limits` 정의를 고려해보십시오. 이렇게 하면 다른 파드가 리소스를 요청하더라도 컨테이너가 종료되지 않습니다.

모든 컨테이너에 CPU 및 메모리 제한을 적용하는 것이 가장 좋습니다. 이렇게 하면 컨테이너가 실수로 시스템 리소스를 소비하여 같은 위치에 배치된 다른 프로세스의 가용성에 영향을 미치는 것을 방지할 수 있기 때문입니다.

### 모든 워크로드에 대한 리소스 요청/제한 구성 및 크기 조정

리소스 요청의 크기 조정 및 워크로드 한도에 대한 몇 가지 일반적인 지침을 적용할 수 있습니다.

- CPU에 리소스 제한을 지정하지 마십시오. 제한이 없는 경우 요청은 [컨테이너의 상대적 CPU 사용 시간](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#how-pods-with-resource-limits-are-run)에 가중치 역할을 합니다. 이렇게 하면 인위적인 제한이나 과다 현상 없이 워크로드에서 CPU 전체를 사용할 수 있습니다.

- CPU가 아닌 리소스의 경우, `requests`=`limits`를 구성하면 가장 예측 가능한 동작이 제공됩니다. 만약 `requests`!=`limits`이면, 컨테이너의 [QOS](https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#qos-classes)도 Guaranteed에서 Burstable로 감소하여 [node pressure](https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction/) 이벤트에 축출될 가능성이 높아졌습니다.

- CPU가 아닌 리소스의 경우 요청보다 훨씬 큰 제한을 지정하지 마십시오. `limits`이 `requests`에 비해 크게 구성될수록 노드가 오버 커밋되어 워크로드가 중단될 가능성이 높아집니다.

- [Karpenter](https://aws.github.io/aws-eks-best-practices/karpenter/) 또는 [Cluster AutoScaler](https://aws.github.io/aws-eks-best-practices/cluster-autoscaling/)와 같은 노드 자동 크기 조정 솔루션을 사용할 때는 요청 크기를 올바르게 지정하는 것이 특히 중요합니다. 이러한 도구는 워크로드 요청을 검토하여 프로비저닝할 노드의 수와 크기를 결정합니다. 요청이 너무 작아 제한이 더 큰 경우, 워크로드가 노드에 꽉 차 있으면 워크로드가 제거되거나 OOM으로 종료될 수 있습니다.

리소스 요청을 결정하는 것은 어려울 수 있지만 [Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler)와 같은 도구를 사용하면 런타임 시 컨테이너 리소스 사용량을 관찰하여 요청 규모를 '적정'하게 조정할 수 있습니다. 요청 크기를 결정하는 데 유용할 수 있는 다른 도구는 다음과 같습니다.

- [Goldilocks](https://github.com/FairwindsOps/goldilocks)
- [Parca](https://www.parca.dev/)
- [Prodfiler](https://prodfiler.com/)
- [rsg](https://mhausenblas.info/right-size-guide/)

### 네임스페이스의 리소스 할당량 구성

네임스페이스는 사용자가 여러 팀 또는 프로젝트에 분산되어 있는 환경에서 사용하기 위한 것입니다. 이름 범위를 제공하고 클러스터 리소스를 여러 팀, 프로젝트, 워크로드 간에 나누는 방법입니다. 네임스페이스의 총 리소스 사용량을 제한할 수 있습니다. [`ResourceQuota`](https://kubernetes.io/docs/concepts/policy/resource-quotas/) 객체는 유형별로 네임스페이스에 만들 수 있는 개체 수와 해당 프로젝트의 리소스가 소비할 수 있는 총 컴퓨팅 리소스 양을 제한할 수 있습니다. 지정된 네임스페이스에서 요청할 수 있는 스토리지 및/또는 컴퓨팅(CPU 및 메모리) 리소스의 총합을 제한할 수 있습니다.

> CPU 및 메모리와 같은 컴퓨팅 리소스의 네임스페이스에 리소스 쿼터가 활성화된 경우 사용자는 해당 네임스페이스의 각 컨테이너에 대한 요청 또는 제한을 지정해야 합니다.

각 네임스페이스에 할당량을 구성하는 것을 고려해 보십시오. 네임스페이스 내의 컨테이너에 사전 구성된 제한을 자동으로 적용하려면 `LimitRanges`를 사용해 보십시오.

### 네임스페이스 내에서 컨테이너 리소스 사용을 제한합니다.

리소스 쿼터는 네임스페이스가 사용할 수 있는 리소스의 양을 제한하는 데 도움이 됩니다. [`LimitRange` 개체](https://kubernetes.io/docs/concepts/policy/limit-range/)는 컨테이너가 요청할 수 있는 최소 및 최대 리소스를 구현하는 데 도움이 될 수 있습니다. `LimitRange`를 사용하면 컨테이너에 대한 기본 요청 및 제한을 설정할 수 있는데, 이는 컴퓨팅 리소스 제한을 설정하는 것이 조직의 표준 관행이 아닌 경우에 유용합니다. 이름에서 알 수 있듯이, `LimitRange`는 네임스페이스의 파드 또는 컨테이너당 최소 및 최대 컴퓨팅 리소스 사용량을 적용할 수 있습니다. 또한 네임스페이스에서 퍼시스턴트볼륨클레임당 최소 및 최대 스토리지 요청을 적용할 수 있습니다.

컨테이너와 네임스페이스 수준에서 제한을 적용하려면 `LimitRange`와 `ResourceQuota`를 함께 사용하는 것이 좋습니다. 이러한 제한을 설정하면 컨테이너 또는 네임스페이스가 클러스터의 다른 테넌트가 사용하는 리소스에 영향을 주지 않도록 할 수 있습니다.

## CoreDNS

CoreDNS는 쿠버네티스에서 이름 확인 및 서비스 검색 기능을 수행합니다. EKS 클러스터에 기본적으로 설치됩니다. 상호 운용성을 위해 CoreDNS용 쿠버네티스 서비스의 이름은 여전히 [kube-dns](https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/)로 지정됩니다. CoreDNS 파드는 디플로이먼트의 일부로 `kube-system` 네임스페이스에서 실행되며, EKS에서는 기본적으로 요청과 제한이 선언된 두 개의 복제본을 실행합니다. DNS 쿼리는 `kube-system` 네임스페이스에서 실행되는 `kube-dns` 서비스로 전송됩니다.

## 권장 사항
### 핵심 DNS 지표 모니터링
CoreDNS는 [프로메테우스](https://github.com/coredns/coredns/tree/master/plugin/metrics)에 대한 지원을 내장하고 있습니다. 특히 CoreDNS 지연 시간(`coredns_dns_request_duration_seconds_sum`, [1.7.0](https://github.com/coredns/coredns/blob/master/notes/coredns-1.7.0.md) 버전 이전에는 메트릭이 `core_dns_response_rcode_count_total`이라고 불렸음), 오류 (`coredns_dns_responses_total`, NXDOMAIN, SERVFAIL, FormErr) 및 CoreDNS 파드의 메모리 사용량에 대한 모니터링을 고려해야 합니다.

문제 해결을 위해 kubectl을 사용하여 CoreDNS 로그를 볼 수 있습니다.

```shell
for p in $(kubectl get pods —namespace=kube-system -l k8s-app=kube-dns -o name); do kubectl logs —namespace=kube-system $p; done
```

### 노드 로컬 DNS 캐시 사용
[노드 로컬 DNS 캐시](https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/)를 실행하여 클러스터 DNS 성능을 개선할 수 있습니다. 이 기능은 클러스터 노드에서 DNS 캐싱 에이전트를 데몬셋으로 실행합니다. 모든 파드는 이름 확인을 위해 `kube-dns` 서비스를 사용하는 대신 노드에서 실행되는 DNS 캐싱 에이전트를 사용합니다.

### CoreDNS의 cluster-proportional-scaler를 구성합니다.

클러스터 DNS 성능을 개선하는 또 다른 방법은 클러스터의 노드 및 CPU 코어 수에 따라 [CoreDNS 배포를 자동으로 수평으로 확장](https://kubernetes.io/docs/tasks/administer-cluster/dns-horizontal-autoscaling/#enablng-dns-horizontal-autoscaling)하는 것입니다. [수평 클러스터 비례 자동 확장](https://github.com/kubernetes-sigs/cluster-proportional-autoscaler/blob/master/README.md)은 스케줄 가능한 데이터 플레인의 크기에 따라 디플로이먼트의 복제본 수를 조정하는 컨테이너입니다.

노드와 노드의 CPU 코어 집계는 CoreDNS를 확장할 수 있는 두 가지 지표입니다. 두 지표를 동시에 사용할 수 있습니다. 더 큰 노드를 사용하는 경우 CoreDNS 스케일링은 CPU 코어 수를 기반으로 합니다. 반면 더 작은 노드를 사용하는 경우 CoreDNS 복제본의 수는 데이터 플레인의 CPU 코어에 따라 달라집니다. 비례 오토스케일러 구성은 다음과 같습니다.

```
linear: '{"coresPerReplica":256,"min":1,"nodesPerReplica":16}'
```

### 노드 그룹이 있는 AMI 선택
EKS는 고객이 자체 관리형 노드 그룹과 관리형 노드 그룹을 모두 생성하는 데 사용하는 최적화된 EC2 AMI를 제공합니다. 이러한 AMI는 지원되는 모든 쿠버네티스 버전에 대해 모든 리전에 게시됩니다. EKS는 CVE 또는 버그가 발견되면 이러한 AMI를 더 이상 사용되지 않는 것으로 표시합니다. 따라서 노드 그룹에 사용할 AMI를 선택할 때는 더 이상 사용되지 않는 AMI를 사용하지 않는 것이 좋습니다.

Ec2 describe-images api를 사용하여 아래 명령을 사용하여 더 이상 사용되지 않는 AMI를 필터링할 수 있습니다.

```
aws ec2 describe-images --image-id ami-0d551c4f633e7679c --no-include-deprecated
```

이미지 설명 출력에 DeprecationTime이 필드로 포함되어 있는지 확인하여 지원 중단된 AMI를 식별할 수도 있습니다. 예를 들면:

```
aws ec2 describe-images --image-id ami-xxx --no-include-deprecated
{
    "Images": [
        {
            "Architecture": "x86_64",
            "CreationDate": "2022-07-13T15:54:06.000Z",
            "ImageId": "ami-xxx",
            "ImageLocation": "123456789012/eks_xxx",
            "ImageType": "machine",
            "Public": false,
            "OwnerId": "123456789012",
            "PlatformDetails": "Linux/UNIX",
            "UsageOperation": "RunInstances",
            "State": "available",
            "BlockDeviceMappings": [
                {
                    "DeviceName": "/dev/xvda",
                    "Ebs": {
                        "DeleteOnTermination": true,
                        "SnapshotId": "snap-0993a2fc4bbf4f7f4",
                        "VolumeSize": 20,
                        "VolumeType": "gp2",
                        "Encrypted": false
                    }
                }
            ],
            "Description": "EKS Kubernetes Worker AMI with AmazonLinux2 image, (k8s: 1.19.15, docker: 20.10.13-2.amzn2, containerd: 1.4.13-3.amzn2)",
            "EnaSupport": true,
            "Hypervisor": "xen",
            "Name": "aws_eks_optimized_xxx",
            "RootDeviceName": "/dev/xvda",
            "RootDeviceType": "ebs",
            "SriovNetSupport": "simple",
            "VirtualizationType": "hvm",
            "DeprecationTime": "2023-02-09T19:41:00.000Z"
        }
    ]
}
```

search    exclude  true         EKS                                                                                2                                                                     EKS                EC2       https   docs aws amazon com eks latest userguide worker html    Fargate   https   docs aws amazon com eks latest userguide fargate html                   EC2                             EKS           https   docs aws amazon com eks latest userguide managed node groups html                                        Fargate                          Fargate  EKS                                        Fargate                            Fargate                                                  Fargate                        horizontal pod autoscaler  https   docs aws amazon com eks latest userguide horizontal pod autoscaler html                                       EC2                               Cluster Autoscaler  https   github com kubernetes autoscaler blob master cluster autoscaler cloudprovider aws README md    EC2 Auto Scaling     https   docs aws amazon com autoscaling ec2 userguide AutoScalingGroup html      Atlassian s Esclator  https   github com atlassian escalator                                            EC2                               EC2                          EC2                                                                                Cluster Autoscaler                  Cluster Autoscaler                                                                                Cluster Autoscaler                                        pending                                       EC2                                                                          Pending                                                                                Cluster Autoscaler                        Cluster Autoscaler                         Cluster Autoscaler                pending                                                                                Cluster Autoscaler                   pause                  https   github com kubernetes autoscaler blob master cluster autoscaler FAQ md how can i configure overprovisioning with cluster autoscaler       pause       pause       https   github com kubernetes kubernetes tree master build pause                                                      placeholder                                                                                pause                                                                         pending            Cluster Autoscaler                                             Cluster Autoscaler        node group auto discovery                Cluster Autoscaler               Cluster Autoscaler                                                                                Cluster Autoscaler           Cluster Autoscaler                                                skip nodes with local storage       false       Cluster Autoscaler                                           AZ             AZ                      AZ                                                                 AZ                     1 18           AZ                                          https   kubernetes io docs concepts workloads pods pod topology spread constraints  spread constraints for pods                                 AZ                                                 apiVersion  apps v1 kind  Deployment metadata    name  web server spec    replicas  3   selector      matchLabels        app  web server   template      metadata        labels          app  web server     spec        topologySpreadConstraints            maxSkew  1           whenUnsatisfiable  ScheduleAnyway           topologyKey  topology kubernetes io zone           labelSelector              matchLabels                app  web server       containers          name  web app         image  nginx         resources            requests              cpu  1          note      kube scheduler                                                                            kube scheduler                                             Topology Spread                                                        1 24    MinDomainsInPodToplogySpread           https   kubernetes io docs concepts workloads pods pod topology spread constraints  api                                                      MinDomains                       warning      whenUnsatisfiable    Donot Schedule        Topology Spread Constraints                                  Topology Spread Constraints                                                                 anti affinity             AZ                                                  AZ                                      apiVersion  apps v1 kind  Deployment metadata    name  web server   labels      app  web server spec    replicas  4   selector      matchLabels        app  web server   template      metadata        labels          app  web server     spec        affinity          podAntiAffinity            preferredDuringSchedulingIgnoredDuringExecution              podAffinityTerm                labelSelector                  matchExpressions                    key  app                   operator  In                   values                      web server               topologyKey  failure domain beta kubernetes io zone             weight  100       containers          name  web app         image  nginx          warning                AZ                                       AZ                        EBS             AZ                Amazon EBS                 https   docs aws amazon com eks latest userguide ebs csi html                   EBS         AZ                             EBS        AZ                         AZ      EBS                                               AZ                 https   kubernetes io docs reference kubernetes api labels annotations taints  topologykubernetesiozone                     AZ  EBS                                     AZ                                                       EBS         AZ                                            AZ                                          balance similar similar node groups                  EBS                                                                AZ              EKS           AZ          failure domain beta kubernetes io zone                    kubectl get nodes   show labels                                                              https   kubernetes io docs concepts configuration assign pod node  built in node labels                                AZ                                     us west 2c  AZ                  apiVersion  v1 kind  Pod metadata    name  single az pod spec    affinity      nodeAffinity        requiredDuringSchedulingIgnoredDuringExecution          nodeSelectorTerms            matchExpressions              key  failure domain beta kubernetes io zone             operator  In             values                us west 2c   containers      name  single az container     image  kubernetes pause               EBS        AZ                      kubectl get pv  L topology ebs csi aws com zone                       AZ                                                        AZ                                   EKS                                    3   AZ                        EBS                                                                   AZ        AZ                                                            Cluster Autoscaler                                             AZ                                         AZ                  AZ                    AZ        EBS          AZ           AZ                                              AZ                              AZ                                                                               EFS   https   github com kubernetes sigs aws efs csi driver                                                   AZ       EFS                      EFS                               AZ                                                                                node problem detector  https   github com kubernetes node problem detector                                                npd          https   github com kubernetes node problem detector remedy systems                                                                                https   kubernetes io docs tasks administer cluster reserve compute resources                                     limits                                                   kubelet                                                  kubelet         system reserved      kube reserved                   udev    sshd                                          EKS       Linux AMI  https   docs aws amazon com eks latest userguide eks optimized ami html           CPU                                               AMI                        bootstrap sh        https   github com awslabs amazon eks ami blob master files bootstrap sh           EC2                         EC2                 CPU                   CPU                           etc kubernetes kubelet kubelet config json       KubeletConfiguration                                              CPU                                                  eksctl                            https   eksctl io usage customizing the kubelet                                    QoS                                   requests   limits                                                                    CPU                                                                                CPU                                              CPU        https   kubernetes io docs concepts configuration manage resources containers  how pods with resource limits are run                                                 CPU                    CPU               requests   limits                                 requests    limits            QOS  https   kubernetes io docs tasks configure pod container quality service pod  qos classes   Guaranteed   Burstable        node pressure  https   kubernetes io docs concepts scheduling eviction node pressure eviction                            CPU                                       limits    requests                                                     Karpenter  https   aws github io aws eks best practices karpenter       Cluster AutoScaler  https   aws github io aws eks best practices cluster autoscaling                                                                                OOM                                           Vertical Pod Autoscaler  https   github com kubernetes autoscaler tree master vertical pod autoscaler                                                                                Goldilocks  https   github com FairwindsOps goldilocks     Parca  https   www parca dev      Prodfiler  https   prodfiler com      rsg  https   mhausenblas info right size guide                                                                                ResourceQuota   https   kubernetes io docs concepts policy resource quotas                                                                                CPU                                CPU                                                                                LimitRanges                                                                                LimitRange      https   kubernetes io docs concepts policy limit range                                                      LimitRange                                                                                LimitRange                                                                                LimitRange    ResourceQuota                                                                                CoreDNS  CoreDNS                                    EKS                               CoreDNS                      kube dns  https   kubernetes io docs tasks administer cluster dns custom nameservers           CoreDNS                  kube system                 EKS                                       DNS      kube system                 kube dns                               DNS         CoreDNS           https   github com coredns coredns tree master plugin metrics                        CoreDNS        coredns dns request duration seconds sum    1 7 0  https   github com coredns coredns blob master notes coredns 1 7 0 md                core dns response rcode count total                coredns dns responses total   NXDOMAIN  SERVFAIL  FormErr    CoreDNS                                            kubectl       CoreDNS                   shell for p in   kubectl get pods  namespace kube system  l k8s app kube dns  o name   do kubectl logs  namespace kube system  p  done                DNS              DNS     https   kubernetes io docs tasks administer cluster nodelocaldns              DNS                                 DNS                                         kube dns                         DNS                      CoreDNS  cluster proportional scaler               DNS                              CPU           CoreDNS                   https   kubernetes io docs tasks administer cluster dns horizontal autoscaling  enablng dns horizontal autoscaling                             https   github com kubernetes sigs cluster proportional autoscaler blob master README md                                                                 CPU        CoreDNS                                                             CoreDNS       CPU                                     CoreDNS                  CPU                                            linear     coresPerReplica  256  min  1  nodesPerReplica  16                      AMI    EKS                                                   EC2 AMI             AMI                                     EKS  CVE                 AMI                                         AMI                      AMI                    Ec2 describe images api                                AMI                    aws ec2 describe images   image id ami 0d551c4f633e7679c   no include deprecated                 DeprecationTime                           AMI                           aws ec2 describe images   image id ami xxx   no include deprecated        Images                            Architecture    x86 64                CreationDate    2022 07 13T15 54 06 000Z                ImageId    ami xxx                ImageLocation    123456789012 eks xxx                ImageType    machine                Public   false               OwnerId    123456789012                PlatformDetails    Linux UNIX                UsageOperation    RunInstances                State    available                BlockDeviceMappings                                            DeviceName     dev xvda                        Ebs                              DeleteOnTermination   true                           SnapshotId    snap 0993a2fc4bbf4f7f4                            VolumeSize   20                           VolumeType    gp2                            Encrypted   false                                                                     Description    EKS Kubernetes Worker AMI with AmazonLinux2 image   k8s  1 19 15  docker  20 10 13 2 amzn2  containerd  1 4 13 3 amzn2                 EnaSupport   true               Hypervisor    xen                Name    aws eks optimized xxx                RootDeviceName     dev xvda                RootDeviceType    ebs                SriovNetSupport    simple                VirtualizationType    hvm                DeprecationTime    2023 02 09T19 41 00 000Z


eks exclude true Amazon EKS Karpenter Fargate EKS Anywhere AWS Outposts AWS Local Zone search

Answer:
---
search:
  exclude: true
---

# 클러스터 업그레이드 모범 사례

이 안내서는 클러스터 관리자에게 Amazon EKS 업그레이드 전략을 계획하고 실행하는 방법을 보여줍니다. 또한 자체 관리형 노드, 관리형 노드 그룹, Karpenter 노드 및 Fargate 노드를 업그레이드하는 방법도 설명합니다. EKS Anywhere, 자체 관리형 쿠버네티스, AWS Outposts 또는 AWS Local Zone에 대한 지침은 포함되지 않습니다.

## 개요

쿠버네티스 버전은 컨트롤 플레인과 데이터 플레인을 모두 포함합니다.원활한 작동을 위해 컨트롤 플레인과 데이터 플레인 모두 동일한 [쿠버네티스 마이너 버전, 예: 1.24](https://kubernetes.io/releases/version-skew-policy/#supported-versions) 를 실행해야 합니다. AWS가 컨트롤 플레인을 관리하고 업그레이드하는 동안 데이터 플레인에서 워커 노드를 업데이트하는 것은 사용자의 책임입니다.

* **컨트롤 플레인** — 컨트롤 플레인 버전은 쿠버네티스 API 서버에서 정의합니다.EKS 클러스터에서는 AWS에서 이를 관리합니다.컨트롤 플레인 버전으로의 업그레이드는 AWS API를 사용하여 시작됩니다.
* **데이터 플레인** — 데이터 플레인 버전은 노드에서 실행되는 Kubelet 버전을 참조합니다.동일한 클러스터의 여러 노드라도 버전이 다를 수 있습니다. `kubectl get nodes` 명령어로 있는 모든 노드의 버전을 확인하세요.

## 업그레이드 전

Amazon EKS에서 쿠버네티스 버전을 업그레이드하려는 경우 업그레이드를 시작하기 전에 몇 가지 중요한 정책, 도구 및 절차를 마련해야 합니다.

* **지원 중단 정책 이해** — [쿠버네티스 지원 중단 정책](https://kubernetes.io/docs/reference/using-api/deprecation-policy/)이 어떻게 작동하는지 자세히 알아보세요. 기존 애플리케이션에 영향을 미칠 수 있는 향후 변경 사항을 숙지하세요. 최신 버전의 Kubernetes는 특정 API 및 기능을 단계적으로 중단하는 경우가 많으며, 이로 인해 애플리케이션 실행에 문제가 발생할 수 있습니다.
* **쿠버네티스 변경 로그 검토** — [Amazon EKS Kubernetes 버전](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html) 과 함께 [Kubernetes 변경 로그](https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG) 를 철저히 검토하여 워크로드에 영향을 미칠 수 있는 주요 변경 사항 등 클러스터에 미칠 수 있는 영향을 파악하십시오.
* **클러스터 추가 기능 호환성 평가** — Amazon EKS는 새 버전이 출시되거나 클러스터를 새 Kubernetes 마이너 버전으로 업데이트한 후에 추가 기능을 자동으로 업데이트하지 않습니다.업그레이드하려는 클러스터 버전과 기존 클러스터 애드온의 호환성을 이해하려면 [애드온 업데이트](https://docs.aws.amazon.com/eks/latest/userguide/managing-add-ons.html#updating-an-add-on) 를 검토하십시오.
* **컨트롤 플레인 로깅 활성화** — 업그레이드 프로세스 중에 발생할 수 있는 로그, 오류 또는 문제를 캡처하려면 [컨트롤 플레인 로깅](https://docs.aws.amazon.com/eks/latest/userguide/control-plane-logs.html)을 활성화합니다. 이러한 로그에 이상이 있는지 검토해 보십시오. 비프로덕션 환경에서 클러스터 업그레이드를 테스트하거나 자동화된 테스트를 지속적 통합 워크플로에 통합하여 애플리케이션, 컨트롤러 및 사용자 지정 통합과의 버전 호환성을 평가하세요.
* **클러스터 관리를 위한 eksctl 살펴보기** — [eksctl](https://eksctl.io/)을 사용하여 EKS 클러스터를 관리하는 것을 고려해 보십시오. 기본적으로 [컨트롤 플레인 업데이트, 애드온 관리, 워커 노드 업데이트 처리](https://eksctl.io/usage/cluster-upgrade/) 기능을 제공합니다.
* **EKS에서 관리형 노드 그룹 또는 Fargate를 선택하세요** — [EKS 관리형 노드 그룹](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html) 또는 [EKS Fargate](https://docs.aws.amazon.com/eks/latest/userguide/fargate.html)를 사용하여 워커 노드 업그레이드를 간소화하고 자동화합니다. 이러한 옵션을 사용하면 프로세스를 간소화하고 수동 개입을 줄일 수 있습니다.
* **kubectl Convert 플러그인 활용** — [kubectl convert 플러그인](https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/#install-kubectl-convert-plugin)을 활용하여 서로 다른 API 버전 간에 [쿠버네티스 매니페스트 파일 변환](https://kubernetes.io/docs/tasks/tools/included/kubectl-convert-overview/)을 용이하게 합니다. 이를 통해 구성이 새로운 쿠버네티스 버전과의 호환성을 유지할 수 있습니다.

## 클러스터를 최신 상태로 유지

Amazon EKS의 공동 책임 모델을 반영하면 안전하고 효율적인 EKS 환경을 위해서는 쿠버네티스 업데이트를 최신 상태로 유지하는 것이 무엇보다 중요합니다.이러한 전략을 운영 워크플로에 통합하면 최신 기능 및 개선 사항을 최대한 활용하는 안전한 최신 클러스터를 유지할 수 있는 입지를 다질 수 있습니다. 전략:

* **지원되는 버전 정책** — 쿠버네티스 커뮤니티에 따라 Amazon EKS는 일반적으로 세 가지 활성 쿠버네티스 버전을 제공하고 매년 네 번째 버전은 지원 중단합니다. 지원 중단 통지는 버전이 지원 종료일에 도달하기 최소 60일 전에 발행됩니다. 자세한 내용은 [EKS 버전 FAQ](https://aws.amazon.com/eks/eks-version-faq/)를 참조하십시오.
* **자동 업그레이드 정책** — EKS 클러스터에서 쿠버네티스 업데이트를 계속 동기화하는 것이 좋습니다. 버그 수정 및 보안 패치를 포함한 쿠버네티스 커뮤니티 지원은 일반적으로 1년 이상 된 버전의 경우 중단됩니다. 또한 지원 중단된 버전에는 취약성 보고가 부족하여 잠재적 위험이 발생할 수 있습니다. 버전의 수명이 끝나기 전에 사전 업그레이드를 하지 못하면 자동 업그레이드가 트리거되어 워크로드와 시스템이 중단될 수 있습니다. 자세한 내용은 [EKS 버전 지원 정책](https://aws.amazon.com/eks/eks-version-support-policy/)을 참조하십시오.
* **업그레이드 런북 생성** — 업그레이드 관리를 위한 문서화된 프로세스를 수립하십시오. 사전 예방적 접근 방식의 일환으로 업그레이드 프로세스에 맞는 런북 및 특수 도구를 개발하십시오. 이를 통해 대비 능력이 향상될 뿐만 아니라 복잡한 전환도 간소화됩니다. 적어도 1년에 한 번 클러스터를 업그레이드하는 것을 표준 관행으로 삼으세요. 이 방법을 통해 지속적인 기술 발전에 발맞추어 환경의 효율성과 보안을 강화할 수 있습니다.

## EKS 출시 일정 검토

[EKS 쿠버네티스 릴리스 캘린더 검토](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-release-calendar)를 통해 새 버전이 출시되는 시기와 특정 버전에 대한 지원이 종료되는 시기를 알아보십시오. 일반적으로 EKS는 매년 세 개의 마이너 버전의 쿠버네티스를 릴리스하며 각 마이너 버전은 약 14개월 동안 지원됩니다.

또한 업스트림 [쿠버네티스 릴리스 정보](https://kubernetes.io/releases/) 도 검토하십시오.

## 공동 책임 모델이 클러스터 업그레이드에 어떻게 적용되는지 이해

클러스터 컨트롤 플레인과 데이터 플레인 모두에 대한 업그레이드를 시작하는 것은 사용자의 책임입니다. [업그레이드 시작 방법에 대해 알아보십시오.](https://docs.aws.amazon.com/eks/latest/userguide/update-cluster.html) 클러스터 업그레이드를 시작하면 AWS가 클러스터 컨트롤 플레인 업그레이드를 관리합니다. Fargate 파드 및 [기타 애드온] 을 포함한 데이터 플레인 업그레이드는 사용자의 책임입니다.(#upgrade -애드온 및 구성 요소 - kubernetes-api 사용) 클러스터 업그레이드 후 가용성과 운영에 영향을 미치지 않도록 클러스터에서 실행되는 워크로드의 업그레이드를 검증하고 계획해야 합니다.

## 클러스터를 인플레이스 업그레이드

EKS는 인플레이스 클러스터 업그레이드 전략을 지원합니다.이렇게 하면 클러스터 리소스가 유지되고 클러스터 구성 (예: API 엔드포인트, OIDC, ENIS, 로드밸런서) 이 일관되게 유지됩니다.이렇게 하면 클러스터 사용자의 업무 중단이 줄어들고, 워크로드를 재배포하거나 외부 리소스 (예: DNS, 스토리지) 를 마이그레이션할 필요 없이 클러스터의 기존 워크로드와 리소스를 사용할 수 있습니다.

전체 클러스터 업그레이드를 수행할 때는 한 번에 하나의 마이너 버전 업그레이드만 실행할 수 있다는 점에 유의해야 합니다 (예: 1.24에서 1.25까지).

즉, 여러 버전을 업데이트해야 하는 경우 일련의 순차적 업그레이드가 필요합니다.순차적 업그레이드를 계획하는 것은 더 복잡하며 다운타임이 발생할 위험이 더 높습니다.이 상황에서는 [블루/그린 클러스터 업그레이드 전략을 평가하십시오.](#인플레이스-클러스터-업그레이드의-대안으로-블루/그린-클러스터-평가)

## 컨트롤 플레인과 데이터 플레인을 순서대로 업그레이드

클러스터를 업그레이드하려면 다음 조치를 취해야 합니다.

1. [쿠버네티스 및 EKS 릴리스 노트를 검토하십시오.](#use-the-eks-documentation-to-create-an-upgrade-checklist)
2. [클러스터를 백업하십시오.(선택 사항)](#backup-the-cluster-before-upgrading)
3. [워크로드에서 더 이상 사용되지 않거나 제거된 API 사용을 식별하고 수정하십시오.](#identify-and-remediate-removed-api-usage-before-upgrading-the-control-plane)
4. [관리형 노드 그룹을 사용하는 경우 컨트롤 플레인과 동일한 Kubernetes 버전에 있는지 확인하십시오.](#track-the-version-skew-of-nodes-ensure-managed-node-groups-are-on-the-same-version-as-the-control-plane-before-upgrading) EKS Fargate 프로파일에서 생성한 EKS 관리형 노드 그룹 및 노드는 컨트롤 플레인과 데이터 플레인 간의 마이너 버전 스큐를 1개만 지원합니다.
5. [AWS 콘솔 또는 CLI를 사용하여 클러스터 컨트롤 플레인을 업그레이드하십시오.](https://docs.aws.amazon.com/eks/latest/userguide/update-cluster.html)
6. [애드온 호환성을 검토하세요.](#upgrade-add-ons-and-components-using-the-kubernetes-api) 필요에 따라 쿠버네티스 애드온과 커스텀 컨트롤러를 업그레이드하십시오.
7. [kubectl 업데이트하기.](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)
8. [클러스터 데이터 플레인을 업그레이드합니다.](https://docs.aws.amazon.com/eks/latest/userguide/update-managed-node-group.html) 업그레이드된 클러스터와 동일한 쿠버네티스 마이너 버전으로 노드를 업그레이드하십시오.

## EKS 문서를 활용하여 업그레이드 체크리스트 생성

EKS 쿠버네티스 [버전 문서](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)에는 각 버전에 대한 자세한 변경 목록이 포함되어 있습니다.각 업그레이드에 대한 체크리스트를 작성하십시오.

특정 EKS 버전 업그레이드 지침은 문서에서 각 버전의 주요 변경 사항 및 고려 사항을 검토하십시오.

* [EKS 1.27](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-1.27)
* [EKS 1.26](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-1.26)
* [EKS 1.25](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-1.25)
* [EKS 1.24](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-1.24)
* [EKS 1.23](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-1.23)
* [EKS 1.22](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html#kubernetes-1.22)

## 쿠버네티스 API를 사용하여 애드온 및 컴포넌트 업그레이드

클러스터를 업그레이드하기 전에 사용 중인 Kubernetes 구성 요소의 버전을 이해해야 합니다. 클러스터 구성 요소의 인벤토리를 작성하고 Kubernetes API를 직접 사용하는 구성 요소를 식별하십시오.여기에는 모니터링 및 로깅 에이전트, 클러스터 오토스케일러, 컨테이너 스토리지 드라이버 (예: [EBS CSI](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html), [EFS CSI](https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html)), 인그레스 컨트롤러, 쿠버네티스 API를 직접 사용하는 기타 워크로드 또는 애드온과 같은 중요한 클러스터 구성 요소가 포함됩니다.

!!! tip
    중요한 클러스터 구성 요소는 대개 `*-system` 네임스페이스에 설치됩니다.

    ```
    kubectl get ns | grep '-system'
    ```

Kubernetes API를 사용하는 구성 요소를 식별한 후에는 해당 설명서에서 버전 호환성 및 업그레이드 요구 사항을 확인하십시오. 예를 들어 버전 호환성에 대해서는 [AWS 로드밸런서 컨트롤러](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/deploy/installation/) 설명서를 참조하십시오.클러스터 업그레이드를 진행하기 전에 일부 구성 요소를 업그레이드하거나 구성을 변경해야 할 수 있습니다. 확인해야 할 몇 가지 중요한 구성 요소로는 [CoreDNS](https://github.com/coredns/coredns), [kube-proxy](https://kubernetes.io/docs/concepts/overview/components/#kube-proxy), [VPC CNI](https://github.com/aws/amazon-vpc-cni-k8s), 스토리지 드라이버 등이 있습니다.

클러스터에는 Kubernetes API를 사용하는 많은 워크로드가 포함되는 경우가 많으며 인그레스 컨트롤러, 지속적 전달 시스템, 모니터링 도구와 같은 워크로드 기능에 필요합니다.EKS 클러스터를 업그레이드할 때는 애드온과 타사 도구도 업그레이드하여 호환되는지 확인해야 합니다.

일반적인 애드온의 다음 예와 관련 업그레이드 설명서를 참조하십시오.

* **Amazon VPC CNI:** 각 클러스터 버전에 대한 Amazon VPC CNI 애드온의 권장 버전은 [쿠버네티스 자체 관리형 애드온용 Amazon VPC CNI 플러그인 업데이트](https://docs.aws.amazon.com/eks/latest/userguide/managing-vpc-cni.html)를 참조하십시오. **Amazon EKS 애드온으로 설치한 경우 한 번에 하나의 마이너 버전만 업그레이드할 수 있습니다.**
* **kube-proxy:** [쿠버네티스 kube-proxy 자체 관리형 애드온 업데이트](https://docs.aws.amazon.com/eks/latest/userguide/managing-kube-proxy.html)를 참조하십시오.
* **CoreDNS:** [CoreDNS 자체 관리형 애드온 업데이트](https://docs.aws.amazon.com/eks/latest/userguide/managing-coredns.html)를 참조하십시오.
* **AWS Load Balancer Controller:** AWS Load Balancer Controller는 배포한 EKS 버전과 호환되어야 합니다. 자세한 내용은 [설치 가이드](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html)를 참조하십시오.
* **Amazon Elastic Block Store (아마존 EBS) 컨테이너 스토리지 인터페이스 (CSI) 드라이버:** 설치 및 업그레이드 정보는 [Amazon EKS 애드온으로 Amazon EBS CSI 드라이버 관리](https://docs.aws.amazon.com/eks/latest/userguide/managing-ebs-csi.html)를 참조하십시오.
* **Amazon Elastic File System (Amazon EFS) 컨테이너 스토리지 인터페이스 (CSI) 드라이버:** 설치 및 업그레이드 정보는 [Amazon EFS CSI 드라이버](https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html) 를 참조하십시오.
* **쿠버네티스 메트릭 서버:** 자세한 내용은 GitHub의 [metrics-server](https://kubernetes-sigs.github.io/metrics-server/)를 참조하십시오.
* **쿠버네티스 Cluster Autoscaler:** 쿠버네티스 Cluster Autoscaler 버전을 업그레이드하려면 배포 시 이미지 버전을 변경하십시오. Cluster Autoscaler는 쿠버네티스 스케줄러와 밀접하게 연결되어 있습니다. 클러스터를 업그레이드할 때는 항상 업그레이드해야 합니다. [GitHub 릴리스](https://github.com/kubernetes/autoscaler/releases)를 검토하여 쿠버네티스 마이너 버전에 해당하는 최신 릴리스의 주소를 찾으십시오.
* **Karpenter:** 설치 및 업그레이드 정보는 [Karpenter 설명서](https://karpenter.sh/v0.27.3/faq/#which-versions-of-kubernetes-does-karpenter-support)를 참조하십시오.

## 업그레이드 전에 기본 EKS 요구 사항 확인

AWS에서 업그레이드 프로세스를 완료하려면 계정에 특정 리소스가 필요합니다.이런 리소스가 없는 경우 클러스터를 업그레이드할 수 없습니다.컨트롤 플레인 업그레이드에는 다음 리소스가 필요합니다.

1. 사용 가능한 IP 주소: 클러스터를 업데이트하려면 Amazon EKS에서 클러스터를 생성할 때 지정한 서브넷의 사용 가능한 IP 주소가 최대 5개까지 필요합니다.
2. EKS IAM 역할: 컨트롤 플레인 IAM 역할은 필요한 권한으로 계정에 계속 존재합니다.
3. 클러스터에 시크릿 암호화가 활성화되어 있는 경우 클러스터 IAM 역할에 AWS KMS키를 사용할 권한이 있는지 확인하십시오.

### 사용 가능한 IP 주소 확인

클러스터를 업데이트하려면 Amazon EKS에서 클러스터를 생성할 때 지정한 서브넷의 사용 가능한 IP 주소가 최대 5개까지 필요합니다.

다음 명령을 실행하여 서브넷에 클러스터를 업그레이드할 수 있는 충분한 IP 주소가 있는지 확인할 수 있습니다.

```
CLUSTER=<cluster name>
aws ec2 describe-subnets --subnet-ids \
  $(aws eks describe-cluster --name ${CLUSTER} \
  --query 'cluster.resourcesVpcConfig.subnetIds' \
  --output text) \
  --query 'Subnets[*].[SubnetId,AvailabilityZone,AvailableIpAddressCount]' \
  --output table

----------------------------------------------------
|                  DescribeSubnets                 |
+---------------------------+--------------+-------+
|  subnet-067fa8ee8476abbd6 |  us-east-1a  |  8184 |
|  subnet-0056f7403b17d2b43 |  us-east-1b  |  8153 |
|  subnet-09586f8fb3addbc8c |  us-east-1a  |  8120 |
|  subnet-047f3d276a22c6bce |  us-east-1b  |  8184 |
+---------------------------+--------------+-------+
```

[VPC CNI Metrics Helper](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/cmd/cni-metrics-helper/README.md) 를 사용하여 VPC 지표에 대한 CloudWatch 대시보드를 만들 수 있습니다.
클러스터 생성 시 처음 지정한 서브넷의 IP 주소가 부족한 경우, Amazon EKS는 쿠버네티스 버전 업그레이드를 시작하기 전에 “UpdateClusterConfiguration” API를 사용하여 클러스터 서브넷을 업데이트할 것을 권장합니다. 신규 서브넷이 아래 항목을 만족하는지 확인하십시오:

* 신규 서브넷은 클러스터 생성 중에 선택한 동일 가용영역에 속합니다.
* 신규 서브넷은 클러스터 생성 시 제공된 동일 VPC에 속합니다.

기존 VPC CIDR 블록의 IP 주소가 부족한 경우 추가 CIDR 블록을 연결하는 것을 고려해 보십시오. AWS를 사용하면 추가 CIDR 블록을 기존 클러스터 VPC와 연결하여 IP 주소 풀을 효과적으로 확장할 수 있습니다. 이러한 확장은 추가 프라이빗 IP 범위 (RFC 1918) 를 도입하거나, 필요한 경우 퍼블릭 IP 범위 (비 RFC 1918) 를 도입하여 수행할 수 있습니다. Amazon EKS에서 새 CIDR을 사용하려면 먼저 새 VPC CIDR 블록을 추가하고 VPC 새로 고침이 완료될 때까지 기다려야 합니다. 그런 다음 새로 설정된 CIDR 블록을 기반으로 서브넷을 VPC로 업데이트할 수 있습니다.

### EKS IAM 역할 확인

다음 명령을 실행하여 IAM 역할을 사용할 수 있고 계정에 올바른 역할 수임 정책이 적용되었는지 확인할 수 있습니다.

```
CLUSTER=<cluster name>
ROLE_ARN=$(aws eks describe-cluster --name ${CLUSTER} \
  --query 'cluster.roleArn' --output text)
aws iam get-role --role-name ${ROLE_ARN##*/} \
  --query 'Role.AssumeRolePolicyDocument'

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "eks.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

## EKS 애드온으로 마이그레이션

Amazon EKS는 모든 클러스터에 쿠버네티스 용 Amazon VPC CNI 플러그인, `kube-proxy`, CoreDNS와 같은 애드온을 자동으로 설치합니다. 애드온은 자체 관리하거나 Amazon EKS 애드온으로 설치할 수 있습니다. Amazon EKS 애드온은 EKS API를 사용하여 애드온을 관리하는 또 다른 방법입니다.

Amazon EKS 애드온을 사용하여 단일 명령으로 버전을 업데이트할 수 있습니다. 예:

```
aws eks update-addon —cluster-name my-cluster —addon-name vpc-cni —addon-version version-number \
--service-account-role-arn arn:aws:iam::111122223333:role/role-name —configuration-values '{}' —resolve-conflicts PRESERVE
```

다음과 같은 EKS 애드온이 있는지 확인:

```
aws eks list-addons --cluster-name <cluster name>
```

!!! warning

    EKS 애드온은 컨트롤 플레인 업그레이드 중에 자동으로 업그레이드되지 않습니다. EKS 애드온 업데이트를 시작하고 원하는 버전을 선택해야 합니다.

    * 사용 가능한 모든 버전 중에서 호환되는 버전을 선택하는 것은 사용자의 책임입니다. [애드온 버전 호환성에 대한 지침을 검토하세요.](#upgrade-add-ons-and-components-using-the-kubernetes-api)
    * Amazon EKS 애드온은 한 번에 하나의 마이너 버전만 업그레이드할 수 있습니다.

[EKS 애드온으로 사용할 수 있는 구성 요소와 시작 방법에 대해 자세히 알아보세요.](https://docs.aws.amazon.com/eks/latest/userguide/eks-add-ons.html)

[EKS 애드온에 사용자 지정 구성을 제공하는 방법을 알아봅니다.](https://aws.amazon.com/blogs/containers/amazon-eks-add-ons-advanced-configuration/)

## 컨트롤 플레인을 업그레이드하기 전에 제거된 API 사용을 식별하고 수정하기

EKS 컨트롤 플레인을 업그레이드하기 전에 제거된 API의 API 사용을 확인해야 합니다. 이를 위해서는 실행 중인 클러스터 또는 정적으로 렌더링된 Kubernetes 매니페스트 파일을 확인할 수 있는 도구를 사용하는 것이 좋습니다.

일반적으로 정적 매니페스트 파일을 대상으로 검사를 실행하는 것이 더 정확합니다. 라이브 클러스터를 대상으로 실행하면 이런 도구가 오탐을 반환할 수 있습니다.

쿠버네티스 API가 더 이상 사용되지 않는다고 해서 API가 제거된 것은 아닙니다. [쿠버네티스 지원 중단 정책](https://kubernetes.io/docs/reference/using-api/deprecation-policy/)을 확인하여 API 제거가 워크로드에 미치는 영향을 이해해야 합니다.

### 클러스터 인사이트
[클러스터 인사이트](https://docs.aws.amazon.com/eks/latest/userguide/cluster-insights.html)는 EKS 클러스터를 최신 버전의 쿠버네티스로 업그레이드하는 기능에 영향을 미칠 수 있는 문제에 대한 결과를 제공하는 기능입니다. 이러한 결과는 Amazon EKS에서 선별 및 관리하며 문제 해결 방법에 대한 권장 사항을 제공합니다. 클러스터 인사이트를 활용하면 최신 쿠버네티스 버전으로 업그레이드하는 데 드는 노력을 최소화할 수 있습니다.

EKS 클러스터의 인사이트를 보려면 다음 명령을 실행할 수 있습니다.
```
aws eks list-insights --region <region-code> --cluster-name <my-cluster>

{
    "insights": [
        {
            "category": "UPGRADE_READINESS",
            "name": "Deprecated APIs removed in Kubernetes v1.29",
            "insightStatus": {
                "status": "PASSING",
                "reason": "No deprecated API usage detected within the last 30 days."
            },
            "kubernetesVersion": "1.29",
            "lastTransitionTime": 1698774710.0,
            "lastRefreshTime": 1700157422.0,
            "id": "123e4567-e89b-42d3-a456-579642341238",
            "description": "Checks for usage of deprecated APIs that are scheduled for removal in Kubernetes v1.29. Upgrading your cluster before migrating to the updated APIs supported by v1.29 could cause application impact."
        }
    ]
}
```

인사이트에 대해 더 자세한 내용을 출력하려면 다음 명령을 실행할 수 있습니다:
```
aws eks describe-insight --region <region-code> --id <insight-id> --cluster-name <my-cluster>
```

[Amazon EKS 콘솔](https://console.aws.amazon.com/eks/home#/clusters)에서 인사이트를 볼 수도 있습니다.클러스터 목록에서 클러스터를 선택하면 인사이트 결과가 ```업그레이드 인사이트``` 탭 아래에 표시됩니다.

`"status": ERROR`인 클러스터 인사이트를 찾은 경우 클러스터 업그레이드를 수행하기 전에 문제를 해결해야 합니다. `aws eks describe-insight` 명령을 실행하면 다음과 같은 개선 권고 사항을 공유할 수 있습니다:

영향을 받는 리소스:
```
"resources": [
      {
        "insightStatus": {
          "status": "ERROR"
        },
        "kubernetesResourceUri": "/apis/policy/v1beta1/podsecuritypolicies/null"
      }
]
```

APIs deprecated:
```
"deprecationDetails": [
      {
        "usage": "/apis/flowcontrol.apiserver.k8s.io/v1beta2/flowschemas",
        "replacedWith": "/apis/flowcontrol.apiserver.k8s.io/v1beta3/flowschemas",
        "stopServingVersion": "1.29",
        "clientStats": [],
        "startServingReplacementVersion": "1.26"
      }
]
```

취해야 할 권장 조치:
```
"recommendation": "Update manifests and API clients to use newer Kubernetes APIs if applicable before upgrading to Kubernetes v1.26."
```

EKS 콘솔 또는 CLI를 통해 클러스터 통찰력을 활용하면 EKS 클러스터 버전을 성공적으로 업그레이드하는 프로세스를 가속화할 수 있습니다. 다음 리소스를 통해 자세히 알아보십시오:
* [공식 EKS 문서](https://docs.aws.amazon.com/eks/latest/userguide/cluster-insights.html)
* [클러스터 인사이트 출시 블로그](https://aws.amazon.com/blogs/containers/accelerate-the-testing-and-verification-of-amazon-eks-upgrades-with-upgrade-insights/).

### Kube-no-Trouble

[Kube-no-Trouble](https://github.com/doitintl/kube-no-trouble) 은 `kubent` 명령을 사용하는 오픈소스 커맨드라인 유틸리티입니다. 인수 없이 `kubent`를 실행하면 현재 KubeConfig 컨텍스트를 사용하여 클러스터를 스캔하고 더 이상 사용되지 않고 제거될 API가 포함된 보고서를 생성합니다

```
kubent

4:17PM INF >>> Kube No Trouble `kubent` <<<
4:17PM INF version 0.7.0 (git sha d1bb4e5fd6550b533b2013671aa8419d923ee042)
4:17PM INF Initializing collectors and retrieving data
4:17PM INF Target K8s version is 1.24.8-eks-ffeb93d
4:l INF Retrieved 93 resources from collector name=Cluster
4:17PM INF Retrieved 16 resources from collector name="Helm v3"
4:17PM INF Loaded ruleset name=custom.rego.tmpl
4:17PM INF Loaded ruleset name=deprecated-1-16.rego
4:17PM INF Loaded ruleset name=deprecated-1-22.rego
4:17PM INF Loaded ruleset name=deprecated-1-25.rego
4:17PM INF Loaded ruleset name=deprecated-1-26.rego
4:17PM INF Loaded ruleset name=deprecated-future.rego
__________________________________________________________________________________________
>>> Deprecated APIs removed in 1.25 <<<
------------------------------------------------------------------------------------------
KIND                NAMESPACE     NAME             API_VERSION      REPLACE_WITH (SINCE)
PodSecurityPolicy   <undefined>   eks.privileged   policy/v1beta1   <removed> (1.21.0)
```

정적 매니페스트 파일 및 헬름 패키지를 스캔하는 데에도 사용할 수 있습니다.매니페스트를 배포하기 전에 문제를 식별하려면 지속적 통합 (CI) 프로세스의 일부로 `kubent` 를 실행하는 것이 좋습니다.또한 매니페스트를 스캔하는 것이 라이브 클러스터를 스캔하는 것보다 더 정확합니다.

Kube-no-Trouble은 클러스터를 스캔하기 위한 적절한 권한이 있는 샘플 [서비스 어카운트 및 역할](https://github.com/doitintl/kube-no-trouble/blob/master/docs/k8s-sa-and-role-example.yaml)을 제공합니다.

### 풀루토(pluto)

또 다른 옵션은 [pluto](https://pluto.docs.fairwinds.com/)인데, 이는 라이브 클러스터, 매니페스트 파일, 헬름 차트 스캔을 지원하고 CI 프로세스에 포함할 수 있는 GitHub Action이 있다는 점에서 `kubent`와 비슷합니다.

```
pluto detect-all-in-cluster

NAME             KIND                VERSION          REPLACEMENT   REMOVED   DEPRECATED   REPL AVAIL
eks.privileged   PodSecurityPolicy   policy/v1beta1                 false     true         true
```

### 리소스

업그레이드 전에 클러스터가 지원 중단된 API를 사용하지 않는지 확인하려면 다음을 모니터링해야 합니다:

* 쿠버네티스 v1.19 `apiserver_requested_deprecated_apis` 메트릭:

```
kubectl get --raw /metrics | grep apiserver_requested_deprecated_apis

apiserver_requested_deprecated_apis{group="policy",removed_release="1.25",resource="podsecuritypolicies",subresource="",version="v1beta1"} 1
```

* `k8s.io/deprecated`가 `true`로 표시된 [감사 로그](https://docs.aws.amazon.com/eks/latest/userguide/control-plane-logs.html)  내 이벤트:

```
CLUSTER="<cluster_name>"
QUERY_ID=$(aws logs start-query \
 --log-group-name /aws/eks/${CLUSTER}/cluster \
 --start-time $(date -u --date="-30 minutes" "+%s") # or date -v-30M "+%s" on MacOS \
 --end-time $(date "+%s") \
 --query-string 'fields @message | filter `annotations.k8s.io/deprecated`="true"' \
 --query queryId --output text)

echo "Query started (query id: $QUERY_ID), please hold ..." && sleep 5 # give it some time to query

aws logs get-query-results --query-id $QUERY_ID
```

더 이상 사용되지 않는 API를 사용하는 경우 다음 행이 출력됩니다:

```
{
    "results": [
        [
            {
                "field": "@message",
                "value": "{\"kind\":\"Event\",\"apiVersion\":\"audit.k8s.io/v1\",\"level\":\"Request\",\"auditID\":\"8f7883c6-b3d5-42d7-967a-1121c6f22f01\",\"stage\":\"ResponseComplete\",\"requestURI\":\"/apis/policy/v1beta1/podsecuritypolicies?allowWatchBookmarks=true\\u0026resourceVersion=4131\\u0026timeout=9m19s\\u0026timeoutSeconds=559\\u0026watch=true\",\"verb\":\"watch\",\"user\":{\"username\":\"system:apiserver\",\"uid\":\"8aabfade-da52-47da-83b4-46b16cab30fa\",\"groups\":[\"system:masters\"]},\"sourceIPs\":[\"::1\"],\"userAgent\":\"kube-apiserver/v1.24.16 (linux/amd64) kubernetes/af930c1\",\"objectRef\":{\"resource\":\"podsecuritypolicies\",\"apiGroup\":\"policy\",\"apiVersion\":\"v1beta1\"},\"responseStatus\":{\"metadata\":{},\"code\":200},\"requestReceivedTimestamp\":\"2023-10-04T12:36:11.849075Z\",\"stageTimestamp\":\"2023-10-04T12:45:30.850483Z\",\"annotations\":{\"authorization.k8s.io/decision\":\"allow\",\"authorization.k8s.io/reason\":\"\",\"k8s.io/deprecated\":\"true\",\"k8s.io/removed-release\":\"1.25\"}}"
            },
[...]
```

## 쿠버네티스 워크로드 업데이트. kubectl-convert를 사용하여 매니페스트를 업데이트

업데이트가 필요한 워크로드와 매니페스트를 식별한 후에는 매니페스트 파일의 리소스 유형을 변경해야 할 수 있습니다 (예: 파드시큐리티폴리시를 파드시큐리티스탠다드로).이를 위해서는 리소스 사양을 업데이트하고 교체할 리소스에 따른 추가 조사가 필요합니다.

리소스 유형은 동일하게 유지되지만 API 버전을 업데이트해야 하는 경우, `kubectl-convert` 명령을 사용하여 매니페스트 파일을 자동으로 변환할 수 있습니다. 예전 디플로이먼트를 `apps/v1`으로 변환하는 경우를 예로 들 수 있다. 자세한 내용은 쿠버네티스 웹 사이트의 [kubectl convert 플러그인 설치](https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/#install-kubectl-convert-plugin) 를 참조하십시오.

`kubectl-convert -f <file> --output-version <group>/<version>`

## 데이터 플레인이 업그레이드되는 동안 워크로드의 가용성을 보장하도록 PodDisruptionBudget 및 topologySpreadConstraints 조건을 구성.

데이터 플레인이 업그레이드되는 동안 워크로드의 가용성을 보장하려면 워크로드에 적절한 [PodDisruptionBudget(파드디스럽션 예산)](https://kubernetes.io/docs/concepts/workloads/pods/disruptions/#pod-disruption-budgets) 및 [토폴로지 스프레드 제약 조건](https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints) 이 있는지 확인하십시오.모든 워크로드에 동일한 수준의 가용성이 필요한 것은 아니므로 워크로드의 규모와 요구 사항을 검증해야 합니다.

워크로드가 여러 가용영역에 분산되어 있고 토폴로지가 분산된 여러 호스트에 분산되어 있는지 확인하면 워크로드가 문제 없이 새 데이터 플레인으로 자동 마이그레이션될 것이라는 신뢰도가 높아집니다.

다음은 항상 80% 의 복제본을 사용할 수 있고 여러 영역과 호스트에 걸쳐 복제본을 분산시키는 워크로드의 예입니다.

```
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: myapp
spec:
  minAvailable: "80%"
  selector:
    matchLabels:
      app: myapp
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 10
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - image: public.ecr.aws/eks-distro/kubernetes/pause:3.2
        name: myapp
        resources:
          requests:
            cpu: "1"
            memory: 256M
      topologySpreadConstraints:
      - labelSelector:
          matchLabels:
            app: host-zone-spread
        maxSkew: 2
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: DoNotSchedule
      - labelSelector:
          matchLabels:
            app: host-zone-spread
        maxSkew: 2
        topologyKey: topology.kubernetes.io/zone
        whenUnsatisfiable: DoNotSchedule
```

[AWS Resilience Hub](https://aws.amazon.com/resilience-hub/) 는 아마존 엘라스틱 쿠버네티스 서비스 (Amazon EKS) 를 지원 리소스로 추가했습니다. Resilience Hub는 애플리케이션 복원력을 정의, 검증 및 추적할 수 있는 단일 장소를 제공하므로 소프트웨어, 인프라 또는 운영 중단으로 인한 불필요한 다운타임을 피할 수 있습니다.

## 관리형 노드 그룹 또는 Karpenter를 사용하여 데이터 플레인 업그레이드를 간소화.

관리형 노드 그룹과 Karpenter는 모두 노드 업그레이드를 단순화하지만 접근 방식은 다릅니다.

관리형 노드 그룹은 노드의 프로비저닝 및 라이프사이클 관리를 자동화합니다.즉, 한 번의 작업으로 노드를 생성, 자동 업데이트 또는 종료할 수 있습니다.

기본 구성에서 Karpenter는 호환되는 최신 EKS 최적화 AMI를 사용하여 새 노드를 자동으로 생성합니다. EKS가 업데이트된 EKS 최적화 AMI를 출시하거나 클러스터가 업그레이드되면 Karpenter는 자동으로 이런 이미지를 사용하기 시작합니다.[Karpenter는 노드 업데이트를 위한 노드 만료도 구현합니다.](#enable-node-expiry-for-karpenter-managed-nodes)

[Karpenter는 사용자 지정 AMI를 사용하도록 구성할 수 있습니다.](https://karpenter.sh/docs/concepts/node-templates/) Karpenter에서 사용자 지정 AMI를 사용하는 경우 kubelet 버전에 대한 책임은 사용자에게 있습니다.

## 기존 노드 및 컨트롤 플레인과의 버전 호환성 확인

Amazon EKS에서 쿠버네티스 업그레이드를 진행하기 전에 관리형 노드 그룹, 자체 관리형 노드 및 컨트롤 플레인 간의 호환성을 보장하는 것이 중요합니다. 호환성은 사용 중인 쿠버네티스 버전에 따라 결정되며 다양한 시나리오에 따라 달라집니다. 전략:

* **쿠버네티스 v1.28+** — **** 쿠버네티스 버전 1.28 이상부터는 핵심 구성 요소에 대한 보다 관대한 버전 정책이 있습니다. 특히, 쿠버네티스 API 서버와 kubelet 간에 지원되는 스큐(skew)가 하나의 마이너 버전 (n-2에서 n-3으로) 으로 확장되었습니다. 예를 들어, 사용 중인 EKS 컨트롤 플레인 버전이 1.28인 경우, 1.25까지의 kubelet 버전을 안전하게 사용할 수 있다. 이 버전 스큐는 [AWS Fargate](https://docs.aws.amazon.com/eks/latest/userguide/fargate.html), [관리형 노드 그룹](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html) 및 [자체 관리형 노드](https://docs.aws.amazon.com/eks/latest/userguide/worker.html) 에서 지원됩니다. 보안상의 이유로 [Amazon 머신 이미지 (AMI)](https://docs.aws.amazon.com/eks/latest/userguide/eks-optimized-amis.html) 버전을 최신 상태로 유지하는 것이 좋습니다. 이전 kubelet 버전은 잠재적인 공통 취약성 및 노출 (CVE) 으로 인해 보안 위험을 초래할 수 있으며, 이는 이전 kubelet 버전 사용의 이점보다 클 수 있습니다.
* **쿠버네티스 < v1.28** — v1.28 이전 버전을 사용하는 경우, API 서버와 kubelet 간에 지원되는 스큐는 n-2이다. 예를 들어, 사용 중인 EKS 버전이 1.27인 경우, 사용할 수 있는 가장 오래된 kubelet 버전은 1.25이다. 이 버전 차이는 [AWS Fargate](https://docs.aws.amazon.com/eks/latest/userguide/fargate.html), [관리형 노드 그룹](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html) 및 [자체 관리형 노드](https://docs.aws.amazon.com/eks/latest/userguide/worker.html)에 적용됩니다.

## Karpenter 관리형 노드의 노드 만료 활성화

Karpenter가 노드 업그레이드를 구현하는 한 가지 방법은 노드 만료라는 개념을 사용하는 것입니다. 이렇게 하면 노드 업그레이드에 필요한 계획이 줄어듭니다. 프로비저너에서 **ttlSecondsUntilExpired** 의 값을 설정하면 노드 만료가 활성화됩니다. 노드가 몇 초 만에 정의된 연령에 도달하면 노드가 안전하게 비워지고 삭제됩니다. 이는 사용 중인 경우에도 마찬가지이므로 노드를 새로 프로비저닝된 업그레이드된 인스턴스로 교체할 수 있습니다. 노드가 교체되면 Karpenter는 EKS에 최적화된 최신 AMI를 사용합니다. 자세한 내용은 Karpenter 웹 사이트의 [디프로비저닝(Deprovisioning)](https://karpenter.sh/docs/concepts/deprovisioning/#methods)를 참조하십시오.

Karpenter는 이 값에 지터를 자동으로 추가하지 않습니다. 과도한 워크로드 중단을 방지하려면 Kubernetes 설명서에 나와 있는 대로 [Pod Disruption Budget (PDB)](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) 을 정의하십시오.

프로비저너에서 **ttlSecondsUntilExpired** 값을 설정하는 경우 이는 프로비저너와 연결된 기존 노드에 적용됩니다.

## Karpenter 관리 노드에 드리프트 기능 사용

[Karpenter's Drift 기능](https://karpenter.sh/docs/concepts/deprovisioning/#drift)은 Karpenter가 프로비저닝한 노드를 자동으로 업그레이드하여 EKS 컨트롤 플레인과 동기화 상태를 유지할 수 있습니다. Karpenter 드리프트는 현재 [기능 게이트](https://karpenter.sh/docs/concepts/settings/#feature-gates)를 사용하여 활성화해야 합니다. Karpenter의 기본 구성은 EKS 클러스터의 컨트롤 플레인과 동일한 메이저 및 마이너 버전에 대해 EKS에 최적화된 최신 AMI를 사용합니다.

EKS 클러스터 업그레이드가 완료되면 Karpenter의 Drift 기능은 Karpenter가 프로비저닝한 노드가 이전 클러스터 버전용 EKS 최적화 AMI를 사용하고 있음을 감지하고 해당 노드를 자동으로 연결, 드레인 및 교체합니다. 새 노드로 이동하는 파드를 지원하려면 적절한 파드 [리소스 할당량](https://kubernetes.io/docs/concepts/policy/resource-quotas/)을 설정하고 [Pod Disruption Budgets](https://kubernetes.io/docs/concepts/workloads/pods/disruptions/)(PDB) 을 사용하여 쿠버네티스 모범 사례를 따르세요. Karpenter의 디프로비저닝은 파드 리소스 요청을 기반으로 대체 노드를 미리 가동하고 노드 디프로비저닝을 할 때 PDB를 존중합니다.

## eksctl을 사용하여 자체 관리형 노드 그룹의 업그레이드를 자동화

자체 관리형 노드 그룹은 사용자 계정에 배포되고 EKS 서비스 외부의 클러스터에 연결된 EC2 인스턴스입니다. 이들은 일반적으로 일종의 자동화 도구를 통해 배포되고 관리됩니다. 자체 관리형 노드 그룹을 업그레이드하려면 도구 설명서를 참조해야 합니다.

예를 들어 eksctl은 [자체 관리형 노드 삭제 및 드레인](https://eksctl.io/usage/managing-nodegroups/#deleting-and-draining)을 지원합니다.

몇 가지 일반적인 도구는 다음과 같습니다.

* [eksctl](https://eksctl.io/usage/nodegroup-upgrade/)
* [kOps](https://kops.sigs.k8s.io/operations/updates_and_upgrades/)
* [EKS Blueprints](https://aws-ia.github.io/terraform-aws-eks-blueprints/node-groups/#self-managed-node-groups)

## 업그레이드 전 클러스터 백업

새 버전의 쿠버네티스는 Amazon EKS 클러스터를 크게 변경합니다. 클러스터를 업그레이드한 후에는 다운그레이드할 수 없습니다.

[Velero](https://velero.io/) 는 커뮤니티에서 지원하는 오픈 소스 도구로, 기존 클러스터를 백업하고 새 클러스터에 백업을 적용하는 데 사용할 수 있습니다.

현재 EKS에서 지원하는 쿠버네티스 버전에서만 새 클러스터를 생성할 수 있다는 점에 유의하십시오. 클러스터가 현재 실행 중인 버전이 계속 지원되고 업그레이드가 실패할 경우 원래 버전으로 새 클러스터를 생성하고 데이터 플레인을 복원할 수 있습니다. 참고로 IAM을 포함한 AWS 리소스는 Velero의 백업에 포함되지 않습니다. 이런 리소스는 다시 생성해야 합니다.

## 컨트롤 플레인을 업그레이드한 후 Fargate 배포를 다시 시작.

Fargate 데이터 플레인 노드를 업그레이드하려면 워크로드를 재배포해야 합니다. 모든 파드를 `-o wide` 옵션으로 나열하여 파게이트 노드에서 실행 중인 워크로드를 식별할 수 있습니다.'fargate-'로 시작하는 모든 노드 이름은 클러스터에 재배포해야 합니다.

## 인플레이스 클러스터 업그레이드의 대안으로 블루/그린 클러스터 평가

일부 고객은 블루/그린 업그레이드 전략을 선호합니다. 여기에는 이점이 있을 수 있지만 고려해야 할 단점도 있습니다.

혜택은 다음과 같습니다:

* 여러 EKS 버전을 한 번에 변경할 수 있습니다 (예: 1.23에서 1.25).
* 이전 클러스터로 다시 전환 가능
* 최신 시스템 (예: terraform) 으로 관리할 수 있는 새 클러스터를 생성합니다.
* 워크로드를 개별적으로 마이그레이션할 수 있습니다.

몇 가지 단점은 다음과 같습니다.

* 소비자 업데이트가 필요한 API 엔드포인트 및 OIDC 변경 (예: kubectl 및 CI/CD)
* 마이그레이션 중에 2개의 클러스터를 병렬로 실행해야 하므로 비용이 많이 들고 지역 용량이 제한될 수 있습니다.
* 워크로드가 서로 종속되어 함께 마이그레이션되는 경우 더 많은 조정이 필요합니다.
* 로드밸런서와 외부 DNS는 여러 클러스터에 쉽게 분산될 수 없습니다.

이 전략은 가능하지만 인플레이스 업그레이드보다 비용이 많이 들고 조정 및 워크로드 마이그레이션에 더 많은 시간이 필요합니다.상황에 따라 필요할 수 있으므로 신중하게 계획해야 합니다.

높은 수준의 자동화와 GitOps와 같은 선언형 시스템을 사용하면 이 작업을 더 쉽게 수행할 수 있습니다.데이터를 백업하고 새 클러스터로 마이그레이션하려면 상태 저장 워크로드에 대한 추가 예방 조치를 취해야 합니다.

자세한 내용은 다음 블로그 게시물을 검토하세요.

* [쿠버네티스 클러스터 업그레이드: 블루-그린 배포 전략](https://aws.amazon.com/blogs/containers/kubernetes-cluster-upgrade-the-blue-green-deployment-strategy/)
* [스테이트리스 ArgoCD 워크로드를 위한 블루/그린 또는 카나리 Amazon EKS 클러스터 마이그레이션](https://aws.amazon.com/blogs/containers/blue-green-or-canary-amazon-eks-clusters-migration-for-stateless-argocd-workloads/)

## 쿠버네티스 프로젝트에서 계획된 주요 변경 사항 추적 — 미리 생각해 보세요

쿠버네티스 다음 버전만 고려하지 마세요. 쿠버네티스의 새 버전이 출시되면 이를 검토하고 주요 변경 사항을 확인하십시오. 예를 들어, 일부 애플리케이션은 도커 API를 직접 사용했고, 도커용 컨테이너 런타임 인터페이스 (CRI) (Dockershim이라고도 함) 에 대한 지원은 쿠버네티스 `1.24`에서 제거되었습니다. 이런 종류의 변화에는 대비하는 데 더 많은 시간이 필요합니다.

업그레이드하려는 버전에 대해 문서화된 모든 변경 사항을 검토하고 필요한 업그레이드 단계를 기록해 두십시오.또한 Amazon EKS 관리형 클러스터와 관련된 모든 요구 사항 또는 절차를 기록해 두십시오.

* [쿠버네티스 변경 로그](https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG)

## 기능 제거에 대한 구체적인 지침

### 1.25에서 Dockershim 제거 - Docker Socket(DDS) 용 검출기 사용

1.25용 EKS 최적화 AMI에는 더 이상 Dockershim에 대한 지원이 포함되지 않습니다. Dockershim에 대한 종속성이 있는 경우 (예: Docker 소켓을 마운트하는 경우) 워커 노드를 1.25로 업그레이드하기 전에 이런 종속성을 제거해야 합니다.

1.25로 업그레이드하기 전에 도커 소켓에 종속 관계가 있는 인스턴스를 찾아보세요. kubectl 플러그인인 [Detector for Docker Socket (DDS)](https://github.com/aws-containers/kubectl-detector-for-docker-socket) 를 사용하는 것이 좋습니다.

### 1.25에서 파드 시큐리티 폴리시(PSP) 제거 - 파드 시큐리티 스탠다드(PSS) 또는 코드형 정책(PaC) 솔루션으로 마이그레이션

`PodSecurityPolicy` 는 [쿠버네티스 1.21에서 지원 중단이 발표](https://kubernetes.io/blog/2021/04/06/podsecuritypolicy-deprecation-past-present-and-future/)이 되었고, 쿠버네티스 1.25에서는 제거되었습니다. 클러스터에서 PSP를 사용하는 경우, 워크로드 중단을 방지하기 위해 클러스터를 버전 1.25로 업그레이드하기 전에 내장된 쿠버네티스 파드 시큐리티 스탠다드 (PSS) 또는 코드형 정책(PaC) 솔루션으로 마이그레이션해야 합니다.

AWS는 [EKS 설명서에 자세한 FAQ](https://docs.aws.amazon.com/eks/latest/userguide/pod-security-policy-removal-faq.html)를 게시했습니다.

[파드 시큐리티 스탠다드(PSS) 및 파드 시큐리티 어드미션(PSA)](https://aws.github.io/aws-eks-best-practices/security/docs/pods/#pod-security-standards-pss-and-pod-security-admission-psa) 모범 사례를 검토하십시오.

쿠버네티스 웹사이트에서 [파드 시큐리티 폴리시(PSP) 지원 중단 블로그 게시물](https://kubernetes.io/blog/2021/04/06/podsecuritypolicy-deprecation-past-present-and-future/)을 검토하십시오.

### 1.23에서 In-tree 스토리지 드라이버 지원 중단 - 컨테이너 스토리지 인터페이스 (CSI) 드라이버로 마이그레이션

컨테이너 스토리지 인터페이스(CSI)는 쿠버네티스가 기존의 In-tree 스토리지 드라이버 메커니즘을 대체할 수 있도록 설계되었습니다. Amazon EBS 컨테이너 스토리지 인터페이스 (CSI) 마이그레이션 기능은 Amazon EKS `1.23` 이상 클러스터에서 기본적으로 활성화됩니다. 파드가 버전 `1.22` 또는 이전 클러스터에서 실행되는 경우, 서비스 중단을 방지하려면 클러스터를 버전 `1.23`으로 업데이트하기 전에 [Amazon EBS CSI 드라이버](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html)를 설치해야 합니다.

[Amazon EBS CSI 마이그레이션 자주 묻는 질문](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi-migration-faq.html)을 검토하십시오.

## 추가 리소스

### ClowdHaus EKS 업그레이드 지침

[ClowdHaus EKS 업그레이드 지침](https://clowdhaus.github.io/eksup/) 은 Amazon EKS 클러스터를 업그레이드하는 데 도움이 되는 CLI입니다.클러스터를 분석하여 업그레이드 전에 해결해야 할 잠재적 문제를 찾아낼 수 있습니다.

### GoNoGo

[GoNoGo](https://github.com/FairwindsOps/GoNoGo) 는 클러스터 애드온의 업그레이드 신뢰도를 결정하는 알파 단계 도구입니다.

search    exclude  true                                             Amazon EKS                                                         Karpenter      Fargate                        EKS Anywhere                AWS Outposts    AWS Local Zone                                                                                1 24  https   kubernetes io releases version skew policy  supported versions              AWS                                                                                API            EKS         AWS                                 AWS API                                                     Kubelet                                             kubectl get nodes                                          Amazon EKS                                                                                https   kubernetes io docs reference using api deprecation policy                                                                        Kubernetes     API                                                                                Amazon EKS Kubernetes     https   docs aws amazon com eks latest userguide kubernetes versions html        Kubernetes        https   github com kubernetes kubernetes tree master CHANGELOG                                                                                Amazon EKS                      Kubernetes                                                                                https   docs aws amazon com eks latest userguide managing add ons html updating an add on                                                                                https   docs aws amazon com eks latest userguide control plane logs html                                                                                eksctl           eksctl  https   eksctl io         EKS                                                                     https   eksctl io usage cluster upgrade                   EKS                Fargate             EKS            https   docs aws amazon com eks latest userguide managed node groups html      EKS Fargate  https   docs aws amazon com eks latest userguide fargate html                                                                                kubectl Convert              kubectl convert       https   kubernetes io docs tasks tools install kubectl linux  install kubectl convert plugin              API                           https   kubernetes io docs tasks tools included kubectl convert overview                                                                             Amazon EKS                           EKS                                                                                Amazon EKS                                                                                60                     EKS    FAQ  https   aws amazon com eks eks version faq                                EKS                                                                              1                                                                                EKS           https   aws amazon com eks eks version support policy                                                                                1                                                                                EKS            EKS                   https   docs aws amazon com eks latest userguide kubernetes versions html kubernetes release calendar                                                          EKS                                           14                                      https   kubernetes io releases                                                                                https   docs aws amazon com eks latest userguide update cluster html                   AWS                             Fargate                                                 upgrade                kubernetes api                                                                                EKS                                                               API        OIDC  ENIS                                                                            DNS                                                                                1 24   1 25                                                                                1           EKS                   use the eks documentation to create an upgrade checklist  2                          backup the cluster before upgrading  3                            API                    identify and remediate removed api usage before upgrading the control plane  4                                   Kubernetes                   track the version skew of nodes ensure managed node groups are on the same version as the control plane before upgrading  EKS Fargate            EKS                                                1          5   AWS       CLI                                 https   docs aws amazon com eks latest userguide update cluster html  6                     upgrade add ons and components using the kubernetes api                                          7   kubectl          https   docs aws amazon com eks latest userguide install kubectl html  8                            https   docs aws amazon com eks latest userguide update managed node group html                                                      EKS                          EKS               https   docs aws amazon com eks latest userguide kubernetes versions html                                                                  EKS                                                       EKS 1 27  https   docs aws amazon com eks latest userguide kubernetes versions html kubernetes 1 27     EKS 1 26  https   docs aws amazon com eks latest userguide kubernetes versions html kubernetes 1 26     EKS 1 25  https   docs aws amazon com eks latest userguide kubernetes versions html kubernetes 1 25     EKS 1 24  https   docs aws amazon com eks latest userguide kubernetes versions html kubernetes 1 24     EKS 1 23  https   docs aws amazon com eks latest userguide kubernetes versions html kubernetes 1 23     EKS 1 22  https   docs aws amazon com eks latest userguide kubernetes versions html kubernetes 1 22            API                                                Kubernetes                                             Kubernetes API                                                                              EBS CSI  https   docs aws amazon com eks latest userguide ebs csi html    EFS CSI  https   docs aws amazon com eks latest userguide efs csi html                     API                                                          tip                           system                                  kubectl get ns   grep   system           Kubernetes API                                                                                AWS             https   kubernetes sigs github io aws load balancer controller v2 4 deploy installation                                                                                CoreDNS  https   github com coredns coredns    kube proxy  https   kubernetes io docs concepts overview components  kube proxy    VPC CNI  https   github com aws amazon vpc cni k8s                               Kubernetes API                                                                               EKS                                                                                Amazon VPC CNI                  Amazon VPC CNI                                Amazon VPC CNI            https   docs aws amazon com eks latest userguide managing vpc cni html             Amazon EKS                                                    kube proxy           kube proxy                  https   docs aws amazon com eks latest userguide managing kube proxy html               CoreDNS     CoreDNS                  https   docs aws amazon com eks latest userguide managing coredns html               AWS Load Balancer Controller    AWS Load Balancer Controller      EKS                                 https   docs aws amazon com eks latest userguide aws load balancer controller html                Amazon Elastic Block Store      EBS                   CSI                          Amazon EKS       Amazon EBS CSI          https   docs aws amazon com eks latest userguide managing ebs csi html               Amazon Elastic File System  Amazon EFS                   CSI                          Amazon EFS CSI       https   docs aws amazon com eks latest userguide efs csi html                                        GitHub   metrics server  https   kubernetes sigs github io metrics server                      Cluster Autoscaler          Cluster Autoscaler                                   Cluster Autoscaler                                                               GitHub      https   github com kubernetes autoscaler releases                                                  Karpenter                    Karpenter      https   karpenter sh v0 27 3 faq  which versions of kubernetes does karpenter support                           EKS           AWS                                                                                1         IP                   Amazon EKS                               IP        5           2  EKS IAM             IAM                            3                                  IAM     AWS KMS                                   IP                      Amazon EKS                               IP        5                                                   IP                          CLUSTER  cluster name  aws ec2 describe subnets   subnet ids       aws eks describe cluster   name   CLUSTER        query  cluster resourcesVpcConfig subnetIds        output text        query  Subnets     SubnetId AvailabilityZone AvailableIpAddressCount         output table                                                                          DescribeSubnets                                                                           subnet 067fa8ee8476abbd6    us east 1a     8184      subnet 0056f7403b17d2b43    us east 1b     8153      subnet 09586f8fb3addbc8c    us east 1a     8120      subnet 047f3d276a22c6bce    us east 1b     8184                                                              VPC CNI Metrics Helper  https   github com aws amazon vpc cni k8s blob master cmd cni metrics helper README md         VPC        CloudWatch                                         IP             Amazon EKS                           UpdateClusterConfiguration  API                                                                                VPC            VPC CIDR     IP               CIDR                       AWS          CIDR             VPC       IP                                         IP     RFC 1918                      IP       RFC 1918                     Amazon EKS     CIDR             VPC CIDR          VPC                                       CIDR               VPC                      EKS IAM                    IAM                                                        CLUSTER  cluster name  ROLE ARN   aws eks describe cluster   name   CLUSTER        query  cluster roleArn    output text  aws iam get role   role name   ROLE ARN            query  Role AssumeRolePolicyDocument            Version    2012 10 17        Statement                            Effect    Allow                Principal                      Service    eks amazonaws com                              Action    sts AssumeRole                            EKS               Amazon EKS                   Amazon VPC CNI        kube proxy   CoreDNS                                    Amazon EKS                   Amazon EKS      EKS API                               Amazon EKS                                             aws eks update addon  cluster name my cluster  addon name vpc cni  addon version version number     service account role arn arn aws iam  111122223333 role role name  configuration values       resolve conflicts PRESERVE             EKS                   aws eks list addons   cluster name  cluster name           warning            EKS                                          EKS                                                                                upgrade add ons and components using the kubernetes api        Amazon EKS                                         EKS                                             https   docs aws amazon com eks latest userguide eks add ons html    EKS                                  https   aws amazon com blogs containers amazon eks add ons advanced configuration                               API                EKS                         API  API                                               Kubernetes                                                                                API                    API                                https   kubernetes io docs reference using api deprecation policy         API                                                        https   docs aws amazon com eks latest userguide cluster insights html   EKS                                                                            Amazon EKS                                                                                EKS                                        aws eks list insights   region  region code    cluster name  my cluster          insights                            category    UPGRADE READINESS                 name    Deprecated APIs removed in Kubernetes v1 29                 insightStatus                      status    PASSING                     reason    No deprecated API usage detected within the last 30 days                                kubernetesVersion    1 29                 lastTransitionTime   1698774710 0                lastRefreshTime   1700157422 0                id    123e4567 e89b 42d3 a456 579642341238                 description    Checks for usage of deprecated APIs that are scheduled for removal in Kubernetes v1 29  Upgrading your cluster before migrating to the updated APIs supported by v1 29 could cause application impact                                                                          aws eks describe insight   region  region code    id  insight id    cluster name  my cluster        Amazon EKS     https   console aws amazon com eks home  clusters                                                                                status   ERROR                                                       aws eks describe insight                                                          resources                      insightStatus                status    ERROR                      kubernetesResourceUri     apis policy v1beta1 podsecuritypolicies null                 APIs deprecated       deprecationDetails                      usage     apis flowcontrol apiserver k8s io v1beta2 flowschemas             replacedWith     apis flowcontrol apiserver k8s io v1beta3 flowschemas             stopServingVersion    1 29             clientStats                 startServingReplacementVersion    1 26                                   recommendation    Update manifests and API clients to use newer Kubernetes APIs if applicable before upgrading to Kubernetes v1 26        EKS       CLI                    EKS                                                                        EKS     https   docs aws amazon com eks latest userguide cluster insights html                       https   aws amazon com blogs containers accelerate the testing and verification of amazon eks upgrades with upgrade insights         Kube no Trouble   Kube no Trouble  https   github com doitintl kube no trouble     kubent                                      kubent           KubeConfig                                        API                      kubent  4 17PM INF     Kube No Trouble  kubent      4 17PM INF version 0 7 0  git sha d1bb4e5fd6550b533b2013671aa8419d923ee042  4 17PM INF Initializing collectors and retrieving data 4 17PM INF Target K8s version is 1 24 8 eks ffeb93d 4 l INF Retrieved 93 resources from collector name Cluster 4 17PM INF Retrieved 16 resources from collector name  Helm v3  4 17PM INF Loaded ruleset name custom rego tmpl 4 17PM INF Loaded ruleset name deprecated 1 16 rego 4 17PM INF Loaded ruleset name deprecated 1 22 rego 4 17PM INF Loaded ruleset name deprecated 1 25 rego 4 17PM INF Loaded ruleset name deprecated 1 26 rego 4 17PM INF Loaded ruleset name deprecated future rego                                                                                Deprecated APIs removed in 1 25                                                                                KIND                NAMESPACE     NAME             API VERSION      REPLACE WITH  SINCE  PodSecurityPolicy    undefined    eks privileged   policy v1beta1    removed   1 21 0                                                                                CI             kubent                                                                 Kube no Trouble                                              https   github com doitintl kube no trouble blob master docs k8s sa and role example yaml                    pluto             pluto  https   pluto docs fairwinds com                                            CI                GitHub Action           kubent               pluto detect all in cluster  NAME             KIND                VERSION          REPLACEMENT   REMOVED   DEPRECATED   REPL AVAIL   eks privileged   PodSecurityPolicy   policy v1beta1                 false     true         true                                     API                                          v1 19  apiserver requested deprecated apis            kubectl get   raw  metrics   grep apiserver requested deprecated apis  apiserver requested deprecated apis group  policy  removed release  1 25  resource  podsecuritypolicies  subresource    version  v1beta1   1         k8s io deprecated    true               https   docs aws amazon com eks latest userguide control plane logs html               CLUSTER   cluster name   QUERY ID   aws logs start query      log group name  aws eks   CLUSTER  cluster      start time   date  u   date   30 minutes     s     or date  v 30M    s  on MacOS      end time   date    s        query string  fields  message   filter  annotations k8s io deprecated   true        query queryId   output text   echo  Query started  query id   QUERY ID   please hold         sleep 5   give it some time to query  aws logs get query results   query id  QUERY ID                   API                                   results                                              field     message                    value       kind     Event     apiVersion     audit k8s io v1     level     Request     auditID     8f7883c6 b3d5 42d7 967a 1121c6f22f01     stage     ResponseComplete     requestURI      apis policy v1beta1 podsecuritypolicies allowWatchBookmarks true  u0026resourceVersion 4131  u0026timeout 9m19s  u0026timeoutSeconds 559  u0026watch true     verb     watch     user      username     system apiserver     uid     8aabfade da52 47da 83b4 46b16cab30fa     groups      system masters       sourceIPs        1      userAgent     kube apiserver v1 24 16  linux amd64  kubernetes af930c1     objectRef      resource     podsecuritypolicies     apiGroup     policy     apiVersion     v1beta1      responseStatus      metadata        code   200    requestReceivedTimestamp     2023 10 04T12 36 11 849075Z     stageTimestamp     2023 10 04T12 45 30 850483Z     annotations      authorization k8s io decision     allow     authorization k8s io reason          k8s io deprecated     true     k8s io removed release     1 25                                                    kubectl convert                                                                                API                    kubectl convert                                                  apps v1                                              kubectl convert          https   kubernetes io docs tasks tools install kubectl linux  install kubectl convert plugin              kubectl convert  f  file    output version  group   version                                            PodDisruptionBudget   topologySpreadConstraints                                                          PodDisruptionBudget             https   kubernetes io docs concepts workloads pods disruptions  pod disruption budgets                      https   kubernetes io docs concepts scheduling eviction topology spread constraints                                                                                80                                                             apiVersion  policy v1 kind  PodDisruptionBudget metadata    name  myapp spec    minAvailable   80     selector      matchLabels        app  myapp     apiVersion  apps v1 kind  Deployment metadata    name  myapp spec    replicas  10   selector      matchLabels        app  myapp   template      metadata        labels          app  myapp     spec        containers          image  public ecr aws eks distro kubernetes pause 3 2         name  myapp         resources            requests              cpu   1              memory  256M       topologySpreadConstraints          labelSelector            matchLabels              app  host zone spread         maxSkew  2         topologyKey  kubernetes io hostname         whenUnsatisfiable  DoNotSchedule         labelSelector            matchLabels              app  host zone spread         maxSkew  2         topologyKey  topology kubernetes io zone         whenUnsatisfiable  DoNotSchedule       AWS Resilience Hub  https   aws amazon com resilience hub                         Amazon EKS                    Resilience Hub                                                                                Karpenter                                       Karpenter                                                                                Karpenter          EKS     AMI                         EKS        EKS     AMI                      Karpenter                           Karpenter                              enable node expiry for karpenter managed nodes     Karpenter         AMI                     https   karpenter sh docs concepts node templates   Karpenter          AMI          kubelet                                                          Amazon EKS                                                                                v1 28                    1 28                                                  API     kubelet            skew               n 2   n 3                             EKS             1 28      1 25    kubelet                              AWS Fargate  https   docs aws amazon com eks latest userguide fargate html               https   docs aws amazon com eks latest userguide managed node groups html                https   docs aws amazon com eks latest userguide worker html                      Amazon         AMI   https   docs aws amazon com eks latest userguide eks optimized amis html                              kubelet                       CVE                                kubelet                                   v1 28     v1 28                 API     kubelet             n 2                 EKS     1 27                      kubelet     1 25              AWS Fargate  https   docs aws amazon com eks latest userguide fargate html               https   docs aws amazon com eks latest userguide managed node groups html                https   docs aws amazon com eks latest userguide worker html              Karpenter                    Karpenter                                                                                ttlSecondsUntilExpired                                                                                Karpenter  EKS          AMI                 Karpenter                Deprovisioning   https   karpenter sh docs concepts deprovisioning  methods            Karpenter                                              Kubernetes                Pod Disruption Budget  PDB   https   kubernetes io docs tasks run application configure pdb                        ttlSecondsUntilExpired                                              Karpenter                     Karpenter s Drift     https   karpenter sh docs concepts deprovisioning  drift   Karpenter                          EKS                              Karpenter                   https   karpenter sh docs concepts settings  feature gates                   Karpenter         EKS                                     EKS          AMI          EKS                  Karpenter  Drift     Karpenter                         EKS     AMI                                                                                https   kubernetes io docs concepts policy resource quotas          Pod Disruption Budgets  https   kubernetes io docs concepts workloads pods disruptions   PDB                            Karpenter                                                        PDB             eksctl                                                            EKS                   EC2                                                                                eksctl                       https   eksctl io usage managing nodegroups  deleting and draining                                       eksctl  https   eksctl io usage nodegroup upgrade      kOps  https   kops sigs k8s io operations updates and upgrades      EKS Blueprints  https   aws ia github io terraform aws eks blueprints node groups  self managed node groups                                    Amazon EKS                                                    Velero  https   velero io                                                                             EKS                                                                                IAM      AWS      Velero                                                             Fargate             Fargate                                                o wide                                              fargate                                                                                EKS                         1 23   1 25                                    terraform                                                                                API         OIDC        kubectl   CI CD              2                                                                                DNS                                                                                GitOps                                                                                https   aws amazon com blogs containers kubernetes cluster upgrade the blue green deployment strategy             ArgoCD                       Amazon EKS              https   aws amazon com blogs containers blue green or canary amazon eks clusters migration for stateless argocd workloads                                                                                API                               CRI   Dockershim                        1 24                                                                                Amazon EKS                                                          https   github com kubernetes kubernetes tree master CHANGELOG                             1 25   Dockershim      Docker Socket DDS            1 25  EKS     AMI        Dockershim                    Dockershim                    Docker                      1 25                                 1 25                                           kubectl        Detector for Docker Socket  DDS   https   github com aws containers kubectl detector for docker socket                        1 25               PSP                    PSS            PaC                 PodSecurityPolicy           1 21              https   kubernetes io blog 2021 04 06 podsecuritypolicy deprecation past present and future               1 25                    PSP                                     1 25                                     PSS            PaC                        AWS   EKS          FAQ  https   docs aws amazon com eks latest userguide pod security policy removal faq html                          PSS                 PSA   https   aws github io aws eks best practices security docs pods  pod security standards pss and pod security admission psa                                             PSP                 https   kubernetes io blog 2021 04 06 podsecuritypolicy deprecation past present and future                 1 23   In tree                                    CSI                                CSI              In tree                                    Amazon EBS                  CSI             Amazon EKS  1 23                                  1 22                                                1 23               Amazon EBS CSI       https   docs aws amazon com eks latest userguide ebs csi html                Amazon EBS CSI                  https   docs aws amazon com eks latest userguide ebs csi migration faq html                           ClowdHaus EKS            ClowdHaus EKS           https   clowdhaus github io eksup     Amazon EKS                        CLI                                                         GoNoGo   GoNoGo  https   github com FairwindsOps GoNoGo