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
の指定」を参照してください。 enabled
をfalse
に設定しても、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 の使用開始」を参照してください。
-
クラスターにインストールされているアドオンのバージョンを確認します。
kubectl describe deployment coredns --namespace kube-system | grep coredns: | cut -d : -f 3
出力例は次のとおりです。
v1.10.1-eksbuild.7
-
クラスターにインストールされているアドオンのタイプを確認します。クラスターを作成するために使用したツールによっては、現在クラスターに Amazon EKS アドオンタイプがインストールされていない場合があります。
my-cluster
の部分は、自分のクラスター名に置き換えます。aws eks describe-addon --cluster-name
my-cluster
--addon-name coredns --query addon.addonVersion --output textバージョン番号が返された場合、Amazon EKS タイプのアドオンがクラスターにインストールされているため、このステップの残りのステップを完了する必要はありません。エラーが返された場合、クラスターに Amazon EKS タイプのアドオンがインストールされていません。インストールするには、この手順の残りのステップを完了します。
-
現在インストールされているアドオンの設定を保存します。
kubectl get deployment coredns -n kube-system -o yaml >
aws-k8s-coredns-old.yaml
-
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-versionv1.11.1-eksbuild.6
Amazon EKS アドオンのデフォルト設定と競合するカスタム設定を現在のアドオンに適用した場合、作成が失敗する可能性があります。作成が失敗した場合、エラーが表示されます。これは、問題の解決に役立てることができます。または、前のコマンドに
--resolve-conflicts OVERWRITE
を追加することもできます。これにより、アドオンは既存のカスタム設定を上書きできます。アドオンを作成したら、カスタム設定で更新できます。 -
-
クラスターの Kubernetes バージョン用のアドオンの最新バージョンがクラスターに追加されたことを確認します。
を自分のクラスター名に置き換えます。my-cluster
aws eks describe-addon --cluster-name
my-cluster
--addon-name coredns --query addon.addonVersion --output textアドオンの作成が完了するまでに数秒かかる場合があります。
出力例は次のとおりです。
v1.11.1-eksbuild.6
-
元のアドオンに対してカスタム設定を行った場合は、Amazon EKS アドオンを作成する前に、前のステップで保存した設定を使用して、カスタム設定で Amazon EKS アドオンを更新します。
Amazon EKS アドオンの更新
Amazon EKS タイプのアドオンを更新します。Amazon EKS タイプのアドオンをクラスターに追加していない場合は、この手順を完了する代わりに、アドオンを追加するか、「セルフマネージド型アドオンを更新する」を参照してください。
-
クラスターにインストールされているアドオンのバージョンを確認します。
をクラスター名に置き換えます。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 タイプのアドオンがクラスターにインストールされていません。この手順でアドオンを更新する前に、アドオンを作成する必要があります。
-
現在インストールされているアドオンの設定を保存します。
kubectl get deployment coredns -n kube-system -o yaml >
aws-k8s-coredns-old.yaml
-
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-versionv1.11.1-eksbuild.6
\ --resolve-conflictsPRESERVE
--configuration-values '{"replicaCount":3
}'更新が完了するまでに数秒かかる場合があります。
-
-
アドオンのバージョンが更新されたことを確認します。
を自分のクラスター名に置き換えます。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 リポジトリに送信することをお勧めします
-
クラスターにインストールされているアドオンがセルフマネージド型であることを確認します。
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 アドオン」を参照してください。
-
クラスターに現在インストールされているコンテナイメージのバージョンを確認します。
kubectl describe deployment coredns -n kube-system | grep Image | cut -d ":" -f 3
出力例は次のとおりです。
v1.8.7-eksbuild.2
-
現在の CoreDNS のバージョンが
v1.5.0
以降で、CoreDNS バージョン表に記載されるバージョンよりも前の場合、この手順はスキップしてください。現在のバージョンが1.5.0
より前の場合、プロキシアドオンではなく進んだアドオンを使用するためには、CoreDNS のConfigMap
を修正する必要があります。-
次のコマンドを使用して ConfigMap ファイルを開きます。
kubectl edit configmap coredns -n kube-system
-
次の行の
proxy
をforward
に置き換えます。ファイルを保存し、エディタを終了します。
. /etc/resolv.confproxy
-
-
Kubernetes
1.17
以前にクラスターを最初にデプロイした場合、CoreDNS マニフェストから廃止された行の削除が必要な場合がります。重要
CoreDNS バージョン
1.7.0
に更新する前に、この手順を完了する必要があります。以前のバージョンに更新する場合でも、この手順を完了することをお勧めします。-
CoreDNS マニフェストにその行があるかどうかを確認します。
kubectl get configmap coredns -n kube-system -o jsonpath='{$.data.Corefile}' | grep upstream
出力が返されない場合、マニフェストにその行がないため、次の手順に進み、CoreDNS を更新できます。出力が返された場合は、その行を削除します。
-
以下のコマンドを使用して
ConfigMap
を編集し、ファイル内のupstream
という単語がある行を削除します。このファイル内の他の部分は変更しないでください。行を削除したら、変更を保存します。kubectl edit configmap coredns -n kube-system -o yaml
-
-
現在の CoreDNS イメージバージョンを取得します。
kubectl describe deployment coredns -n kube-system | grep Image
出力例は次のとおりです。
602401143452
.dkr.ecr.region-code
.amazonaws.com/eks/coredns:v1.8.7-eksbuild.2
-
CoreDNS
1.8.3
以降に更新する場合は、endpointslices
のアクセス許可をsystem:coredns
Kubernetesclusterrole
に追加する必要があります。kubectl edit clusterrole system:coredns -n kube-system
ファイルの
rules
セクション内の既存の権限行の下に次の行を追加します。[...]
- apiGroups: - discovery.k8s.io resources: - endpointslices verbs: - list - watch
[...] -
と602401143452
を前のステップで返された出力の値に置き換えて、CoreDNS アドオンを更新します。region-code
を、ご利用の 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
-
コンテナイメージのバージョンをもう一度チェックして、前のステップで指定したバージョンに更新されたことを確認します。
kubectl describe deployment coredns -n kube-system | grep Image | cut -d ":" -f 3
出力例は次のとおりです。
v1.11.1-eksbuild.6