すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:DNSサービスのベストプラクティス

最終更新日:Dec 10, 2024

DNS (Domain Name System) サービスは、Kubernetesクラスターの基本サービスです。 クライアントのDNS設定が適切に構成されていない場合、または大規模なクラスターを使用している場合、DNS解決のタイムアウトと失敗が発生する可能性があります。 このトピックでは、問題を回避するためにKubernetesクラスターでDNSサービスを設定するためのベストプラクティスについて説明します。

前提条件

目次

このトピックのベストプラクティスには、クライアントとDNSサーバーが含まれます。

CoreDNSの詳細については、「CoreDNSの公式ドキュメント」をご参照ください。

DNSクエリの最適化

DNSクエリはKubernetesで頻繁に送信されます。 多数のDNSクエリを最適化または回避できます。 次のいずれかの方法を使用して、DNSクエリを最適化できます。

  • 接続プールの使用: クライアントポッドが頻繁にサービスにアクセスする場合は、接続プールの使用を推奨します。 接続プールは、メモリ内の上流サービスへの接続をキャッシュできます。 これにより、クライアントポッドは、DNSクエリを送信し、サービスにアクセスするたびにTCP接続を確立する必要がなくなります。

  • DNSキャッシュを使用する:

    • 接続プールを使用してクライアントポッドをサービスに接続できない場合は、クライアントポッド側でDNS解決結果をキャッシュすることをお勧めします。 詳細については、「NodeLocal DNSCacheを使用したDNS解決の最適化」をご参照ください。

    • NodeLocal DNSCacheを使用できない場合は、コンテナーで組み込みのネームサービスキャッシュデーモン (NSCD) を使用できます。 NSCDの使用方法の詳細については、「KubernetesクラスターでのNSCDの使用」をご参照ください。

  • resolv.confファイルの最適化: resolv.confファイルでndotsおよびsearchパラメーターを使用しているため、DNS解決の効率は、コンテナーでドメイン名を指定する方法によって影響を受けます。 ndotsおよびsearchパラメーターの詳細については、「DNSポリシーとドメイン名解決」をご参照ください。

  • ドメイン名設定の最適化: クライアントポッドがアクセスする必要があるドメイン名を、次のルールに基づいて指定できます。 これらのルールは、ドメイン名を解決しようとする回数を最小限に抑え、DNS解決サービスをより効率的にするのに役立ちます。

    • クライアントポッドが同じ名前空間のサービスにアクセスする必要がある場合は、ドメイン名として <Service-name> を使用します。 <service-name> は、サービスの名前を示します。

    • クライアントポッドが別の名前空間のサービスにアクセスする必要がある場合は、ドメイン名として <Service-name>.<namespace-name> を使用します。 namespace-nameは、サービスが属する名前空間を指定します。

    • クライアントポッドが外部ドメイン名にアクセスする必要がある場合は、ドメイン名にピリオド (.) を追加することで、完全修飾ドメイン名 (FQDN) 形式でドメイン名を指定できます。 これにより、検索ドメインをクエリ対象のドメイン名と組み合わせることによって引き起こされる無効なDNSルックアップが回避されます。 たとえば、クライアントポッドがwww.aliyun.comにアクセスする必要がある場合は、www.aliyun.comを指定できます。 ドメイン名として。

適切なコンテナイメージを使用する

Alpineコンテナイメージの組み込みmusl libcの実装は、glibcの実装とは異なります。

  • Alpine 3.3以前のバージョンは、searchパラメーターをサポートしていません。 そのため、検索ドメインやサービスの検出を指定することはできません。

  • musl libcは、/etc/resolv.confファイルで指定されているDNSサーバーに送信されるクエリを並行して処理します。 その結果、NodeLocal DNSCacheはDNS解決を最適化できません。

  • musl libcは、同じソケットを並行して使用するAおよびAAAAクエリを処理します。 これにより、以前のカーネルバージョンのconntrackポートでパケットが失われます。

詳細については、「musl libc」をご参照ください。

KubernetesクラスターにデプロイされているコンテナーがベースイメージとしてAlpineを使用している場合、musl libcの使用によりドメイン名が解決されないことがあります。 イメージをDebianまたはCentOSに基づくイメージに置き換えることを推奨します。

