クラスターの DNS プロバイダーの構成
IBM Cloud® Kubernetes Service クラスター内の各サービスには、DNS 要求を解決するためにクラスターの DNS プロバイダーが登録するドメイン・ネーム・システム (DNS) 名が割り当てられます。 サービスとポッドのDNSについての詳細は、 Kubernetes のドキュメントを参照してください。
クラスタDNSプロバイダは CoreDNSである。CoreDNSは汎用の権威DNSサーバで、 Kubernetes と下位互換性があるが拡張可能な統合を提供する。 CoreDNS は、単一の実行可能プログラムであり単一のプロセスであるため、他のクラスター DNS プロバイダーよりも、問題が起きる可能性がある依存関係や移動パーツが少なくなっています。
また、このプロジェクトは Kubernetes プロジェクトと同じ言語である Go
で記述されています。このことは、メモリーの保護に役立ちます。 最後に、 CoreDNS ドキュメントにある一般的なセットアップのようなカスタムDNSエントリを作成できるため、 CoreDNS は他のクラスタDNSプロバイダよりも柔軟なユースケースをサポートしている。
クラスター DNS プロバイダーの自動スケーリング
デフォルトでは、CoreDNS には、クラスター内のワーカー・ノードとコアの数に応じて CoreDNS ポッドを自動スケーリングするためのデプロイメントが含まれています。 CoreDNS 自動スケーリング機能のパラメーターを微調整するには、CoreDNS 自動スケーリング機能の構成マップを編集します。 例えば、アプリでクラスター CoreDNS プロバイダーを頻繁に使用している場合は、アプリをサポートするために DNS ポッドの最小数を増やす必要があります。 詳しくは、 Kubernetes のドキュメントを参照。
始める前に: アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
-
CoreDNS の自動スケーリング機能のデプロイメントが使用可能であることを確認します。 CLI 出力で、1 つのデプロイメントが AVAILABLE であることを確認します。
kubectl get deployment -n kube-system coredns-autoscaler
出力例
NAME READY UP-TO-DATE AVAILABLE AGE coredns-autoscaler 1/1 1 1 69d
-
CoreDNS 自動スケーリング機能のデフォルト設定を編集します。
data.linear
フィールドを探します。デフォルトでは、クラスター・サイズ (preventSinglePointFailure: true
) に関係なく、16 個のワーカー・ノードごとに 1 つの CoreDNS ポッドまたは 256 個のコアになり、少なくとも 2 つの CoreDNS ポッドが存在します。 詳しくは、 Kubernetes の資料を参照してください。kubectl edit configmap -n kube-system coredns-autoscaler
出力例
apiVersion: v1 data: linear: '{"coresPerReplica":256,"nodesPerReplica":16,"preventSinglePointFailure":true}' kind: ConfigMap metadata: ...
クラスター DNS プロバイダーのカスタマイズ
CoreDNS をカスタマイズするには、CoreDNS の構成マップを編集します。 例えば、外部ホストを指すサービスを解決するように、スタブ・ドメインおよびアップストリーム DNS サーバーを構成することができます。 さらに、 CoreDNS ConfigMap、複数の Corefileを設定することができます。 詳しくは、 Kubernetes のドキュメントを参照。
NodeLocal
DNS キャッシングは、DNS 解決のキャッシュを維持するために CoreDNS に依存します。 DNS 解決の整合性を維持するには、該当する NodeLocal
DNS キャッシュと CoreDNS 構成 (スタブ・ドメインなど) が同じになるよう保持します。
始める前に: アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
-
CoreDNS のデプロイメントが使用可能であることを確認します。 CLI 出力で、1 つのデプロイメントが AVAILABLE であることを確認します。
kubectl get deployment -n kube-system coredns
出力例
NAME READY UP-TO-DATE AVAILABLE AGE coredns 3/3 3 3 69d
-
CoreDNS 構成マップのデフォルト設定を編集します。 スタブ・ドメインおよびアップストリーム DNS サーバーをカスタマイズするには、構成マップの
data
セクションで Corefile を使用します。 詳しくは、 Kubernetes のドキュメントを参照。CoreDNS
proxy
プラグインが非推奨になり、forward
プラグインに置き換えられています。 CoreDNS 構成マップを更新する場合は、proxy
の出現箇所をすべてforward
に置き換えてください。kubectl edit configmap -n kube-system coredns
CoreDNS の出力例
apiVersion: v1 kind: ConfigMap metadata: name: coredns namespace: kube-system data: Corefile: | import <MyCorefile> .:53 { errors health { lameduck 10s } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 } cache 30 { disable success cluster.local disable denial cluster.local } loop reload loadbalance } <MyCorefile>: | abc.com:53 { errors cache 30 loop forward . 1.2.3.4 }
-
オプション: CoreDNS configmap にカスタム Corefile を追加します。 次の例では、
data.Corefile
セクションにimport <MyCoreFile>
を含め、data.<MyCorefile>
セクションにカスタムCorefile情報を記入する。 詳しくは、 Corefileインポートのドキュメントをご覧ください。CoreDNS
proxy
プラグインが非推奨になり、forward
プラグインに置き換えられています。 CoreDNS 構成マップを更新する場合は、proxy
の出現箇所をすべてforward
に置き換えてください。kubectl edit configmap -n kube-system coredns
カスタム Corefile の出力例
apiVersion: v1 kind: ConfigMap metadata: name: coredns namespace: kube-system data: Corefile: | import <MyCorefile> .:53 { errors health kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure upstream 172.16.0.1 fallthrough in-addr.arpa ip6.arpa } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 } cache 30 { disable success cluster.local disable denial cluster.local } loop reload loadbalance } <MyCorefile>: | abc.com:53 { errors cache 30 loop forward . 1.2.3.4 }
-
数分後に、CoreDNS ポッドで、構成マップの変更が反映されます。
NodeLocal DNS キャッシュのセットアップ
IBM Cloud Kubernetes Service クラスターでは、一部のワーカー・ノードに NodeLocal
DNS キャッシング・エージェントをセットアップして、クラスター DNS のパフォーマンスと可用性を向上させることができます。 詳しくは、 Kubernetes のドキュメントをご覧ください。
デフォルトでは、 ClusterFirst
DNSポリシーを使用するポッドに対するクラスタDNS要求は、クラスタDNSサービスに送信されます。 NodeLocal
DNS キャッシングをワーカー・ノードで有効にすると、そのワーカー・ノードのポッドに対するクラスター DNS 要求が、代わりにローカルの DNS キャッシュに送信されるようになります。このキャッシュは、リンク・ローカル IP アドレス 169.254.20.10 を listen します。 DNS キャッシュは kube-dns
名前空間の kube-system
サービスのクラスター IP でも listen します。
クラスターでゾーン対応 DNS を既に使用している場合は、DNS キャッシュ・ラベルを追加しないでください。 また、NodeLocal
DNS キャッシングは、DNS 解決のキャッシュを維持するために CoreDNS に依存します。 DNS 解決の整合性を維持するには、該当する NodeLocal
DNS キャッシュと CoreDNS 構成 (スタブ・ドメインなど)
が同じになるよう保持します。
NodeLocal
DNS キャッシュは、Kubernetes 1.18 以降を実行するクラスターで一般提供されています。ただし、デフォルトではまだ無効になっています。
NodeLocal DNS キャッシュの有効化
Kubernetes クラスター内の 1 台以上のワーカー・ノードで NodeLocal
DNS キャッシュを有効にします。
以下の手順で、特定のワーカー・ノードで実行される DNS ポッドを更新できます。 また、これ以降のノードがラベルを継承するようにワーカー・プールにラベルを付けることもできます。
開始する前に、DNS 出力のポッドまたは名前空間セレクターに依存するポリシーなど、この機能の影響を受ける DNS 出力ネットワーク ポリシー を更新します。
kubectl get networkpolicy --all-namespaces -o yaml
-
アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
-
CoreDNS のスタブ・ドメインおよびアップストリーム DNS サーバーをカスタマイズした場合は、これらのスタブ・ドメインおよびアップストリーム DNS サーバーを使用して
NodeLocal
DNS キャッシュをカスタマイズする必要もあります。 -
クラスター内のノードをリストします。
NodeLocal
DNS キャッシング・エージェント・ポッドは、各ノードで実行されるデーモン・セットに含まれています。kubectl get nodes
-
ibm-cloud.kubernetes.io/node-local-dns-enabled=true
ラベルをワーカー・ノードに追加します。 このラベルは、ワーカー・ノード上の DNS キャッシング・エージェント・ポッドを開始します。-
1 つ以上のワーカー・ノードにラベルを追加します。
-
クラスター内のすべてのワーカー・ノードにラベルを付けるには、既存のすべてのワーカー・プールにラベルを追加します。
-
個々のワーカー・ノードにラベルを付けるには、以下のようにします。
kubectl label node <node_name> --overwrite "ibm-cloud.kubernetes.io/node-local-dns-enabled=true"
-
-
NODE-LOCAL-DNS-ENABLED
フィールドがtrue
に設定されていることを確認して、ノードにラベルがあることを検証します。kubectl get nodes -L "ibm-cloud.kubernetes.io/node-local-dns-enabled"
出力例
NAME STATUS ROLES AGE VERSION NODE-LOCAL-DNS-ENABLED 10.xxx.xx.xxx Ready,SchedulingDisabled <none> 28h v1.32+IKS true
-
ワーカー・ノードで DNS キャッシング・エージェント・ポッドが実行されていることを確認します。
kubectl get pods -n kube-system -l k8s-app=node-local-dns -o wide
出力例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES node-local-dns-pvnjn 1/1 Running 0 1m 10.xxx.xx.xxx 10.xxx.xx.xxx <none> <none>
-
-
ワーカー・ノードごとに上記の手順を繰り返して、DNS キャッシングを有効にします。
NodeLocal DNS キャッシュの無効化
1 台以上のワーカー・ノードで NodeLocal
DNS キャッシュを無効にします。
-
アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
-
ワーカー・ノードから
ibm-cloud.kubernetes.io/node-local-dns-enabled
ラベルを削除します。 この操作により、ワーカー・ノード上の DNS キャッシング・エージェント・ポッドが終了します。クラスター内のすべてのワーカー・ノードからラベルを削除するには、以下のコマンドを実行します。
kubectl label node --all --overwrite "ibm-cloud.kubernetes.io/node-local-dns-enabled-"
個々のワーカー・ノードからラベルを削除するには、以下のコマンドを実行します。
kubectl label node <node_name> "ibm-cloud.kubernetes.io/node-local-dns-enabled-"
-
NODE-LOCAL-DNS-ENABLED
フィールドが空であることを確認して、ラベルが削除されていることを検証します。kubectl get nodes -L "ibm-cloud.kubernetes.io/node-local-dns-enabled"
出力例
NAME STATUS ROLES AGE VERSION NODE-LOCAL-DNS-ENABLED 10.xxx.xx.xxx Ready,SchedulingDisabled <none> 28h v1.32+IKS
-
DNS キャッシュが無効になっているノードでポッドが実行されていないことを確認します。 出力にはポッドが表示されていません。
kubectl get pods -n kube-system -l k8s-app=node-local-dns -o wide
出力例
No resources found.
-
-
ワーカー・ノードごとに上記の手順を繰り返して、DNS キャッシングを無効にします。
NodeLocal DNS キャッシュのカスタマイズ
2 つの構成マップのいずれかを編集して、NodeLocal
DNS キャッシュをカスタマイズできます。
node-local-dns
構成マップ:NodeLocal
DNS キャッシュ構成をカスタマイズします。node-local-dns-config
構成マップ: 外部ホストを指すサービスを解決するようにスタブ・ドメインまたはアップストリーム DNS サーバーをカスタマイズして、NodeLocal
DNS キャッシュ構成を拡張します。
NodeLocal
DNS キャッシングは、DNS 解決のキャッシュを維持するために CoreDNS に依存します。 DNS 解決の整合性を維持するには、該当する NodeLocal
DNS キャッシュと CoreDNS 構成 (スタブ・ドメインなど) が同じになるよう保持します。
一般的な構成更新のための node-local-dns
構成マップの編集
node-local-dns
構成マップを編集して、NodeLocal
DNS キャッシュ構成をカスタマイズします。
始める前に: アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
-
NodeLocal
DNS キャッシュ・デーモン・セットが使用可能であることを確認します。kubectl get ds -n kube-system node-local-dns
出力例
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE node-local-dns 4 4 4 4 4 ibm-cloud.kubernetes.io/node-local-dns-enabled=true 82d
-
デフォルト設定を編集するか、カスタム Corefile を
NodeLocal
DNS キャッシュ構成マップに追加します。 インポートする各 Corefile は、coredns
パスを使用する必要があります。 詳しくは、 Kubernetes のドキュメントを参照。NodeLocal
DNSキャッシュに対応している プラグインは限られています。kubectl edit configmap -n kube-system node-local-dns
出力例
apiVersion: v1 kind: ConfigMap metadata: name: node-local-dns namespace: kube-system data: Corefile: | # Add your NodeLocal DNS customizations as import files under ./coredns directory. # Refer to /docs/containers?topic=containers-cluster_dns for details. import ./coredns/<MyCorefile> cluster.local:53 abc.com:53 { errors cache { success 9984 30 denial 9984 5 } reload loop bind 169.254.20.10 172.21.0.10 forward . __PILLAR__CLUSTER__DNS__ { force_tcp } prometheus :9253 health 169.254.20.10:8080 } in-addr.arpa:53 { errors cache 30 reload loop bind 169.254.20.10 172.21.0.10 forward . __PILLAR__CLUSTER__DNS__ { force_tcp } prometheus :9253 } ip6.arpa:53 { errors cache 30 reload loop bind 169.254.20.10 172.21.0.10 forward . __PILLAR__CLUSTER__DNS__ { force_tcp } prometheus :9253 } .:53 { errors cache 30 { disable success cluster.local disable denial cluster.local } reload loop bind 169.254.20.10 172.21.0.10 forward . __PILLAR__UPSTREAM__SERVERS__ { force_tcp } prometheus :9253 } <MyCorefile>: | # Add custom corefile content ...
-
数分後に、
NodeLocal
DNS キャッシュ・ポッドで、構成マップの変更が反映されます。
スタブ・ドメインまたはアップストリーム・サーバーを使用して拡張するための node-local-dns-config
構成マップの編集
node-local-dns-config
構成マップを編集し、スタブ・ドメインまたはアップストリーム DNS サーバーのカスタマイズなどによって NodeLocal
DNS キャッシュ構成を拡張します。 詳しくは、 Kubernetes のドキュメントを参照。
始める前に: アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
-
NodeLocal
DNS キャッシュ・デーモン・セットが使用可能であることを確認します。kubectl get ds -n kube-system node-local-dns
出力例
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE node-local-dns 4 4 4 4 4 ibm-cloud.kubernetes.io/node-local-dns-enabled=true 82d
-
NodeLocal
DNS キャッシュに構成マップがあることを確認します。-
NodeLocal
DNS キャッシュの構成マップが存在するかどうかを判別します。kubectl get cm -n kube-system node-local-dns-config
構成マップが存在しない場合の出力例
Error from server (NotFound): ConfigMaps "node-local-dns-config" not found
-
構成マップが存在しない場合は、
NodeLocal
DNS キャッシュの構成マップを作成します。kubectl create cm -n kube-system node-local-dns-config
出力例
configmap/node-local-dns-config created
-
-
NodeLocal
DNS キャッシュの構成マップを編集します。 構成マップで、KubeDNS 構文を使用して、スタブ・ドメインおよびアップストリーム DNS サーバーをカスタマイズします。 詳しくは、 Kubernetes のドキュメントを参照。kubectl edit cm -n kube-system node-local-dns-config
出力例
apiVersion: v1 kind: ConfigMap metadata: name: node-local-dns-config namespace: kube-system data: stubDomains: | {"abc.com" : ["1.2.3.4"]}
-
数分後に、
NodeLocal
DNS キャッシュ・ポッドで、構成マップの変更が反映されます。
ゾーン対応 DNS のセットアップ
マルチゾーン IBM Cloud Kubernetes Service クラスターでは、ゾーン対応 DNS をセットアップしてクラスター DNS のパフォーマンスと可用性を向上させることができます。 このセットアップは、同じゾーンのクラスター DNS のトラフィックを優先するように NodeLocal
DNS キャッシュを拡張したものです。
デフォルトでは、クラスターにはゾーン対応 DNS のリソースではなく、クラスター規模の DNS のリソースがセットアップされます。 ゾーン対応 DNS をセットアップした後も、クラスター規模の DNS のリソースはバックアップ DNS として実行され続けます。 ゾーン対応 DNS のリソースはクラスター規模の DNS とは別のものであるため、ゾーン対応 DNS を変更してもクラスター規模の DNS には影響はありません。
クラスターでゾーン対応 DNS を使用している場合は、DNS キャッシュ・ラベルを使用しないでください。
ゾーン対応 DNS のセットアップ
マルチゾーン・クラスターでゾーン対応 DNS をセットアップするには、以下のステップを実行します。
-
DNS 出力のポッドまたは名前空間セレクターに依存するポリシーなど、ゾーン対応 DNS の影響を受ける DNS 出力ネットワーク ポリシー を更新します。 以下のコマンドを実行して、ネットワーク・ポリシーのリストを取得する。
kubectl get networkpolicy --all-namespaces -o yaml
-
kube-system
名前空間内のcoredns
ConfigMap にibm-cloud.kubernetes.io/deploy-zone-aware-dns=true
というラベルを付けます。kubectl label cm -n kube-system coredns --overwrite "ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true"
-
クラスター・マスターをリフレッシュ して、ゾーン対応 DNS リソースをデプロイします。
ibmcloud ks cluster master refresh -c <cluster_name_or_ID>
-
クラスターの詳細情報に含まれている「Master Health」を確認し、リフレッシュ操作が完了するまで待ちます。
ibmcloud ks cluster get -c <cluster_name_or_ID>
-
CoreDNS のスタブ・ドメインおよびアップストリーム DNS サーバーをカスタマイズした場合は、これらのスタブ・ドメインおよびアップストリーム DNS サーバーを使用して
NodeLocal
DNS キャッシュをカスタマイズする必要もあります。 -
クラスターのゾーンの環境変数を設定します。
ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
-
すべてのゾーンで CoreDNS と CoreDNS 自動スケーリング機能ポッドを開始します。
for ZONE in ${ZONES}; do kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=1 done
-
すべてのゾーンで CoreDNS と CoreDNS 自動スケーリング機能ポッドが実行されていることを確認します。
for ZONE in ${ZONES}; do kubectl get pods -n kube-system -l "k8s-app=coredns-autoscaler-${ZONE}" -o wide kubectl get pods -n kube-system -l "k8s-app=coredns-${ZONE}" -o wide done
-
すべてのワーカー・ノードで
NodeLocal
DNS キャッシュ・ポッドを開始します。kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true"
-
すべてのワーカー・ノードで
NodeLocal
DNS キャッシュ・ポッドが実行されていることを確認します。for ZONE in ${ZONES}; do kubectl get pods -n kube-system -l "k8s-app=node-local-dns-${ZONE}" -o wide done
-
将来のワーカーノードが
ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true
のラベルを継承するように、 ワーカープールにラベルを付けます。
ゾーン対応 DNS の無効化と削除
ゾーン対応 DNS を削除するには、まず、マルチゾーン・クラスターの各ゾーンのゾーン対応 DNS を無効にする必要があります。 その後、ゾーン対応 DNS のリソースを削除します。
-
ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true
ラベルをワーカー・プールから削除します。 -
クラスターのゾーンの環境変数を設定します。
ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
-
すべてのワーカー・ノードで
NodeLocal
DNS キャッシュ・ポッドを停止します。kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled-"
-
すべてのゾーンで CoreDNS 自動スケーリング機能ポッドを停止します。
for ZONE in ${ZONES}; do kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=0 done
-
すべてのゾーンで CoreDNS 自動スケーリング機能ポッドが実行されなくなったことを確認します。
for ZONE in ${ZONES}; do kubectl get pods -n kube-system -l "k8s-app=coredns-autoscaler-${ZONE}" done
-
すべてのゾーンで CoreDNS ポッドを停止します。
for ZONE in ${ZONES}; do kubectl scale deployment -n kube-system "coredns-${ZONE}" --replicas=0 done
-
ibm-cloud.kubernetes.io/deploy-zone-aware-dns=true
ラベルを、coredns
名前空間のkube-system
構成マップから削除します。kubectl label cm -n kube-system coredns --overwrite "ibm-cloud.kubernetes.io/deploy-zone-aware-dns-"
-
クラスター・マスターをリフレッシュして、ゾーン対応 DNS のリソースを削除します。
ibmcloud ks cluster master refresh --cluster <cluster-name-or-id>
-
クラスターの詳細情報に含まれている「Master Health」を確認し、リフレッシュ操作が完了するまで待ちます。
ibmcloud ks cluster get -c <cluster_name_or_ID>