Anthos clusters on Azure のトラブルシューティング

Anthos clusters on Azure の作成時や使用時に問題が発生した場合は、このトラブルシューティング手順を使用してください。

クラスタの作成に失敗する

クラスタを作成するリクエストを行うと、Anthos clusters on Azure では一連のプリフライト テストを実行してそのリクエストが検証されます。クラスタの作成に失敗した場合は、このプリフライト テストのいずれかが失敗したか、クラスタを作成するプロセス自体のステップが完了しなかった可能性があります。

プリフライト テストが失敗すると、クラスタはリソースを作成せず、エラーに関する情報を直接返します。たとえば、invalid%%%name という名前のクラスタを作成しようとすると、有効なクラスタ名のプリフライト テストは失敗し、リクエストは次のエラーを返します。

ERROR: (gcloud.container.azure.clusters.create) INVALID_ARGUMENT: must be
between 3-40 characters, valid characters are /[a-z][0-9]-/, should start with a
letter, and end with a letter or a number: "invalid%%%name",
field: azure_cluster_id

プリフライト テストに合格した後、クラスタの作成に失敗する場合もあります。これは、クラスタの作成開始から数分後(Anthos clusters on Azure が Google Cloud と Azure にリソースを作成した後)に発生する可能性があります。この場合は、状態が ERROR に設定された Azure リソースが Google Cloud プロジェクト内に存在します。

クラスタの状態を表示するには、以下を実行します。

gcloud container azure clusters describe `CLUSTER_NAME` \
  --location `GOOGLE_CLOUD_LOCATION` \
  --format "value(state)"

次のように置き換えます。

  • CLUSTER_NAME: 状態のクエリを実行するクラスタの名前。
  • GOOGLE_CLOUD_LOCATION: この Azure クラスタを管理する Google Cloud リージョンの名前。

ERROR 状態のクラスタの詳細を取得するには、次のコマンドを実行します。

gcloud container azure operations describe `OPERATION_ID`

OPERATION_ID は、クラスタを作成したオペレーションの ID に置き換えます。クラスタ作成リクエストのオペレーション ID がない場合は、次のコマンドで取得できます。

gcloud container azure operations list

タイムスタンプまたは関連情報を使用して、対象のクラスタ作成オペレーションを特定します。

kubectl を使用してクラスタに接続できない

このセクションでは、kubectl コマンドライン ツールを使用してクラスタに接続する際の問題を診断するヒントをいくつか説明します。

サーバーにリソースがない

クラスタに実行中のノードプールがない場合や、Connect ゲートウェイがノードプールに接続できない場合は、error: the server doesn't have a resource type "services" などのエラーが発生することがあります。ノードプールのステータスを確認するには、次のコマンドを実行します。

gcloud container azure node-pools list \
    --cluster-name CLUSTER_NAME \
    --location LOCATION

以下を置き換えます。

  • CLUSTER_NAME: クラスタの名前
  • LOCATION: クラスタを管理する Google Cloud のロケーション

出力には、クラスタのノードプールのステータスが含まれます。ノードプールが表示されない場合は、ノードプールを作成してください。

Connect ゲートウェイのトラブルシューティング

お使いのユーザー名にクラスタに対する管理者アクセス権がない場合は、次のエラーが発生します。

Error from server (Forbidden): users "administrator@example.com" is forbidden:
User "system:serviceaccount:gke-connect:connect-agent-sa" cannot impersonate
resource "users" in API group "" at the cluster scope

追加のユーザーを構成するには、クラスタの作成時に --admin-users フラグを渡します。

Connect ゲートウェイを使用していてクラスタに接続できない場合は、次の手順をお試しください。

  1. クラスタの承認されたユーザーを取得します。

    gcloud container azure clusters describe CLUSTER_NAME \
      --format 'value(authorization.admin_users)'
    

    CLUSTER_NAME をクラスタ名で置き換えます。

    出力には、クラスタに対する管理者権限があるユーザー名が含まれます。 次に例を示します。

    {'username': 'administrator@example.com'}
    
  2. Google Cloud CLI で現在認証されているユーザー名を取得します。

    gcloud config get-value account
    

    出力には、Google Cloud CLI で認証されたアカウントが含まれます。gcloud containers azure clusters describegcloud config get-value account の出力が一致しない場合は、gcloud auth login を実行し、クラスタに対する管理者権限を持つユーザーとして認証を行います。

kubectl コマンドが応答しない

kubectl コマンドが応答しない、またはタイムアウトする場合、最も一般的な理由は、ノードプールがまだ作成されていないことです。デフォルトで Anthos clusters on Azure は、インターネットに接続可能なエンドポイントとして Connect ゲートウェイを使用する kubeconfig ファイルを生成します。これが機能するには、クラスタのノードプールで gke-connect-agent Deployment が実行されている必要があります。

この場合の詳細な診断情報を確認するには、次のコマンドを実行します。

kubectl cluster-info -v=9

動作しているノードプールがない場合、connectgateway.googleapis.com へのリクエストは 404 cannot find active connections for cluster エラーで失敗します。

kubectl exec、attach、port-forward コマンドが失敗する

Connect ゲートウェイを使用しているときに、kubectl execkubectl attachkubectl port-forward コマンドがメッセージ「error: unable to upgrade connection」で失敗することがあります。これは、Connect ゲートウェイを Kubernetes API Server エンドポイントとして使用する場合の制限事項です。

この問題を回避するには、kubeconfig を使用してクラスタのプライベート エンドポイントを指定します。プライベート エンドポイントを介してクラスタにアクセスする手順については、kubectl 用のクラスタ アクセスを構成するをご覧ください。

kubectl の一般的なトラブルシューティング

Connect ゲートウェイを使用する場合:

  • Google Cloud プロジェクトで Connect ゲートウェイが有効になっていることを確認します。

    gcloud services enable connectgateway.googleapis.com
    
  • 1 つ以上の Linux ノードプールが実行されていることを確認します。

  • gke-connect-agent が実行されていることを確認します。詳細については、接続のトラブルシューティングをご覧ください。

API エラー

Kubernetes 1.22 では、一部の API が非推奨になり、置き換えられます。クラスタをバージョン 1.22 以降にアップグレードした場合、非推奨 API のいずれかに対するアプリケーションからの呼び出しはすべて失敗します。

解決策

アプリケーションをアップグレードして、非推奨の API 呼び出しを新しいものに置き換えます