IPVSの欠陥によって引き起こされる時折のDNS解決タイムアウトの悪影響を減らす

クラスターでkube-proxyの負荷分散モードがIPVSに設定されている場合、CoreDNSポッドのスケールインまたは再起動時にDNS解決タイムアウトが発生する可能性があります。 問題は、Linuxのカーネルバグが原因です。 詳細については、「IPVS」をご参照ください。

次の方法を使用して、これらの問題の悪影響を減らすことができます。

NodeLocal DNSCacheを使用したDNS解決の最適化

Container Service for Kubernetes (ACK) を使用すると、NodeLocal DNSCacheをデプロイして、サービス検出の安定性とパフォーマンスを向上させることができます。 NodeLocal DNSCacheはDaemonSetとして実装され、クラスタノードでDNSキャッシングエージェントを実行して、ACKクラスタのDNS解決の効率を向上させます。

NodeLocal DNSCacheの詳細とACKクラスターにNodeLocal DNSCacheをデプロイする方法については、「NodeLocal DNSCacheの設定」をご参照ください。

適切なCoreDNSバージョンを使用する

CoreDNSはKubernetesと下位互換性があります。 CoreDNSの新しい安定バージョンを使用することを推奨します。 CoreDNSは、ACKコンソールの [アドオン] ページでインストール、更新、および設定できます。 CoreDNSコンポーネントのステータスが、CoreDNSが更新可能であることを示している場合は、できるだけ早い時期にオフピーク時にコンポーネントを更新することを推奨します。

1.7.0より前のCoreDNSバージョンで次の問題が発生する可能性があります。

  • ネットワークのジッター、APIサーバーの再起動、APIサーバーの移行など、CoreDNSとAPIサーバーの間で接続の例外が発生した場合、エラーログを書き込むことができないため、CoreDNSポッドが再起動される可能性があります。 詳細については、「klogのlogtostderrフラグの設定」をご参照ください。

  • CoreDNSは、初期化プロセス中に余分なメモリリソースを占有します。 このプロセスでは、デフォルトのメモリ制限により、大きなクラスタでメモリ不足 (OOM) エラーが発生する可能性があります。 この状況が激化すると、CoreDNSポッドは繰り返し再起動されますが、起動に失敗する可能性があります。 詳細については、「CoreDNSが初期化フェーズ中に大量のメモリを使用する」をご参照ください。

  • CoreDNSには、ヘッドレスサービスのドメイン名解決とクラスター外部からの要求に影響を与える可能性のある問題があります。 詳細については、「plugin/kubernetes: default processorでのトゥームストーンの処理」と「CoreDNSがkubernetes api serverに再接続してもデータは同期されません」をご参照ください。

  • 以前のCoreDNSバージョンの一部は、デフォルトの許容ルールで構成されているため、CoreDNSポッドが異常なノードにデプロイされ、ノードで例外が発生したときに自動的に追い出されない可能性があります。 これにより、クラスター内のドメイン名解決エラーが発生する可能性があります。

次の表に、異なるバージョンのKubernetesを実行するクラスターに推奨される最小限のCoreDNSバージョンを示します。

Kubernetesバージョン

最小CoreDNSバージョン

1.14.8より前 (中止)

v1.6.2

1.14.8以降、1.20.4より前

v1.7.0.0-f59c03d-aliyun

1.20.4以降

v1.8.4.1-3a376cc-aliyun

説明

1.14.8より前のKubernetesバージョンは廃止されました。 CoreDNSを更新する前に、Kubernetesバージョンを更新することを推奨します。

CoreDNSのステータスを監視する

モニタリングメトリクス

CoreDNSは、標準のPrometheus APIを使用して、DNS解決結果などのメトリックを収集します。 これにより、CoreDNSおよびアップストリームDNSサーバーの例外をできるだけ早く特定できます。

デフォルトでは、CoreDNSに関連するモニタリングメトリックとアラートルールは、Alibaba Cloudが提供するManaged Service for Prometheusで定義されています。 ACKコンソールにログインして、Prometheusのマネージドサービスとダッシュボードを有効にします。 詳細については、「CoreDNSモニタリング」をご参照ください。

