Azure Kubernetes Service で CoreDNS をカスタマイズする

Azure Kubernetes Service (AKS) は、すべての 1.12.x 以降のクラスターでクラスター DNS の管理と解決に CoreDNS プロジェクトを使用します。 CoreDNS のカスタマイズおよび Kubernetes について詳しくは、公式のアップ ストリーム ドキュメントを参照してください。

AKS はマネージド サービスであるため、CoreDNS のメイン構成 (CoreFile) を変更することはできません。 代わりに、既定の設定をオーバーライドするには、Kubernetes ConfigMap を使用してください。 既定の AKS CoreDNS ConfigMaps を表示するには、kubectl get configmaps --namespace=kube-system coredns -o yaml コマンドを使用してください。

この記事では、AKS の 基本的な CoreDNS のカスタマイズ オプションに ConfigMaps を使用する方法を説明します。 この方法は、CoreFile のような他のコンテキストでの CoreDNS の構成とは異なります。

Note

以前は、kube-dns がクラスター DNS の管理と解決に使用されていましたが、現在は非推奨になりました。 kube-dns では、Kubernetes 構成マップを介してさまざまなカスタマイズ オプションが提供されていました。 CoreDNS には kube-dns との下位互換性はありません。 以前に使用していたカスタマイズはすべて、CoreDNS 用に更新する必要があります。

開始する前に

  • この記事は、AKS クラスターがすでに存在していることを前提としています。 AKS クラスターが必要な場合は、Azure CLIAzure PowerShell、または Azure portal を使用して作成できます。
  • 実行している CoreDNS のバージョンを確認します。 構成値はバージョンによって変わることがあります。
  • 次の例のような構成を作成するとき、data セクション内の名前は .server または .override で終わる必要があります。 この名前付け規則は、kubectl get configmaps --namespace=kube-system coredns -o yaml コマンドを使用して表示できる既定の AKS CoreDNS ConfigMap で定義されています。

プラグインのサポート

組み込みの CoreDNS プラグインはすべてサポート対象です。 アドオン/サード パーティ製のプラグインはサポート対象外です。

DNS を書き換える

AKS を使用して CoreDNS をカスタマイズして、その場での DNS 名書き換えを行うことができます。

  1. corednsms.yaml という名前のファイルを作成し、次の構成例を貼り付けます。 必ず <domain to be rewritten> を独自の完全修飾ドメイン名に置き換えてください。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      test.server: |
        <domain to be rewritten>.com:53 {
        log
        errors
        rewrite stop {
          name regex (.*)\.<domain to be rewritten>.com {1}.default.svc.cluster.local
          answer name (.*)\.default\.svc\.cluster\.local {1}.<domain to be rewritten>.com
        }
        forward . /etc/resolv.conf # you can redirect this to a specific DNS server such as 10.0.0.10, but that server must be able to resolve the rewritten domain name
        }
    

    重要

    CoreDNS サービス IP などの DNS サーバーにリダイレクトする場合、その DNS サーバーは、書き換えられたドメイン名を解決できる必要があります。

  2. kubectl apply configmap コマンドを使用して ConfigMap を作成し、YAML マニフェストの名前を指定します。

    kubectl apply -f corednsms.yaml
    
  3. kubectl get configmaps を使用してカスタマイズが適用されていることを確認し、coredns-custom ConfigMap を指定します。

    kubectl get configmaps --namespace=kube-system coredns-custom -o yaml
    
  4. ConfigMap を再度読み込み、Kubernetes Scheduler がダウンタイムなしで CoreDNS を再起動できるようにするには、kubectl rollout restart を使用してローリング再起動を実行します。

    kubectl -n kube-system rollout restart deployment coredns
    

カスタム転送サーバー

