このトピックでは、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分続きます。 この問題を回避するには、次のいずれかの方法を使用できます。
kube-proxy設定でIPVS UDPセッションのタイムアウト期間を変更します。 詳細については、「」をご参照ください。kube-proxy設定でIPVS UDPセッションのタイムアウト期間を変更するにはどうすればよいですか。.
NodeLocal DNSCacheを使用してDNS解決を最適化します。 詳細については、「NodeLocal DNSCacheを使用したDNS解決の最適化」をご参照ください。
クラスター内のノードがAlibaba Cloud Linux 2を実行している場合、ノードカーネルを4.19.91-25.1.al7.x86_64以降に更新することを推奨します。 詳細については、「Alibaba Cloud Linux 2のリリースノート」をご参照ください。
クラスター内のノードが他のオペレーティングシステムを実行している場合は、IPVSモードでUDPタイムアウト期間を変更できます。 詳細については、「IPVSモードでのUDPタイムアウト期間の変更」をご参照ください。
上記の操作を実行しない場合は、ACKがCoreDNSを更新する前に、すべてのクライアントポッドをNodeLocal DNSCacheに接続できます。 詳細については、「NodeLocal DNSCacheの設定」をご参照ください。
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は更新後に通常どおり起動できません。
ACKコンソールにログインします。
ACKコンソールの左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、[操作] 列の [詳細] をクリックします。 クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
ConfigMapページの上部で、名前空間をkube-systemに設定します。 次に、coredns ConfigMapを見つけ、[操作] 列の [YAMLの編集] をクリックします。
[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 }
次のコマンドを実行して、CoreDNSポッドのログを印刷し、新しい構成がロードされているかどうかを確認します。 ほとんどの場合、CoreDNSポッドはホットロードを完了するのに約30秒かかります。
kubectl logs coredns-78d4b8bd88-n6wjm -n kube-system
出力に
plugin/reload
が含まれている場合、新しいCoreDNS設定が読み込まれます。
CoreDNSの更新
ACKコンソールの [アドオン] ページに移動し、CoreDNSを更新できます。
ACKコンソールにログインします。
ACKコンソールの左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、[操作] 列の を選択します。
[アドオン] ページで、[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コンソールの使用
ACKコンソールにログインします。
ACKコンソールの左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、[操作] 列の [詳細] をクリックします。 クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
ConfigMapページで、kube-system名前空間を選択し、kube-proxy-worker ConfigMapを見つけ、[操作] 列の [YAMLの編集] をクリックします。
[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
kube-proxy-workerという名前のすべてのポッドを再作成します。
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
DaemonSetsページで、kube-proxy-workerを見つけてクリックします。
kube-proxy-workerページの [ポッド] タブでポッドを選択し、[操作] 列の を選択します。 表示されるメッセージで、[確認] をクリックします。
上記の手順を繰り返して、すべてのポッドを削除します。 ポッドを削除すると、システムは自動的にポッドを再作成します。
UDPセッションのタイムアウト時間が変更されていないか確認します。
次のコマンドを実行してipvsadmをインストールします。
ipvsadmは、IPVSの管理に使用できるツールです。 詳細については、「ipvsadm」をご参照ください。
yum install -y ipvsadm
クラスター内のElastic Compute Service (ECS) インスタンスにログインし、次のコマンドを実行して出力の3番目の値を確認します。
ipvsadm -L --timeout
出力の3番目の値が10の場合、UDPセッションのタイムアウト期間が変更されます。
説明UDPセッションのタイムアウト期間が変更された後、少なくとも5分待ってから続行してください。
CLIの使用
次のコマンドを実行して、kube-proxy-worker ConfigMapを変更します。
kubectl -n kube-system edit configmap kube-proxy-worker
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
次のコマンドを実行して、kube-proxy-workerという名前のすべてのポッドを再作成します。
次のコマンドを実行してポッドを照会します。
kubectl -n kube-system get pod -o wide | grep kube-proxy-worker
次のコマンドを実行して、前の手順で返されたすべてのポッドを削除します。 次に、システムはkube-proxy-workerという名前のポッドを再作成します。
kubectl -n kube-system delete pod <kube-proxy-worker-****>
説明<kube-proxy-worker-****> を、前の手順で返されたポッドの名前に置き換えます。
UDPセッションのタイムアウト時間が変更されていないか確認します。
次のコマンドを実行してipvsadmをインストールします。
ipvsadmは、IPVSの管理に使用できるツールです。 詳細については、「ipvsadm」をご参照ください。
yum install -y ipvsadm
クラスター内の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の適切な設定」をご参照ください。