オープンソースのPrometheusを使用してKubernetesクラスターを監視する場合、Prometheusで関連するメトリクスを表示し、次の主要なメトリクスに基づいてアラートルールを作成できます。 詳細については、「CoreDNS Prometheus公式ドキュメント」をご参照ください。

操作ログ

DNS解決エラーが発生した場合、CoreDNSのログを表示して原因を特定できます。 CoreDNSのロギングを有効にし、Log Serviceを使用してログデータを収集することを推奨します。 詳細については、「CoreDNSログの収集と分析」をご参照ください。

シンクKubernetesイベント

CoreDNS v1.9.3.6-32932850-aliyun以降のバージョンでは、k8s_eventプラグインを有効にして、CoreDNSの情報、エラー、および警告ログを含むKubernetesイベントをイベントセンターにシンクできます。 詳細は、「k8s_event」をご参照ください。

CoreDNS v1.9.3.6-32932850-aliyun以降のバージョンをデプロイすると、デフォルトでk8s_eventプラグインが有効になります。 以前のCoreDNSバージョンをデプロイしてv1.9.3.6-32932850-aliyun以降に更新した場合は、CoreDNSのConfigMapを変更してk8s_eventプラグインを有効にする必要があります。

  1. 次のコマンドを実行してcoredns ConfigMapを開きます。

    kubectl -n kube-system edit configmap/coredns
  2. kubeAPIとk8s_eventプラグインを追加します。

    apiVersion: v1
    data:
      Corefile: |
        .:53 {
            errors
            health {
                lameduck 15s
            }
    
            // The beginning of the plug-in configuration. Ignore other settings. 
            kubeapi
            k8s_event {
              level info error warning // Report Info, Error, and Warning logs to Kubernetes events. 
            }
            // The end of the plug-in configuration. 
    
            kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods verified
                fallthrough in-addr.arpa ip6.arpa
            }
            // Details are not shown. 
        }
  3. CoreDNSポッドのステータスとログを確認します。 ログデータにreloadキーワードが含まれている場合、新しい設定が読み込まれます。

CoreDNSデプロイの変更

CoreDNSポッドの数の変更

少なくとも2つのCoreDNSポッドをプロビジョニングすることを推奨します。 CoreDNSポッドの数がクラスター内のDNSクエリを処理するのに十分であることを確認する必要があります。

CoreDNSのDNS QPSは、CPU使用率に関連しています。 DNSキャッシュを有効にすると、単一のCPUで10,000を超えるDNS QPSを処理できます。 異なるワークロードに必要なDNS QPSは異なる場合があります。 各CoreDNSポッドのピークCPU使用率に基づいてDNS QPSを評価できます。 ピーク時にCoreDNSポッドが複数のvCPUを占有する場合は、CoreDNSポッドの数を増やすことを推奨します。 各CoreDNSポッドのピークCPU使用率を確認できない場合は、CoreDNSポッドとクラスターノードの比率を1:8に設定できます。 これにより、クラスターに8つのノードを追加するたびに、CoreDNSポッドが作成されます。 CoreDNSポッドの総数は10を超えてはなりません。 クラスターに100を超えるノードが含まれている場合は、NodeLocal DNSCacheを使用することを推奨します。 詳細については、「NodeLocal DNSCacheを使用したDNS解決の最適化」をご参照ください。

説明

UDPは再送信をサポートしていません。 CoreDNSポッドが終了すると、CoreDNSポッドが削除または再起動されると、UDPパケットがドロップされる可能性があります。 その結果、クラスターでDNSクエリのタイムアウトや失敗が発生する可能性があります。 IPVSの問題によるUDPパケット損失がクラスターノードで発生した場合、CoreDNSポッドが削除または再起動されてから最大5分続くDNSクエリのタイムアウトまたは失敗がクラスターに発生する可能性があります。 IPVSの問題によって引き起こされるDNSクエリの失敗を解決する方法の詳細については、IPVSエラーのためにDNS解決が失敗した場合はどうすればよいですか?.