ネットワーク トラフィックの転送サーバーを指定する必要がある場合は、DNS をカスタマイズするための ConfigMap を作成できます。

  1. corednsms.yaml という名前のファイルを作成し、次の構成例を貼り付けます。 必ず、forward の名前とアドレスを自分の環境の値に置き換えてください。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      test.server: | # you may select any name here, but it must end with the .server file extension
        <domain to be rewritten>.com:53 {
            forward foo.com 1.1.1.1
        }
    
  2. kubectl apply configmap コマンドを使用して ConfigMap を作成し、YAML マニフェストの名前を指定します。

    kubectl apply -f corednsms.yaml
    
  3. ConfigMap を再度読み込み、Kubernetes Scheduler がダウンタイムなしで CoreDNS を再起動できるようにするには、kubectl rollout restart を使用してローリング再起動を実行します。

    kubectl -n kube-system rollout restart deployment coredns
    

カスタム ドメインを使用する

内部的にしか解決できないカスタム ドメインを構成する必要が生じる場合があります。 たとえば、有効な最上位レベルのドメインではないカスタム ドメイン puglife.local を解決したい場合があります。 カスタム ドメインの ConfigMap がないと、AKS クラスターはアドレスを解決できません。

  1. corednsms.yaml という名前の新しいファイルを作成し、次の構成例を貼り付けます。 かならず、カスタム ドメイン と IP アドレスを、自分の環境の値で更新します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      puglife.server: | # you may select any name here, but it must end with the .server file extension
        puglife.local:53 {
            errors
            cache 30
            forward . 192.11.0.1  # this is my test/dev DNS server
        }
    
  2. kubectl apply configmap コマンドを使用して ConfigMap を作成し、YAML マニフェストの名前を指定します。

    kubectl apply -f corednsms.yaml
    
  3. ConfigMap を再度読み込み、Kubernetes Scheduler がダウンタイムなしで CoreDNS を再起動できるようにするには、kubectl rollout restart を使用してローリング再起動を実行します。

    kubectl -n kube-system rollout restart deployment coredns 
    

スタブ ドメイン

CoreDNS を使用してスタブ ドメインを構成することもできます。

  1. corednsms.yaml という名前のファイルを作成し、次の構成例を貼り付けます。 かならず、カスタム ドメイン と IP アドレスを、自分の環境の値で更新します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      test.server: | # you may select any name here, but it must end with the .server file extension
        abc.com:53 {
         errors
         cache 30
         forward . 1.2.3.4
        }
        my.cluster.local:53 {
            errors
            cache 30
            forward . 2.3.4.5
        }
    
    
  2. kubectl apply configmap コマンドを使用して ConfigMap を作成し、YAML マニフェストの名前を指定します。

    kubectl apply -f corednsms.yaml
    
  3. ConfigMap を再度読み込み、Kubernetes Scheduler がダウンタイムなしで CoreDNS を再起動できるようにするには、kubectl rollout restart を使用してローリング再起動を実行します。

    kubectl -n kube-system rollout restart deployment coredns
    

ホストのプラグイン

すべての組み込みプラグインがサポートされるので、CoreDNS hosts プラグインを使って /etc/hosts もカスタマイズできます。

  1. corednsms.yaml という名前のファイルを作成し、次の構成例を貼り付けます。 IP アドレスとホスト名は、必ず実際の環境に合わせた値に更新してください。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom # this is the name of the configmap you can overwrite with your changes
      namespace: kube-system
    data:
        test.override: | # you may select any name here, but it must end with the .override file extension
              hosts { 
                  10.0.0.1 example1.org
                  10.0.0.2 example2.org
                  10.0.0.3 example3.org
                  fallthrough
              }
    
  2. kubectl apply configmap コマンドを使用して ConfigMap を作成し、YAML マニフェストの名前を指定します。

    kubectl apply -f corednsms.yaml
    
  3. ConfigMap を再度読み込み、Kubernetes Scheduler がダウンタイムなしで CoreDNS を再起動できるようにするには、kubectl rollout restart を使用してローリング再起動を実行します。

    kubectl -n kube-system rollout restart deployment coredns
    

トラブルシューティング

エンドポイントや解決策を調べるなど、CoreDNS の一般的なトラブルシューティング手順については、「DNS 解決のデバッグ」を参照してください。

CoreDNS ポッドのスケーリングを構成します

