次の方法で共有


"az aks command invoke" エラーを解決する

この記事では、Azure Kubernetes Service (AKS) クラスター (特に private AKS クラスターに正常に接続できるように、microsoft Azure CLI で az aks コマンド呼び出しエラーを解決する方法について説明します。

他の接続方法では、次の表に示すように、追加の構成コンポーネントを使用する必要があります。

接続方法 追加の構成コンポーネント
仮想ネットワーク 仮想プライベート ネットワーク (VPN)
ピアリングされたネットワーク Azure ExpressRoute
プライベート エンドポイント ジャンプボックス

az aks command invoke Azure CLI コマンドは、追加の構成コンポーネントを必要としないクラスターに接続する別の方法です。

az aks command invoke コマンドを実行すると、Azure CLI によって aks-command 名前空間に command-<ID> ポッドが自動的に作成され、AKS クラスターにアクセスし、必要な情報が取得されます。

前提条件

  • Azure CLI

  • Kubernetes kubectl ツール。 Azure CLI を使用して kubectl をインストールするには、 az aks install-cli コマンドを実行します。

現象

次の表に、一般的な az aks command invoke エラー メッセージを示します。 各エラー メッセージには、エラーが発生している理由とその修正方法を説明するセクションへのリンクがあります。

エラー メッセージ リンク
操作が無効な状態 'Not Found' を返しました 原因 1: ノードまたはリソースの制約のためにポッドを作成できない
kubernetes エラーのため、マネージド クラスターでコマンドを実行できませんでした。 details: admission webhook "validation.gatekeeper.sh" が要求を拒否しました: <policy-specific-message> 原因 2: Azure Policy でポッドの作成が許可されない
サーバーからのエラー (禁止): 名前空間は禁止されています。ユーザー "<ID>" は、クラスター スコープの API グループ "<resource>" にリソースを一覧表示できません 原因 3: 必要なロールが付与されていない
MSI に接続できませんでした。 Please make sure MSI is configured correctly. (MSI が正しく構成されていることを確認してください。)

返されたトークン要求の取得: 応答 [400];
原因 4: Cloud Shell に問題がある

原因 1: ノードまたはリソースの制約のためにポッドを作成できない

command-<ID> ポッドが正常な状態 (Running など) に達できないため、操作はNot Found状態を返します。 (多くの場合、ポッドは Pending 状態のままです)。この場合、ノードはポッドをスケジュールできません。 このシナリオには、次の原因など、さまざまな原因が考えられます。

  • リソース制約
  • NotReadyまたはSchedulingDisabled状態のノード
  • ポッドが許容できないテイントを持つノード
  • その他の原因

解決策 1: ポッドをスケジュールして実行できるように構成を変更する

構成を調整して、 command-<ID> ポッドをスケジュールして実行できることを確認します。 例えば次が挙げられます。

  • ノード プールのサイズを大きくし、テイントなどのポッド分離制約がないことを確認して、 command-<ID> ポッドをデプロイできるようにします。
  • ポッドの仕様でリソースの要求と制限を調整します。

原因 2: Azure Policy でポッドの作成が許可されない

特定の Azure ポリシーがある場合、command-<ID> ポッドで構成が許可されていないため、az aks command invoke コマンドが失敗する可能性があります。 たとえば、読み取り専用ルート ファイル システムまたはその他の特定の構成を必要とする Azure ポリシーがあるとします。

解決策 2: ポッドの作成を禁止するポリシーの名前空間を除外する

ポッドの作成を許可しない関連付けられた Azure ポリシーの aks-command 名前空間を除外することをお勧めします。 除外の詳細については、「 Azure Policy でのスコープの管理」を参照してください。

Azure Policy を除外するには:

  1. Azure ポータルでPolicyを検索して選択します。

  2. Policy ナビゲーション ウィンドウで、Authoring セクションを見つけて、割り当てを選択します。

  3. 割り当ての表で、変更する 割り当て名 を含む行を見つけて、割り当ての名前を選択します。

  4. その割り当てのポリシー割り当てページで、 割り当ての編集を選択します。

  5. パラメーター タブを選択します。

  6. 入力またはレビューが必要なパラメーターを表示するオプションをオフにします。

  7. Namespace の除外 ボックスで、除外する名前空間の一覧に aks-command 名前空間を追加します。

または、ポリシーが組み込みのポリシーでない場合は、 command-<ID> ポッドの構成を確認し、必要に応じてポリシーを調整できます。 ポッドの YAML 構成を調べるには、次のコマンドを実行します。

kubectl get pods command-<ID> --namespace aks-command --output yaml

次のコマンドを実行して、 aks-command 名前空間を制限付きポリシーから除外できます。

az policy exemption create --name ExemptAksCommand --scope /subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.ContainerService/managedClusters/{aks-cluster} --policyAssignment /subscriptions/{subscription-id}/providers/Microsoft.Authorization/policyAssignments/{policy-assignment-id}

原因 3: 必要なロールが付与されていない

az aks command invoke コマンドを使用するには、クラスター上の次のロールにアクセスできる必要があります。

  • Microsoft.ContainerService/managedClusters/runCommand/action
  • Microsoft.ContainerService/managedClusters/commandResults/read

これらのロールがない場合、 az aks command invoke コマンドは必要な情報を取得できません。

解決策 3: 必要なロールを追加する

この問題を解決するには、次の手順に従ってください。

  1. Microsoft.ContainerService/managedClusters/runCommand/actionロールとMicrosoft.ContainerService/managedClusters/commandResults/readロールを追加します。

  2. 必要なロールをユーザーに割り当てます。

    az role assignment create --assignee {user-principal-name} --role "Azure Kubernetes Service Cluster User Role" --scope /subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.ContainerService/managedClusters/{aks-cluster}
    

原因 4: Cloud Shell に問題がある

az aks command invoke コマンドは、Azure Cloud Shell 環境で直接実行される場合、想定どおりに処理されません。 これは Cloud Shell の既知の問題です。

解決策 4a: 最初に az login コマンドを実行する

Cloud Shell で、az aks command invoke コマンドを実行する前に、az login コマンドを実行します。 例えば次が挙げられます。

az login
az aks command invoke --resource-group {resource-group} --name {aks-cluster} --command "kubectl get pods"

解決策 4b: ローカル コンピューターまたは仮想マシンでコマンドを実行する

ローカル コンピューターまたは Azure CLI がインストールされている仮想マシン (VM) で、 az aks command invoke コマンドを実行します。

サードパーティの情報に関する免責事項

この資料に記載されているサードパーティ製品は、マイクロソフトと関連のない他社の製品です。 明示的か黙示的かにかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。

お問い合わせはこちらから

質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。