CoreDNSポッドを適切なノードにスケジュールする

CoreDNSポッドをクラスターにデプロイする場合は、複数のゾーンにまたがる異なるクラスターノードにCoreDNSポッドをデプロイすることを推奨します。 これにより、単一のノードまたはゾーンに障害が発生した場合のサービスの中断を防ぎます。 デフォルトでは、ノードに基づくソフトなアンチアフィニティ設定がCoreDNS用に構成されています。 ノードが不十分なため、一部またはすべてのCoreDNSポッドが同じノードにデプロイされる場合があります。 この場合、CoreDNSポッドを削除し、ポッドを再スケジュールすることを推奨します。

CoreDNSポッドは、CPUとメモリリソースが完全に利用されているクラスターノードにデプロイしないでください。 そうでない場合、DNS QPSおよび応答時間は悪影響を受ける。 クラスターに十分なノードが含まれている場合は、カスタムパラメーターを設定して、排他ノードにCoreDNSポッドをスケジュールできます。 これにより、CoreDNSは安定したドメイン名解決サービスを提供できます。 排他的クラスターノードにCoreDNSポッドをスケジュールする方法の詳細については、「カスタムパラメーターを設定して排他的ノードにCoreDNSポッドをデプロイする」を参照してください。

CoreDNSポッドの数を手動で増やす

クラスターノードの数が長期間変わらない場合は、次のコマンドを実行してCoreDNSポッドの数を増やすことができます。

kubectl scale -- replicas={target} deployment/coredns -n kube-system
説明

{target} を必要な値に置き換えます。

cluster-autoscalerを使用してCoreDNSポッドの数を自動的に増やす

クラスターノードの数が増えた場合、次のYAMLテンプレートを使用してcluster-proportional-autoscalerをデプロイし、CoreDNSポッドの数を動的に増やすことができます。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dns-autoscaler
  namespace: kube-system
  labels:
    k8s-app: dns-autoscaler
spec:
  selector:
    matchLabels:
      k8s-app: dns-autoscaler
  template:
    metadata:
      labels:
        k8s-app: dns-autoscaler
    spec:
      serviceAccountName: admin
      containers:
      - name: autoscaler
        image: registry.cn-hangzhou.aliyuncs.com/acs/cluster-proportional-autoscaler:1.8.4
        resources:
          requests:
            cpu: "200m"
            memory: "150Mi"
        command:
        - /cluster-proportional-autoscaler
        - --namespace=kube-system
        - --configmap=dns-autoscaler
        - --nodelabels=type!=virtual-kubelet
        - --target=Deployment/coredns
        - --default-params={"linear":{"coresPerReplica":64,"nodesPerReplica":8,"min":2,"max":100,"preventSinglePointFailure":true}}
        - --logtostderr=true
        - --v=9

上記の例では、線形スケーリングポリシーが使用されています。 CoreDNSポッドの数は、以下の式に基づいて計算される。Replicas (ポッド) = Max (Ceil (Cores × 1/coresPerReplica), Ceil (Nodes × 1/nodesPerReplica)) 。 CoreDNSポッドの数は、線形スケーリングポリシーのmaxminの値の対象となります。 次のコードブロックは、線形スケーリングポリシーのパラメーターを示しています。

{
      "coresPerReplica": 64,
      "nodesPerReplica": 8,
      "min": 2,
      "max": 100,
      "preventSinglePointFailure": true
}

HPAを使用してCPU負荷に基づいてCoreDNSポッドの数を増やす

Horizontal Pod Autoscaler (HPA) は、CoreDNSポッドのスケールインアクティビティを頻繁にトリガーします。 HPAを使用しないことをお勧めします。 特定のシナリオでHPAが必要な場合は、CPU使用率に基づいて次のポリシー設定を参照できます。

---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: coredns-hpa
  namespace: kube-system
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: coredns
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: 50
説明

HPAの使用方法の詳細については、「水平ポッド自動スケーリングの実装」をご参照ください。

