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

Container Service for Kubernetes:CoreDNSを自動的に更新するようにACKを設定する

最終更新日:Nov 12, 2024

このトピックでは、CoreDNSを更新する前に事前チェックおよび最適化する方法について説明します。 このトピックでは、Container Service for Kubernetes (ACK) を設定してCoreDNSを自動的に更新する方法についても説明します。

前提条件

kubectlクライアントがクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。

CoreDNSの更新に関する注意事項

  • ACKがCoreDNSを更新すると、ACKはCoreDNSのYAMLファイルを上書きします。 ACKはcoredns ConfigMapを更新しますが、CoreDNSポッドの数は変更しません。

  • CoreDNSのYAMLファイルで許容範囲、CPUとメモリの要求、またはCPUとメモリの制限を変更した場合、ACKはCoreDNSを更新するときに変更を上書きします。 CoreDNSのYAMLファイルでこれらの変更を保持するには、CoreDNSを手動で更新するか、CoreDNSが自動的に更新された後、これらの変更をCoreDNSのYAMLファイルに再度適用する必要があります。 CoreDNSを手動でアップグレードする方法の詳細については、「CoreDNSの手動更新」をご参照ください。

  • kube-proxyの負荷分散モードがIP仮想サーバー (IPVS) に設定されている場合、CoreDNSが更新された後、クラスター内のすべてのDNSクエリが失敗するかタイムアウトする可能性があります。 この状況は約5分続きます。 この問題を回避するには、次のいずれかの方法を使用できます。

  • ACKはCoreDNSの更新に約2分かかります。 消費時間は、CoreDNSポッドの数によって異なります。 新しくプロビジョニングされたCoreDNSポッドをスケジュールまたは起動できない場合、チケットを起票します。 ACKがCoreDNSを更新しても、CoreDNSが更新される前にプロビジョニングされたCoreDNSポッドはACKによって停止されません。 したがって、更新プロセスはクラスタ内のDNS解決サービスを中断しません。 更新は、更新開始後10分以内にロールバックできます。

準備完了プラグインを有効にする

CoreDNSを手動で更新し、CoreDNSのバージョンが1.5.0以降の場合、ACKがCoreDNSを更新する前に、CoreDNS ConfigMapで準備完了プラグインが有効になっているかどうかを確認する必要があります。 readyフィールドが存在しない場合は、readyフィールドをConfigMapに追加します。 それ以外の場合、CoreDNSは更新後に通常どおり起動できません。

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

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

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

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

  5. ConfigMapページの上部で、名前空間をkube-systemに設定します。 次に、coredns ConfigMapを見つけ、[操作] 列の [YAMLの編集] をクリックします。

  6. [YAMLで表示] パネルで、readyフィールドが存在するかどうかを確認します。 フィールドが存在しない場合は、readyフィールドを追加し、[OK] をクリックします。

    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
        }
        cache 30
        loop
        log
        reload
        loadbalance
      }
  7. 次のコマンドを実行して、CoreDNSポッドのログを印刷し、新しい構成がロードされているかどうかを確認します。 ほとんどの場合、CoreDNSポッドはホットロードを完了するのに約30秒かかります。

    kubectl logs coredns-78d4b8bd88-n6wjm -n kube-system

    出力にplugin/reloadが含まれている場合、新しいCoreDNS設定が読み込まれます。

CoreDNSの更新

ACKコンソールの [アドオン] ページに移動し、CoreDNSを更新できます。

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

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

  3. [クラスター] ページで、管理するクラスターを見つけ、[操作] 列の [詳細] > [コンポーネントの管理] を選択します。

  4. [アドオン] ページで、[CoreDNS] を見つけ、[アップグレード] をクリックします。

IPVSモードでUDPタイムアウト期間を変更する

kube-proxyがIPVSモードで実行されている場合、IPVSのセッション維持ポリシーにより、CoreDNSが更新されてから最初の5分でDNS解決が失敗することがあります。 次のいずれかの方法を使用して、IPVSモードのUDPセッションのタイムアウト時間を10秒に短縮できます。 このようにして、CoreDNSが更新された後に発生するDNS解決エラーが少なくなります。 UDPを使用するアプリケーションがクラスターにデプロイされている場合は、CoreDNSを更新する前にこれらのアプリケーションへの影響を評価してください。 またできます チケットを起票してテクニカルサポートをリクエストします。

説明

kube-proxyがIPVSモードで実行されない場合、UDPセッションのタイムアウト期間を変更する必要はありません。 kube-proxyの負荷分散モードを確認する方法の詳細については、「基本情報の表示」をご参照ください。

Kubernetes 1.18以降を実行するACKクラスター

