このガイドでは、前提条件の確認、既知のリスクの緩和、Container Service for Kubernetes (ACK) での CoreDNS の自動アップグレードの実行方法について説明します。
前提条件
作業を開始する前に、次のことを確認してください。
ご利用のクラスターに接続するように kubectl が設定されていること。詳細については、「kubectl を使用したクラスターへの接続」をご参照ください。
アップグレード前の準備
アップグレードを開始する前に、次の項目を確認してください。各項目では、対応が必要な条件やリスクについて説明します。
アップグレードの仕組み
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 が起動に失敗します。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター]ページで、クラスター名をクリックします。左側のナビゲーションウィンドウで、[設定] > [ConfigMap]を選択します。
「ConfigMap」ページで、[名前空間] を kube-system に設定します。coredns を見つけ、[操作] 列の [YAML の編集] をクリックします。
[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 }新しい構成がロードされたことを確認します。次のコマンドを実行し、出力に
plugin/reloadが含まれているか確認します。これは構成がホットリロードされたことを確認するもので、約30秒かかります。kubectl logs coredns-78d4b8bd88-n6wjm -n kube-system
IPVS に関連する DNS 障害の緩和
ご利用のクラスターが IPVS モードで kube-proxy を使用している場合、IPVS セッション維持ポリシーにより、アップグレード後最大 5 分間、クラスター全体の DNS 名前解決のタイムアウトや失敗が発生する可能性があります。これを緩和するには、次のいずれかのオプションを使用します。
kube-proxy の IPVS UDP セッション維持タイムアウトの変更。詳細については、「kube-proxy の IPVS UDP セッション維持タイムアウトを変更する方法」をご参照ください。
NodeLocal DNSCache の使用。詳細については、「NodeLocal DNSCache による安定性の向上」をご参照ください。
ノードカーネルのアップグレード (Alibaba Cloud Linux 2 のみ)。カーネルバージョン 4.19.91-25.1.al7.x86_64 以降にアップグレードします。詳細については、「Alibaba Cloud Linux 2 イメージのリリースノート」をご参照ください。
他のオペレーティングシステムでの IPVS UDP タイムアウトの設定。本トピックの「IPVS クラスターの UDP タイムアウトの設定」をご参照ください。
アップグレード前にすべてのアプリケーションコンテナを NodeLocal DNSCache に接続。詳細については、「NodeLocal DNSCache コンポーネントの使用」をご参照ください。
ご利用のクラスターが IPVS モードを使用しているかどうかを確認するには、「クラスター情報の表示」をご参照ください。
CoreDNS のアップグレード
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、対象のクラスター名を見つけてクリックします。左側のナビゲーションウィンドウで、[アドオン] をクリックします。
[アドオン] ページで、CoreDNS を検索し、[アップグレード] をクリックします。
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 構成を最適化します。詳細については、「CoreDNS 構成の最適化」をご参照ください。