カスタムパラメータを使用して排他ノードにCoreDNSポッドをデプロイする

  1. ACK コンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ノード] > [ノード] を選択します。

  3. [ノード] ページで、[ラベルとテイントの管理] をクリックします。

  4. [ラベルとテイントの管理] ページの [ラベル] タブで、管理するノードを選択し、[ラベルの追加] をクリックします。

    説明

    選択するノードの数は、CoreDNSポッドの数よりも大きい必要があります。 これにより、複数のCoreDNSポッドを同じノードにデプロイできなくなります。

  5. [追加] ダイアログボックスで、次のパラメーターを設定し、[OK] をクリックします。

    • 名前: node-role-typeを入力します。

    • : corednsを入力します。

  6. 左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。 表示されるページで、CoreDNSを検索します。

  7. CoreDNSセクションで [設定] をクリックします。 [CoreDNSパラメーター] ダイアログボックスで、[NodeSelector] の右側にある [+ 追加] をクリックし、次のパラメーターを設定し、[OK] をクリックします。

    • キー: node-role-typeを入力します。

    • 値: corednsを入力します。

    CoreDNSポッドは、指定されたラベルを持つノードに再スケジュールされます。

CoreDNSを適切に設定する

ACKはCoreDNSのデフォルト設定のみを提供します。 パラメーターを変更して設定を最適化し、CoreDNSがクライアントポッドに通常のDNSサービスを提供できるようにすることができます。 オンデマンドでCoreDNSの設定を変更できます。 詳細については、「DNSポリシーとドメイン名解決」および「CoreDNS公式ドキュメント」をご参照ください。

Kubernetesクラスターと一緒にデプロイされた以前のCoreDNSバージョンのデフォルト設定はリスクをもたらす可能性があります。 次の方法を使用して、設定をチェックおよび最適化することを推奨します。

Container Intelligence Serviceコンソールに移動し、定期検査および診断コンポーネントを使用してCoreDNSの設定を確認できます。 結果にcoredns ConfigMapに関連するエラーが表示された場合は、上記の操作を実行することをお勧めします。

CoreDNSのリソースリクエストと制限を調整する

CoreDNSは、次のルールに基づいてリソースを消費します。

  • CoreDNSが再起動して設定ファイルをリロードすると、API Serverを接続して再接続すると、CPUおよびメモリリソースの使用量が増加します。

  • CoreDNSのCPU使用率は、CoreDNSのDNS QPSとともに増加します。

  • CoreDNSのメモリ使用量は、クラスターサイズとサービスの数とともに増加します。

次の表に、リソース要求のデフォルト値と、システムがCoreDNSをデプロイするときの制限を示します。 クラスターのステータスに基づいて値を変更できます。 詳細については、「O&M管理-コンポーネント管理-ネットワーク-CoreDNS-パラメーター設定」を参照してください。

リソースタイプ

リクエスト /制限

デフォルト

説明

CPU

リクエスト

100m

ワークロードへの影響なし

制限

非該当

低い値を指定すると、CoreDNSのDNS QPSは悪影響を受けます。

メモリ

リクエスト

100 ミ

ワークロードへの影響なし

制限

2 Gi

デフォルト値より低い値を指定すると、OOMエラーが発生する可能性があります。

説明

1.8.4より前のCoreDNSバージョンのデフォルト設定は、前の表で説明したものと異なる場合があります。 要件に基づいて設定を変更できます。

kube-dnsサービスのアフィニティ設定を無効にする

アフィニティ設定により、CoreDNSポッドが異なる負荷を処理する可能性があります。 アフィニティ設定を無効にするには、次の手順を実行します。

ACKコンソールの使用

  1. ACK コンソールにログインします。

  2. ACK コンソールの左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  3. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、クラスターに対応する [操作] 列の [詳細] をクリックします。

  4. 詳細ページの左側のナビゲーションウィンドウで、[ネットワーク] > [サービス] を選択します。

  5. kube-system名前空間で、kube-dnsサービスを見つけ、[操作] 列の [YAMLで表示] をクリックします。

    • sessionAffinityフィールドの値がNoneの場合、次の手順をスキップします。

    • sessionAffinityフィールドの値がClientIPの場合、次の手順を実行します。

  6. sessionAffinitysessionAffinityConfig、およびすべてのサブフィールドを削除します。 次に、[更新] をクリックします。

    # Delete the following content. 
    sessionAffinity: ClientIP
      sessionAffinityConfig:
        clientIP:
          timeoutSeconds: 10800
  7. kube-dns Serviceを見つけ、[操作] 列の [YAMLで表示] をもう一度クリックして、sessionAffinityフィールドの値が [なし] かどうかを確認します。 値がNoneの場合、kube-dnsサービスが変更されます。

