CoreDNS Amazon EKS 추가 기능을 사용한 작업 - Amazon EKS

CoreDNS Amazon EKS 추가 기능을 사용한 작업

CoreDNS는 Kubernetes 클러스터 DNS로 사용할 수 있는 유연하고 확장 가능한 DNS 서버입니다. 하나 이상의 노드가 있는 Amazon EKS 클러스터를 시작하면 클러스터에 배포된 노드 수에 관계없이 CoreDNS 이미지의 복제본 2개가 기본적으로 배포됩니다. CoreDNS Pods는 클러스터의 모든 Pods의 이름을 확인합니다. 클러스터에 CoreDNS deployment의 네임 스페이스와 일치하는 네임스페이스의 AWS Fargate 프로파일이 포함되어 있는 경우 CoreDNS Pods를 Fargate 노드에 배포할 수 있습니다. CoreDNS에 대한 자세한 내용은 Kubernetes 설명서의 서비스 검색에 CoreDNS 사용을 참조하세요.

다음 표에는 각 Kubernetes 버전에 사용할 수 있는 Amazon EKS 추가 기능 유형의 최신 버전이 나열되어 있습니다.

Kubernetes 버전 1.29 1.28 1.27 1.26 1.25 1.24 1.23
v1.11.1-eksbuild.6 v1.10.1-eksbuild.7 v1.10.1-eksbuild.7 v1.9.3-eksbuild.11 v1.9.3-eksbuild.11 v1.9.3-eksbuild.11 v1.8.7-eksbuild.10
중요

이 추가 기능을 자체 관리하는 경우 표의 버전이 사용 가능한 자체 관리 버전과 다를 수 있습니다. 이 추가 기능의 자체 관리형 유형 업데이트에 대한 자세한 내용은 자체 관리형 추가 기능 업데이트 부분을 참조하세요.

중요 CoreDNS 업그레이드 고려 사항

  • CoreDNS Deployment의 안정성과 가용성을 개선하기 위해 버전 v1.9.3-eksbuild.5 이상과 v1.10.1-eksbuild.2가 PodDisruptionBudget과 함께 배포됩니다. 기존 PodDisruptionBudget 버전을 배포한 경우 이러한 버전으로의 업그레이드가 실패할 수 있습니다. 업그레이드가 실패할 경우 다음 작업 중 하나를 수행하면 문제가 해결됩니다.

    • Amazon EKS 추가 기능을 업그레이드할 때 충돌 해결 옵션으로 기존 설정을 재정의하도록 선택합니다. Deployment에 다른 사용자 지정 설정을 지정한 경우 업그레이드 후 다른 사용자 지정 설정을 다시 적용할 수 있도록 업그레이드하기 전에 설정을 백업해야 합니다.

    • 기존 PodDisruptionBudget을 제거하고 업그레이드를 다시 시도하세요.

  • EKS 추가 기능 버전 v1.9.3-eksbuild.3 이상 및 v1.10.1-eksbuild.6 이상에서는 CoreDNS Deployment는 /ready 엔드포인트를 사용하도록 readinessProbe를 설정합니다. 이 엔드포인트는 CoreDNS의 Corefile 구성 파일에서 활성화됩니다.

    사용자 지정 Corefile을 사용하는 경우 프로브가 사용할 /ready 엔드포인트가 CoreDNS에서 활성화되도록 구성에 ready 플러그인을 추가해야 합니다.

  • EKS 추가 기능 버전 v1.9.3-eksbuild.7 이상 및 v1.10.1-eksbuild.4 이상에서는 PodDisruptionBudget을 변경할 수 있습니다. 다음 예제의 필드를 사용하여 선택적 구성 설정에서 추가 기능을 편집하고 이러한 설정을 변경할 수 있습니다. 이 예제는 기본 PodDisruptionBudget을 보여줍니다.

    { "podDisruptionBudget": { "enabled": true, "maxUnavailable": 1 } }

    maxUnavailable 또는 minAvailable을 설정할 수 있지만 단일 PodDisruptionBudget에서 둘 다 설정할 수는 없습니다. PodDisruptionBudgets에 대한 자세한 내용은 Kubernetes 설명서PodDisruptionBudget 지정을 참조하세요.

    enabledfalse으로 설정한 경우 PodDisruptionBudget은 제거되지 않는다는 점에 유의하세요. 이 필드를 false(으)로 설정한 후에는 PodDisruptionBudget 객체를 삭제해야 합니다. 마찬가지로, PodDisruptionBudget이 있는 버전으로 업그레이드한 후 이전 버전의 추가 기능을 사용하도록 추가 기능을 편집(추가 기능 다운그레이드)해도 PodDisruptionBudget은 제거되지 않습니다. PodDisruptionBudget을 삭제하려면 다음 명령을 실행할 수 있습니다.

    kubectl delete poddisruptionbudget coredns -n kube-system
  • EKS 추가 기능 버전 v1.10.1-eksbuild.5 이상에서는 KEP 2067을 준수하도록 기본 허용 범위를 node-role.kubernetes.io/master:NoSchedule에서 node-role.kubernetes.io/control-plane:NoSchedule로 변경합니다. KEP 2067에 대한 자세한 내용은 GitHub의 Kubernetes Enhancement Proposals (KEPs)에서 KEP-2067: Rename the kubeadm "master" label and taint를 참조하세요.

    EKS 추가 기능 버전 v1.8.7-eksbuild.8 이상 및 v1.9.3-eksbuild.9 이상에서 허용 범위는 모든 Kubernetes 버전과 호환되도록 설정됩니다.

  • EKS 추가 기능 버전 v1.9.3-eksbuild.11v1.10.1-eksbuild.7 이상에서는 CoreDNS Deployment가 topologySpreadConstraints에 대한 기본값을 설정합니다. 기본값은 사용 가능한 여러 가용 영역에 노드가 있는 경우 CoreDNS Pods가 가용 영역에 분산되도록 합니다. 기본값 대신 사용될 사용자 지정 값을 설정할 수 있습니다. 기본값은 다음과 같습니다.

    topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: ScheduleAnyway labelSelector: matchLabels: k8s-app: kube-dns

