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

Container Service for Kubernetes:非マネージド CoreDNS の自動アップグレード

最終更新日:Mar 26, 2026

このガイドでは、前提条件の確認、既知のリスクの緩和、Container Service for Kubernetes (ACK) での CoreDNS の自動アップグレードの実行方法について説明します。

前提条件

作業を開始する前に、次のことを確認してください。

アップグレード前の準備

アップグレードを開始する前に、次の項目を確認してください。各項目では、対応が必要な条件やリスクについて説明します。

アップグレードの仕組み

ACK は、ローリングアップデートを使用して CoreDNS をアップグレードします。新しい Pod が実行されてからレガシー Pod が削除されるため、レプリカ数は全体を通して同じままです。アップグレードではグレースフルターミネーションが使用されます。レガシーレプリカはすぐには停止しません。このプロセスには約 2 分かかりますが、実際の時間は CoreDNS レプリカの数によって異なります。アップグレードが失敗した場合、ACK は 10 分以内に自動的にロールバックします。

ローリングアップデート中、新しい Pod が起動しても、レガシー Pod がまだ DNS 名前解決リクエストを処理している場合があります。アップグレード全体を通して DNS の可用性を確保するには、NodeLocal DNSCache コンポーネントを使用してください。詳細については、「NodeLocal DNSCache コンポーネントの使用」をご参照ください。

カスタム構成のバックアップ

自動アップグレードでは、Toleration、メモリと CPU のリソースリクエスト、リソースリミットなど、YAML テンプレートのカスタマイズが上書きされます。アップグレードする前に、現在の CoreDNS Deployment の構成をバックアップしてください。

kubectl get deployment coredns -n kube-system -o yaml > coredns-backup.yaml

アップグレード後、手動でカスタマイズを再適用してください。詳細については、「非マネージド CoreDNS の手動更新」をご参照ください。

ready プラグインを有効にする

以前に CoreDNS を 1.5.0 より後のバージョンに手動でスペックアップした場合は、Corefile で ready プラグインが有効になっていることを確認してください。有効になっていない場合、自動スペックアップ中に CoreDNS が起動に失敗します。

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

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

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

  4. [YAML の編集] パネルで、ready フィールドを確認します。存在しない場合は、ready を追加し、[OK] をクリックします。インデントが kubernetes ブロックと一致するようにしてください。

    apiVersion: v1
    data:
     Corefile: |
      .:53 {
        errors
        health {
          lameduck 15s
        }
        ready # この行が存在しない場合は追加します。インデントが 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
      }
  5. 新しい構成がロードされたことを確認します。次のコマンドを実行し、出力に plugin/reload が含まれているか確認します。これは構成がホットリロードされたことを確認するもので、約30秒かかります。

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

IPVS に関連する DNS 障害の緩和

ご利用のクラスターが IPVS モードで kube-proxy を使用している場合、IPVS セッション維持ポリシーにより、アップグレード後最大 5 分間、クラスター全体の DNS 名前解決のタイムアウトや失敗が発生する可能性があります。これを緩和するには、次のいずれかのオプションを使用します。

ご利用のクラスターが IPVS モードを使用しているかどうかを確認するには、「クラスター情報の表示」をご参照ください。

CoreDNS のアップグレード

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

  2. [クラスター] ページで、対象のクラスター名を見つけてクリックします。左側のナビゲーションウィンドウで、[アドオン] をクリックします。

  3. [アドオン] ページで、CoreDNS を検索し、[アップグレード] をクリックします。

IPVS クラスターの UDP タイムアウトの設定

ご利用のクラスターが IPVS モードで kube-proxy を使用している場合、IPVS UDP セッション維持タイムアウトを 10 秒に短縮して、アップグレード後の DNS 名前解決の失敗を抑制します。

ご利用のクラスターに UDP ベースのサービスがある場合は、続行する前に UDP タイムアウトを短縮することによる影響を評価してください。

Kubernetes 1.18 以降

コンソールでの操作

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

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

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

  4. [YAMLの編集] パネルで、udpTimeout: 10sipvs フィールドの下に追加し、[OK] をクリックします。

    apiVersion: v1
    data:
      config.conf: |
        apiVersion: kubeproxy.config.k8s.io/v1alpha1
        kind: KubeProxyConfiguration
        # 他の無関係なフィールドは省略されています。
        mode: ipvs
        # ipvs キーが存在しない場合は追加します。
        ipvs:
          udpTimeout: 10s
  5. すべての kube-proxy-worker Pod を再作成します。

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

    2. DaemonSet リストで、[kube-proxy-worker] をクリックします。

    3. [kube-proxy-worker] ページで、[Pod] タブをクリックします。Pod の行で、[その他] > [削除] を選択し、[OK] をクリックします。この手順をすべての Pod で繰り返します。システムは自動的に Pod を再作成します。

  6. UDP タイムアウトが設定されていることを確認します。

    1. ipvsadm をインストールします:

      sudo yum install -y ipvsadm
    2. クラスター内の任意の ECS ノードで次のコマンドを実行します。

      sudo ipvsadm -L --timeout

      出力の 3 番目の数値が 10 の場合、UDP タイムアウトは正しく設定されています。

      重要:タイムアウトを設定した後、CoreDNS のアップグレードに進む前に少なくとも 5 分間待機してください。

コマンドラインでの操作

  1. kube-proxy-worker ConfigMap を編集します。

    kubectl -n kube-system edit configmap kube-proxy-worker
  2. udpTimeout: 10sipvs フィールドの下に追加します。保存して終了します。

    apiVersion: v1
    data:
      config.conf: |
        apiVersion: kubeproxy.config.k8s.io/v1alpha1
        kind: KubeProxyConfiguration
        # 他の無関係なフィールドは省略されています。
        mode: ipvs
        # ipvs キーが存在しない場合は追加します。
        ipvs:
          udpTimeout: 10s
  3. すべての kube-proxy-worker Pod を再作成します。

    1. 現在の Pod を一覧表示します。

      kubectl -n kube-system get pod -o wide | grep kube-proxy-worker
    2. 各 Pod を削除します。システムは自動的に Pod を再作成します。

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

      <kube-proxy-worker-****> を前の手順で取得した実際の Pod 名に置き換えます。

  4. UDP タイムアウトが設定されていることを確認します。

    1. ipvsadm をインストールします:

      sudo yum install -y ipvsadm
    2. クラスター内の任意の ECS ノードで次のコマンドを実行します。

      sudo ipvsadm -L --timeout

      出力の3番目の数字が 10 の場合、UDP タイムアウトは正しく設定されています。

      重要:タイムアウトを設定した後、CoreDNS のアップグレードに進む前に少なくとも 5 分間待機してください。

Kubernetes 1.16 以前

Kubernetes 1.16 以前のバージョンで実行されているクラスター内の kube-proxy は、udpTimeout パラメーターをサポートしていません。Operation Orchestration Service (OOS) を使用して、以下の 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 でのバッチ操作の実行に関する詳細については、「インスタンスの一括操作」をご参照ください。

次のステップ

アップグレードが完了したら、CoreDNS 構成を最適化します。詳細については、「CoreDNS 構成の最適化」をご参照ください。