AKS クラスター内の DNS トラフィックの突然の増加は、AKS がワークロードに提供する柔軟性のため、一般的に発生します。 これらの増加により、CoreDNS ポッドによるメモリ消費量が増加する可能性があります。 場合によっては、このメモリ消費量の増加がOut of memory問題の原因となる可能性があります。 この問題を回避するために、AKS クラスターは CoreDNS ポッドを自動スケーリングして、ポッドあたりのメモリ使用量を減らします。 この自動スケーリング ロジックの既定の設定は、coredns-autoscalerConfigMap に保存されます。 ただし、CoreDNS ポッドの既定の自動スケーリングが、CoreDNS ポッドのOut of memory問題を防ぐのに常に有効であるとは限りません。 この場合は、coredns-autoscalerConfigMap を直接変更できます。 Out of memory問題の根本原因に対処せずに CoreDNS ポッドの数を増やすことは、一時的な解決にしかならない場合があることに注意してください。 CoreDNS ポッドが実行されているノードで十分なメモリが使用できない場合、CoreDNS ポッドの数を増やすことは役に立ちません。 さらに調査し、リソース使用量の最適化、リソース要求と制限の調整、ノードへのメモリの追加など、適切な解決策を実行することが必要になる場合があります。

CoreDNS では、ポッドの自動スケーリングに、水平クラスターに比例する自動スケーラーが使用されます。 coredns-autoscalerConfigMap を編集して、CoreDNS ポッドの数のスケーリング ロジックを構成できます。 現在、coredns-autoscalerConfigMap では 2 つの異なる ConfigMap キー値、linearladder がサポートされています。これらは、サポートされている 2 つの制御モードに対応しています。 linearコントローラーは、max( ceil( cores * 1/coresPerReplica ) , ceil( nodes * 1/nodesPerReplica ) ) と同じ [最小値,最大値] の範囲で多数のレプリカを生成します。 ladderコントローラーは、コア スケーリング用とノード スケーリング用の 2 つの異なるステップの関数を参照してレプリカの数を計算し、2 つのレプリカ値の最大値を生成します。 制御モードと ConfigMap のフォーマットの詳細については、上流のドキュメントを参照してください。

重要

クラスターあたり少なくとも 2 個の CoreDNS ポッド レプリカが推奨されます。 構成する CoreDNS ポッド レプリカの数が最小で 1 個の場合、クラスターのアップグレード操作など、ノードのドレインを必要とする操作中にエラーが発生する可能性があります。

coredns-autoscalerConfigMap を取得するには、以下の結果を返すkubectl get configmap coredns-autoscaler -n kube-system -o yamlコマンドを実行することができます。

apiVersion: v1
data:
  ladder: '{"coresToReplicas":[[1,2],[512,3],[1024,4],[2048,5]],"nodesToReplicas":[[1,2],[8,3],[16,4],[32,5]]}'
kind: ConfigMap
metadata:
  name: coredns-autoscaler
  namespace: kube-system
  resourceVersion: "..."
  creationTimestamp: "..."

DNS クエリのログ記録を有効にする

  1. 次の構成を coredns-custom ConfigMap に追加します。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: coredns-custom
      namespace: kube-system
    data:
      log.override: | # you may select any name here, but it must end with the .override file extension
            log
    
  2. 次のコマンドを使用して、構成の変更を適用し、CoreDNS を強制的に ConfigMap を再読み込みさせます。

    # Apply configuration changes
    kubectl apply -f corednsms.yaml
    
    # Force CoreDNS to reload the ConfigMap
    kubectl -n kube-system rollout restart deployment coredns
    
  3. kubectl logs コマンドを使用して CoreDNS デバッグ ログを表示します。

    kubectl logs --namespace kube-system -l k8s-app=kube-dns
    

次のステップ

この記事では、CoreDNS カスタマイズのシナリオ例をいくつか紹介しました。 CoreDNS プロジェクトについては、CoreDNS アップストリーム プロジェクト ページを参照してください。

コア ネットワークの概念の詳細については、「AKS でのアプリケーションに対するネットワークの概念」を参照してください。