現在のCoreDNSバージョンが古くなっていても、CoreDNSのアップグレードボタンがACKコンソールのアドオンページに表示されていない場合、Container Service for Kubernetes (ACK) クラスターを設定してCoreDNSを自動的に更新することはできません。 このシナリオでは、CoreDNSを手動で更新できます。 このトピックでは、CoreDNSを手動で更新する方法について説明します。
前提条件
kubectlクライアントがクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
メモの更新
kube-proxyの負荷分散モードがIP仮想サーバー (IPVS) に設定されている場合、CoreDNSが更新された後、クラスター内のすべてのDNSクエリが失敗するかタイムアウトする可能性があります。 この状況は約5分続きます。 この問題を回避するには、次のいずれかの方法を使用できます。
kube-proxy設定でIPVS UDPセッションのタイムアウト期間を変更します。 詳細については、「IPVSモードでのUDPタイムアウト期間の変更」をご参照ください。
NodeLocal DNSCacheを使用してDNS解決を最適化します。 詳細については、「NodeLocal DNSCacheを使用したDNS解決の最適化」をご参照ください。
ACKはCoreDNSの更新に約2分かかります。 期間は、CoreDNSポッドの数によって異なります。 新しくプロビジョニングされたCoreDNSポッドをスケジュールまたは起動できない場合、チケットを起票します。 既存のCoreDNSポッドがまだ実行されているため、DNS解決は中断されません。
CoreDNSバージョンの照会
ACKコンソールの使用
ACK コンソールの左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけます。 次に、クラスターの名前をクリックするか、[操作] 列の [詳細] をクリックします。
クラスターの詳細ページの左側のナビゲーションウィンドウで、
を選択します。[デプロイメント] ページで、[名前空間] を [kube-system] に設定し、[イメージ] 列でCoreDNSバージョンを確認します。
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には、 |
手動で更新
コンソールの使用
(オプション)
proxy
フィールドをforward
フィールドに置き換えます。ProxyプラグインはCoreDNS v1.6.2で廃止されました。 v1.6.2より前のバージョンからアップグレードする場合、次の手順を実行してCoreDNS設定を手動で変更する必要があります。
CoreDNSのイメージバージョンを変更します。
ACK コンソールの左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけます。 次に、クラスターの名前をクリックするか、[操作] 列の [詳細] をクリックします。
クラスターの詳細ページの左側のナビゲーションウィンドウで、
を選択します。[デプロイメント] ページの上部で、[名前空間] をkube-systemに設定します。 次に、corednsを見つけ、[操作] 列で
を選択します。[YAMLの編集] ダイアログボックスで、
image
フィールドのバージョン番号を変更します。 次に、[更新] をクリックします。
更新を確認します。
次のコマンドを実行して、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ポッドが [実行中] 状態であるかどうかを確認します。
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で廃止されました。 v1.6.2より前のバージョンから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ポッドが [実行中] 状態であるかどうかを確認します。
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コンソールの使用
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の適切な設定」をご参照ください。