CoreDNS v1.11 업그레이드 고려 사항

  • EKS 추가 기능 버전 v1.11.1-eksbuild.4 이상에서 컨테이너 이미지는 최소 패키지를 포함하고 셸이 없는 Amazon EKS Distro에서 유지 관리하는 최소 기본 이미지를 기반으로 합니다. 자세한 내용은 Amazon EKS Distro를 참조하세요. CoreDNS 이미지의 사용법과 문제 해결은 동일하게 유지됩니다.

Amazon EKS 추가 기능 생성

추가 기능의 Amazon EKS 유형 생성. Check]를 선택합니다

사전 조건
  1. 클러스터에 설치된 추가 기능의 버전을 확인하세요.

    kubectl describe deployment coredns --namespace kube-system | grep coredns: | cut -d : -f 3

    예제 출력은 다음과 같습니다.

    v1.10.1-eksbuild.7
  2. 클러스터에 설치된 추가 기능의 유형을 확인하세요. 클러스터를 생성하는 데 사용한 도구에 따라 현재 클러스터에 Amazon EKS 추가 기능이 유형이 설치되어 있지 않을 수 있습니다. my-cluster를 해당 클러스터의 이름으로 바꿉니다.

    aws eks describe-addon --cluster-name my-cluster --addon-name coredns --query addon.addonVersion --output text

    버전 번호가 반환되는 경우 Amazon EKS 유형의 추가 기능이 클러스터에 설치되고 본 절차의 나머지 단계를 완료할 필요가 없습니다. 오류가 번호가 반환되는 경우 Amazon EKS 유형의 추가 기능이 클러스터에 설치되지 않습니다. 이 절차의 나머지 단계를 완료하여 설치하세요.

  3. 현재 설치된 추가 기능의 구성을 저장합니다.

    kubectl get deployment coredns -n kube-system -o yaml > aws-k8s-coredns-old.yaml
  4. AWS CLI를 사용하여 추가 기능을 생성합니다. AWS Management Console 또는 eksctl를 사용하여 추가 기능을 만들려면 추가 기능 생성 을 참조하여 추가 기능 이름을 coredns로 지정하십시오. 다음 명령을 디바이스에 복사합니다. 필요에 따라 명령을 다음과 같이 수정한 다음에 수정한 명령을 실행합니다.

    • my-cluster를 클러스터 이름으로 바꿉니다.

    • 클러스터 버전의 최신 버전 표에 나와 있는 최신 버전으로 v1.11.1-eksbuild.6을 바꿉니다.

    aws eks create-addon --cluster-name my-cluster --addon-name coredns --addon-version v1.11.1-eksbuild.6

    Amazon EKS 추가 기능의 기본 설정과 충돌하는 사용자 지정 설정을 현재 추가 기능에 적용한 경우 생성이 실패할 수 있습니다. 생성에 실패하면 문제 해결에 도움이 될 수 있는 오류를 받게 됩니다. 또는 이전 명령에 --resolve-conflicts OVERWRITE을(를) 추가할 수 있습니다. 이렇게 하면 추가 기능이 기존 사용자 지정 설정을 덮어쓸 수 있습니다. 추가 기능을 만든 후에는 사용자 지정 설정으로 업데이트할 수 있습니다.

  5. 클러스터 Kubernetes 버전에 맞는 추가 기능의 최신 버전이 클러스터에 추가되었는지 확인합니다. my-cluster를 클러스터 이름으로 바꿉니다.

    aws eks describe-addon --cluster-name my-cluster --addon-name coredns --query addon.addonVersion --output text

    추가 기능 생성이 완료되는 데 몇 초 정도 걸릴 수 있습니다.

    예제 출력은 다음과 같습니다.

    v1.11.1-eksbuild.6
  6. 원래 추가 기능을 사용자 지정 설정했다면 Amazon EKS 추가 기능을 생성하기 전에 이전 단계에서 저장한 구성을 사용하여 Amazon EKS 추가 기능을 사용자 지정 설정으로 업데이트하십시오.

