ACK コンソールの [アドオン] ページで [アップグレード] オプションが利用できない場合は、CoreDNS を手動でアップデートします。
前提条件
作業を開始する前に、次のことを確認してください。
ご利用のクラスターに接続するように kubectl が設定されていること。詳細については、「kubectl を使用したクラスターへの接続」をご参照ください。
更新に関する注意事項
kube-proxy が IP Virtual Server (IPVS) モードを使用している場合、CoreDNS の更新後、すべての DNS クエリが最大 5 分間失敗またはタイムアウトする可能性があります。この問題を回避するには、次のいずれかの方法を使用してください。
kube-proxy 設定で IPVS UDP セッションタイムアウトを変更します。詳細については、「IPVS クラスターの UDP タイムアウトの設定」をご参照ください。
NodeLocal DNSCache を使用して DNS 名前解決を最適化します。
更新には、CoreDNS のレプリカ数に応じて約 2 分かかります。既存のレプリカは終了されないため、サービス解決に影響はありません。
CoreDNS バージョンの確認
コンソール
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[デプロイ] ページで、[名前空間] を [kube-system] に設定し、[イメージ] 列で CoreDNS のバージョンを確認します。

kubectl
CoreDNS のバージョンを確認します。
kubectl get deployment coredns -n kube-system -o jsonpath="{.spec.template.spec.containers[0].image}"期待される出力:
registry-vpc.cn-hangzhou.aliyuncs.com/acs/coredns:1.6.2 # この例ではバージョン 1.6.2 が使用されています。更新バージョンの確認
次の表は、各 Kubernetes バージョンと互換性のある CoreDNS バージョンを示しています。互換性のある最新バージョンを使用してください。
Kubernetes バージョン範囲 | CoreDNS バージョン |
1.11 ~ 1.16 | 1.6.2 (廃止) |
1.14.8 ~ 1.22 | 1.6.7 (廃止) および 1.7.0 |
1.20.4 以降 | 1.8.4 および 1.9.3 重要 v1.8.4 と v1.9.3 には、 |
1.21 以降 | 1.11.3 |
手動更新
コンソール
(オプション)
proxyフィールドをforwardフィールドに置き換えます。Proxy プラグインは CoreDNS v1.6.2 で非推奨になりました。それより前のバージョンからアップグレードする場合は、次のように CoreDNS 設定を変更してください。
CoreDNS のイメージバージョンを変更します。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[デプロイメント] ページで、[名前空間] を [kube-system] に設定します。[coredns] を探し、[操作] 列で を選択します。
[YAML の編集] ダイアログボックスで、
imageフィールドのバージョン番号を変更し、[更新] をクリックします。
YAML 編集ダイアログで、CoreDNS Deployment 設定を探し、
imageフィールドのイメージバージョン (例:1.6.2) を確認します。主要な YAML スニペット:labelSelector: matchExpressions: - key: k8s-app operator: In values: - kube-dns topologyKey: kubernetes.io/hostname weight: 100 containers: - args: - '-conf' - /etc/coredns/Corefile image: 'registry-vpc.cn-hangzhou.aliyuncs.com/acs/coredns:1.6.2' imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 5 httpGet: ...
更新を確認します。
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すべての CoreDNS Pod が実行中状態であることを確認します。
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
(オプション)
proxyフィールドをforwardフィールドに置き換えます。Proxy プラグインは CoreDNS v1.6.2 で非推奨になりました。それより前のバージョンからアップグレードする場合は、次のように CoreDNS 設定を変更してください。
CoreDNS デプロイメントの
imageフィールドのバージョン番号を変更し、保存して終了します:kubectl edit deployment/coredns -n kube-system更新を確認します。
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すべての CoreDNS Pod が実行中状態であることを確認します。
kubectl get pods -n kube-system | grep coredns期待される出力:
coredns-78d4b8****-6g62w 1/1 Running 0 9d coredns-78d4b8****-n6wjm 1/1 Running 0 9d
IPVS クラスターの UDP タイムアウトの設定
ご利用のクラスターが IPVS モードで kube-proxy を使用している場合、IPVS UDP セッション維持タイムアウトを 10 秒に短縮して、アップグレード後の DNS 名前解決の失敗を抑制します。
ご利用のクラスターに UDP ベースのサービスがある場合は、続行する前に UDP タイムアウトを短縮することによる影響を評価してください。
Kubernetes 1.18 以降
コンソールでの操作
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、クラスター名をクリックします。左側のナビゲーションウィンドウで、[設定] > [ConfigMap] を選択します。
「ConfigMap」ページで、[kube-system] 名前空間を選択します。「kube-proxy-worker」を見つけ、[操作] 列の [YAML の編集] をクリックします。
[YAMLの編集] パネルで、
udpTimeout: 10sをipvsフィールドの下に追加し、[OK] をクリックします。apiVersion: v1 data: config.conf: | apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration # 他の無関係なフィールドは省略されています。 mode: ipvs # ipvs キーが存在しない場合は追加します。 ipvs: udpTimeout: 10sすべての kube-proxy-worker Pod を再作成します。
クラスターの詳細ページで、左側のナビゲーションウィンドウから [ワークロード] > [DaemonSet] を選択します。
DaemonSet リストで、[kube-proxy-worker] をクリックします。
[kube-proxy-worker] ページで、[Pod] タブをクリックします。Pod の行で、[その他] > [削除] を選択し、[OK] をクリックします。この手順をすべての Pod で繰り返します。システムは自動的に Pod を再作成します。
UDP タイムアウトが設定されていることを確認します。
ipvsadmをインストールします:sudo yum install -y ipvsadmクラスター内の任意の ECS ノードで次のコマンドを実行します。
sudo ipvsadm -L --timeout出力の 3 番目の数値が
10の場合、UDP タイムアウトは正しく設定されています。重要:タイムアウトを設定した後、CoreDNS のアップグレードに進む前に少なくとも 5 分間待機してください。
コマンドラインでの操作
kube-proxy-worker ConfigMap を編集します。
kubectl -n kube-system edit configmap kube-proxy-workerudpTimeout: 10sをipvsフィールドの下に追加します。保存して終了します。apiVersion: v1 data: config.conf: | apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration # 他の無関係なフィールドは省略されています。 mode: ipvs # ipvs キーが存在しない場合は追加します。 ipvs: udpTimeout: 10sすべての kube-proxy-worker Pod を再作成します。
現在の Pod を一覧表示します。
kubectl -n kube-system get pod -o wide | grep kube-proxy-worker各 Pod を削除します。システムは自動的に Pod を再作成します。
kubectl -n kube-system delete pod <kube-proxy-worker-****><kube-proxy-worker-****>を前の手順で取得した実際の Pod 名に置き換えます。
UDP タイムアウトが設定されていることを確認します。
ipvsadmをインストールします:sudo yum install -y ipvsadmクラスター内の任意の 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_newOOS でのバッチ操作の実行に関する詳細については、「インスタンスの一括操作」をご参照ください。
次のステップ
更新後、ワークロードに合わせて CoreDNS 設定を最適化してください。