ACKコンソールの使用

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

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

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

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

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

  6. [YAMLで表示] パネルで、ipvsフィールドにudpTimeout: 10sを追加し、[OK] をクリックします。

    apiVersion: v1
    data:
      config.conf: |
        apiVersion: kubeproxy.config.k8s.io/v1alpha1
        kind: KubeProxyConfiguration
        # Irrelevant fields are not shown. 
        mode: ipvs
        # If the ipvs field does not exist, you must add the field. 
        ipvs:
          udpTimeout: 10s
  7. kube-proxy-workerという名前のすべてのポッドを再作成します。

    1. 詳細ページの左側のナビゲーションウィンドウで、[ワークロード] > [DaemonSets] を選択します。

    2. DaemonSetsページで、kube-proxy-workerを見つけてクリックします。

    3. kube-proxy-workerページの [ポッド] タブでポッドを選択し、[操作] 列の [詳細] > [削除] を選択します。 表示されるメッセージで、[確認] をクリックします。

      上記の手順を繰り返して、すべてのポッドを削除します。 ポッドを削除すると、システムは自動的にポッドを再作成します。

  8. UDPセッションのタイムアウト時間が変更されていないか確認します。

    1. 次のコマンドを実行してipvsadmをインストールします。

      ipvsadmは、IPVSの管理に使用できるツールです。 詳細については、「ipvsadm」をご参照ください。

      yum install -y ipvsadm
    2. クラスター内のElastic Compute Service (ECS) インスタンスにログインし、次のコマンドを実行して出力の3番目の値を確認します。

      ipvsadm -L --timeout

      出力の3番目の値が10の場合、UDPセッションのタイムアウト期間が変更されます。

      説明

      UDPセッションのタイムアウト期間が変更された後、少なくとも5分待ってから続行してください。

CLIの使用

  1. 次のコマンドを実行して、kube-proxy-worker ConfigMapを変更します。

    kubectl -n kube-system edit configmap kube-proxy-worker
  2. udpTimeout: 10sをkube-proxy-worker ConfigMapのipvsフィールドに追加します。 次に、変更を保存して終了します。

    apiVersion: v1
    data:
      config.conf: |
        apiVersion: kubeproxy.config.k8s.io/v1alpha1
        kind: KubeProxyConfiguration
        # Irrelevant fields are not shown. 
        mode: ipvs
        # If the ipvs field does not exist, you must add the field. 
        ipvs:
          udpTimeout: 10s
  3. 次のコマンドを実行して、kube-proxy-workerという名前のすべてのポッドを再作成します。

    1. 次のコマンドを実行してポッドを照会します。

      kubectl -n kube-system get pod -o wide | grep kube-proxy-worker
    2. 次のコマンドを実行して、前の手順で返されたすべてのポッドを削除します。 次に、システムはkube-proxy-workerという名前のポッドを再作成します。

      kubectl -n kube-system delete pod <kube-proxy-worker-****>
      説明

      <kube-proxy-worker-****> を、前の手順で返されたポッドの名前に置き換えます。

  4. UDPセッションのタイムアウト時間が変更されていないか確認します。

    1. 次のコマンドを実行してipvsadmをインストールします。

      ipvsadmは、IPVSの管理に使用できるツールです。 詳細については、「ipvsadm」をご参照ください。

      yum install -y ipvsadm
    2. クラスター内のElastic Compute Service (ECS) インスタンスにログインし、次のコマンドを実行して出力の3番目の値を確認します。

      ipvsadm -L --timeout

      出力の3番目の値が10の場合、UDPセッションのタイムアウト期間が変更されます。

      説明

      UDPセッションのタイムアウト期間が変更された後、少なくとも5分待ってから続行してください。

Kubernetes 1.16以前を実行するACKクラスター

Kubernetes 1.16またはそれ以前のバージョンを実行するACKクラスターのkube-proxyは、udpTimeoutパラメーターをサポートしていません。 UDPセッションのタイムアウト期間を変更するには、OOSを使用して、クラスター内のすべてのECSインスタンスで次のipvsadmコマンドを同時に実行することを推奨します。

sudo yum install -y ipvsadm
sudo ipvsadm -L --timeout > /tmp/ipvsadm_timeout_old
sudo ipvsadm --set 900 120 10
sudo ipvsadm -L --timeout > /tmp/ipvsadm_timeout_new
diff /tmp/ipvsadm_timeout_old /tmp/ipvsadm_timeout_new

OOSを使用して複数のECSインスタンスを同時に管理する方法の詳細については、「一度に複数のインスタンスを管理する」をご参照ください。

次のステップ

CoreDNSが更新された後、必要に応じてCoreDNSの設定を最適化できます。 詳細については、「CoreDNSの適切な設定」をご参照ください。