Amazon EKS 추가 기능 업데이트

추가 기능의 Amazon EKS 유형 업데이트. 클러스터에 Amazon EKS 유형의 추가 기능을 추가하지 않은 경우 이 절차를 완료하는 대신 추가하거나 자체 관리형 추가 기능 업데이트 부분을 참조하세요.

  1. 클러스터에 설치된 추가 기능의 버전을 확인하세요. my-cluster을 클러스터 이름으로 교체합니다.

    aws eks describe-addon --cluster-name my-cluster --addon-name coredns --query "addon.addonVersion" --output text

    예제 출력은 다음과 같습니다.

    v1.10.1-eksbuild.7

    반환된 버전이 최신 버전 표에 있는 클러스터의 Kubernetes 버전과 동일한 경우 클러스터에 이미 최신 버전이 설치되어 있으므로 이 절차의 나머지 부분을 완료하지 않아도 됩니다. 출력에 버전 번호 대신 오류가 표시되면 클러스터에 설치된 추가 기능의 Amazon EKS 유형이 없는 것입니다. 이 절차로 업데이트하려면 먼저 추가 기능을 생성해야 합니다.

  2. 현재 설치된 추가 기능의 구성을 저장합니다.

    kubectl get deployment coredns -n kube-system -o yaml > aws-k8s-coredns-old.yaml
  3. AWS CLI를 사용하여 추가 기능 업데이트. AWS Management Console 또는 eksctl를 사용하여 추가 기능을 업데이트하려면 추가 기능 업데이트 부분을 참조하세요. 다음 명령을 디바이스에 복사합니다. 필요에 따라 명령을 다음과 같이 수정한 다음에 수정한 명령을 실행합니다.

    • my-cluster를 클러스터 이름으로 바꿉니다.

    • 클러스터 버전의 최신 버전 표에 나와 있는 최신 버전으로 v1.11.1-eksbuild.6을 바꿉니다.

    • --resolve-conflicts 보존 옵션에서는 추가 기능의 기존 구성 값을 보존합니다. 추가 기능 설정에 사용자 지정 값을 설정하고 이 옵션을 사용하지 않는 경우 Amazon EKS에서는 기본값으로 해당 값을 덮어씁니다. 이 옵션을 사용하는 경우에는 추가 기능을 업데이트하기 전에 프로덕션 클러스터에서 비프로덕션 클러스터의 필드 및 값 변경 사항을 테스트하는 것이 좋습니다. 이 값을 OVERWRITE로 변경하면 모든 설정이 Amazon EKS 기본값으로 변경됩니다. 설정에 사용자 지정 값을 설정한 경우 Amazon EKS 기본값으로 해당 값을 덮어쓸 수도 있습니다. 이 값을 none으로 변경하면 Amazon EKS에서는 설정의 값을 변경하지 않지만 업데이트에 실패할 수도 있습니다. 업데이트에 실패하면 충돌 해결에 도움이 되는 오류 메시지가 표시됩니다.

    • 구성 설정을 업데이트하지 않는 경우 --configuration-values '{"replicaCount":3}'을(를) 명령에서 제거하십시오. 구성 설정을 업데이트하는 경우, “ReplicaCount”:3을 설정하려는 설정으로 바꾸십시오. 이 예제에서는 CoreDNS의 복제본 수가 3로 설정 되어 있습니다. 지정한 값은 구성 스키마에 유효해야 합니다. 구성 스키마를 모르는 경우 aws eks describe-addon-configuration --addon-name coredns --addon-version v1.11.1-eksbuild.6을 실행하고 구성을 확인할 추가 기능의 버전 번호로 v1.11.1-eksbuild.6을 바꿉니다. 스키마가 출력에 반환됩니다. 기존 사용자 지정 구성이 있는데 이를 모두 제거하고 모든 설정의 값을 Amazon EKS 기본값으로 다시 설정하려면 명령에서 "replicaCount":3를 제거하여 {}을(를) 비워 두십시오. CoreDNS설정에 대한 자세한 내용은Kubernetes 설명서의 DNS 서비스 사용자 지정을 참조하십시오.

      aws eks update-addon --cluster-name my-cluster --addon-name coredns --addon-version v1.11.1-eksbuild.6 \ --resolve-conflicts PRESERVE --configuration-values '{"replicaCount":3}'

      업데이트가 완료되는 데 몇 초 정도 걸릴 수 있습니다.

  4. 추가 기능 버전이 업데이트되었는지 확인합니다. my-cluster를 클러스터 이름으로 바꿉니다.

    aws eks describe-addon --cluster-name my-cluster --addon-name coredns

    업데이트가 완료되는 데 몇 초 정도 걸릴 수 있습니다.

    예제 출력은 다음과 같습니다.

    { "addon": { "addonName": "coredns", "clusterName": "my-cluster", "status": "ACTIVE", "addonVersion": "v1.11.1-eksbuild.6", "health": { "issues": [] }, "addonArn": "arn:aws:eks:region:111122223333:addon/my-cluster/coredns/d2c34f06-1111-2222-1eb0-24f64ce37fa4", "createdAt": "2023-03-01T16:41:32.442000+00:00", "modifiedAt": "2023-03-01T18:16:54.332000+00:00", "tags": {}, "configurationValues": "{\"replicaCount\":3}" } }

