IBM Cloud Docs
クラスターの DNS プロバイダーの構成

クラスターの 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 のドキュメントを参照。

始める前に: アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。

  1. 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
    
  2. 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 構成 (スタブ・ドメインなど) が同じになるよう保持します。

始める前に: アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。

  1. CoreDNS のデプロイメントが使用可能であることを確認します。 CLI 出力で、1 つのデプロイメントが AVAILABLE であることを確認します。

    kubectl get deployment -n kube-system coredns
    

    出力例

    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    coredns   3/3     3            3           69d
    
  2. 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
            }
    
  3. オプション: 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
        }
    
  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
  1. アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。

  2. CoreDNS のスタブ・ドメインおよびアップストリーム DNS サーバーをカスタマイズした場合は、これらのスタブ・ドメインおよびアップストリーム DNS サーバーを使用して NodeLocal DNS キャッシュをカスタマイズする必要もあります。

  3. クラスター内のノードをリストします。 NodeLocal DNS キャッシング・エージェント・ポッドは、各ノードで実行されるデーモン・セットに含まれています。

    kubectl get nodes
    
  4. ibm-cloud.kubernetes.io/node-local-dns-enabled=true ラベルをワーカー・ノードに追加します。 このラベルは、ワーカー・ノード上の DNS キャッシング・エージェント・ポッドを開始します。

    1. 1 つ以上のワーカー・ノードにラベルを追加します。

      • クラスター内のすべてのワーカー・ノードにラベルを付けるには、既存のすべてのワーカー・プールにラベルを追加します。

      • 個々のワーカー・ノードにラベルを付けるには、以下のようにします

        kubectl label node <node_name> --overwrite "ibm-cloud.kubernetes.io/node-local-dns-enabled=true"
        
    2. 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
      
    3. ワーカー・ノードで 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>
      
  5. ワーカー・ノードごとに上記の手順を繰り返して、DNS キャッシングを有効にします。

NodeLocal DNS キャッシュの無効化

1 台以上のワーカー・ノードで NodeLocal DNS キャッシュを無効にします。

  1. アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。

  2. ワーカー・ノードから 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-"
    
    1. 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   
      
    2. DNS キャッシュが無効になっているノードでポッドが実行されていないことを確認します。 出力にはポッドが表示されていません。

      kubectl get pods -n kube-system -l k8s-app=node-local-dns -o wide
      

      出力例

      No resources found.
      
  3. ワーカー・ノードごとに上記の手順を繰り返して、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 キャッシュ構成をカスタマイズします。

始める前に: アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。

  1. 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
    
  2. デフォルト設定を編集するか、カスタム 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 ...
    
  3. 数分後に、NodeLocal DNS キャッシュ・ポッドで、構成マップの変更が反映されます。

スタブ・ドメインまたはアップストリーム・サーバーを使用して拡張するための node-local-dns-config 構成マップの編集

node-local-dns-config 構成マップを編集し、スタブ・ドメインまたはアップストリーム DNS サーバーのカスタマイズなどによって NodeLocal DNS キャッシュ構成を拡張します。 詳しくは、 Kubernetes のドキュメントを参照。

