排查并发操作问题


本页面可帮助您解决 Google Kubernetes Engine (GKE) 中由并发操作引起的错误。

本页面适用于想要了解部署失败(例如 Cluster is running incompatible operation 错误)原因的应用开发者。还适用于希望在集群或节点池级别诊断和解决这些并发操作错误的平台管理员和运维人员。如需详细了解我们在Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务

了解并发操作错误

在 GKE 中,集群操作是指修改集群控制平面或其节点池状态的操作。这些操作由 GKE 管理,您可以出于维护目的发起这些操作,GKE 也可以出于维护目的发起这些操作。常见的集群操作包括:

  • 创建或删除集群。
  • 升级集群的控制平面版本。
  • 创建、更新、删除节点池或调整其大小。
  • 修改集群级设置,例如启用或停用功能。
  • 由 GKE 启动的自动控制平面修复。

在集群上执行操作时,您可能会看到类似于以下内容的错误消息:

Cluster is running incompatible operation OPERATION_NAME
Cluster is currently being created, deleted, updated or repaired and cannot be updated
Operation OPERATION_NAME is currently ACTIONING cluster CLUSTER_NAME. Please wait and try again once it is done

这些错误可能包含以下值:

  • OPERATION_NAME:已在集群上运行的操作的唯一 ID。您可以使用此名称跟踪会阻止新操作启动的现有操作的状态。
  • ACTIONING:正在对集群执行的操作。例如 CreatingUpdating
  • CLUSTER_NAME:操作所针对的集群的名称。

发生这些错误是因为 GKE 限制了为防止发生冲突可同时运行的操作数量。一般来说,GKE 只允许同时运行一个集群级操作或每个节点池一个操作。GKE 还会执行自己的自动操作(例如控制平面升级),这些操作也会计入此限制,可能会暂时阻止您启动新任务。

解决并发操作错误

如果您收到一条错误消息,指出有另一项操作正在进行中,找到该任务并等待其完成:

  1. 如果您不知道阻塞操作的名称,请列出集群的所有进行中和等待中的操作:

     gcloud container operations list \
         --location=LOCATION \
         --filter '(targetLink~/clusters/CLUSTER_NAME$ OR targetLink~/clusters/CLUSTER_NAME/) AND status!=DONE' \
         --format json
    

    替换以下内容:

    • LOCATION:集群的 Compute Engine 区域或可用区(例如 us-central1us-central1-a),具体取决于集群是区域级还是可用区级。
    • CLUSTER_NAME:发生失败操作的集群的名称。

      输出类似于以下内容:

      {
         "name": "operation-0978307200000-00112233-4455-6677-8899-aabbccddeeff",
         "operationType": "UPDATE_CLUSTER",
         "selfLink": "https://container.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/operations/operation-0978307200000-00112233-4455-6677-8899-aabbccddeeff",
         "startTime": "2001-01-01T00:00:00.000000000Z",
         "status": "RUNNING",
         "targetLink": "https://container.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME/nodePools/NODE_POOL_NAME",
         "zone": "LOCATION"
      }
      

      在输出中,查看每个操作的 name 字段。此值是阻止新操作启动的操作的名称。下一步中您需要用到该值。

      如需详细了解输出中的其他字段,请参阅 projects.locations.operations 的 API 文档。

  2. 等待操作完成:

    gcloud container operations wait OPERATION_NAME \
        --location=LOCATION
    

    OPERATION_NAME 替换为错误消息或上一步中的阻塞操作的名称。

    此命令会主动监控操作,并在操作完成后退出。

  3. 当阻塞操作的状态为 DONE 时,重试导致错误的操作。

后续步骤