자체 관리형 추가 기능 업데이트

중요

자체 관리형 추가 기능 유형을 사용하는 대신 클러스터에 Amazon EKS 유형의 추가 기능을 추가하는 것이 좋습니다. 유형 간의 차이를 잘 모르는 경우 Amazon EKS 추가 기능 부분을 참조하세요. Amazon EKS 추가 기능을 클러스터에 추가하는 방법에 대한 자세한 내용은 추가 기능 생성 섹션을 참조하세요. Amazon EKS 추가 기능을 사용할 수 없는 경우, 사용할 수 없는 이유에 대한 문제를 컨테이너 로드맵 GitHub 리포지토리에 제출하는 것이 좋습니다.

  1. 클러스터에 자체 관리형 추가 기능 유형이 설치되어 있는지 확인하세요. my-cluster를 해당 클러스터의 이름으로 바꿉니다.

    aws eks describe-addon --cluster-name my-cluster --addon-name coredns --query addon.addonVersion --output text

    오류 메시지가 반환되면 자체 관리형 추가 기능 유형이 클러스터에 설치됩니다. 이 절차의 나머지 단계를 완료하여 설치하세요. 버전 번호가 반환되는 경우 Amazon EKS 유형의 추가 기능이 클러스터에 설치됩니다. Amazon EKS의 추가 기능을 업데이트하려면 이 절차를 수행하는 대신 Amazon EKS 추가 기능 업데이트의 절차를 수행하세요. 추가 기능 유형 간의 차이를 잘 모르는 경우 Amazon EKS 추가 기능 부분을 참조하세요.

  2. 클러스터에 현재 설치된 컨테이너 이미지의 버전을 확인하세요.

    kubectl describe deployment coredns -n kube-system | grep Image | cut -d ":" -f 3

    예제 출력은 다음과 같습니다.

    v1.8.7-eksbuild.2
  3. 현재 CoreDNS 버전이 v1.5.0 이상이지만 CoreDNS 버전 표에 나열된 버전보다 낮은 경우 이 단계를 건너뜁니다. 현재 버전이 1.5.0 버전보다 낮은 경우 프록시 추가 기능 대신 전달 추가 기능을 사용하도록 CoreDNS의 ConfigMap을 수정해야 합니다.

    1. 다음 명령을 통해 Configmap을 엽니다.

      kubectl edit configmap coredns -n kube-system
    2. 다음 줄의 proxyforward로 바꿉니다. 파일을 저장하고 편집기를 종료합니다.

      proxy . /etc/resolv.conf
  4. 원래 Kubernetes 1.17 또는 이전 버전에서 클러스터를 배포한 경우 CoreDNS 매니페스트에서 더는 사용되지 않는 줄을 제거해야 할 수 있습니다.

    중요

    CoreDNS 버전 1.7.0으로 업데이트하기 전에 이 단계를 완료해야 하지만, 이전 버전으로 업데이트하는 경우에도 이 단계를 완료하는 것이 좋습니다.

    1. CoreDNS 매니페스트에 이 줄이 있는지 확인합니다.

      kubectl get configmap coredns -n kube-system -o jsonpath='{$.data.Corefile}' | grep upstream

      결과가 반환되지 않으면 매니페스트에 해당 줄이 없는 것이므로 다음 단계로 건너뛰어 CoreDNS를 업데이트할 수 있습니다. 출력이 반환되면 줄을 제거해야 합니다.

    2. 다음 명령을 사용하여 ConfigMap을 편집하고 파일에서 upstream 단어가 포함된 줄을 제거합니다. 파일에서 다른 것을 변경하지 마세요. 이 줄을 제거한 후 변경 사항을 저장하세요.

      kubectl edit configmap coredns -n kube-system -o yaml
  5. 현재 CoreDNS 이미지 버전을 검색합니다.

    kubectl describe deployment coredns -n kube-system | grep Image

    예제 출력은 다음과 같습니다.

    602401143452.dkr.ecr.region-code.amazonaws.com/eks/coredns:v1.8.7-eksbuild.2
  6. CoreDNS 1.8.3 이상으로 업데이트하는 경우 system:coredns Kubernetes clusterroleendpointslices 권한을 추가해야 합니다.

    kubectl edit clusterrole system:coredns -n kube-system

    파일의 rules 부분의 기존 권한 줄 아래에 다음 줄을 추가합니다.

    [...] - apiGroups: - discovery.k8s.io resources: - endpointslices verbs: - list - watch [...]
  7. 602401143452region-code를 이전 단계에서 반환된 출력의 값으로 바꿔 CoreDNS 추가 기능을 업데이트합니다. Kubernetes버전의 최신 버전 표에 나와 있는 CoreDNS최신 버전으로 v1.11.1-eksbuild.6을(를) 교체하십시오.

    kubectl set image deployment.apps/coredns -n kube-system coredns=602401143452.dkr.ecr.region-code.amazonaws.com/eks/coredns:v1.11.1-eksbuild.6

    예제 출력은 다음과 같습니다.

    deployment.apps/coredns image updated
  8. 컨테이너 이미지 버전을 다시 확인하여 이전 단계에서 지정한 버전으로 업데이트되었는지 확인합니다.

    kubectl describe deployment coredns -n kube-system | grep Image | cut -d ":" -f 3

    예제 출력은 다음과 같습니다.

    v1.11.1-eksbuild.6