次の方法で共有


CSE エラーが原因のノードの準備ができていないエラーのトラブルシューティング

この記事は、Microsoft Azure Kubernetes Service (AKS) クラスターが Succeeded 状態ではなく、カスタム スクリプト拡張機能 (CSE) エラーのためにノード プール内で AKS ノードの準備ができていないシナリオのトラブルシューティングに役立ちます。

前提条件

現象

CSE エラーのため、AKS クラスター ノードはノード プール内で準備ができており、AKS クラスターは Succeeded 状態ではありません。

原因

ノード拡張機能のデプロイは失敗し、 kubelet およびその他のコンポーネントをプロビジョニングすると、複数のエラー コードが返されます。 これがエラーの最も一般的な原因です。 kubelet をプロビジョニングするときにノード拡張機能のデプロイが失敗することを確認するには、次の手順に従います。

  1. クラスターの現在のエラーを理解するには、 az aks showaz リソースの更新 コマンドを実行してデバッグを設定します。

    clusterResourceId=$(az aks show \
        --resource-group <resource-group-name> --name <cluster-name> --output tsv --query id)
    az resource update --debug --verbose --ids $clusterResourceId
    
  2. デバッグ出力と、 az resource update コマンドから受信したエラー メッセージを、GitHub の CSE ヘルパー 実行可能ファイルのエラー 一覧と照らして確認します。

いずれかのエラーに kubelet の CSE デプロイが含まれている場合は、ここで説明するシナリオが Node Not Ready エラーの原因であることを確認しました。

一般に、終了コードは、障害の原因となっている特定の問題を識別します。 たとえば、"API サーバーと通信できません" や "インターネットに接続できません" などのメッセージが表示されます。または、終了コードによって、API ネットワークのタイムアウト、または交換が必要なノード 障害が警告される場合があります。

解決策 1: カスタム DNS サーバーが正しく構成されていることを確認する

名前解決を正しく実行できるように、カスタム ドメイン ネーム システム (DNS) サーバーを設定します。 あなたは次の要件を満たすようにサーバーを構成する必要があります:

  • カスタム DNS サーバーを使用している場合は、サーバーが正常であり、ネットワーク経由で到達可能であることを確認します。

  • カスタム DNS サーバーに、Azure DNS IP アドレス (またはそのアドレスへのフォワーダー) に必要な条件フォワーダーがあることを確認します。

  • プライベート AKS DNS ゾーンが Azure でホストされている場合は、カスタム DNS 仮想ネットワークにリンクされていることを確認します。

  • Azure DNS の IP アドレスをカスタムDNS サーバーの IP アドレスに置き換えます。 これを行うことはお勧めしません。

  • DNS 設定で DNS サーバーの代わりに IP アドレスを使用しないでください。 Azure CLI コマンドを使用して、仮想マシン スケール セットまたは可用性セットでこのような状況を確認できます。

    • 仮想マシン スケール セット ノードの場合は、 az vmss run-command invoke コマンドを使用します。

      az vmss run-command invoke \
          --resource-group <resource-group-name> \
          --name <vm-scale-set-name> \
          --command-id RunShellScript \
          --instance-id 0 \
          --output tsv \
          --query "value[0].message" \
          --scripts "telnet <dns-ip-address> 53"
      az vmss run-command invoke \
          --resource-group <resource-group-name> \
          --name <vm-scale-set-name> \
          --instance-id 0 \
          --command-id RunShellScript \
          --output tsv \
          --query "value[0].message" \
          --scripts "nslookup <api-fqdn> <dns-ip-address>"
      
    • VM 可用性セット ノードの場合は、 az vm run-command invoke コマンドを使用します。

      az vm run-command invoke \
          --resource-group <resource-group-name> \
          --name <vm-availability-set-name> \
          --command-id RunShellScript \
          --output tsv \
          --query "value[0].message" \
          --scripts "telnet <dns-ip-address> 53"
      az vm run-command invoke \
          --resource-group <resource-group-name> \
          --name <vm-availability-set-name> \
          --command-id RunShellScript \
          --output tsv \
          --query "value[0].message" \
          --scripts "nslookup <api-fqdn> <dns-ip-address>"
      

詳細については、「 Azure 仮想ネットワーク内のリソースの名前解決 およびカスタム DNS を使用した Hub とスポークを参照してください。

解決策 2: API ネットワークのタイムアウトを修正する

API サーバーに到達でき、遅延の影響を受けないことを確認します。 これを行うには、次の手順を実行します。

  • AKS サブネットを調べて、割り当てられたネットワーク セキュリティ グループ (NSG) が API サーバーへのエグレス トラフィック ポート 443 をブロックしているかどうかを確認します。

  • ノード自体をチェックして、トラフィックをブロックしている別の NSG がノードにあるかどうかを確認します。

  • AKS サブネットで、割り当てられているルート テーブルを確認します。 ルート テーブルにネットワーク仮想アプライアンス (NVA) またはファイアウォールがある場合は、ポート 443 がエグレス トラフィックに使用できることを確認します。 詳細については、「AKS でクラスター ノードに対するエグレス トラフィックを制御する」をご覧ください。

  • DNS が名前を正常に解決し、API に到達できるが、API タイムアウトのためにノード CSE が失敗した場合は、次の表に示すように適切なアクションを実行します。

    種類の設定 アクション
    VM 可用性セット kubectl delete node コマンドを使用して Azure portal と AKS API からノードを削除し、クラスターをもう一度スケールアップします。
    Virtual Machine Scale Set Azure portal からノードを再イメージ化するか、ノードを削除してから、クラスターをもう一度スケールアップします。 特定のノードを削除するには、 az aks nodepool delete-machines コマンドを使用します。 最初に切断してドレインし、ノードを削除します。
  • 要求が AKS API サーバーによって調整されている場合は、上位のサービス レベルにアップグレードします。 詳細については、「AKS の Pricing レベル」を参照してください。

詳細