既存の ACK Pro cluster の内部ドメイン名の名前解決を有効にすると、kubelet や kube-proxy などのノードコンポーネントは、内部ドメイン名を介してエンドポイントを動的に解決することで、API サーバーに直接アクセスできるようになります。この方法は、Server Load Balancer (SLB) の固定 IP アドレスを介して API サーバーにアクセスする方法に比べて最適化されています。これにより、大規模クラスターにおけるノードコンポーネントから API サーバーへのアクセスのパフォーマンスと可用性が向上します。
適用範囲
この機能は、Kubernetes バージョン 1.30 以降を実行している ACK Pro cluster でのみ利用できます。
この機能は、ハイブリッドクラウドノードプールでは有効にできません。
以下のクラスターでは、API サーバーの内部ドメイン名がデフォルトで有効になっています。手動で有効にする必要はありません。
2024 年 11 月以降に作成され、Kubernetes バージョン 1.20 以降を実行しているクラスター。
DescribeClusterDetail 操作を呼び出す際に
internal_dns_config.enabledパラメーターがtrueに設定されている場合、この機能は有効になっています。
変更点と影響
ネットワークパスの変更とセキュリティグループへの影響:
この機能を有効にすると、ノードが API サーバーにアクセスするための通信パスが、API サーバーの SLB の固定 IP アドレスから、内部ドメイン名による直接接続に切り替わります。
変更前 (SLB 転送):ノード -> SLB IP -> API サーバー
変更後 (内部ドメイン名による直接接続):ノード -> (内部ドメイン名の名前解決) -> API サーバーの Elastic Network Interface (ENI)
これは、トラフィックが SLB をバイパスし、API サーバーの ENI に直接アクセスすることを意味します。したがって、ノードのセキュリティグループが ENI のセキュリティグループとの間のトラフィックを許可していることを確認してください。
パブリックネットワークアクセスの依存関係:この機能を有効にすると、API サーバーのデフォルトのアウトバウンドルートがクラスターの VPC に変更されます。クラスターに OIDC Issuer URL またはパブリック IP アドレスに依存する外部 Webhook が設定されている場合は、クラスターの VPC がパブリックネットワークアクセスを持っていることを確認してください。そうしないと、API サーバーは外部サービスに接続できません。
設定の適用範囲:
この機能を有効にすると、kubelet と kube-proxy が API サーバーにアクセスするためのパスが、SLB の固定 IP アドレスから API サーバーの ENI への直接接続に切り替わります。
`default` 名前空間の
kubernetesサービスのエンドポイントは、API サーバーの SLB の IP アドレスを指す状態から、API サーバーの ENI の IP アドレスを指す状態に切り替わります。これにより、クラスター内の Operator などのアプリケーションが直接接続できるようになります。
前提条件
開始する前に、以下のチェックを実行してください。そうしないと、ノードが API サーバーに接続できなくなります。
1. セキュリティグループ設定の確認
直接接続を有効にすると、トラフィックは API サーバーの ENI に直接送信されます。ENI のセキュリティグループのセキュリティグループルールが直接接続を許可していることを確認してください。詳細については、「セキュリティグループの管理」をご参照ください。
セキュリティグループのタイプ
確認項目
推奨される操作
エンタープライズセキュリティグループ
インバウンドルール
トラフィックを明示的に許可する必要があります。クラスターの VPC CIDR ブロックおよびすべてのセカンダリ CIDR ブロックからの TCP ポート 6443 へのアクセスを許可するルールを手動で追加してください。
標準セキュリティグループ
グループ内接続
ノードまたはコンテナーが API サーバーと同じセキュリティグループにある場合、デフォルトで通信できます。
異なるセキュリティグループにある場合は、それらの間でトラフィックを許可するようにセキュリティグループを設定するか、対応する CIDR ブロックからポート 6443 へのアクセスを許可してください。
ノードおよびノードの ENI のセキュリティグループのアウトバウンドルールを確認し、ポート 6443 へのアクセスが拒否されていないことを確認してください。
2. Webhook と OIDC のパブリックネットワーク依存関係の確認
パブリック URL に依存する Webhook を確認します。
kubectl get validatingwebhookconfiguration -o yaml -A | grep url kubectl get mutatingwebhookconfiguration -o yaml -A | grep urlACK クラスターページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、Add-ons をクリックします。API サーバーを見つけ、その設定で OIDC 関連のパラメーターを確認し、パブリックアドレスが使用されているかどうかを確認します。
上記で述べたパブリックネットワークアクセスの依存関係が API サーバーにあり、クラスターの VPC にパブリックネットワークの出口がない場合は、まずNAT Gateway を設定して、インターネットトラフィックに統一された出口を提供する必要があります。
3. DNS 名前解決設定の確認
API サーバーのドメイン名の名前解決は、VPC のデフォルトの内部 DNS サーバー (100.100.2.136 および 100.100.2.138) に依存します。
デフォルト設定:ノードがデフォルトの DNS 設定を使用している場合、追加の操作は必要ありません。
カスタム DNS:ノードまたはコンテナーでカスタム DNS サーバーを設定する場合、その DNS サーバーが
*.aliyuncs.comまたは API サーバーのドメイン名のリクエストを、名前解決のために上記の Alibaba Cloud 内部 DNS サーバーに転送できることを確認してください。
ステップ 1: API サーバーの内部ドメインの名前解決を有効にする
ModifyCluster OpenAPI 操作を呼び出して、クラスターの VPC に内部 DNS レコードを作成します。このセクションの手順は、ご利用のノードがデフォルトの Alibaba Cloud 内部 DNS を使用していることを前提としています。
ご利用のノードまたはコンテナーがカスタム DNS サーバーを使用している場合は、「カスタム DNS の設定」をご参照ください。
ModifyCluster 操作を呼び出し、以下のパラメーターを指定します。
{ "control_plane_endpoints_config": { "internal_dns_config": { "enabled": true } } }更新中、API サーバーは自動的に再起動します。再起動が完了したら、DescribeClusterDetail 操作を呼び出し、
internal_dns_config.enabledパラメーターがtrueに設定されていることを確認して、設定が有効になったことを確認します。
ステップ 2:kube-proxy 設定の変更
API サーバーのドメイン名が有効になった後、kube-proxy の接続アドレスを IP アドレスからドメイン名に切り替えます。
ACK クラスターページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
名前空間を kube-system に設定し、kube-proxy-worker と kube-proxy-worker-windows を見つけます。
各
kubeconfigフィールドで、serverパラメーターを以下のフォーマットに一致するように更新します。https://apiserver.{cluster_id}.{region_id}.cs.aliyuncs.com:6443{cluster_id}:クラスター ID。{region_id}:cn-hangzhou など、クラスターのリージョン ID。
ステップ 3:内部ドメイン名が有効であることの確認
既存のノードを変更する前に、新しいノードまたは Pod を作成して、新しいリソースでドメイン名の名前解決が機能することを確認します。
ノードプールまたはLingjun ノードプール内のノード:
クラスターで新しいノードをスケールアウトします。新しいノード上の kubelet と kube-proxy は自動的に内部ドメイン名を使用します。
ノードが準備完了になったら、ノードにログインし、以下のコマンドを実行して、kubelet 設定ファイル内の
serverアドレスが内部ドメイン名であることを確認します。cat /etc/kubernetes/kubelet.confACK Virtual Node コンポーネントはバージョン v2.14.0 以降である必要があります。
内部ドメイン名を有効にすると、新しい ECI Pod と ACS Pod はデフォルトで内部ドメイン名を介して API サーバーと対話します。
この時点で、新しい Pod を追加すると、
Ready状態になるはずです。
ステップ 4:変更を適用するための既存の kube-proxy Pod の再作成
kube-proxy の設定が更新された後、既存の Pod を再作成して新しい設定を読み込みます。
ACK クラスターページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
名前空間を kube-system に設定します。`kube-proxy-worker` と `kube-proxy-worker-windows` を見つけてクリックします。[Pod] タブで、それらの Pod を 1 つずつ削除します。この操作により Pod が再作成され、新しい設定が読み込まれます。
重要サービスの安定性を確保するため、Pod は段階的にバッチで削除してください。次のバッチを削除する前に、Pod が正常に再作成されたことを確認してください。
ステップ 5:既存ノード上の kubelet 設定の変更
既存ノードの kubelet 設定を更新し、サービスを再起動して、内部ドメイン名アクセスへの切り替えを完了します。クラスターの安定性を確保するため、このセクションは単一ノードでの検証とバッチ操作の 2 つの部分に分かれています。
単一ノードでの検証
既存のノードを選択します。ノードにログインし、以下のコマンドを実行して、API サーバーのアドレスを IP アドレスからドメイン名に切り替え、kubelet を再起動します。
{clb-ip}: /etc/kubernetes/kubelet.conf ファイルに設定されている CLB の IP アドレス。{cluster-id}:クラスター ID{region-id}:リージョン ID
# 以下のワンライナーコマンドは、設定を置き換えてサービスを再起動します。 sed -i.bak 's#https://{slb-ip}:6443#https://apiserver.{cluster-id}.{region-id}.cs.aliyuncs.com:6443#g' /etc/kubernetes/kubelet.conf && systemctl restart kubelet例:
sed -i.bak 's#https://10.XX.XX.1:6443#https://apiserver.c34f3cdb665954e2f8e8e40a824a*****.cn-hangzhou.cs.aliyuncs.com:6443#g' /etc/kubernetes/kubelet.conf && systemctl restart kubeletコマンドが実行された後、コンソールでノードを監視し、Ready 状態であることを確認します。
残りのノードでバッチ操作を実行します。
単一ノードでの検証が成功した後、コンソールのバッチ操作機能を使用して、残りの既存ノードに対してバッチ操作を実行します。
ACK クラスターページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
操作を実行するノードを選択します。ページの下部で [バッチ操作] をクリックし、[シェルコマンドの実行] を選択します。プロンプトに従ってコマンドを設定し、バッチタスクを送信します。
# 以下のコマンドを入力します。 sed -i.bak 's#https://{slb-ip}:6443#https://apiserver.{cluster-id}.{region-id}.cs.aliyuncs.com:6443#g' /etc/kubernetes/kubelet.conf && systemctl restart kubeletタスクが完了するのを待ちます。ノードのステータスが正常であることを確認した後、すべての既存ノードが更新されるまでこの操作を繰り返します。
付録
カスタム DNS の設定
ご利用のノードまたはコンテナーがカスタム DNS サーバーで設定されている場合は、このセクションを参照して API サーバーの内部ドメイン名の名前解決を有効にしてください。
API サーバーのドメイン名の名前解決は、VPC に設定されているデフォルトの内部 DNS サービスアドレス 100.100.2.136 および 100.100.2.138 に依存します。カスタム DNS サーバーがこのドメイン名を解決する必要がある場合、DNS サーバーが配置されている VPC を、内部ドメイン名の名前解決に使用されるプライベートゾーンに関連付ける必要があります。
操作手順
ModifyCluster OpenAPI 操作を呼び出して、クラスター設定を変更します。API サーバーのアクセス最適化を有効にする際に、bind_vpcs パラメーターを使用してカスタム DNS サーバーの VPC を関連付けます。
この手順は、DNS サーバーをホストする VPC とクラスターが同じアカウントにあることを前提としています。異なるアカウントに属している場合は、「アカウント間での VPC の関連付け」を参照して、内部 DNS の名前解決を一元管理してください (ステップ 1 から 5 まで)。
ModifyCluster OpenAPI 操作を呼び出し、以下の内容を指定します。
["vpc-id"]に、DNS サーバーの VPC ID を入力します。これは配列です。複数の VPC ID はコンマ (,) で区切ります。{ "control_plane_endpoints_config": { "internal_dns_config": { "enabled": true, "bind_vpcs": ["vpc-id"] } } }設定が有効になった後、DescribeClusterDetail 操作を呼び出して設定を確認できます。
次のステップ: