クラスタの作成または更新に関する問題のトラブルシューティング

このページでは、GKE on AWS のインストールやアップグレードに関連する問題を解決する方法について説明します。

さらにサポートを必要とされる場合は、Cloud カスタマーケアにお問い合わせください。

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

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

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

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

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

失敗の詳細を取得するには、次のコマンドを実行します。

gcloud container aws clusters describe CLUSTER_NAME \
    --location GOOGLE_CLOUD_LOCATION \
    --format "value(state, errors)"

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

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

あるいは、Create Cluster API 呼び出しに関連付けられた Operation リソースを記述して、作成エラーの詳細を取得することもできます。

gcloud container aws operations describe OPERATION_ID

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

gcloud container aws operations list \
    --location GOOGLE_CLOUD_LOCATION

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

たとえば、AWS IAM ロールに十分な権限が付与されていないことが原因でクラスタの作成に失敗した場合、このコマンドとその結果は次の例のようになります。

gcloud container aws operations describe b6a3d042-8c30-4524-9a99-6ffcdc24b370 \
  --location GOOGLE_CLOUD_LOCATION

出力は次のようになります。

done: true
error:
  code: 9
  message: 'could not set deregistration_delay timeout for the target group: AccessDenied
    User: arn:aws:sts::0123456789:assumed-role/foo-1p-dev-oneplatform/multicloud-service-agent
    is not authorized to perform: elasticloadbalancing:ModifyTargetGroupAttributes
    on resource: arn:aws:elasticloadbalancing:us-west-2:0123456789:targetgroup/gke-4nrk57tlyjva-cp-tcp443/74b57728e7a3d5b9
    because no identity-based policy allows the elasticloadbalancing:ModifyTargetGroupAttributes
    action'
metadata:
  '@type': type.googleapis.com/google.cloud.gkemulticloud.v1.OperationMetadata
  createTime: '2021-12-02T17:47:31.516995Z'
  endTime: '2021-12-02T18:03:12.590148Z'
  statusDetail: Cluster is being deployed
  target: projects/123456789/locations/us-west1/awsClusters/aws-prod1
name: projects/123456789/locations/us-west1/operations/b6a3d042-8c30-4524-9a99-6ffcdc24b370

クラスタの作成またはオペレーションが承認エラーで失敗する

通常、承認エラーを示すエラーは、クラスタの作成コマンドで指定した 2 つの AWS IAM ロールの一方が誤って作成されたことを示します。たとえば、API ロールに elasticloadbalancing:ModifyTargetGroupAttributes 権限が含まれていない場合は、クラスタの作成が失敗し、次のようなエラー メッセージが表示されます。

ERROR: (gcloud.container.aws.clusters.create) could not set
deregistration_delay timeout for the target group: AccessDenied User:
arn:aws:sts::0123456789:assumed-role/cloudshell-user-dev-api-role/multicloud-
service-agent is not authorized to perform:
elasticloadbalancing:ModifyTargetGroupAttributes on resource:
arn:aws:elasticloadbalancing:us-east-1:0123456789:targetgroup/gke-u6au6c65e4iq-
cp-tcp443/be4c0f8d872bb60e because no identity-based policy allows the
elasticloadbalancing:ModifyTargetGroupAttributes action

クラスタが正常に作成されたように見える場合でも、IAM ロールの指定が誤っていると、後で kubectl logs のようなコマンドを使用する際などにクラスタ オペレーションが失敗する可能性があります。

このような承認エラーを解決するには、クラスタ作成時に指定した 2 つの IAM ロールに関連付けられたポリシーが正しいことを確認します。具体的には、AWS IAM ロールの作成の説明と一致していることを確認してから、クラスタを削除して再作成します。個々のロールの説明は、API ロールコントロール プレーンのロールで確認できます。

クラスタの作成またはオペレーションがヘルスチェック ステージで失敗する

次のようなオペレーション ステータスでは、ヘルスチェック中にクラスタの作成が失敗する場合があります。

done: true
error:
  code: 4
  message: Operation failed