CLIの使用

  1. 次のコマンドを実行して、kube-dns Serviceの設定を照会します。

    kubectl -n kube-system get svc kube-dns -o yaml
    • sessionAffinityフィールドの値がNoneの場合、次の手順をスキップします。

    • sessionAffinityフィールドの値がClientIPの場合、次の手順を実行します。

  2. 次のコマンドを実行して、kube-dnsサービスを変更します。

    kubectl -n kube-system edit service kube-dns
  3. sessionAffinitysessionAffinityConfig、およびすべてのサブフィールドを含む、sessionAffinityに関連するすべてのフィールドを削除します。 次に、変更を保存して終了します。

    # 次のコンテンツを削除します。 
    sessionAffinity: ClientIP
      sessionAffinityConfig:
        clientIP:
          timeoutSeconds: 10800 
  4. kube-dns Serviceを変更した後、次のコマンドを再度実行して、sessionAffinityフィールドの値がNoneかどうかを確認します。 値がNoneの場合、kube-dnsサービスが変更されます。

    kubectl -n kube-system get svc kube-dns -o yaml

autopathプラグインを無効にする

自動パスプラグインは以前のバージョンのCoreDNSで有効になっており、特定のシナリオでDNS解決エラーを引き起こす可能性があります。 autopathプラグインが有効になっている場合は、coredns ConfigMapでプラグインを無効にする必要があります。 詳細については、「オートパス」をご参照ください。

説明

自動パスプラグインを無効にすると、クライアントから1秒あたりに送信されるDNSクエリの数は最大で3倍になります。 したがって、ドメイン名を解決するために必要な時間も最大で3倍になります。 CoreDNSの負荷とビジネスへの影響に細心の注意を払う必要があります。

  1. kubectl -n kube-system edit configmap corednsコマンドを実行して、coredns ConfigMapを変更します。

  2. autopath @ kubernetesを削除します。 次に、変更を保存して終了します。

  3. CoreDNSポッドのステータスとログを確認します。 ログデータにreloadキーワードが含まれている場合、新しい設定が読み込まれます。

CoreDNSのグレースフルシャットダウンの設定

説明

ACKは、coredns ConfigMapを更新するときに追加のメモリリソースを消費する可能性があります。 coredns ConfigMapを変更した後、CoreDNSポッドのステータスを確認します。 ポッドのメモリリソースが使い果たされた場合は、CoreDNSデプロイメントでポッドのメモリ制限を変更します。 メモリ制限を2 GBに変更することを推奨します。

ACKコンソールの使用

  1. ACK コンソールにログインします。

  2. ACK コンソールの左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  3. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、クラスターに対応する [操作] 列の [詳細] をクリックします。

  4. 詳細ページの左側のナビゲーションウィンドウで、[設定] > [ConfigMaps] を選択します。

  5. kube-system名前空間を選択します。 coredns ConfigMapを見つけ、[操作] 列の [YAMLの編集] をクリックします。

  6. 次のCorefileコンテンツを参照し、ヘルスプラグインが有効になっていることを確認します。 次に、lameduck15秒に設定し、[OK] をクリックします。

  7. .:53 {
            errors       
            # The setting of the health plug-in may vary based on the CoreDNS version. 
            # Scenario 1: The health plug-in is disabled by default.    
            # Scenario 2: The health plug-in is enabled by default but lameduck is not set. 
            health      
            # Scenario 3: The health plug-in is enabled by default and lameduck is set to 5s.    
            health {
                lameduck 5s
            }      
            # In the preceding scenarios, change the value of lameduck to 15s. 
            health {
                lameduck 15s
            }       
            # You do not need to modify other plug-ins. 
        }