始める前に: アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。

  1. 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
    
  2. NodeLocal DNS キャッシュに構成マップがあることを確認します。

    1. NodeLocal DNS キャッシュの構成マップが存在するかどうかを判別します。

      kubectl get cm -n kube-system node-local-dns-config
      

      構成マップが存在しない場合の出力例

      Error from server (NotFound): ConfigMaps "node-local-dns-config" not found
      
    2. 構成マップが存在しない場合は、NodeLocal DNS キャッシュの構成マップを作成します。

      kubectl create cm -n kube-system node-local-dns-config
      

      出力例

      configmap/node-local-dns-config created
      
  3. 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"]}
    
  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 をセットアップするには、以下のステップを実行します。

  1. DNS 出力のポッドまたは名前空間セレクターに依存するポリシーなど、ゾーン対応 DNS の影響を受ける DNS 出力ネットワーク ポリシー を更新します。 以下のコマンドを実行して、ネットワーク・ポリシーのリストを取得する。

    kubectl get networkpolicy --all-namespaces -o yaml
    
  2. 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"
    
  3. クラスター・マスターをリフレッシュ して、ゾーン対応 DNS リソースをデプロイします。

    ibmcloud ks cluster master refresh -c <cluster_name_or_ID>
    
  4. クラスターの詳細情報に含まれている「Master Health」を確認し、リフレッシュ操作が完了するまで待ちます。

    ibmcloud ks cluster get -c <cluster_name_or_ID>
    
  5. CoreDNS のスタブ・ドメインおよびアップストリーム DNS サーバーをカスタマイズした場合は、これらのスタブ・ドメインおよびアップストリーム DNS サーバーを使用して NodeLocal DNS キャッシュをカスタマイズする必要もあります。

  6. クラスターのゾーンの環境変数を設定します。

    ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
    
  7. すべてのゾーンで CoreDNS と CoreDNS 自動スケーリング機能ポッドを開始します。

    for ZONE in ${ZONES}; do
        kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=1
    done
    
  8. すべてのゾーンで 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
    
  9. すべてのワーカー・ノードで NodeLocal DNS キャッシュ・ポッドを開始します。

    kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true"
    
  10. すべてのワーカー・ノードで NodeLocal DNS キャッシュ・ポッドが実行されていることを確認します。

    for ZONE in ${ZONES}; do
        kubectl get pods -n kube-system -l "k8s-app=node-local-dns-${ZONE}" -o wide
    done
    
  11. 将来のワーカーノードが ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true のラベルを継承するように、 ワーカープールにラベルを付けます

ゾーン対応 DNS の無効化と削除

ゾーン対応 DNS を削除するには、まず、マルチゾーン・クラスターの各ゾーンのゾーン対応 DNS を無効にする必要があります。 その後、ゾーン対応 DNS のリソースを削除します。

  1. ibm-cloud.kubernetes.io/zone-aware-dns-enabled=true ラベルをワーカー・プールから削除します。

  2. クラスターのゾーンの環境変数を設定します。

    ZONES=$(kubectl get nodes --no-headers --ignore-not-found=true -o jsonpath='{range .items[*]}{.metadata.labels.topology\.kubernetes\.io/zone}{"\n"}{end}' | uniq)
    
  3. すべてのワーカー・ノードで NodeLocal DNS キャッシュ・ポッドを停止します。

    kubectl label nodes --all --overwrite "ibm-cloud.kubernetes.io/zone-aware-dns-enabled-"
    
  4. すべてのゾーンで CoreDNS 自動スケーリング機能ポッドを停止します。

    for ZONE in ${ZONES}; do
        kubectl scale deployment -n kube-system "coredns-autoscaler-${ZONE}" --replicas=0
    done
    
  5. すべてのゾーンで CoreDNS 自動スケーリング機能ポッドが実行されなくなったことを確認します。

    for ZONE in ${ZONES}; do
        kubectl get pods -n kube-system -l "k8s-app=coredns-autoscaler-${ZONE}"
    done
    
  6. すべてのゾーンで CoreDNS ポッドを停止します。

    for ZONE in ${ZONES}; do
        kubectl scale deployment -n kube-system "coredns-${ZONE}" --replicas=0
    done
    
  7. 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-"
    
  8. クラスター・マスターをリフレッシュして、ゾーン対応 DNS のリソースを削除します。

    ibmcloud ks cluster master refresh --cluster <cluster-name-or-id>
    
  9. クラスターの詳細情報に含まれている「Master Health」を確認し、リフレッシュ操作が完了するまで待ちます。

    ibmcloud ks cluster get -c <cluster_name_or_ID>