metadata:
  '@type': type.googleapis.com/google.cloud.gkemulticloud.v1.OperationMetadata
  createTime: '2022-06-29T18:26:39.739574Z'
  endTime: '2022-06-29T18:54:45.632136Z'
  errorDetail: Operation failed
  statusDetail: Health-checking cluster
  target: projects/123456789/locations/us-west1/awsClusters/aws-prod1
name: projects/123456789/locations/us-west1/operations/8a7a3b7f-242d-4fff-b518-f361d41c6597

このエラーは、IAM ロールがないか、IAM ロールが正しく指定されていないことが原因で発生する可能性があります。AWS CloudTrail を使用して、IAM の問題を特定できます。

次に例を示します。

  • API ロールにコントロール プレーンのメイン ボリューム KMS 鍵の kms:GenerateDataKeyWithoutPlaintext 権限が含まれていない場合は、次のイベントが表示されます。

    "eventName": "AttachVolume",
    "errorCode": "Client.InvalidVolume.NotFound",
    "errorMessage": "The volume 'vol-0ff75940ce333aebb' does not exist.",
    

    and

    "errorCode": "AccessDenied",
    "errorMessage": "User: arn:aws:sts::0123456789:assumed-role/foo-1p-dev-oneplatform/multicloud-service-agent is not authorized to perform: kms:GenerateDataKeyWithoutPlaintext on resource: arn:aws:kms:us-west1:0123456789:key/57a61a45-d9c1-4038-9021-8eb08ba339ba because no identity-based policy allows the kms:GenerateDataKeyWithoutPlaintext action",
    
  • コントロール プレーンのロールにコントロール プレーンのメイン ボリューム KMS 鍵の kms:CreateGrant 権限が含まれていない場合は、次のイベントが表示されます。

    "eventName": "AttachVolume",
    "errorCode": "Client.CustomerKeyHasBeenRevoked",
    "errorMessage": "Volume vol-0d022beb769c8e33b cannot be attached. The encrypted volume was unable to access the KMS key.",
    

    and

    "errorCode": "AccessDenied",
    "errorMessage": "User: arn:aws:sts::0123456789:assumed-role/foo-controlplane/i-0a11fae03eb0b08c1 is not authorized to perform: kms:CreateGrant on resource: arn:aws:kms:us-west1:0123456789:key/57a61a45-d9c1-4038-9021-8eb08ba339ba because no identity-based policy allows the kms:CreateGrant action",
    
  • コントロール プレーンのルート ボリューム KMS 鍵を使用するために kms:CreateGrant 権限があるサービスにリンクしたロール(AWSServiceRoleForAutoScaling)を指定しなかった場合は、次のイベントが表示されます。

    "errorCode": "AccessDenied",
    "errorMessage": "User: arn:aws:sts::0123456789:assumed-role/AWSServiceRoleForAutoScaling/AutoScaling is not authorized to perform: kms:CreateGrant on resource: arn:aws:kms:us-west1:0123456789:key/c77a3a26-bc91-4434-bac0-0aa963cb0c31 because no identity-based policy allows the kms:CreateGrant action",
    
  • コントロール プレーンのルート ボリューム KMS 鍵を使用するために kms:GenerateDataKeyWithoutPlaintext 権限があるサービスにリンクしたロール(AWSServiceRoleForAutoScaling)を指定しなかった場合は、次のイベントが表示されます。

    "errorCode": "AccessDenied",
    "errorMessage": "User: arn:aws:sts::0123456789:assumed-role/AWSServiceRoleForAutoScaling/AutoScaling is not authorized to perform: kms:GenerateDataKeyWithoutPlaintext on resource: arn:aws:kms:us-west1:0123456789:key/c77a3a26-bc91-4434-bac0-0aa963cb0c31 because no identity-based policy allows the kms:CreateGrant action",
    

ノードがクラスタに参加するのを待機している

ノードプールの作成時に次のエラーが発生した場合は、VPC に関連付けられているセカンダリ IPv4 CIDR ブロックが含まれていないことを確認します。

