まとめ
この記事は、Azure Kubernetes Service (AKS) による新しいノードのプロビジョニングを妨げるカスタム スクリプト拡張機能 (CSE) エラーのトラブルシューティングに役立ちます。 新しい仮想マシン スケール セット インスタンスが AKS ノードとして登録されるように、CSE 終了コードを特定し、エラーを解決します。
前提条件
Azure CLIインストールされていること、および最新バージョンに更新されていることを確認します。
az --versionを使用して、インストールされているバージョンを確認します。
症状
新しくプロビジョニングされた仮想マシン スケール セット インスタンスは、AKS ノードとして登録されません。 ノード プールのスケールアウト操作の後、Kubernetes ノードの数が変更されていない間に、Virtual Machine Scale Sets インスタンスの数が増える場合があります。
クラスター オートスケーラーが有効になっている場合、一定期間後に未登録の Virtual Machine Scale Sets インスタンスを削除する可能性があります。
Troubleshooting
原因を特定するには、影響を受ける Virtual Machine Scale Sets インスタンスから CSE 終了コードを取得してください。
Azure CLIを使用して、次の手順を実行します。
AKS クラスターの変数を設定します。
export RG_NAME="<cluster-resource-group>" export CLUSTER_NAME="<cluster-name>" export NODE_RG=$(az aks show \ --resource-group "$RG_NAME" \ --name "$CLUSTER_NAME" \ --query nodeResourceGroup \ --output tsv) export API_FQDN=$(az aks show \ --resource-group "$RG_NAME" \ --name "$CLUSTER_NAME" \ --query fqdn \ --output tsv)ノード リソース グループ内の VM スケール セットを一覧表示し、影響を受けるノード プールの VM スケール セットを特定します。
az vmss list \ --resource-group "$NODE_RG" \ --query "[].{Name:name,Capacity:sku.capacity,ProvisioningState:provisioningState}" \ --output table export VMSS_NAME="<affected-vmss-name>"影響を受ける Virtual Machine Scale Sets のインスタンス ID を見つけて、値をエクスポートします。
export INSTANCE_ID="<affected-vmss-instance-id>"影響を受けるインスタンスから CSE 状態を取得します。
az vmss get-instance-view \ --resource-group "$NODE_RG" \ --name "$VMSS_NAME" \ --instance-id "$INSTANCE_ID" \ --query "extensions[?name=='vmssCSE'].statuses[].{ ExtensionState:code, Details:message }" \ --output json以下に、出力の例を示します。
[ { "ExtensionState": "ProvisioningState/failed/0", "Details": "failed to execute command: command terminated with exit status=1\n[stdout]\n{ \"ExitCode\": \"51\", \"Output\": \"... Failed to connect to <AKS API server FQDN> port 443: Connection timed out ... API server connection check code: 51 ... exit 51\", ... }\n\n[stderr]\n..." } ]
終了コードは、プロビジョニングエラーの原因となった特定の問題を特定します。 前の例では、CSE は終了コード 51を返します。これは、Kubernetes API サーバーとの接続の問題を示しています。
他の終了コードのマッピングについては、 CSE ヘルパーを参照してください。
解決策: API サーバーのネットワーク タイムアウトをテストして修正する
影響を受ける Virtual Machine Scale Sets インスタンスから API サーバーに到達できることを確認します。 次のネットワーク構成を確認します。
- AKS サブネットに関連付けられているネットワーク セキュリティ グループ (NSG) が、TCP ポート 443 の API サーバー IP アドレスへの送信トラフィックをブロックしているかどうかを確認します。
- Virtual Machine Scale Sets ネットワーク インターフェイスに追加の NSG が関連付けられているかどうかを確認します。 該当するすべての NSG は、TCP ポート 443 の API サーバー IP アドレスへの送信トラフィックを許可する必要があります。
- ファイアウォールまたはネットワーク仮想アプライアンス (NVA) が送信トラフィック パス内にあるかどうかを確認します。 通常は、AKS ノード サブネットに関連付けられているルート テーブルを使用して NVA を構成します。 ファイアウォールまたは NVA で、TCP ポート 443 の API サーバー IP アドレスへの送信トラフィックが許可されていることを確認します。 詳細については、「AKS でクラスター ノードに対するエグレス トラフィックを制御する」をご覧ください。
Virtual Machine Scale Sets インスタンスから API サーバーへの接続をテストするには、Azure CLIを使用して次のコマンドを実行します。
az vmss run-command invoke \
--resource-group "$NODE_RG" \
--name "$VMSS_NAME" \
--instance-id "$INSTANCE_ID" \
--command-id RunShellScript \
--scripts '
API_FQDN="'"$API_FQDN"'"
echo "=== DNS resolution ==="
getent ahostsv4 "$API_FQDN" |
awk '"'"'NR==1 {print "Resolved IP: " $1}'"'"'
echo "=== TCP connectivity ==="
if timeout 10 bash -c "</dev/tcp/$API_FQDN/443"; then
echo "TCP 443: connected"
else
echo "TCP 443: failed"
fi
echo "=== HTTPS response ==="
curl -sS -k \
--connect-timeout 10 \
--max-time 15 \
--output /dev/null \
--write-out \
"HTTP status: %{http_code}
Remote IP: %{remote_ip}
Connect time: %{time_connect}s
TLS time: %{time_appconnect}s
" \
"https://$API_FQDN/"
' \
--query "value[0].message" \
--output tsv
このコマンドは、ドメイン ネーム システム (DNS) の解決、伝送制御プロトコル (TCP) 接続、および HTTPS 接続をテストします。 接続が成功した場合、出力は次の例のようになります。
Enable succeeded:
[stdout]
=== DNS resolution ===
Resolved IP: 172.199.220.208
=== TCP connectivity ===
TCP 443: connected
=== HTTPS response ===
HTTP status: 401
Remote IP: 172.199.220.208
Connect time: 0.018883s
TLS time: 0.058870s
[stderr]
要求に認証資格情報が含まれていないため、HTTP 401 応答が必要です。 応答により、DNS 解決、TCP 接続、および TLS ハンドシェイクが成功し、API サーバーに到達可能であることが確認されます。
接続がタイムアウトした場合、出力は次の例のようになります。
Enable succeeded:
[stdout]
=== DNS resolution ===
Resolved IP: 20.238.162.102
=== TCP connectivity ===
TCP 443: failed
=== HTTPS response ===
HTTP status: 000
Remote IP:
Connect time: 0.000000s
TLS time: 0.000000s
[stderr]
curl: (28) Connection timeout after 10000 ms
接続がタイムアウトした場合、Virtual Machine Scale Sets インスタンスは TCP ポート 443 上の API サーバーに到達できません。 有効な NSG ルール、ユーザー定義ルート、ファイアウォール、NVA、接続をブロックする可能性があるその他のネットワーク デバイスを確認します。
References
- 一般的なトラブルシューティング手順については、「 ノード準備ができていないエラーの基本的なトラブルシューティングを参照してください。