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

Container Service for Kubernetes:CoreDNSを手動で更新する

最終更新日:Nov 12, 2024

現在のCoreDNSバージョンが古くなっていても、CoreDNSのアップグレードボタンがACKコンソールのアドオンページに表示されていない場合、Container Service for Kubernetes (ACK) クラスターを設定してCoreDNSを自動的に更新することはできません。 このシナリオでは、CoreDNSを手動で更新できます。 このトピックでは、CoreDNSを手動で更新する方法について説明します。

前提条件

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

メモの更新

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

  • ACKはCoreDNSの更新に約2分かかります。 期間は、CoreDNSポッドの数によって異なります。 新しくプロビジョニングされたCoreDNSポッドをスケジュールまたは起動できない場合、チケットを起票します。 既存のCoreDNSポッドがまだ実行されているため、DNS解決は中断されません。

CoreDNSバージョンの照会

ACKコンソールの使用

  1. Container Service for Kubernetes (ACK) コンソールにログインします。

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

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

  4. クラスターの詳細ページの左側のナビゲーションウィンドウで、[ワークロード] > [デプロイ] を選択します。

  5. [デプロイメント] ページで、[名前空間][kube-system] に設定し、[イメージ] 列でCoreDNSバージョンを確認します。 dns

kubectlを使う

次のコマンドを実行して、CoreDNSのバージョンを照会できます。

kubectl get deployment coredns -n kube-system -o jsonpath="{.spec.template.spec.containers[0].image}"

期待される出力:

この例では、バージョン1.6.2が使用されています。

アップデートバージョンの確認

更新するCoreDNSのバージョンを確認します。 次の表に、CoreDNSと互換性のあるKubernetesのバージョンを示します。 Kubernetesバージョンと互換性のある最新のCoreDNSバージョンを使用することを推奨します。

Kubernetesバージョン

CoreDNSバージョン

[1.11, 1.16]

v1.6.2

1.14.8以降および1.22以前のバージョン

v1.6.7およびv1.7.0

1.20.4以降のバージョン

v1.8.4およびv1.9.3

重要

v1.8.4およびv1.9.3には、v1.8.4.3-644f4735-aliyunv1.9.3.1-5e7ba42d-aliyunなどの複数のマイナーバージョンがあります。 詳細については、「CoreDNS」をご参照ください。

手動で更新

コンソールの使用

  1. (オプション) proxyフィールドをforwardフィールドに置き換えます。

    ProxyプラグインはCoreDNS v1.6.2で廃止されました。 v1.6.2より前のバージョンからアップグレードする場合、次の手順を実行してCoreDNS設定を手動で変更する必要があります。

    CoreDNS設定の変更

    1. Container Service for Kubernetes (ACK) コンソールにログインします。

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

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

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

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

    6. [YAMLで表示] パネルで、proxyforwardに置き換え、[OK] をクリックします。 forward

  2. CoreDNSのイメージバージョンを変更します。

    1. Container Service for Kubernetes (ACK) コンソールにログインします。

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

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

    4. クラスターの詳細ページの左側のナビゲーションウィンドウで、[ワークロード] > [デプロイ] を選択します。

    5. [デプロイメント] ページの上部で、[名前空間] をkube-systemに設定します。 次に、corednsを見つけ、[操作] 列で [詳細] > [YAMLで表示] を選択します。

    6. [YAMLの編集] ダイアログボックスで、imageフィールドのバージョン番号を変更します。 次に、[更新] をクリックします。 image

  3. 更新を確認します。

    1. 次のコマンドを実行して、CoreDNSのバージョンを照会します。

      kubectl get deployment coredns -n kube-system -o jsonpath="{.spec.template.spec.containers[0].image}"

      期待される出力:

      registry-cn-shanghai-vpc.ack.aliyuncs.com/acs/coredns:v1.9.3.10-5e7ba42d-aliyun
    2. 次のコマンドを実行して、クラスター内のすべてのCoreDNSポッドが [実行中] 状態であるかどうかを確認します。

      kubectl get pods -n kube-system | grep coredns

      期待される出力:

      coredns-78d4b8****-6g62w                           1/1     Running   0          9d
      coredns-78d4b8****-n6wjm                           1/1     Running   0          9d

kubectlを使う

  1. (オプション) proxyフィールドをforwardフィールドに置き換えます。

    ProxyプラグインはCoreDNS v1.6.2で廃止されました。 v1.6.2より前のバージョンからv1.6.2以降にアップグレードする場合は、次の手順を実行してCoreDNS設定を手動で変更する必要があります。

    CoreDNS設定の変更

    1. 次のコマンドを実行して、CoreDNS設定ファイルのproxyforwardに置き換え、設定ファイルを保存して終了します。

      kubectl edit configmap/coredns -n kube-system
    2. 次のコマンドを実行して、CoreDNSポッドのログを照会し、新しい構成がロードされているかどうかを確認します。

      kubectlログcoredns-78d4b8bd88-n6wjm -n kube-system

      出力にplugin/reloadが含まれている場合は、CoreDNS設定がロードされていることを示します。 期待される出力:

      . : 53
      [INFO] プラグイン /リロード: 実行設定MD5 = 71c5f1ff539d304c630521f315dc2ac2
      CoreDNS-1.6.7
      linux/amd64, go1.13.6, da7f65b
      [INFO] 127.0.0.1:48329 - 42313 "HINFO 1108347002237365533.4506541768939609094。 udp 57偽512 "NXDOMAIN qr、rd、ra 132 0.008874794s 
  2. 次のコマンドを実行して、CoreDNS設定ファイルのimageフィールドのバージョン番号を変更し、設定ファイルを保存して終了します。

    kubectl edit deployment/coredns -n kube-system
  3. 更新を確認します。

    1. 次のコマンドを実行して、CoreDNSのバージョンを照会します。

      kubectl get deployment coredns -n kube-system -o jsonpath="{.spec.template.spec.containers[0].image}"

      期待される出力:

      registry-cn-shanghai-vpc.ack.aliyuncs.com/acs/coredns:v1.9.3.10-5e7ba42d-aliyun
    2. 次のコマンドを実行して、クラスター内のすべてのCoreDNSポッドが [実行中] 状態であるかどうかを確認します。

      kubectl get pods -n kube-system | grep coredns

      期待される出力:

      coredns-78d4b8 ****-6g62w 1/1ランニング0 9d
      coredns-78d4b8 ****-n6wjm 1/1ランニング0 9d 

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の適切な設定」をご参照ください。