errorDetail: Operation failed
statusDetail: Waiting for nodes to join the cluster (0 out of 1 are ready)

この問題を解決するには、すべての CIDR ブロックを含むセキュリティ グループを作成し、そのグループをクラスタに追加します。詳細については、VPC セカンダリ CIDR ブロックのノードプールをご覧ください。

インスタンスのシステムログを取得する

コントロール プレーンまたはノードプール インスタンスが起動しない場合に、そのシステムログを調査できます。システムログを調べるには、次の操作を行います。

  1. AWS EC2 インスタンス コンソールを開きます。
  2. [Instances] をクリックします。
  3. 名前でインスタンスを検索します。GKE on AWS は通常、コントロール プレーン ノード用に CLUSTER_NAME-cp、ノードプール ノード用に CLUSTER_NAME-np という名前のインスタンスを作成します。
  4. [Actions] -> [Monitor and Troubleshooter] -> [Get System Log] を選択します。インスタンスのシステムログが表示されます。

クラスタ更新の失敗

クラスタを更新すると、新しいクラスタを作成するときと同様に、GKE on AWS は最初に一連のプリフライト テストを実行してリクエストを検証します。クラスタの更新に失敗した場合は、このプリフライト テストのいずれかが失敗したか、クラスタを更新するプロセス自体のステップが完了しなかった可能性があります。

プリフライト テストが失敗すると、クラスタはリソースを更新せず、エラーに関する情報を直接返します。たとえば、test_ec2_keypair という SSH 認証鍵ペアを使用するようにクラスタを更新しようとすると、プリフライト テストで EC2 鍵ペアの取得に失敗し、リクエストは次のエラーを返します。

ERROR: (gcloud.container.aws.clusters.update) INVALID_ARGUMENT: key pair
"test_ec2_keypair" not found,
field: aws_cluster.control_plane.ssh_config.ec2_key_pair

プリフライト テストに合格した後、クラスタの更新に失敗する場合もあります。これは、クラスタの更新開始から数分後に発生する可能性があり、 Google Cloud プロジェクトの AWS リソースの状態は DEGRADED に設定されます。

失敗と関連する操作の詳細については、クラスタ作成の失敗をご覧ください。

コントロール プレーン タグの更新時にクラスタの更新に失敗する

AWS 更新 API は、コントロール プレーン タグの更新をサポートしています。タグを更新するには、Kubernetes バージョン 1.24 以降のクラスタが必要です。また、コントロール プレーンタグを更新するための [クラスタの更新] ページに記載されている適切な権限が AWS IAM ロールに付与されている必要があります。

通常、認証エラーを示すエラーは、IAM 権限の追加がないことを示しています。たとえば、API ロールに ec2:DeleteTags 権限が含まれていない場合、タグのクラスタ更新は、次のようなエラー メッセージが返されて失敗する可能性があります(<encoded_auth_failure_message> は簡略化されています)。

ERROR: (gcloud.container.aws.clusters.update) could not delete tags:
UnauthorizedOperation You are not authorized to perform this operation.
Encoded authorization failure message: <encoded_auth_failure_message>

上記のエンコードされたエラー メッセージをデバッグするには、次のコマンドに示すように、AWS STS decode-authorization-message API にリクエストを送信します。

aws sts decode-authorization-message --encoded-message
<encoded_auth_failure_message> --query DecodedMessage --output
text | jq '.' | less

出力は次のようになります。

...
"principal": {
  "id": "AROAXMEL2SCNPG6RCJ72B:iam-session",
  "arn": "arn:aws:sts::1234567890:assumed-role/iam_role/iam-session"
},
"action": "ec2:DeleteTags",
"resource": "arn:aws:ec2:us-west-2:1234567890:security-group-rule/sgr-00bdbaef24a92df62",
...

上記のレスポンスは、AWS クラスタの EC2 セキュリティ グループ ルール リソースに対して ec2:DeleteTags アクションを実行できなかったことを示しています。必要に応じて API ロールを更新し、更新の API リクエストを再送信してコントロール プレーン タグを更新します。

次のステップ