CoreDNSポッドが通常どおり実行される場合、CoreDNSは正常にシャットダウンできます。 CoreDNSポッドが通常どおり実行されない場合は、ポッドイベントとログを確認して原因を特定できます。

CLIの使用

  1. 次のコマンドを実行してcoredns ConfigMapを開きます。

  2. kubectl -n kube-system edit configmap/coredns
  3. 次のYAMLコンテンツを参照し、ヘルスプラグインが有効になっていることを確認します。 次に、lameduck15秒に設定します。

  4. . : 53 {
            errors     
            # ヘルスプラグインの設定は、CoreDNSのバージョンによって異なる場合があります。 
            # シナリオ1: ヘルスプラグインはデフォルトで無効になっています。      
            # シナリオ2: ヘルスプラグインはデフォルトで有効になっていますが、lameduckは設定されていません。 
            health
            # シナリオ3: ヘルスプラグインはデフォルトで有効になっており、lameduckは5秒に設定されています。    
            health {
                lameduck 5s
            }
            # 上記のシナリオでは、lameduckの値を15秒に変更します。 
            health {
                lameduck 15s
            }
            # 他のプラグインを変更する必要はありません。 
        }
  5. coredns ConfigMapを変更した後、変更を保存して終了します。

  6. CoreDNSポッドが通常どおり実行される場合、CoreDNSは正常にシャットダウンできます。 CoreDNSポッドが通常どおり実行されない場合は、ポッドイベントとログを確認して原因を特定できます。

VPCのフォワードプラグインおよびアップストリームDNSサーバーのデフォルトプロトコルの設定

NodeLocal DNSCacheは、TCPプロトコルを使用してCoreDNSと通信します。 CoreDNSは、DNSクエリのソースによって使用されるプロトコルに基づいて、アップストリームDNSサーバーと通信します。 したがって、外部ドメイン名のクライアントポッドから送信されたDNSクエリは、NodeLocal DNSCacheとCoreDNSを通過し、TCP経由でVPCのDNSサーバーに到達します。 DNSサーバーのIPアドレスは100.100.2.136と100.100.2.138です。 これらのIPアドレスは、Elastic Compute Service (ECS) インスタンスで自動的に設定されます。

VPC内のDNSサーバーでは、TCPのサポートが制限されています。 NodeLocal DNSCacheを使用する場合は、CoreDNSの設定を変更し、CoreDNSがアップストリームDNSサーバーとの通信にUDPを使用できるようにする必要があります。 これにより、DNS解決の問題が防止されます。 以下の変更に基づいて、CoreDNSのConfigMapを変更することを推奨します。 ConfigMapの名前はcorednsで、kube-system名前空間に属します。 詳細については、「ConfigMapsの管理」をご参照ください。 forwardプラグインの設定を変更し、アップストリームサーバーとの通信に使用されるプロトコルをperfer_udpに設定します。 このように、CoreDNSは、好ましくは、上流DNSサーバと通信するためにUDPプロトコルを使用する。 次の変更に基づいて設定を変更できます。

# The original setting
forward . /etc/resolv.conf
# The modified setting
forward . /etc/resolv.conf {
  prefer_udp
}

準備完了プラグインの設定

1.5.0以降のバージョンのCoreDNSの準備完了プラグインを設定する必要があります。

  1. 次のコマンドを実行してcoredns ConfigMapを開きます。

    kubectl -n kube-system edit configmap/coredns
  2. readyのみを含む行が存在するかどうかを確認します。 行が存在しない場合は、行を追加してreadyを指定し、Escキーを押して :wq! と入力し、enterキーを押してファイルを保存し、編集モードを終了します。

    apiVersion: v1
    data:
     Corefile: |
      .:53 {
        errors
        health {
          lameduck 15s
        }
        ready # Add this line and make sure that the word "ready" is aligned with the word "kubernetes". 
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods verified
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . /etc/resolv.conf {
          max_concurrent 1000
                prefer_udp
        }
        cache 30
        loop
        log
        reload
        loadbalance
      }
  3. CoreDNSポッドのステータスとログを確認します。 ログデータにreloadキーワードが含まれている場合、新しい設定が読み込まれます。