CoreDNS Amazon EKS アドオンの使用 - Amazon EKS

CoreDNS Amazon EKS アドオンの使用

CoreDNS は、Kubernetes クラスター DNS として機能できる柔軟で拡張可能な DNS サーバーです。1 つ以上のノードで Amazon EKS クラスターを起動すると、クラスターにデプロイされたノード数に関係なく、デフォルトで CoreDNS イメージの 2 つのレプリカがデプロイされます。CoreDNS の Pods は、クラスター内のすべての Pods の名前解決を行います。クラスターに AWS Fargate プロファイル が含まれ、名前空間が CoreDNS deployment の名前空間と一致している場合、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 の安定性と可用性を向上させるために、PodDisruptionBudget を使用してバージョン v1.9.3-eksbuild.5 以降および v1.10.1-eksbuild.2 がデプロイされます。既存の PodDisruptionBudget をデプロイした場合、これらのバージョンへのアップグレードは失敗する可能性があります。アップグレードが失敗した場合は、次のいずれかのタスクを実行することで問題が解決します。

    • Amazon EKS アドオンをアップグレードする際は、競合解決のオプションとして既存の設定を上書きすることを選択してください。Deployment に他のカスタム設定を行った場合は、アップグレード後に他のカスタム設定を再適用できるように、アップグレード前に必ず設定をバックアップしてください。

    • 既存の PodDisruptionBudget を削除して、アップグレードを再試行してください。

  • EKS アドオンバージョン v1.9.3-eksbuild.3 以降および v1.10.1-eksbuild.6 以降では、CoreDNS Deployment は readinessProbe/ready エンドポイントを使用するように設定します。このエンドポイントは CoreDNS の Corefile 設定ファイルで有効になっています。

    カスタム Corefile を使用する場合は、ready プラグインを設定に追加して、プローブが使用できるように /ready エンドポイントを CoreDNS でアクティブにする必要があります。

  • 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 拡張プロポーザル (KEP) の「KEP-2067: kubeadm の「マスター」ラベルとテイントの名前を変更する」を参照してください。

    EKS アドオンバージョン v1.8.7-eksbuild.8 以降、および v1.9.3-eksbuild.9 以降では、両方の許容範囲がすべての Kubernetes バージョンと互換性があるように設定されています。

  • EKS アドオンバージョン v1.9.3-eksbuild.11 および v1.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 タイプのアドオンを作成します。チェック

前提条件
  • 既存の Amazon EKS クラスター。デプロイするには、「Amazon EKS の使用開始」を参照してください。

  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 PRESERVE オプションはアドオンの既存の設定値を保存します。アドオン設定にカスタム値を設定していて、このオプションを使用しない場合、Amazon EKS は値をデフォルト値で上書きします。このオプションを使用する場合、実稼働クラスターのアドオンを更新する前に、非稼動クラスターのフィールドおよび値変更をテストすることをお勧めします。この値を OVERWRITE に変更する場合、すべての設定が Amazon EKS のデフォルト値に変更されます。いずれかの設定にカスタム値を設定した場合、Amazon EKS のデフォルト値で上書きされる可能性があります。この値を none に変更した場合、Amazon EKS は設定の値を一切変更しませんが、更新が失敗する可能性があります。更新に失敗した場合、競合の解決に役立つエラーメッセージが返されます。

    • 構成設定を更新しない場合は、コマンドから --configuration-values '{"replicaCount":3}' を削除します。構成設定を更新する場合は、「ReplicaCount」: 3 を設定したい設定に置き換えてください。この例では、CoreDNS3のレプリカの数はに設定されています。指定する値は、設定スキーマに対して有効である必要があります。設定スキーマがわからない場合は、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 以降に更新する場合は、endpointslices のアクセス許可を system:coredns Kubernetes clusterrole に追加する必要があります。

    kubectl edit clusterrole system:coredns -n kube-system

    ファイルの rules セクション内の既存の権限行の下に次の行を追加します。

    [...] - apiGroups: - discovery.k8s.io resources: - endpointslices verbs: - list - watch [...]
  7. 602401143452 と region-code を前のステップで返された出力の値に置き換えて、CoreDNS アドオンを更新します。v1.11.1-eksbuild.6 を、ご利用の Kubernetes バージョンの最新バージョンの表に記載されている CoreDNS バージョンに置き換えます。

    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