Google Distributed Cloud Air-gapped 1.12.x 已知问题

类别 已识别的版本 问题和解决方法
备份和恢复 1.12.1

卷备份无法解析组织级对象存储端点

用于卷备份的存储集群使用外部 DNS 服务器而非转发器,这会导致卷备份无法解析组织级对象存储端点。在 1.12 版中,备份流量需要为每个组织设置新路由。

临时解决方法:

IO 必须更新存储集群,以启用组织级 DNS 解析,并创建从复制逻辑接口 (LIF) 到每个组织中的对象存储端点的路由。从引导加载程序复制并粘贴以下命令。

  1. 设置 KUBECONFIG 环境变量:
    export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
  2. 查找存储集群:
    storage_cluster=$(kubectl get storagecluster -n gpc-system | awk 'NR == 2{print $1}')
  3. 查找实例外部 CIDR:
    instance_external_cidr=$(kubectl get cidrclaim -n gpc-system instance-external-cidr -ojsonpath='{.spec.ipv4Spec.staticCidrBlocks}')
  4. 更新存储集群以使用转发器,并添加通往实例外部 CIDR 的路由:
    kubectl patch storagecluster "${storage_cluster}" -n gpc-system --type='json' -p='[{"op": "replace", "path": "/spec/additionalNetworks/0/destinationSubnets", "value": '"${instance_external_cidr}"'}, {"op": "replace", "path": "/spec/dnsConfig/serviceRef/name", "value": "gpc-coredns-forwarder-udp"}]'
  5. 重新启动控制器,以确保更改已实现:
    kubectl rollout restart deploy/file-storage-backend-controller -n file-system
备份和恢复 1.12.1

备份组织路线失败

症状

由于备份子网中没有到组织控制平面的路由,因此从 ONTAP 节点对组织管理员 Ingress 网关执行 curl 操作失败。

临时解决方法:

IO 必须更新存储集群,以启用组织级 DNS 解析,并创建从复制逻辑接口 (LIF) 到每个组织中的对象存储端点的路由。从引导加载程序复制并粘贴以下命令。

  1. 设置 KUBECONFIG 环境变量:
    export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
  2. 查找存储集群:
    storage_cluster=$(kubectl get storagecluster -n gpc-system | awk 'NR == 2{print $1}')
  3. 查找实例外部 CIDR:
    instance_external_cidr=$(kubectl get cidrclaim -n gpc-system instance-external-cidr -ojsonpath='{.spec.ipv4Spec.staticCidrBlocks}')
  4. 更新存储集群以使用转发器,并添加通往实例外部 CIDR 的路由:
    kubectl patch storagecluster "${storage_cluster}" -n gpc-system --type='json' -p='[{"op": "replace", "path": "/spec/additionalNetworks/0/destinationSubnets", "value": '"${instance_external_cidr}"'}, {"op": "replace", "path": "/spec/dnsConfig/serviceRef/name", "value": "gpc-coredns-forwarder-udp"}]'
  5. 重新启动控制器,以确保更改已实现:
    kubectl rollout restart deploy/file-storage-backend-controller -n file-system
备份和恢复 1.12.4

已备份的永久性卷无法删除

症状

如果永久性卷处于 SnapMirror 关系中,则无法将其删除。

临时解决方法:

IO 会删除以相应卷为目标的 SnapMirror 关系。

  1. 设置 KUBECONFIG 环境变量:
    export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
  2. 将有问题的 PV 名称存储在一个变量中:
    PV_NAME={ PV_NAME }
  3. 获取内部卷名称:
    volume_name=$(kubectl get pv ${PV_NAME?} -o jsonpath='{.spec.csi.volumeAttributes.internalName}')
  4. 按照 FILE-A0006 运行手册中的步骤获取对 ONTAP 的访问权限。
  5. 使用之前收集的密码删除以相应卷为来源的关系:
    ssh ${username?}@${mgmt_ip?} snapmirror delete -source-volume ${volume_name?} -destination-path "*"
    # enter the password collected from the breakglass secret
备份和恢复 1.12.0
1.12.1
1.12.2

备份存储库实际上处于健康状态

如果备份资源库没有任何类型的错误状态,但系统却针对该资源库发出提醒,则可能是该资源库的提醒指标被错误地提升了。这是 1.12.0 中的已知问题,已在 1.12.4 中修复。此问题的原因是,备份存储库会定期尝试连接到对象存储,以进行健康检查,如果连接失败,则会进入不健康状态。不过,如果备份资源库恢复,指示其健康状况的指标不会正确切换回来,导致提醒一直处于触发状态。 如需解决此问题,您可以手动删除并重新创建备份库,以重置其健康状况指标。按照 BACK-R0003 运行手册中的步骤重新创建备份代码库。

结算 1.12.4

bil-storage-system-cluster - Reconciliation error: E0121 子组件失败

症状

错误消息:bil-storage-system-cluster - Reconciliation error: E0121- rollback chart: no Job with the name "billing-storage-system-init-job-628" found

由于作业过时,bil-storage-system-cluster 子组件无法进行协调。成功完成后,billing-storage-system-init-job-628billing-storage-system-init-job-629 仍会保留。

临时解决方法:

请完成以下步骤:

  1. 备份过时的结算作业:
    cd /root/USERNAME
    kubectl --kubeconfig /root/release/gdchservices/gdchservices-system-kubeconfig get jobs billing-storage-system-init-job-628 -n billing-system -o yaml > billing-storage-system-init-job-628.yaml
    kubectl --kubeconfig /root/release/gdchservices/gdchservices-system-kubeconfig get jobs billing-storage-system-init-job-629 -n billing-system -o yaml > billing-storage-system-init-job-629.yaml
  2. 暂停子组件:
    export SUBCOMPONENT_NAME=bil-storage-system-cluster
    export SUBCOMPONENT_NAMESPACE=gdchservices-system-cluster
    
    kubectl annotate subcomponent "${SUBCOMPONENT_NAME:?}" -n "${SUBCOMPONENT_NAMESPACE:?}" lcm.private.gdc.goog/paused=true
  3. 删除过时的作业。
  4. 重新开始 oclcm-backend-controller
  5. 取消暂停子组件。
块存储 1.12.4

由于卷装载错误,Grafana pod 卡在 Init 状态。

症状

由于卷装载错误,anthos-identity-service-obs-systemplatform-obs-obs-system 命名空间中的 Grafana pod 卡在 Init 状态。kubelet 日志中的错误消息表明存在多重连接问题。此问题源于 Trident 中的一个 bug,该 bug 会导致 Trident 无法正确识别和验证 LUKS 映射的底层设备,从而导致多重附加 bug。

临时解决方法:

检查 PVC 是否具有 deletionTimestamp。如果不存在 deletionTimestamp(Pod 迁移),请按以下步骤操作:

  1. 检查 PVCVolumeAttachment,以确定卷当前连接到的位置。
  2. 隔离集群中与此值不匹配的 Nodes
  3. 删除失败的 Pod,这应该会导致它迁移回原始的 Node

检查后,如果存在 deletionTimestamp(卷删除),请按以下步骤操作:

  1. 检查 PVCVolumeAttachment,以确定卷当前连接到的位置。
  2. Node 上,输出其跟踪文件的内容:
    cat /var/lib/trident/tracking/PVC_NAME.json
  3. 验证在跟踪文件输出的 devicePath 字段中找到的 LUKS 设备是否已实际关闭。此路径此时不应存在:
    stat DEVICE_PATH
  4. 验证序列号当前是否已映射到任何多路径设备。
    1. 复制跟踪文件 iscsiLunSerial 字段中的值。
    2. 将此值转换为预期十六进制值:
      echo 'iISCSILUNSERIAL>' | xxd -l 12 -ps
    3. 使用此新值查找多路径条目是否仍然存在:
      multipath -ll | grep SERIAL_HEX
    4. 如果不存在,请删除跟踪文件。
    5. 如果存在,您会看到一个比搜索到的序列十六进制值稍长的序列十六进制值,我们称之为 multipathSerial。运行以下命令,找到块存储设备:
      multipath -ll MULTIPATH_SERIAL
    6. 然后,运行以下命令,其中最后一个命令针对每个块设备单独运行:
                systemctl restart iscsid
                systemctl restart multipathd
                multipath -f MULTIPATH_SERIAL
                echo 1 > /sys/block/BLOCK_DEVICE_NAME/device/delete
                  
集群管理 1.12.0
1.12.1
1.12.2
1.12.4

在集群配置期间,machine-init 作业失败

症状

  1. 在集群配置期间,第二个控制平面节点的 machine-init 作业失败,并显示以下消息:
    FAILED! => {"changed": true, "cmd": "/usr/bin/kubeadm join phase control-plane-prepare certs --config /dev/stdin --v 5".
  2. 查看日志:
    kubectl --kubeconfig=ADMIN_KUBECONFIG logs -p kube-apiserver-{first_node_name} -n kube-system | grep "etcdmain: open /etc/kubernetes/pki/etcd/ca.crt: permission denied"

    输出显示了非空结果。

临时解决方法:

  1. 切换 /etc/kubernetes/pki/etcd/ca.crt 的权限。这是一项对时间非常敏感的操作。权限切换必须在上次运行 machine-init 作业之后,但在下次运行 machine-init 作业之前进行,因为 machine-init 会将权限覆盖回 root。
  2. 重启第二个节点中的 etcd,以从崩溃循环中恢复第一个节点中的 etcd

    完成这两个步骤后,第一个节点中的 kube-apiserver 开始运行,下一个 machine-init 作业成功完成。

集群管理 1.12.2

所需的 IPv4 PodCIDR 不可用

症状

Cilium 代理显示以下警告:

level=warning msg="Waiting for k8s node information" error="required IPv4 PodCIDR not available" subsys=k8s 

临时解决方法:

  1. 找出要移除的节点的 IP 地址。
  2. NodePool 自定义资源中的 spec.nodes 中移除 IP 地址。
  3. 等待节点从 NodePool 中完全移除。 如果节点未被移除,请执行 force-remove
    1. Machine 自定义资源添加 baremetal.cluster.gke.io/force-remove=true 注解:
      kubectl -n org-1-system-cluster annotate machine IP_ADDRESS baremetal.cluster.gke.io/force-remove=true 
  4. 将 IP 地址重新添加到 NodePool 自定义资源中的 spec.nodes
日志记录 1.12.0
1.12.1

Kubernetes API 服务器日志未转发到 SIEM 目标位置

症状

完成导出到外部 SIEM 系统的设置后,SIEM 输入未包含在 Fluent Bit 处理流水线中,并且此 SIEM 中没有 Kubernetes API 服务器日志。

网络 1.12.4

升级期间,machine-init 作业失败

症状

从版本 1.12.2 升级到 1.12.4 时,如果某个节点被移除,然后又重新添加,则该节点的 machine-init 进程可能会失败。 此故障的发生是因为政策 ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes 拒绝了从重新添加的节点到基本控制平面服务的网络流量。此错误在以下示例输出的状态消息中突出显示:
      Feb 17 18:52:52.330: 30.0.0.9:41046 (world) <> 30.0.0.7:2379 (host) policy-verdict:none INGRESS DENIED (TCP Flags: SYN)
      Feb 17 18:52:52.330: 30.0.0.9:41046 (world) <> 30.0.0.7:2379 (host) Policy denied DROPPED (TCP Flags: SYN)

临时解决方法:

如需缓解此问题,请按以下步骤操作:

  1. 对于根管理员集群:
    1. CIDRClaim/org-external-cidr -n root(具体来说是 .status.ipv4AllocationStatus.allocatedCidrBlocks 字段)获取 CIDR。在根管理员集群中运行以下命令:
      ROOTCIDRs=$(ka get cidrclaim/org-external-cidr -n root -o json | jq '.status.ipv4AllocationStatus.allocatedCidrBlocks')
    2. 将这些 CIDR 添加到 ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes 中,具体来说是添加到 .spec.ingress.fromCIDR 字段中。使用以下命令在根管理员集群中应用此更改:
      ka get ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes -o json \
        | jq '.spec.ingress += [{"fromCIDR":'"${ROOTCIDRs}"'}]' \
        | ka apply -f -
  2. 对于组织管理员集群:
    1. 获取组织的 CIDR(例如,org-1)来自 CIDRClaim/org-external-cidr -n org-1(具体来说是 .status.ipv4AllocationStatus.allocatedCidrBlocks 字段)。此命令针对根管理员集群运行,以获取“org-1”的 CIDR:
      ORGCIDRs=$(ka get cidrclaim/org-external-cidr -n org-1 -o json | jq '.status.ipv4AllocationStatus.allocatedCidrBlocks')
    2. 将这些 CIDR 添加到 ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes 中,具体来说是添加到 .spec.ingress.fromCIDR 字段中。使用以下命令在相应的组织管理员集群中应用此更改:
      ko get ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes -o json \
        | jq '.spec.ingress += [{"fromCIDR":'"${ORGCIDRs}"'}]' \
        | ko apply -f -

此更改只需在开始升级之前进行一次。

网络 1.12.0
1.12.1

虚拟机和容器更新、终止和调度方面的问题

症状

在系统集群的裸机节点上,无法终止两个 anetd 容器。强制停止进程后,重新启动 kubeletcontainerdanetd pod 会重新创建,但所有容器都卡在 podInit 中,并且 containerd 会报告以下错误消息:

`failed to create containerd task: failed to create shim task: context deadline exceeded: unknown`.

这会阻止容器网络接口 (CNI) 启动,并阻止安排其他 pod。

临时解决方法:

执行以下缓解措施可防止出现此节点状态:

  • 请勿在单个节点上同时调度超过 10 个 PVC。等待它们装载完毕,然后再安排更多。在尝试创建虚拟机时,此问题最为明显。
  • 更新每个节点上的 /etc/lvm/lvm.conf 文件,在 devices{} 块中添加以下代码行:filter = [ "r|/dev/dm.|", "r|/dev/sg.|" ]

如果节点进入某种状态,导致卷连接和装载超时,或者无法删除卷,请检查节点上挂起的 vg 进程数量,以确定节点是否处于这种特别糟糕的状态。修复处于此状态的节点的最可靠方法是重启该节点。

您可能还会遇到另一种故障模式。该故障模式在装载尝试中具有以下签名:mount(2) system call failed: No space left on device。这可能是由节点上的装载传播引起的。您可以通过运行 cat /proc/mounts | grep devtmpfs | awk '{ print $2 }' | sort -n | uniq -c 来检查这一点。如果其中任何一个显示的值大于 1,请删除使用该值的 pod,这应该会触发卸载。如果无法成功卸载,请手动卸载该路径。如果您仍然遇到问题,请执行重新启动。

网络 1.12.2

GDC 在初始引导过程中无法根据流量政策创建交换机 ACL

在某些情况下,由于竞争条件,Google Distributed Cloud (GDC) 空气隔离在分布式云的初始引导期间未能创建必要的交换机 ACL Kubernetes 自定义资源。

症状

列出交换机 ACL CR:

kubectl get switchacls -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig

此命令的输出表明尚未创建任何管理交换机 ACL (mgmt-switch-acl)。

No resources found in gpc-system namespace.

临时解决方法:

  1. 列出流量政策 CR:
    kubectl get trafficpolicies -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig

    输出会返回两个流量政策 Kubernetes CR:

    NAME                          AGE     NAME
    default-traffic-policy-data   4d17h   default-traffic-policy-data
    default-traffic-policy-mgmt   4d17h   default-traffic-policy-mgmt
  2. 修改 default-traffic-policy-mgmt 流量政策 Kubernetes CR:
    kubectl edit trafficpolicies default-traffic-policy-mgmt -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig
  3. 前往此文件中的最后一条政策规则,该规则可能位于文件末尾。
  4. 确定最后一个政策规则的说明字段。该字段可能如下所示:
    Deny All rule for Management Network
  5. 修改此说明,并在说明行的开头添加 The
    The Deny All rule for Management Network
  6. 保存文件并退出。
  7. 再次列出 Kubernetes 交换机 ACL CR:
    kubectl get switchacls -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig
  8. 输出会列出管理交换机 ACL (mgmt-switch-acl):
    NAME              AGE   NAME
    mgmt-switch-acl   23h   mgmt-switch-acl
物理服务器 1.12.1
1.12.2

NodePool 在创建期间有服务器处于未知状态

症状

在任何集群创建期间配置 Server 时,服务器可能会被标记为已配置,但缺少 Provision-Ready 条件。因此,NodePool 无法使用此服务器。NodePool 中的错误事件消息示例可能如下所示:

Events:
  Type     Reason          Age    From    Message
  ----     ------          ----   ----    -------
  Warning  ReconcileError  xxx    Server  policy failure PolicyPreflightCompleted(UnreachableError): {PolicyPreflightCompleted False 3 2023-11-07 22:10:56 +0000 UTC UnreachableError reachability err: Failed to connect to the host via ssh: ssh: connect to host xx.xx.xx.xx port 22: Connection timed out}
      

临时解决方法:

通过运行以下脚本重置 ILO:

      SERVER_NAME=
      ROOT_ADMIN_KUBECONFIG=
      ILO_IP=$(kubectl get servers ${SERVER_NAME} -n gpc-system --template={{.spec.bmc.ip}} --kubeconfig=${ROOT_ADMIN_KUBECONFIG})
      SECRET_NAME=$(kubectl get secrets -o go-template='{{range $index,$pod := .items}}{{.metadata.name}}{{"\n"}}{{end}}' -n gpc-system --kubeconfig=${ROOT_ADMIN_KUBECONFIG} | grep bmc | grep ${SERVER_NAME})
      ILO_USER=$(kubectl get secrets ${SECRET_NAME} -n gpc-system --template={{.data.username}} --kubeconfig=${ROOT_ADMIN_KUBECONFIG} | base64 -d)
      ILO_PASS=$(kubectl get secrets ${SECRET_NAME} -n gpc-system --template={{.data.password}} --kubeconfig=${ROOT_ADMIN_KUBECONFIG} | base64 -d)
      # Perform iLO Reset
      
      curl -k -u ${ILO_USER}:${ILO_PASS}  -H "Content-Type: application/json" -H "OData-Version: 4.0" https://${ILO_IP}/redfish/v1/Managers/1/Actions/Manager.Reset --data '{"ResetType":"ForceRestart"}' -X POST | jq
      
      # Perform server power cycle, start with power off target server
       
       curl -k -u ${ILO_USER}:${ILO_PASS} -H "Content-Type: application/json" -H "OData-Version: 4.0" -X POST https://${ILO_IP}/redfish/v1/Systems/1/Actions/ComputerSystem.Reset --data '{"ResetType":"ForceOff"}' | jq .
      
      # Verify target server powered off successfully
      
      curl -kqs -u ${ILO_USER}:${ILO_PASS} https://${ILO_IP}/redfish/v1/Systems/1 | jq '.PowerState'
       
      # Power server back
      
      curl -k -u ${ILO_USER}:${ILO_PASS} -H "Content-Type: application/jsonls " -H "OData-Version: 4.0" -X POST https://${ILO_IP}/redfish/v1/Systems/1/Actions/ComputerSystem.Reset --data '{"ResetType":"On"}' | jq .
       
      

在极少数情况下,上述 iLO 重置程序可能无法完全解决问题,此时需要重新配置服务器。如需了解详细步骤,请参阅 OS-P0002OS-P0003 运行手册。

物理服务器 1.12.2

租户组织中的节点固件升级失败

症状

裸金属节点升级停滞在 in-progress 状态超过 3 小时。

临时解决方法:

按照 SERV-R0005 运行手册中的步骤操作。

网络 1.12.1

预安装脚本在多个开关上失败

症状

POAP 一直失败,并且 POAP 的日志显示类似如下的消息:

2024 Feb 27 20:20:25 switch %$ VDC-1 %$ %USER-1-SYSTEM_MSG: S/N[FDO26391GHS]-MAC[98:A2:C0:F8:60:6A] - Running: 'nxos.10.3.1.bin' - /script.sh
2024 Feb 27 20:20:25 switch %$ VDC-1 %$ %USER-1-SYSTEM_MSG: S/N[FDO26391GHS]-MAC[98:A2:C0:F8:60:6A] - Target: 'nxos64-cs.10.3.4a.M.bin' - /script.sh

您在交换机的 bootflash 目录中找不到 nxos.10.3.1.bin,但找到了类似的文件,例如 nxos64-cs.10.3.1.F.bin

临时解决方法:

在引导加载程序机器上,完成以下步骤。您必须在预安装流程进行期间完成这些步骤。如果存在多个 /tmp/preinstall-bootstrap- 文件夹,请通过检查预安装进程的日志,将更改应用到预安装进程正在使用的当前文件夹。如果您需要重新启动预安装命令,此操作也会创建一个新的 /tmp/preinstall-bootstrap- 文件夹。

  1. 前往 /tmp/preinstall-bootstrap-RANDOM_NUMBER 文件夹。
  2. 在该文件夹中,找到 poap.py 文件。
  3. 完全移除此文件中包含 md5 校验和的行,使 head -n 4 poap.py 看起来如下所示:
    #!/bin/env python3
    import glob
    import os
    import pkgutil
  4. 在同一文件中,将以下代码行添加到 version_to_image_file
        "nxos.10.2.1.bin": "nxos64.10.2.1.F.bin",
        "nxos.10.2.2.bin": "nxos64-cs.10.2.2.F.bin",
        "nxos.10.2.3.bin": "nxos64-cs.10.2.3.F.bin",
        "nxos.10.2.4.bin": "nxos64-cs.10.2.4.M.bin",
        "nxos.10.2.5.bin": "nxos64-cs.10.2.5.M.bin",
        "nxos.10.2.6.bin": "nxos64-cs.10.2.6.M.bin",
        "nxos.10.2.7.bin": "nxos64-cs.10.2.7.M.bin",
        "nxos.10.3.1.bin": "nxos64-cs.10.3.1.F.bin",
        "nxos.10.3.2.bin": "nxos64-cs.10.3.2.F.bin",

    更新后的文件中的相应部分如下所示:

    version_to_image_file = {
        "nxos.10.2.1.bin": "nxos64.10.2.1.F.bin",
        "nxos.10.2.2.bin": "nxos64-cs.10.2.2.F.bin",
        "nxos.10.2.3.bin": "nxos64-cs.10.2.3.F.bin",
        "nxos.10.2.4.bin": "nxos64-cs.10.2.4.M.bin",
        "nxos.10.2.5.bin": "nxos64-cs.10.2.5.M.bin",
        "nxos.10.2.6.bin": "nxos64-cs.10.2.6.M.bin",
        "nxos.10.2.7.bin": "nxos64-cs.10.2.7.M.bin",
        "nxos.10.3.1.bin": "nxos64-cs.10.3.1.F.bin",
        "nxos.10.3.2.bin": "nxos64-cs.10.3.2.F.bin",
        "nxos.10.3.3.bin": "nxos64-cs.10.3.3.F.bin",
        "nxos.10.3.4a.bin": "nxos64-cs.10.3.4a.M.bin",
    }
  5. 运行 md5sum poap.py 以获取 md5 总和,然后将其添加回 poap.py,使 head -n 4 poap.py 如下所示:
    #!/bin/env python3
    #md5sum="396bed5a5f579b80da5fac6edf0b590c"
    import glob
    import os
网络 1.12.1

从 1.11.x 版升级到 1.12.1 版失败,原因是 pnet 控制器未能成功生成 hairpinlink 自定义资源 (CR)。

临时解决方法:

  1. 升级后,在根管理员集群中,修改 clusterroles/pnet-core-backend-controllers-role 文件。
  2. 搜索 hairpinlinks,然后向资源添加 create,update,delete 权限。
  3. 验证是否已生成 hairpinlinkshairpinbgpsessions CR。
NTP 服务器 1.12.1

NTP 中继服务器 pod 在重启后崩溃

症状

  • 运行 kubectl get pods 命令时,您可能会看到以下消息:
    ntp-system                      ntp-relay-server-75bbf                                            1/2     CrashLoopBackOff    123 (5m12s ago)   24h
  • 您可能会在日志中看到活跃度探测警告:
    Warning  BackOff    5m55s (x82 over 28m)      kubelet  Back-off restarting failed container ntp-image in pod ntp-relay-server-75bbf_ntp-system(28e4e28f-4f99-4c6e-8c26-d271f0c7995c)
    Warning  Unhealthy  <invalid> (x37 over 35m)  kubelet  Liveness probe failed: Leap status is Not synchronised

此问题可能会导致服务器时间不同步。

临时解决方法:

  1. 打开 ntp daemonset 进行修改:
    kubectl edit daemonset/ntp-relay-server -n ntp-system
  2. 移除 livenessProbe: 部分,直至 timeoutSeconds: 30 行。
  3. 在 ntp-image 容器中添加以下部分:
    securityContext:
      capabilities:
        add:
        - SYS_TIME
  4. 这会生成如下所示的配置:

    containers:
      - name: ntp-image
      image: "DOCKER_REGISTRY/DOCKER_REPOSITORY/ntp-relay-server:DOCKER_TAG"
      imagePullPolicy: Always
      securityContext:
        capabilities:
          add:
          - SYS_TIME
  5. 打开操作系统 NTP 政策进行修改:
    kubectl edit ospolicy/bm-ntp-policy -n gpc-system
  6. 移除政策部分中的所有 NTP IP 地址。之后,政策如下所示:
    policy:
      installPlaybook:
        extraVars:
          ntp_servers: {}
        name: server-ntp-config
        secrets: {}
          
NTP 服务器 1.12.1

ntp-relay-job-xxxx pod 在重启后崩溃

症状

运行 kubectl get pods 命令时,您可能会看到以下消息:

NAMESPACE                       NAME                                                              READY   STATUS              RESTARTS         AGE
ntp-system                      ntp-relay-job-1707869137-kd7p4                                    0/1     CrashLoopBackOff    3 (15s ago)      59s

此问题是由升级作业清理不当引起的。无需采取任何措施,作业可以保持在崩溃循环状态。

NTP 服务器 1.12.2

节点操作系统的时间未同步

症状

您可能会在系统集群日志中看到以下消息:

INFO: task umount:200725 blocked for more than 120 seconds.

对于未保持时间同步的服务器,这是一个问题。 配置未正确应用,必须更改为其他命名空间才能正确应用。

临时解决方法:

对所有集群执行以下步骤:

  1. 列出现有操作系统政策:
    kubectl get ospolicies -n ntp-system

    输出显示 admin-ntp-policyworker-ntp-policy

  2. 根据政策的名称,将其保存到 .yaml 文件中:
    kubectl get ospolicy/admin-ntp-policy -n ntp-system -o yaml > ntp-ospolicy.yaml
    kubectl get ospolicy/worker-ntp-policy -n ntp-system -o yaml > ntp-ospolicy.yaml
  3. 修改文件,将 metadata.namespacentp-system 更改为 gpc-system,并移除 status: line 及之后的所有内容。
  4. 将修改后的文件应用于集群:
    kubectl apply -f ntp-ospolicy.yaml
  5. 等待几分钟,让控制器应用操作系统政策。
  6. 建立与 OSPolicy 应用到的其中一个节点的 SSH 连接,然后运行 cat /etc/chrony.conf。输出显示了文件开头的一条消息,表明该文件由 Ansible 管理,并且已从配置中移除 nist.time.govntp.pool 服务器。
虚拟机备份和恢复 1.12.0

虚拟机 Webhook 设置会阻止用户启动虚拟机备份和恢复程序

症状

由于虚拟机管理器中基于角色的访问权限控制 (RBAC) 和架构设置不当,用户无法启动虚拟机备份和恢复流程。
虚拟机备份方案名称不能超过 63 个字符。 例如,您可能会看到以下错误消息:

Internal error occurred: failed calling webhook
"vvirtualmachinebackupplantemplates.virtualmachine.gdc.goog":
failed to call webhook: Post "https://vmm-vm-controller-webhooks.vm-system.svc:443/validate-virtualmachine-gdc-goog-v1-virtualmachinebackupplantemplate?timeout=10s":
context deadline exceeded

临时解决方法:

虚拟机备份方案名称是 VirtualMachineBackupPlanTemplate 名称、资源类型(vmvm-disk)以及相应资源的名称的串联。此串联字符串的长度不得超过 63 个字符。
为此,请在创建这些资源时保持其名称简短。如需详细了解如何创建这些资源,请参阅创建和启动虚拟机实例为虚拟机创建备份计划

数据库服务 1.12.0

数据库服务工作负载在系统集群内运行

症状

数据库服务工作负载在分布式云系统集群上的单独项目中进行预配和配置。虽然项目用于在 Distributed Cloud 中强制执行管理边界,但它们不会影响工作负载的执行方式和位置。因此,这些工作负载可以与其他数据库实例和各种控制平面系统共享底层计算基础设施。

临时解决方法:

对于需要额外隔离的数据库工作负载,用户可以请求在系统集群上创建节点池。此节点池必须在项目创建期间引用,以确保数据库工作负载在专用计算基础设施上预配和执行。隔离节点池的配置必须由基础设施运维人员完成。

数据库服务 1.12.2

AlloyDB Omni DBCluster 停滞在协调状态

症状

对于 AlloyDB Omni 版本 15.2.1,当在同一节点上创建多个 AlloyDB Omni 集群时,最后创建的集群会卡在协调状态。使用命令获取 postgresql 日志

kubectl --kubeconfig $ORG_SYSTEM_KUBECONFIG exec -ti $DATABASE_POD_NAME -n $SHADOW_NS -- cat /obs/diagnostic/postgresql.log 
您应该会看到数据库无法启动,并显示类似于以下内容的堆栈轨迹:

2024-08-19 21:20:15.594 UTC: [9400/walwriter] LOG:  [auxprocess.c:129]  BaseInit started for AuxProcType: walwriter
2024-08-19 21:20:15.595 UTC: [9400/walwriter] LOG:  [auxprocess.c:131]  BaseInit finished for AuxProcType: walwriter
*** SIGABRT received at time=1724102415 on cpu 25 ***
PC: @     0x7f03140a9d3c  (unknown)  (unknown)
2024-08-19 21:20:15.601 UTC: [9399/client backend] alloydbadmin@localhost(33906) [unknown] postgres 66c3b70f.24b7 57P03:FATAL:  [postmaster.c:2601]  the database system is not yet accepting connections
2024-08-19 21:20:15.601 UTC: [9399/client backend] alloydbadmin@localhost(33906) [unknown] postgres 66c3b70f.24b7 57P03:DETAIL:  Consistent recovery state has not been yet reached.
    @     0x5557f3b17e31        208  absl::AbslFailureSignalHandler()
    @     0x7f031405afd0    4677136  (unknown)
    @     0x7f0314e75b20  (unknown)  (unknown)
[PID: 9400] : *** SIGABRT received at time=1724102415 on cpu 25 ***
[PID: 9400] : PC: @     0x7f03140a9d3c  (unknown)  (unknown)
[PID: 9400] :     @     0x5557f3b17f75        208  absl::AbslFailureSignalHandler()
[PID: 9400] :     @     0x7f031405afd0    4677136  (unknown)
[PID: 9400] :     @     0x7f0314e75b20  (unknown)  (unknown)

临时解决方法:

1. 通过 shell 进入数据库 pod

kubectl --kubeconfig $ORG_SYSTEM_KUBECONFIG exec -ti $DATABASE_POD_NAME -n $SHADOW_NS -- bash 
2. 在 /mnt/disks/pgsql/data/postgresql.conf.d/ 下手动创建配置文件
echo "enable_lux_wal_writer = off" > /mnt/disks/pgsql/data/postgresql.conf.d/55user.conf
3. 重启数据库以加载配置文件
supervisorctl restart postgres
4. 数据库成功启动,输出内容类似如下:
Chose default config file: /etc/supervisor/supervisord.conf
postgres: ERROR (not running)
postgres: started

防火墙 1.12.0

防火墙启动 secret.yaml 包含 TO-BE-FILLED

症状

在客户部署期间,secret.yaml 文件管理员用户名必须为 admin。相反,该文件在首次创建后包含 TO-BE-FILLED。必须使用 admin 用户名在防火墙上初始化第一个配置,并通过环回 IP admin\admin

临时解决方法:

检查以下防火墙凭据中是否不存在 TO-BE-FILLED

  • CELL_ID/CELL_ID-secret.yaml
  • CELL_ID-ab-rack/CELL_ID-secret.yaml
  • CELL_ID-ac-rack/CELL_ID-secret.yaml
  • 验证所有防火墙管理员账号的用户名是否均为 admin

    防火墙 1.12.2

    bm-system-machine-init 在第一个节点上失败

    症状

    默认 IDPS 防火墙政策不支持直连 (DX) 互连的组织自定义 IP。因此,使用自定义 IP 创建组织会失败,因为自定义 IP 无法连接到根管理员中的 Harbor。

    临时解决方法:

    如需解除流量屏蔽,请手动为组织自定义 IP 创建 SecurityPolicyRule,并将其部署到 IDPS 防火墙。按照 runbook FW-G0002 中的步骤完成以下步骤:

    1. 在根防火墙虚拟系统中创建入站 SecurityPolicyRule,以允许组织自定义 IP 访问根 Harbor

        apiVersion: firewall.private.gdc.goog/v1alpha2
        kind: SecurityPolicyRule
        metadata:
          labels:
            firewall.private.gdc.goog/policy-type: idps
          name: root-default-ingress-ORG_NAME-custom
          namespace: root
        spec:
          action: allow
          destination:
            addresses:
            - root-external-group
            zones:
            - vsys1-gpc
          firewallVirtualSystemRef:
            name: vsys1-root
          priority: 150
          profile:
            group: gdch-threat-profile-group
            type: group
          service:
            option: selected
            ports:
            - ports: "123"
              protocol: UDP
            - ports: "1122"
              protocol: TCP
            - ports: "5140"
              protocol: TCP
            - ports: "10443"
              protocol: TCP
          source:
            addresses:
            - org.customIPConfig.externalCIDRs # example: 30.0.0.0/22
            zones:
            - vsys1-cp
        

    2. 在组织防火墙 vsys 中创建入站 SecurityPolicyRule,以允许 root 访问组织 APIServer。

        apiVersion: firewall.private.gdc.goog/v1alpha2
        kind: SecurityPolicyRule
        metadata:
          labels:
            firewall.private.gdc.goog/policy-type: idps
          name: ORG_NAME-custom-default-ingress-root
          namespace: ORG_NAME # example: gpu-org-1
        spec:
          action: allow
          destination:
            addresses:
            - org.customIPConfig.externalCIDRs # example: 30.0.0.0/22
            zones:
            - ORG_VSYS_ID-gpc # example: vsys3-gpc
          firewallVirtualSystemRef:
             name: ORG_VSYS_ID-ORG_NAME # example: vsys3-gpu-org-1
          priority: 110
          profile:
            group: gdch-threat-profile-group
            type: group
          service:
            option: selected
            ports:
            - ports: "22"
              protocol: TCP
            - ports: "5140"
              protocol: TCP
            - ports: "6443"
              protocol: TCP
            - ports: "10443"
              protocol: TCP
          source:
            addresses:
            - root-external-group
            zones:
            - ORG_VSYS_ID-cp # example: vsys3-cp
        

    3. 触发防火墙配置替换以部署 SecurityPolicyRules

    硬件安全模块 1.12.0
    1.12.1
    1.12.2
    1.12.4

    仍可检测到已停用的 HSM 试用许可

    症状

    由于 CipherTrust Manager 中存在已知问题,已停用的试用许可仍可被检测到,并可能会触发错误的过期警告。

    临时解决方法:

    请参阅 HSM-R0003,验证有效正常许可并删除已停用的试用许可。

    硬件安全模块 1.12.0

    删除 KMS 时,硬件安全模块的运行方式出乎意料

    症状

    删除 KMS CTMKey 时,硬件安全模块 (HSM) 的行为异常。例如,KMS 服务可能无法为组织启动。

    临时解决方法:

    用户可以通过删除 KMS 密钥(而不是 KMS 根密钥)来加密粉碎数据,这会显示为 CTMKey

    硬件安全模块 1.12.0
    1.12.1
    1.12.2

    硬件安全模块的可轮换密钥处于未知状态

    症状

    获取未知可轮替密文的列表:

    kubectl get rotatablesecret -A | grep -i unknown

    输出可能如下所示:

    gpc-system     yz-aa-hsm01-kmip-certificate                HSM-0016                                Unknown
    gpc-system     yz-aa-hsm01-nae-certificate                 HSM-0016       3d19h      <invalid>    Unknown
    gpc-system     yz-aa-hsm01-web-certificate                 HSM-0016       2d         <invalid>   Unknown

    要求

    1. 对根管理员集群的访问权限
    2. jq 工具
    3. 按照 IAM-R0004 为根管理员集群生成 KUBECONFIG。
    4. 按照 IAM-R0005 中的说明在根管理员集群中获取 clusterrole/hsm-admin

    临时解决方法:

    1. 获取 HSM 的数据网络 IP 地址列表:
      kubectl --kubeconfig ${KUBECONFIG:?} get hsm -A -o json | jq -r '.items[] | "\(.spec.dataNetwork.ip)"'

      输出可能如下所示:

      10.89.3.2
      10.89.3.3
      10.89.3.4
    2. 对于上一步中的每个 HSM 数据网络 IP 地址:
      1. 将 IP 地址导出到名为 HSM_DATA_IP 的变量:
        export HSM_DATA_IP=HSM_DATA_IP_ADDRESS
      2. 提取 Web(端口 443)、nae(端口 9000)和 kmip(端口 5696)服务器证书,并检查证书的有效性:
        openssl s_client -showcerts -connect $HSM_DATA_IP:443 2>/dev/null | openssl x509 -text
        openssl s_client -showcerts -connect $HSM_DATA_IP:9000 2>/dev/null | openssl x509 -text
        openssl s_client -showcerts -connect $HSM_DATA_IP:5696 2>/dev/null | openssl x509 -text

        输出可能如下所示:

        Validity
                    Not Before: Mar 12 20:36:58 2024 GMT
                    Not After : Jun 16 20:36:58 2026 GMT
    3. 如果 Not After 日期在今天起 30 天内,请按照 HSM T0016 运行手册中的步骤续订服务器证书。
    监控 1.12.0

    创建组织时,Node Exporter 证书可能无法就绪

    症状

    创建组织时,证书无法变为就绪状态:

    $ kubectl --kubeconfig /root/release/user/org-1-system-user-kubeconfig get certificate -n mon-system
    NAME                                  READY   SECRET                                     AGE
    mon-node-exporter-backend-consumers   False   mon-node-exporter-backend-consumers-cert   20h
    mon-node-exporter-backend-providers   False   mon-node-exporter-backend-providers-cert   20h

    由于存在 `SecretForwarder`,Secret 仍然存在:

    $ kubectl --kubeconfig /root/release/user/org-1-system-user-kubeconfig get secret -n mon-system | grep -E "node-exporter.+cert"
    mon-node-exporter-backend-consumers-cert                                            kubernetes.io/tls                          3      20h
    mon-node-exporter-backend-providers-cert                                            kubernetes.io/tls                          3      20h

    临时解决方法:

    暂停生命周期管理器,使其不再重新创建证书和删除证书:

    kubectl --kubeconfig /root/release/org-admin/org-1-admin-kubeconfig annotate subcomponent mon-node-exporter -n org-1-system-cluster lcm.private.gdc.goog/paused="true"
    kubectl --kubeconfig /root/release/org-admin/org-1-admin-kubeconfig annotate subcomponent mon-node-exporter -n user-vm-1-cluster lcm.private.gdc.goog/paused="true"
    kubectl --kubeconfig /root/release/org-admin/org-1-admin-kubeconfig annotate subcomponent mon-node-exporter -n user-vm-2-cluster lcm.private.gdc.goog/paused="true"
    kubectl --kubeconfig /root/release/user/org-1-system-user-kubeconfig delete certificate -n mon-system mon-node-exporter-backend-consumers mon-node-exporter-backend-providers

    请注意,node-exporter 不会在用户集群上进行协调。

    监控 1.12.0
    1.12.1
    1.12.2

    配置 ServiceNow 网络钩子会导致 LCM 重新协调并还原对 mon-system 命名空间中的 ConfigMapSecret 对象所做的更改。

    症状

    配置 ServiceNow webhook 会导致生命周期管理 (LCM) 重新协调并还原对 mon-system 命名空间中的 ConfigMap 对象 mon-alertmanager-servicenow-webhook-backendSecret 对象 mon-alertmanager-servicenow-webhook-backend 所做的更改。

    临时解决方法:

    暂停 LCM 子组件,以便在不被还原的情况下进行更改:

    1. 获取根管理员集群和组织管理员集群的 kubeconfig 文件的路径。将路径分别保存在 ROOT_ADMIN_KUBECONFIGORG_ADMIN_KUBECONFIG 环境变量中。
    2. 暂停以下任一集群中的 LCM 子组件:
      • 暂停根管理员集群中的 LCM 子组件:
        kubectl --kubeconfig $ROOT_ADMIN_KUBECONFIG annotate subcomponent mon-alertmanager-servicenow-webhook -n root lcm.private.gdc.goog/paused="true"
      • 暂停组织管理员集群中的 LCM 子组件:
        kubectl --kubeconfig $ORG_ADMIN_KUBECONFIG annotate subcomponent mon-alertmanager-servicenow-webhook -n org-1-system-cluster lcm.private.gdc.goog/paused="true"
    监控 1.12.0

    系统不会收集用户集群的指标。

    症状

    未收集用户集群中的某些指标。此问题会影响用户虚拟机集群,但不会影响系统集群。

    • 您可以从 Prometheus 服务器中看到以下日志:
      prometheus-server ts=2024-02-21T16:07:42.300Z caller=dedupe.go:112 component=remote level=warn remote_name=cortex-remote-write url=http://cortex-tenant.mon-system.svc:9009/push msg="Failed to send batch, retrying" err="server returned HTTP status 500 Internal Server Error: 2 errors occurred:"
    • 您可以从 Cortex 租户中看到以下日志:
      cortex-tenant time="2024-02-23T18:03:44Z" level=error msg="proc: src=127.0.0.6:55021 lookup cortex.mon-system.svc on 172.25.38.10:53: no such host"

    临时解决方法:

    请按以下步骤解决此问题:

    1. 获取集群的 kubeconfig 文件的路径。将路径保存在 KUBECONFIG 环境变量中。
    2. 在用户虚拟机集群中部署桩服务:
            kubectl --kubeconfig $KUBECONFIG apply -f - &lt&ltEOF
            apiVersion: v1
            kind: Service
            metadata:
              labels:
                app: cortex
              name: cortex
            spec:
              ports:
              - protocol: TCP
                targetPort: 9009
                port: 9009
                name: cortex
              type: ClusterIP
              sessionAffinity: ClientIP
            EOF
            
    3. 重启 Cortex 租户部署:
      kubectl --kubeconfig $KUBECONFIG rollout restart deploy -n mon-system cortex-tenant
    监控 1.12.0

    主 Prometheus 跨集群边界将指标发送到 Cortex 租户

    症状

    面向基础设施运维人员 Grafana 实例的指标可能出现在平台管理员的 Grafana 实例中,反之亦然。此问题是由 ASM 跨集群边界(具有不同的默认租户)对请求进行负载均衡所致。

    临时解决方法:

    此问题需要访问 private-cloud 来源,并能够推出组件更新。您必须更改网格配置,以限制 cortex-tenant 服务仅接收来自本地集群的流量,并推出 ASM 组件。

    1. 打开 manifests/plain/asm/1.19/asm-primary-cluster-operator.yaml 文件。
    2. 介绍 meshConfig 字段中的 serviceSettings 字段。

      meshConfig 字段最初类似于以下示例:

              ...
              profile: minimal
                revision: 1-19
                meshConfig:
                  localityLbSetting:
                      enabled: false
              ...
            

      因此,您必须更改 meshConfig 字段,使其与以下示例类似:

              profile: minimal
                revision: 1-19
                meshConfig:
                  serviceSettings:
                    - settings:
                        clusterLocal: true
                      hosts:
                      - 'cortex-tenant.mon-system.svc.cluster.local'
                  localityLbSetting:
                      enabled: false
            
    3. 将 ASM 组件部署到集群中。
    升级 1.12.0

    节点升级失败 - NodeOSInPlaceUpgradeCompleted

    症状

    从 1.11.0 升级到 1.11.3 时,节点升级失败,错误为 NodeOSInPlaceUpgradeCompleted

    ka logs -n gpc-system os-policy-preflight-os-upgrade-bm-86efcc8en8sh2-6h5cn | grep GDCH-OS-ANSIBLE-CHECK -A 50
    [GDCH-OS-ANSIBLE-CHECK]
    {
      "syntax": {
        "success": true,
        "msg": ""
      },
      "apply": {
        "reachablity": {
          "success": true,
          "msg": ""
        },
        "execution": {
          "success": false,
          "msg": "errors found when simluating play execution on host: 10.3.20.9",
          "tasks": [
            {
              "task": "os/upgrade : Copy GRUB file to BOOT location",
              "error": "Source /boot/efi/EFI/ubuntu/grubx64.efi not found"
            }
          ]
        }
      },
      "diff": null
    } 

    临时解决方法:

    登录正在升级的裸机。检查 fstab 是否具有 /boot/efi 并且目录已装载:

    # cat /etc/fstab
           LABEL=cloudimg-rootfs   /        ext4   defaults        0 1
           LABEL=UEFI      /boot/efi       vfat    umask=0077      0 1
    lsblk
    NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda       8:0    0  3.5T  0 disk
    ├─sda1    8:1    0  3.5T  0 part /
    ├─sda2    8:2    0 64.3M  0 part
    ├─sda14   8:14   0    4M  0 part
    └─sda15   8:15   0  106M  0 part 

    暂停 nodeupgradetask

    1. 运行 mount -a 并检查目录是否已挂载:
      # mount -a
      root@mb-aa-bm04:~# ls /boot/efi/
      EFI
    2. 请在此处继续检查。运行以下命令:
      C
      # Ensure all three cmds prints `Files are identical`
      if [ "$(sha256sum /boot/efi/EFI/ubuntu/shimx64.efi | awk '{ print $1 }')" == "$(sha256sum /boot/efi/EFI/BOOT/BOOTX64.EFI | awk '{ print $1 }')" ]; then echo "Files are identical."; else  echo "Files are different."; fi
      
      if [ "$(sha256sum /boot/efi/EFI/ubuntu/grubx64.efi | awk '{ print $1 }')" == "$(sha256sum /boot/efi/EFI/BOOT/grubx64.efi| awk '{ print $1 }')" ]; then echo "Files are identical."; else  echo "Files are different."; fi
      
      if [ "$(sha256sum /boot/efi/EFI/ubuntu/grub.cfg | awk '{ print $1 }')" == "$(sha256sum /boot/efi/EFI/ubuntu/grub.cfg | awk '{ print $1 }')" ]; then echo "Files are identical."; else  echo "Files are different."; fi
    3. 如果并非所有文件都相同,请在相应机器上运行此命令,然后重复检查。
      /usr/local/update-efi-files.sh
    4. 取消暂停 nodeupgradetask
    升级 1.12.0

    切换升级失败,无法运行命令 install add bootflash://..

    症状

    交换机升级无法添加 bootflash:

    Conditions:
      Last Transition Time:  2024-01-10T20:06:30Z
      Message:               exception: add and activate package nxos.CSCwh72780-n9k_ALL-1.0.0-9.3.10.lib32_n9000.rpm: nx-api RPC request failed
      with status code 400 and body "{\n\t\"jsonrpc\":\t\"2.0\",\n\t\"error\":\t{\n\t\t\"code\":\t-32602,\n\t\t\"message\":\t\"Invalid params\",\n\t\
      t\"data\":\t{\n\t\t\t\"msg\":\t\"Adding the patch (/nxos.CSCwh72780-n9k_ALL-1.0.0-9.3.10.lib32_n9000.rpm)\\n\\n[###                 ]  10%\\n[#│ #                 []  10%\\n[#####               ]  20%\\n[#######             ]  30%\\n[#########           ]  40%\\n[#########           ]  4
      0%\\n[####################] 100%\\n[####################] 100%\\nInstall operation 21 failed because this patch already exists. at Wed Jan 10 2
      1:00:06 2024\\n\\n\"\n\t\t}\n\t},\n\t\"id\":\t1\n}" for requests "install add bootflash:///nxos.CSCwh72780-n9k_ALL-1.0.0-9.3.10.lib32_n9000.rpm
      activate forced"   

    临时解决方法:

    登录出现故障的交换机,然后从交换机上运行软件包中的安装激活命令:

    install activate nxos.CSCwh72780-n9k_ALL-1.0.0-9.3.10.lib32_n9000.rpm
    升级 1.12.1、1.12.2、1.12.4

    从 1.11.x 升级到 1.12.1 时,节点升级卡在 MaintenanceModeHealthCheckReady undrain 错误

    症状

    集群升级挂起超过一小时。裸机维护模式状态和规范不匹配。例如,命令:

    kubectl get baremetalmachines -A  -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,MaintenanceMode:.spec.maintenanceMode,Status:.status.underMaintenance

    节目:

    root        10.252.135.4   false             true

    裸机预检检查作业显示以下错误消息:

    The error was: 'dict object' has no attribute 'stdout'\n\nThe error appears to be in '/playbook/roles/machine_check_common/tasks/main.yaml': line 215, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Check if bypass the time check in node agent mode\n  ^ here\n"}

    临时解决方法:

    使用以下命令:

    export KUBECONFIG=${ROOT_OR_ORG_ADMIN_KUBECONFIG}
       kubectl get cluster -A
    kubectl annotate cluster ${CLUSTER_NAME} -n=${CLUSTER_NAMESPACE} "baremetal.cluster.gke.io/bypass-check=ntp"
    节点操作系统 1.11.3

    在手动解决 os-policy pod 问题后,虚拟机节点在重新启动时卡住

    症状

    在针对 os-policy pod 采取手动解决方法后,虚拟机重启任务失败。系统会显示以下消息:

    ko logs os-policy-preflight-os-reboot-vm-b1fb94147x8r9-nqmvp -n gpc-system
    
    playbook: server-reboot.yaml
    {
        "custom_stats": {},
        "global_custom_stats": {},
        "plays": [
            {
                "play": {
                    "duration": {
                        "end": "2024-01-12T03:50:52.749714Z",
                        "start": "2024-01-12T03:50:42.694226Z"
                    },
                    "id": "5251f140-5a01-5cce-6150-000000000006",
                    "name": "Run OS Upgrade Tasks"
                },
                "tasks": [
                    {
                        "hosts": {
                            "172.20.128.10": {
                                "action": "setup",
                                "changed": false,
                                "msg": "Failed to connect to the host via ssh: ssh: connect to host 172.20.128.10 port 22: Connection timed out",
                                "unreachable": true
                            }
                        },
                        "task": {
                            "duration": {
                                "end": "2024-01-12T03:50:52.749714Z",
                                "start": "2024-01-12T03:50:42.704562Z"
                            },
                            "id": "5251f140-5a01-5cce-6150-00000000000b",
                            "name": "os/reboot : Gather OS distribution information"
                        }
                    }
                ]
            }
        ],
        "stats": {
            "172.20.128.10": {
                "changed": 0,
                "failures": 0,
                "ignored": 0,
                "ok": 0,
                "rescued": 0,
                "skipped": 0,
                "unreachable": 1
            }
        }
    }
    [GDCH-OS-ANSIBLE-CHECK]
    {
      "syntax": {
        "success": true,
        "msg": ""
      },
      "apply": {
        "reachablity": {
          "success": false,
          "msg": "Failed to connect to the host via ssh: ssh: connect to host 172.20.128.10 port 22: Connection timed out"
        },
        "execution": {
          "success": false,
          "msg": "",
          "tasks": null
        }
      },
      "diff": null
    }
    [GDCH-OS-ANSIBLE-CHECK]
    Error: reachability err: Failed to connect to the host via ssh: ssh: connect to host 172.20.128.10 port 22: Connection timed out

    临时解决方法:

    停止并启动虚拟机可解决此问题。按照启动和停止虚拟机中的说明操作。

    上层网络 1.12.0

    用户虚拟机集群卡在 ContainerCreating 状态,并显示 FailedCreatePodSandBox 警告

    症状

    用户虚拟机集群卡住,描述处于 ContainerCreating 状态的 pod 会显示以下警告:

    # kubectl --kubeconfig path/to/usercluster_kubeconfig describe pods/bm-system-machine-preflight-check-172.204c807f67d2cab60d5d8q58q -n user-vm-1-cluster
    Events:
      Type     Reason                  Age                  From     Message
      ----     ------                  ----                 ----     -------
      Warning  FailedCreatePodSandBox  108s (x62 over 79m)  kubelet  (combined from similar events): Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "ec4d2021ae9d76adf49a6d3c88d678b3b5d9
    50990daa6ffee3fcfeed8291dfa8": plugin type="cilium-cni" name="cilium" failed (add): Unable to create endpoint: [PUT /endpoint/{id}][429] putEndpointIdTooManyRequests 

    临时解决方法:

    按照 NET-P0001 运行手册中的步骤在系统集群上重启 anetd

    系统制品注册表 1.12.1

    升级 ABM 后,Harbor 出现崩溃循环

    症状

    将根组织从 1.11.1 升级到 1.12.1 时,升级可能会在插件阶段失败,并显示 Helm pull 错误:

    harbor-system                   harbor-harbor-harbor-core-657d86bcf8-zl8d2                        1/1     Running             0                 14h
    harbor-system                   harbor-harbor-harbor-core-7d66b4c7c-7g6t4                         0/1     CrashLoopBackOff    155 (76s ago)     12h

    临时解决方法:

    提交支持请求。如需了解详情,请参阅请求支持

    升级 1.12.0

    系统集群中的多个 pod 可能会卡在 TaintToleration 状态

    症状

    在升级期间,OPA Gatekeeper 子组件不会安装在系统集群中。不过,系统会安装约束条件和用于强制执行这些约束条件的 webhook。

    系统集群中的多个 pod 可能会卡在 TaintToleration 状态:

    mon-system                              mon-cortex-pre-upgrade-job-mn29x                              0/1     TaintToleration     0                96m    <none>          zb-aa-bm07    <none>           <none>
    mon-system                              mon-kube-state-metrics-backend-d49b868dc-fmp62                0/2     TaintToleration     0                97m    <none>          zb-aa-bm07    <none>           <none>
    mon-system                              primary-prometheus-shard1-replica0-0                          0/3     TaintToleration     0                103m   <none>          zb-aa-bm07    <none>           <none>
    netapp-trident                          netapp-trident-controller-7ffb4c5f89-rvwjj                    0/5     TaintToleration     0                103m   <none>          zb-aa-bm07    <none>           <none>
    obs-system                              alertmanager-0                                                0/2     TaintToleration     0                98m    <none>          zb-aa-bm07    <none>           <none>
    obs-system                              audit-logs-loki-io-0                                          0/3     TaintToleration     0                97m    <none>          zb-aa-bm07    <none>           <none>
    obs-system                              log-audit-backend-failure-detector-6lgsq                      0/1     TaintToleration     0                105m   <none>          zb-aa-bm07    <none>           <none>
    obs-system                              meta-alertmanager-0                                           0/1     TaintToleration     0                102m   <none>          zb-aa-bm07    <none>           <none>
    obs-system                              meta-alertmanager-servicenow-webhook-5679f48895-ggkg6         0/2     TaintToleration     0                102m   <none>          zb-aa-bm07    <none>           <none>
    platform-obs-obs-system                 grafana-proxy-server-7b6b79f787-2x92t                         0/2     TaintToleration     0                103m   <none>          zb-aa-bm07    <none>           <none>
    vm-system                               gdch-rocky-yum-repo-distributor-zfwp6                         0/1     TaintToleration     0                97m    <none>          zb-aa-bm07    <none>           <none>
    vm-system                               gdch-rocky-yum-repo-server-568768c97b-c9hm2                   0/2     TaintToleration     0                97m    <none>          zb-aa-bm07    <none>           <none>
    Istio 1.12.1

    处于 ImagePullBackOff 状态且具有 Back-off pulling image "auto" 事件的 Pod

    症状

    容器名称为 istio-proxy 的 pod 尚未就绪,状态为 ImagePullBackOff,事件为 Back-off pulling image "auto"

    临时解决方法:

    1. 验证集群中是否存在 istio-revision-tag-default 更改网络钩子。如果未恢复,请等待大约 10 分钟,看看系统是否会自动恢复。如果未解决,请上报问题。
    2. 如果存在变更网络钩子,请删除有问题的 pod 并验证它是否恢复正常。.spec.containers[].image 不得为 auto,必须看起来像实际图片,类似于以下内容:gcr.io/gke-release/asm/proxyv2:<image version>
    日志记录 1.12.1

    由日志组件部署的 ValidatingWebhookConfigurationsMutatingWebhookConfigurationsMonitoringRules 可能无法升级

    症状

    从 1.11.1 升级到 1.12.1 时,由日志组件部署的 ValidatingWebhookConfigurationsMutatingWebhookConfigurationsMonitoringRules 可能无法升级。

    临时解决方法:

    1. 确保您拥有 kubectl,并且可以访问 IAM-R0004 运行手册以获取根管理员集群的 KUBECONFIG

    2. 从根管理员集群中删除 ValidatingWebhookConfiguration root-admin-private-logging-validation-webhook

      kubectl delete validatingwebhookconfiguration root-admin-private-logging-validation-webhook
    3. 从根管理员集群中删除 MutatingWebhookConfiguration root-admin-private-logging-defaulter-webhook

      kubectl delete mutatingwebhookconfiguration root-admin-private-logging-defaulter-webhook
    4. 从根管理员集群中删除 ValidatingWebhookConfiguration root-admin-logging-webhook

      kubectl delete validatingwebhookconfiguration root-admin-logging-webhook
    5. 从根管理员集群的 infra-obs 命名空间中删除 MonitoringRule operational-logs-alerts

      kubectl delete monitoringrule operational-logs-alerts -n infra-obs
    6. 从根管理员集群的 infra-obs namespace 中删除 MonitoringRules audit-logs-alertsaudit-logs-sli-syslog-proberaudit-logs-sli-filelog-proberaudit-logs-sli-fluentbit-to-lokiaudit-logs-sli-fluentbit-to-splunkaudit-logs-sli-fluentbit-backlogaudit-logs-sli-loki-ingester-failed-rateaudit-logs-sli-loki-io-upaudit-logs-sli-loki-pa-up

      kubectl delete monitoringrule audit-logs-alerts audit-logs-sli-syslog-prober audit-logs-sli-filelog-prober audit-logs-sli-fluentbit-to-loki audit-logs-sli-fluentbit-to-splunk audit-logs-sli-fluentbit-backlog audit-logs-sli-loki-ingester-failed-rate audit-logs-sli-loki-io-up audit-logs-sli-loki-pa-up -n infra-obs
    7. 确认根管理员集群中的子组件 log-admin 已准备就绪:

      export RECONCILING="`kubectl get subcomponent log-audit -n root -o json | jq '.status.conditions | .[] | select(.type == "Reconciling") | .status'`" ; if [[ $RECONCILING =~ "False" ]]; then echo "log-audit is ready"; else echo "log-audit is not ready"; fi

      如果成功,该命令会输出 log-audit is ready。否则,输出为 log-audit is not ready

    8. 确认根管理员集群中的子组件 log-admin 已准备就绪:

      export RECONCILING="`kubectl get subcomponent log-operational -n root -o json | jq '.status.conditions | .[] | select(.type == "Reconciling") | .status'`" ; if [[ $RECONCILING =~ "False" ]]; then echo "log-operational is ready"; else echo "log-operational is not ready"; fi

      如果成功,该命令会输出 log-operational is ready。否则,输出为 log-operational is not ready

    日志记录 1.12.1

    不收集审核日志和操作日志

    由于 log-infra-backend-preinstall 作业存在问题,因此审核日志和操作日志 Loki 未安装,并且未收集日志。

    症状

    您可能会在系统集群中看到 CrashLoopBackoff:

    obs-system                      anthos-log-forwarder-5ghbm                                        2/3     CrashLoopBackOff              135 (3m52s ago)   15h
    日志记录 1.12.1

    cortex-ingester pod 显示 OOMKilled 状态

    症状

    您可能会看到 mon-system 命名空间中 pod 的状态为 OOMKilled

    NAMESPACE          NAME                           READY   STATUS      RESTARTS         AGE
    mon-system         cortex-ingester-0              1/2     OOMKilled   6 (3h5m ago)     11h
          

    临时解决方法:

    增加每个提取器的内存、增加提取器的数量,或同时增加这两者。您可以通过在组织管理员集群上部署 SubcomponentOverride 来实现此目的,如以下示例所示:

    apiVersion: lcm.private.gdc.goog/v1
    kind: SubcomponentOverride
    metadata:
      name: mon-cortex-ingester-override
      namespace: org-1-system-cluster
    spec:
      backend:
        operableParameters:
          ingester:
            resourcesLimit:
              memory: "6Gi" # 6Gi is the default, increase to add more memory to each ingester
            replicas: 4     # 4 is the default, increase to create more ingester instances.
      subComponentRef: mon-cortex
          
    升级 1.12.1

    从 1.11.x 升级到 1.12.1 时,集群节点可能因 registy_mirror 的健康检查失败而无法退出维护模式

    症状

    从 1.11.x 升级到 1.12.1 时,节点升级失败,并显示以下错误消息:

    {
        "lastTransitionTime": "2024-02-13T22:53:36Z",
        "message": "following checks failed, ['check_registry_mirror_reachability_pass']",
        "observedGeneration": 3,
        "reason": "JobStatus",
        "status": "False", <----
        "type": "MaintenanceModeHealthCheckReady"
      },
      

    临时解决方法:

    使用以下命令:

    kubectl --kubeconfig=${ROOT_OR_ORG_ADMIN_KUBECONFIG} annotate cluster ${CLUSTER_NAME} -n=${CLUSTER_NAMESPACE}  "baremetal.cluster.gke.io/maintenance-mode-ignore-healthcheck=true"
    升级 1.12.1、1.12.2、1.12.4

    OrganizationUpgrade 在 anthosBareMetaladdOnnode 阶段卡住,并出现 check_registry_mirror_reachability_pass 检查失败。

    症状

    1. 组织升级卡在 anthosBareMetaladdOnnode 阶段,针对 Succeeded 条件显示 Unknown 状态。

    kubectl --kubeconfig=${ROOT_ADMIN_KUBECONFIG} get organizationupgrade -n gpc-system ${ORG_NAME} -o yaml
        addOn: {}
        anthosBareMetal:
          conditions:
          - lastTransitionTime: "2024-09-12T12:10:55Z"
            message: 'UPG1300: ABM upgrade expected to finish within 2h0m0s but hasn''t
              after 39h18m50.606521473s, last message was: Cluster upgrade for root-admin
              cluster: in-progress'
            observedGeneration: 1
            reason: ABMUpgradeTimeout
            status: Unknown
            type: Succeeded
          startTime: "2024-09-12T12:10:55Z"
        node:{}
      
    2. 裸机状态显示 check_registry_mirror_reachability_pass 检查失败。
    kubectl --kubeconfig=${ROOT_ADMIN_OR_ORG_ADMIN_KUBECONFIG} get baremetalmachines -A -o json | jq '.items[] | select(.status.underMaintenace != .spec.maintenanceMode) | .metadata.name as $name | .status.underMaintenace as $statm | .spec.maintenanceMode as $specm | .status.conditions[] | select(.status == "False") | select(.type == "MaintenaceModeHealthCheckReady")'
        {
          "lastTransitionTime": "2024-02-13T19:17:27Z",
          "message": "following checks failed, ['check_registry_mirror_reachability_pass']",
          "observedGeneration": 3,
          "reason": "JobStatus",
          "status": "False",
          "type": "MaintenaceModeHealthCheckReady" 
        },

    临时解决方法:

    使用以下命令:

    export KUBECONFIG=${ROOT_OR_ORG_ADMIN_KUBECONFIG}
    kubectl get cluster -A
    kubectl annotate cluster ${CLUSTER_NAME} -n=${CLUSTER_NAMESPACE}  "baremetal.cluster.gke.io/maintenance-mode-ignore-healthcheck=true"
    升级 1.12.1、1.12.2、1.12.4

    OrganizationUpgrade 在 anthosBareMetaladdOnnode 阶段卡住,健康检查错误显示 netutil.

    症状

    1. 组织升级卡在 anthosBareMetaladdOnnode 阶段,针对 Succeeded 条件显示 Unknown 状态。

    kubectl --kubeconfig=${ROOT_ADMIN_KUBECONFIG} get organizationupgrade -n gpc-system ${ORG_NAME} -o yaml
        addOn: {}
        anthosBareMetal:
          conditions:
          - lastTransitionTime: "2024-09-12T12:10:55Z"
            message: 'UPG1300: ABM upgrade expected to finish within 2h0m0s but hasn''t
              after 39h18m50.606521473s, last message was: Cluster upgrade for root-admin
              cluster: in-progress'
            observedGeneration: 1
            reason: ABMUpgradeTimeout
            status: Unknown
            type: Succeeded
          startTime: "2024-09-12T12:10:55Z"
        node:{}
      
    2. 健康检查显示错误,缺少 netutil
    kubectl --kubeconfig=${ROOT_ADMIN_OR_ORG_ADMIN_KUBECONFIG} get healthchecks -n kube-system -o json | jq '.items[].status | select(.lastHealthcheck.lastStatus == "Error")'
    {
      "lastHealthcheck": {
        "error": {
          "code": "500",
          "reason":  "[Errno 2] No such file or directory: /usr/local/bin/abm-tools10.5.23.4/netutil"
        },
        "lastCompletedTime": "2024-09-14T05:11:39Z",
        "lastStatus": "Error",
        "monitoredComponentVersion": "1.28.900-gke.112",
        "version": "1.28.900-gke.112"
      },
      "lastScheduledTime": "2024-09-14T05:26:00Z"
      }

    临时解决方法:

    删除与失败的健康检查对应的 Kubernetes 作业

    kubectl --kubeconfig=${ROOT_ADMIN_OR_ORG_ADMIN_KUBECONFIG} get job -A -l Command=machine-health-check --field-selector status.successful=0
    NAMESPACE   NAME                                    COMPLETIONS   DURATION   AGE
    root        bm-system-10.200.0.2-machine-28771464   0/1           67m        67m
    root        bm-system-10.200.0.2-machine-28771524   0/1           7m33s      7m33s
    kubectl --kubeconfig=${ROOT_ADMIN_OR_ORG_ADMIN_KUBECONFIG} delete job -A -l Command=machine-health-check --field-selector status.successful=0
    job.batch "bm-system-10.200.0.2-machine-28771464" deleted
    job.batch "bm-system-10.200.0.2-machine-28771524" deleted
    虚拟机管理器 1.12.1

    从 1.11.x 升级到 1.12.x 时,虚拟机可能会因 pod 过多而未就绪

    症状

    从 1.11.x 升级到 1.12.x 时,虚拟机可能会因 Pod 过多而无法就绪,从而阻止 Bare Metal 节点耗尽。

    临时解决方法:

    重启虚拟机。

    物理服务器 1.12.1

    NodeUpgrade 包含同一硬件型号的多个版本,导致无法进行固件升级验证

    症状

    从 1.11.x 升级到 1.12.1 时,NodeUpgrade 包含同一硬件型号的多个版本,从而阻止固件升级验证。

    临时解决方法:

    请按以下步骤操作,修改 NodeUpgrade CR spec

    1. 如果升级是针对 HPE Gen10 服务器 (GDC-4D),请移除 ilo6 型号固件。否则,请移除 ilo5 型号固件。
    2. 用于保留每个说明中具有最新 redfishVersion 的条目的部分。
      例如,如果存在以下两个条目,则仅保留具有 2.98 Oct 10 2023 的条目:
      - description: SystemBMC
              model: ilo5
              redfishVersion: 2.98 Oct 10 2023
            - description: SystemBMC
              model: ilo5
              redfishVersion: 2.95 Jul 19 2023
    物理服务器 1.12.1

    服务器卡在配置状态

    症状

    Ironic 在等待服务器开启时达到超时时间。状态从 cleaning 状态更改为 clean failed,再更改为 available

    2024-02-23 18:53:00.659 1 DEBUG ironic.api.method [req-3a22ed15-d5cd-4d77-bb0b-0e7a3042e793 - - - - -] Client-side error: Node facc133f-898c-46d4-974b-92e3560892d5 is locked by host 10.128.120.2, please retry after the current operation is completed. format_exception /usr/lib/python3.6/site-packages/ironic/api/method.py:124

    确定开关是否已开启:

    curl -kqs -u ${ILO_USER}:${ILO_PASS} https://${ILO_IP}/redfish/v1/Systems/1 | jq '.PowerState'

    如果开关处于开启状态,则输出将返回 "On"

    临时解决方法:

    从问题服务器中移除 image 块,并等待服务器恢复到可用状态。在这些功能可用后,重新添加 image 代码块。

    物理服务器 1.12.2

    服务器启动失败

    症状

    您可能会看到如下所示的调试消息:

    [DEBUG] GET https://172.22.240.103/redfish/v1/
                2024/03/22 21:46:46 [DEBUG] GET https://172.22.240.111/redfish/v1/Systems/1/
                panic: runtime error: invalid memory address or nil pointer dereference

    当 iLO 错误被忽略并且 HTTP 响应被读取而不是立即返回时,就会出现此问题,从而导致空指针取消引用。

    系统制品注册表 1.12.1

    从 1.11.x 升级到 1.12.1 时,Harbor 集群状态可能为 unhealthy

    症状

    从 1.11.1 升级到 1.12.1 时,Harbor 集群状态可能会变为 unhealthy,并显示以下错误:

    root@abc-bootstrapper:/home/ubuntu# ka get harborclusters -A
    NAMESPACE       NAME     PUBLIC URL                    STATUS
    harbor-system   harbor   https://10.252.119.11:10443   unhealthy

    诊断步骤

    1. 检查 harborclusters 的状态:

      root@abc-bootstrapper:/home/ubuntu# ka get harborclusters -A
      NAMESPACE       NAME     PUBLIC URL                    STATUS
      harbor-system   harbor   https://10.252.119.11:10443   unhealthy
    2. 如果状态不正常,请检查 Harbor 组件的状态:

      root@abc-bootstrapper:~# ka get pods -n harbor-system
      NAME                                               READY   STATUS    RESTARTS   AGE
      harbor-harbor-harbor-core-68d9764d8c-rgg4h         0/1     Running   0          3d2h
      harbor-harbor-harbor-exporter-54d559fdb8-nzjk7     1/1     Running   0          3d2h
      harbor-harbor-harbor-jobservice-6f5db4779-sqmlc    1/1     Running   0          3d2h
      harbor-harbor-harbor-portal-8458c847dc-z2l6n       1/1     Running   0          3d4h
      harbor-harbor-harbor-registry-7577f5d9d6-qp45c     3/3     Running   0          3d4h
      harbor-operator-harbor-operator-755b5cfc96-x2bxh   1/1     Running   0          3d4h
      harbor-operator-redisoperator-bf96ffc59-5d457      1/1     Running   0          3d4h
      harbor-operator-redisoperator-bf96ffc59-tbd8j      1/1     Running   0          3h38m
      harbor-operator-redisoperator-bf96ffc59-vlqfl      1/1     Running   0          3h38m
      pg-harbor-db-0                                     0/3     Pending   0          3h37m
      pg-harbor-db-monitor-776b946c74-c7pt9              0/1     Pending   0          3h38m
      rfr-harbor-redis-0                                 1/1     Running   0          3d4h
      rfr-harbor-redis-1                                 1/1     Running   0          3d4h
      rfr-harbor-redis-2                                 1/1     Running   0          3h37m
      rfs-harbor-redis-64d9d8df4f-fds79                  1/1     Running   0          3d4h
      rfs-harbor-redis-64d9d8df4f-p9l9h                  1/1     Running   0          3d3h
      rfs-harbor-redis-64d9d8df4f-x5x8c                  1/1     Running   0          3h38m
    3. 如果 harbor-corepg-harbor-db 未准备就绪,请检查 harbor-db 的状态:

      root@abc-bootstrapper:~# ka get dbclusters.postgresql.dbadmin.gdc.goog harbor-db -n harbor-system
      NAME        PRIMARYENDPOINT   PRIMARYPHASE   DBCLUSTERPHASE
      harbor-db   172.20.0.146      InProgress     DBClusterReconciling
    4. 如果 harbor-db 处于 InProgress 模式,请检查是否有任何 root-admin-control-plane 节点处于 UNDERMAINTENANCE 模式。

      root@abc-bootstrapper:~# ka get nodepool -A
      NAMESPACE   NAME                            READY   RECONCILING   STALLED   UNDERMAINTENANCE   UNKNOWN
      org-1       admin-control-plane-node-pool   0       0             0         0                  0
      root        root-admin-control-plane        3       0             0         1                  0

      节点在升级期间应处于维护模式。如果一个节点正在维护,您可能没有足够的资源来安排 harbor-db

    临时解决方法:

    如需解决此问题,请按以下步骤操作:

    1. 设置 KUBECONFIG

      export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
    2. 缩减 dbs 控制器:

      kubectl scale --replicas=0 deployment -n dbs-fleet-system fleet-controller-manager
      kubectl scale --replicas=0 deployment -n dbs-postgres-system pg-controller-manager
    3. 在 pod 模板中将优先级类名称设置为 system-cluster-criticalsystem-node-critical

      kubectl patch statefulset pg-harbor-db -n harbor-system --type='json' \
        -p='[{"op": "add", "path": "/spec/template/spec/priorityClassName", "value": "system-cluster-critical"}]'
    4. 重启 pg-harbor-db pod:

      kubectl delete pods -n harbor-system pg-harbor-db-0
    5. 验证 harborcluster 运行状况良好后,重新扩大 dbs 控制器的规模:

            kubectl scale --replicas=1 deployment -n dbs-fleet-system fleet-controller-manager
            kubectl scale --replicas=1 deployment -n dbs-postgres-system pg-controller-manager
    系统制品注册表 1.12.2

    作业服务 pod 未就绪

    症状

    作业服务 pod 难以准备就绪:

    Events:
      Type     Reason     Age                       From     Message
      ----     ------     ----                      ----     -------
      Warning  Unhealthy  35m (x8153 over 3d16h)    kubelet  Readiness probe failed: Get "https://172.16.1.142:8443/api/v1/stats": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
      Warning  Unhealthy  10m (x60 over 13h)        kubelet  Readiness probe failed: Get "https://172.16.1.142:8443/api/v1/stats": context deadline exceeded
      Normal   Pulled     5m47s (x1733 over 3d16h)  kubelet  Container image "gcr.io/private-cloud-staging/goharbor/harbor-jobservice:v2.8.4-gke.7" already present on machine
      Warning  BackOff    43s (x21352 over 3d16h)   kubelet  Back-off restarting failed container jobservice in pod harbor-harbor-harbor-jobservice-6f59fbf974-q9h9g_harbor-system(51ab9697-98b9-4315-9ab9-f67b19a28d0a)

    临时解决方法:

    1. 重启作业服务 pod。
      kubectl delete pod POD_NAME -n NAMESPACE

      输出类似于以下内容:

      Events:
        Type    Reason     Age    From               Message
        ----    ------     ----   ----               -------
        Normal  Scheduled  2m20s  default-scheduler  Successfully assigned harbor-system/harbor-harbor-harbor-jobservice-6f59fbf974-p872s to zx-ab-bm02
        Normal  Pulling    2m15s  kubelet            Pulling image "gcr.io/private-cloud-staging/goharbor/harbor-jobservice:v2.8.4-gke.7"
        Normal  Pulled     2m12s  kubelet            Successfully pulled image "gcr.io/private-cloud-staging/goharbor/harbor-jobservice:v2.8.4-gke.7" in 3.25s (3.25s including waiting)
        Normal  Created    2m12s  kubelet            Created container jobservice
        Normal  Started    2m12s  kubelet            Started container jobservice
    2. 在引导加载程序上,获取组织状态:
      kubectl get org -A

      输出可能如下所示:

      NAMESPACE    NAME    CURRENT VERSION   DESIRED VERSION   READY
      gpc-system   org-1   1.12.1-gdch.402   1.12.1-gdch.402   True
      gpc-system   org-2   1.12.1-gdch.402   1.12.1-gdch.402   True
      gpc-system   root    1.12.1-gdch.402   1.12.1-gdch.402   True
    监控 1.12.1

    从 1.11.x 升级到 1.12.1 时,Cortex 存储桶删除可能会失败

    症状

    从 1.11.1 升级到 1.12.1 时,Cortex 存储桶删除可能会失败,并显示以下错误:

            upgrade_post_root_org_validation.go:74: unable to create cortex client to check metrics creating Cortex client failed: can't make a metrics API because of an error getting the Cortex pod: unable to find any matching cortex pods using list options / label selector: {TypeMeta:{Kind: APIVersion:} LabelSelector:app=cortex FieldSelector: Watch:false AllowWatchBookmarks:false ResourceVersion: ResourceVersionMatch: TimeoutSeconds: Limit:0 Continue: SendInitialEvents:}
            upgrade_post_root_org_validation.go:117: Bucket(s) not ready: 3 errors occurred:
                    * Bucket "obs-system/cortex-metrics-alertmanager" not ready
                    * Bucket "obs-system/cortex-metrics-blocks" not ready
                    * Bucket "obs-system/cortex-metrics-ruler" not ready

    临时解决方法:

    请按以下步骤操作,强制删除 bucket

    1. 完成 MON-R0017 运维任务中的步骤,以获取对 StorageGRID 界面的访问权限。
    2. 在界面中前往 bucket
    3. 点击删除存储桶中的对象按钮可删除数据。
    监控 1.12.0
    1.12.1
    1.12.2

    配置中错误地定义了指标存储类别

    症状

    Prometheus StatefulSet 对象配置有误,使用了 standard 存储类,而不是 standard-rwo。此问题会导致从监控组件启动 Anthos Prometheus StatefulSet 对象失败。

    出现此问题的原因是,ObservabilityPipeline 协调器仅在首次安装时设置此值,而 ObsProjectInfra 协调器会监控集群自定义资源。

    临时解决方法:

    重启组织管理员集群中的 fleet-admin-controller 部署以解决此问题。

    监控 1.12.2

    mon-common 子组件不会部署 Istio Telemetry

    症状

    mon-common 子组件必须在组织管理员集群中部署 Istio Telemetry 对象,以防止审核记录 Cortex 的所有请求。不过,清单文件未包含在 build 文件中。

    临时解决方法:

    按照以下步骤在组织管理员集群中部署 Istio Telemetry 对象:

    1. 在组织管理员集群的 mon-system 命名空间中创建一个 YAML 文件,用于定义 Istio Telemetry 自定义资源 (CR):

      # Disable access logging from workloads internal to GDCH.
      # Telemetry CR to disable Istio access logs from obs-system namespace.
      apiVersion: telemetry.istio.io/v1alpha1
      kind: Telemetry
      metadata:
        name: disable-audit-logging
        namespace: mon-system
      spec:
        accessLogging:
          - providers:
            - name: otel
            disabled: true
    2. 将清单文件应用于 mon-system 命名空间中的组织管理员集群:

      kubectl apply -f disable-audit-logging.yaml
    监控 1.12.0
    1.12.1
    1.12.2

    mon-prober-backend-prometheus-config ConfigMap 会重置

    症状

    • 提醒“MON-A0001”已触发。
    • mon-prober-backend-prometheus-config ConfigMap 会重置为不包含任何探测作业,例如:
            apiVersion: v1
            data:
              prometheus.yaml: |
                remote_write:
                - url: http://cortex-tenant.mon-system.svc:9009/push
                  name: cortex-tenant
            kind: ConfigMap
            metadata:
              creationTimestamp: "2024-06-26T14:55:07Z"
              name: mon-prober-backend-prometheus-config
              namespace: mon-system
              resourceVersion: "6606787"
              uid: 1a495af0-1fdc-40b8-845b-4976e3b0f899
            

    临时解决方法:

    请按以下步骤操作以解决此问题:

    1. 设置以下环境变量:
      • KUBECONFIG:集群中 kubeconfig 文件的路径。
      • TARGET_CLUSTER:您要解决问题的集群的名称。
    2. 暂停所有集群上的 mon-prober 子组件:
            kubectl --kubeconfig $KUBECONFIG annotate subcomponent mon-prober -n $TARGET_CLUSTER lcm.private.gdc.goog/paused=true
            

      例如:

            kubectl --kubeconfig ~/root-admin-kubeconfig annotate subcomponent mon-prober -n my-org lcm.private.gdc.goog/paused=true
            
    3. 在每个管理员集群上重启 MON 管理员控制器:
            kubectl --kubeconfig $KUBECONFIG rollout restart deploy -n obs-system mon-admin-backend-controller
            

      随着每个探测器的注册,Prober ConfigMap 会随之填充。

    4. 按照操作手册 MON-R2009MON-A0001 提醒 Blackbox monitoring metrics pipeline down 设为静音,因为此提醒会一直触发。
    节点平台 1.12.1

    从 1.11.x 升级到 1.12.x 时,切换映像下载 pod 可能会卡在 ErrImagePull 状态

    症状

    从 1.11.x 升级到 1.12.x 时,切换映像下载 pod 可能会卡在 ErrImagePull 状态,并显示以下警告:

     Warning  Failed   145m (x4 over 169m)   kubelet  Failed to pull image "gcr.io/private-cloud-staging/switch-image-downloader:1.12.1-gdch.330": failed to pull and unpack image "gcr.io/private-cloud-staging/switch-image-downloader:1.12.1-gdch.330": failed to resolve reference "gcr.io/private-cloud-staging/switch-image-downloader:1.12.1-gdch.330": failed to do request: Head "https://10.252.119.4:5000/v2/library/private-cloud-staging/switch-image-downloader/manifests/1.12.1-gdch.330?ns=gcr.io": dial tcp 10.252.119.4:5000: connect: no route to host
      Warning  Failed   45m (x262 over 25h)   kubelet  Failed to pull image "gcr.io/private-cloud-staging/switch-image-downloader:1.12.1-gdch.330": failed to pull and unpack image "gcr.io/private-cloud-staging/switch-image-downloader:1.12.1-gdch.330": failed to resolve reference "gcr.io/private-cloud-staging/switch-image-downloader:1.12.1-gdch.330": pulling from host 10.252.119.11:10443 failed with status code [manifests 1.12.1-gdch.330]: 401 Unauthorized
      Normal   Pulling  40m (x287 over 26h)   kubelet  Pulling image "gcr.io/private-cloud-staging/switch-image-downloader:1.12.1-gdch.330"
      Normal   BackOff  22s (x6504 over 25h)  kubelet  Back-off pulling image "gcr.io/private-cloud-staging/switch-image-downloader:1.12.1-gdch.330"

    临时解决方法:

    如需解决此问题,请将图片从 pnet-core-switch-image-downloader 重新标记为 switch-image-downloader

    节点平台 1.12.1

    从 1.11.x 升级到 1.12.1 时,主机防火墙会阻止下载交换机映像

    症状

    从 1.11.x 升级到 1.12.1 时,由于主机防火墙使用的接口不匹配,主机防火墙会阻止交换机映像下载。

    临时解决方法:

    仅当您要从 1.11.x 升级到 1.12.x 时,才需要在升级之前应用以下解决方法。

    1. 更新根管理员集群和组织管理员集群。
      1. 获取根管理员裸金属节点和组织管理员裸金属节点的节点池名称和命名空间。对于根管理员集群,请使用根管理员 kubeconfig。以下命令会列出机器的清单,并按裸金属机器过滤该清单:
        kubectl --kubeconfig=KUBECONFIG  get inventorymachines -l cluster.private.gdc.goog/provisioner=baremetal-provisioner.cluster.private.gdc.goog -o json | jq -c -r '.items[].spec.nodePoolRef | [.name, .namespace] | @csv | sub("\"";"";"g")' | sort | uniq
        输出显示节点池名称和命名空间:
        admin-control-plane-node-pool,org-1
        root-admin-control-plane,root

        输出中的值对应于以下内容:

        • ORG_ADMIN_NODEPOOL_NAME:admin-control-平面-node-pool
        • ORG_ADMIN_NODEPOOL_NAMESPACE:org-1
        • ROOT_ADMIN_NODEPOOL_NAME:root-admin-control-平面
        • ROOT_ADMIN_NODEPOOL_NAMESPACE:根
      2. 在根管理员集群和组织管理员集群中创建以下对象,以将节点上的 eth0 重命名为 mgmt0

        apiVersion: system.private.gdc.goog/v1alpha1
        kind: AnsiblePlaybook
        metadata:
          name: eth0-to-mgmt0-int-rename
          namespace: gpc-system
        spec:
          playbook: |
            - name: Rename interface from eth0 to mgmt0
              hosts: all
              gather_facts: no
              tasks:
              - name: Rename interface in netplan file
                ansible.builtin.lineinfile:
                  path: /etc/netplan/50-cloud-init.yaml
                  regexp: '^(.*)set-name: eth0(.*)$'
                  line: '\1set-name: mgmt0\2'
                  backrefs: true
                register: netplan
              - name: Disable cloud-init network configuration
                ansible.builtin.lineinfile:
                  path: /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
                  line: 'network: {config: disabled}'
                  state: present
                  create: true
              - name: Restart netplan
                command: netplan apply
                when: netplan.changed
        ---
        apiVersion: system.private.gdc.goog/v1alpha1
        kind: OSPolicy
        metadata:
          name: interface-renaming
          namespace: gpc-system
          labels:
            ospolicy.system.private.gdc.goog/override-maintenance: "true"
        spec:
          interval:
            period: 1m
          inventory:
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: ${ORG_ADMIN_NODEPOOL_NAME}
            namespace: ${ORG_ADMIN_NODEPOOL_NAMESPACE}
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: ${ROOT_ADMIN_NODEPOOL_NAME}
            namespace: ${ROOT_ADMIN_NODEPOOL_NAMESPACE}
          policy:
            installPlaybook:
              name: eth0-to-mgmt0-int-rename
              
      3. 部署上述 YAML 文件后,NODEPOOL_NAMENODEPOOL_NAMESPACE 字段会填充相应集群中所有节点池的列表。

        一个包含实际根管理员节点池和组织管理员节点池名称的根管理员集群 yaml 文件可能如下所示:

        apiVersion: system.private.gdc.goog/v1alpha1
        kind: AnsiblePlaybook
        metadata:
          name: eth0-to-mgmt0-int-rename
          namespace: gpc-system
        spec:
          playbook: |
            - name: Rename interface from eth0 to mgmt0
              hosts: all
              gather_facts: no
              tasks:
              - name: Rename interface in netplan file
                ansible.builtin.lineinfile:
                  path: /etc/netplan/50-cloud-init.yaml
                  regexp: '^(.*)set-name: eth0(.*)$'
                  line: '\1set-name: mgmt0\2'
                  backrefs: true
                register: netplan
              - name: Disable cloud-init network configuration
                ansible.builtin.lineinfile:
                  path: /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
                  line: 'network: {config: disabled}'
                  state: present
                  create: true
              - name: Restart netplan
                command: netplan apply
                when: netplan.changed
        ---
        apiVersion: system.private.gdc.goog/v1alpha1
        kind: OSPolicy
        metadata:
          name: interface-renaming
          namespace: gpc-system
          labels:
            ospolicy.system.private.gdc.goog/override-maintenance: "true"
        spec:
          interval:
            period: 1m
          inventory:
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: admin-control-plane-node-pool
            namespace: org-1
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: root-admin-control-plane
            namespace: root
          policy:
            installPlaybook:
              name: eth0-to-mgmt0-int-rename
      4. 将 YAML 文件应用于根管理员集群:
        kubectl --kubeconfig=ROOT_ADMIN_KUBECONFIG  -f YAML_FILE_NAME
    2. 更新系统集群:
      1. 获取机器清单,并按裸金属机器过滤该清单:
        kubectl --kubeconfig=_ORG_ADMIN_KUBECONFIG  get inventorymachines -l cluster.private.gdc.goog/provisioner=baremetal-provisioner.cluster.private.gdc.goog -o json | jq -c -r '.items[].spec.nodePoolRef | [.name, .namespace] | @csv | sub("\"";"";"g")' | sort | uniq
        输出如下所示:
        worker-node-pool-o1-highgpu1-48-gdc-metal,org-1-system-cluster

        输出中的值对应于以下内容:

        • SYSTEM_CLUSTER_NODEPOOL_NAME:worker-node-pool-o1-highgpu1-48-gdc-metal
        • SYSTEM_CLUSTER_NODEPOOL_NAMESPACE:org-1-system-cluster
      2. NODEPOOL_NAMENODEPOOL_NAMESPACE 字段会根据上一个命令的输出列表进行填充。

      3. 在系统集群中创建以下对象,以将节点上的 eth0 重命名为 mgmt0 并更新操作系统政策:
        apiVersion: system.private.gdc.goog/v1alpha1
        kind: AnsiblePlaybook
        metadata:
          name: eth0-to-mgmt0-int-rename
          namespace: gpc-system
        spec:
          playbook: |
            - name: Rename interface from eth0 to mgmt0
              hosts: all
              gather_facts: no
              tasks:
              - name: Rename interface in netplan file
                ansible.builtin.lineinfile:
                  path: /etc/netplan/50-cloud-init.yaml
                  regexp: '^(.*)set-name: eth0(.*)$'
                  line: '\1set-name: mgmt0\2'
                  backrefs: true
                register: netplan
              - name: Disable cloud-init network configuration
                ansible.builtin.lineinfile:
                  path: /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
                  line: 'network: {config: disabled}'
                  state: present
                  create: true
              - name: Restart netplan
                command: netplan apply
                when: netplan.changed
        ---
        apiVersion: system.private.gdc.goog/v1alpha1
        kind: OSPolicy
        metadata:
          name: interface-renaming
          namespace: gpc-system
          labels:
            ospolicy.system.private.gdc.goog/override-maintenance: "true"
        spec:
          interval:
            period: 1m
          inventory:
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: ${SYSTEM_CLUSTER_NODEPOOL_NAME}
            namespace: ${SYSTEM_CLUSTER_NODEPOOL_NAMESPACE}
          policy:
            installPlaybook:
              name: eth0-to-mgmt0-int-rename

        包含实际节点池名称的系统集群的示例 YAML 文件可能如下所示:

        apiVersion: system.private.gdc.goog/v1alpha1
        kind: AnsiblePlaybook
        metadata:
          name: eth0-to-mgmt0-int-rename
          namespace: gpc-system
        spec:
          playbook: |
            - name: Rename interface from eth0 to mgmt0
              hosts: all
              gather_facts: no
              tasks:
              - name: Rename interface in netplan file
                ansible.builtin.lineinfile:
                  path: /etc/netplan/50-cloud-init.yaml
                  regexp: '^(.*)set-name: eth0(.*)$'
                  line: '\1set-name: mgmt0\2'
                  backrefs: true
                register: netplan
              - name: Disable cloud-init network configuration
                ansible.builtin.lineinfile:
                  path: /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
                  line: 'network: {config: disabled}'
                  state: present
                  create: true
              - name: Restart netplan
                command: netplan apply
                when: netplan.changed
        ---
        apiVersion: system.private.gdc.goog/v1alpha1
        kind: OSPolicy
        metadata:
          name: interface-renaming
          namespace: gpc-system
          labels:
            ospolicy.system.private.gdc.goog/override-maintenance: "true"
        spec:
          interval:
            period: 1m
          inventory:
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: worker-node-pool-o1-highgpu1-48-gdc-metal
            namespace: org-1-system-cluster
          policy:
            installPlaybook:
              name: eth0-to-mgmt0-int-rename
      4. 将 YAML 文件应用于组织管理员集群:
        kubectl --kubeconfig=ORG_ADMIN_KUBECONFIG  -f YAML_FILE_NAME
    较低的网络 1.12.2

    预加载版本低于 9.3.10 的网络交换机可能无法启动

    症状

    预加载了低于 9.3.10 版本的网络交换机无法进行初始启动,因为交换机的预期版本为 10.3(4a)。

    临时解决方法:

    手动将交换机固件从 9.3.5 升级到 9.3.10,然后再从 9.3.10 升级到 10.3.4a。

    较低的网络 1.12.2

    org-admin 节点的某些连接超时

    症状

    由于交换机上的证书已过期,导致交换机没有最新的配置,因此连接在交换机处断开。

    临时解决方法:

    1. 轮替交换机上的证书。
    2. 激活新证书:
      1. nxapi certificate httpskey keyfile bootflash:api-private-key.pem
      2. nxapi certificate httpscrt certfile bootflash:api-certificate.pem
      3. nxapi certificate enable
    文件存储和块存储 1.12.1
    1.12.2
    1.12.4

    从 1.11.1 升级到 1.12.1、1.12.2 或 1.12.4 时,file-netapp-trident 子组件的推出可能会失败

    症状

    Linux Unified Key Setup (LUKS) 子组件在升级期间不会重新部署。如需检查 file-netapp-trident 子组件,请执行以下操作:

    1. 设置别名:
      alias ka='kubectl --kubeconfig=/path/to/root-admin/root-admin-kubeconfig' 
      alias ko='kubectl --kubeconfig=/path/to/org-admin/org-admin-kubeconfig'
    2. 获取子组件:
      ka get subcomponent -n root file-netapp-trident -o yaml
      ko get subcomponent -n root file-netapp-trident -o yaml

    输出可能如下所示:

    conditions:
      - lastTransitionTime: "2024-03-28T01:37:20Z"
        message: 'Reconciliation error: E0100 - deploy: failed to install chart: release
          file-netapp-trident-backend failed, and has been uninstalled due to atomic being
          set: cannot patch "standard-rwo" with kind StorageClass: StorageClass.storage.k8s.io
          "standard-rwo" is invalid: parameters: Forbidden: updates to parameters are
          forbidden. && cannot patch "standard-block" with kind StorageClass: StorageClass.storage.k8s.io
          "standard-block" is invalid: parameters: Forbidden: updates to parameters are
          forbidden.'
        observedGeneration: 1
        reason: ReconciliationError
        status: "True"
        type: Reconciling 

    在此示例中,有两个存储类失败:standard-rwostandard-block

    临时解决方法:

    1. 删除作业未能创建的 StorageClasses,例如 standard-rwostandard-blockstandard-rwo-non-luksstandard-block-non-luks
    2. 通过为集群(根管理员集群和组织管理员集群的根管理员控制器,系统集群和用户集群的组织管理员控制器)重启 oclcm-backend-controller,触发 StorageClasses 的重新创建。
    3. 对于版本 1.12.4,请确认已安装的存储类是否已将注解 disk.gdc.goog/luks-encrypted: 设置为 true(非 LUKS 存储类除外)。如果注解未设置为 true,请重复执行第 1 步和第 2 步。
    4. 重启集群中的 netapp-trident 部署和 netapp-trident DaemonSet
    5. 验证是否已为您的 PersistentVolumeClaim (PVC) 资源创建 LUKS Secret。每个 PVC 都必须有一个格式为 g-luks-$pvc_name 的 Secret。
    6. 验证 file-netapp-trident 子组件的状态是否正常。
    对象存储 1.12.2

    根组织升级后,对象存储分区可能尚未准备就绪

    症状

    将根组织从 1.12.1 升级到 1.12.x 后,升级后验证失败,并显示以下错误:

    upgrade_post_root_org_validation.go:121: Bucket(s) not ready: 8 errors occurred:
                    * Bucket "atat-system/invoice-export-bucket" not ready
                    * Bucket "mon-system/cortex-metrics-alertmanager" not ready
                    * Bucket "mon-system/cortex-metrics-blocks" not ready
                    * Bucket "mon-system/cortex-metrics-ruler" not ready
                    * Bucket "obs-system/audit-logs-loki-io" not ready
                    * Bucket "obs-system/cortex-metrics-alertmanager" not ready
                    * Bucket "obs-system/cortex-metrics-blocks" not ready
                    * Bucket "obs-system/cortex-metrics-ruler" not ready
          

    临时解决方法:

    在开始升级之前,手动添加 Finalizer。

    集群管理 1.12.1、1.12.2

    Kubernetes 版本为 1.27.x 的用户集群可能存在无法初始化的节点池

    症状

    在 Kubernetes 1.27.x 版上运行的用户集群中的节点池可能无法初始化,导致用户集群无法处理容器工作负载。

    临时解决方法:

    请勿创建 Kubernetes 版本为 1.27.x 的用户集群。

    虚拟机 1.12.0

    当源映像具有默认值时,映像翻译无法提取软件包

    症状

    如果 Ubuntu 源映像在 sources.list 中包含默认 APT 源,则虚拟机映像导入会在映像转换步骤中失败。

    临时解决方法:

    确保源映像中的 /var/lib/apt/lists/ 目录为空。

    虚拟机 1.12.2

    导入器 pod 失败或卡住

    症状

    获取导入器 pod 的列表:

    kubectl get pods -A | grep import 

    输出可能如下所示:

    user-vm-1-cluster               importer-vm-1b19e25c-disk-8dwzz                                   0/1     ContainerCreating      0                2d9h
    user-vm-1-cluster               importer-vm-72b96d39-disk-frv4f                                   0/1     CreateContainerError   124 (43h ago)    2d9h
    user-vm-1-cluster               importer-vm-c7a7a320-disk-qjgt2                                   0/1     CreateContainerError   124 (43h ago)    2d9h
    user-vm-2-cluster               importer-vm-06ca7e94-disk-b66fz                                   0/1     CreateContainerError   124 (43h ago)    2d9h
    user-vm-2-cluster               importer-vm-7e63b71b-disk-jxqfz                                   0/1     CreateContainerError   116 (43h ago)    2d9h
    user-vm-2-cluster               importer-vm-e0651556-disk-k8scf                                   0/1     CreateContainerError   123 (43h ago)    2d9h

    日志可能会显示如下所示的事件:

    Events:
      Type     Reason              Age                      From                     Message
      ----     ------              ----                     ----                     -------
      Warning  FailedAttachVolume  2m14s (x1630 over 2d9h)  attachdetach-controller  AttachVolume.Attach failed for volume "pvc-2000efe0-b4a0-4856-899b-7e0c9fd33405" : rpc error: code = Unknown desc = error publishing ontap-san driver: problem mapping LUN /vol/trident_pvc_2000efe0_b4a0_4856_899b_7e0c9fd33405/lun0: results: {http://www.netapp.com/filer/admin results}
    status,attr: failed
    reason,attr: No such LUN exists
    errno,attr: 9017
    lun-id-assigned: nil

    临时解决方法:

    1. 从错误消息中获取 PersistentVolumeClaim (PVC) 名称,例如 pvc-2000efe0-b4a0-4856-899b-7e0c9fd33405
    2. 查找具有此名称的 PersistentVolume (PV),并记下 spec.csi.volumeAttributes.internalName 以供稍后使用。
    3. 按照 FILE-A0006 运行手册中的步骤,建立与存储集群的 SSH 连接。
    4. 显示卷并记下命令返回的 Vserver 名称:
      volume show -volume INTERNAL_NAME
    5. 使卷变为离线状态:
      volume offline -volume INTERNAL_NAME -vserver VSERVER_NAME
    6. 删除卷:
      volume delete -volume INTERNAL_NAME -vserver VSERVER_NAME
    虚拟机 1.12.1
    1.12.2

    由于网络控制器管理器安装失败,VMRuntime 可能未就绪

    症状

    目标集群(可以是管理集群或系统集群)上的 VMRuntime 具有 VMRuntime 状态。ready = false,并且 kube-system 命名空间中的 network-controller-manager 处于待处理状态

    kubectl --kubeconfig=${TARGET_CLUSTER_KUBECONFIG} get vmruntime vmruntime
    
    apiVersion: virtualmachine.private.gdc.goog/v1
    kind: VMRuntime
    metadata:
      ...
    spec:
      ...
    status:
      ready: false
    
          
    kubectl --kubeconfig=${TARGET_CLUSTER_KUBECONFIG} describe deploy network-controller-manager -n kube-system
    
    ...
    Events:
      Type     Reason       Age                      From     Message
      ----     ------       ----                     ----     -------
      Warning  FailedMount  3m36s (x122 over 3h55m)  kubelet  MountVolume.SetUp failed for volume "cert" : secret "network-webhook-server-cert" not found
          

    临时解决方法:

    删除部署 network-controller-manager 应该会使 VMM 运算符自动使用所需的证书重新创建部署。部署应进入 Running 状态,随后 VMRuntime 状态应更改为 ready=true。

    kubectl --kubeconfig=${TARGET_CLUSTER_KUBECONFIG} delete deploy network-controller-manager -n kube-system
    虚拟机 1.12.2

    虚拟机磁盘的预配时间过长

    症状

    虚拟机导入器 pod 崩溃循环,数据卷卡在导入状态超过 90 分钟。Pod 的状态可能如下所示:

    test-vm-project                           importer-disk-ops-test-vm-boot-disk-tbdtz                     0/1     CrashLoopBackOff   14 (47s ago)     90m     172.16.20.94    zb-aa-bm08    <none>           <none>
    test-vm-project                            importer-test-vm-1-boot-disk-plsxk         1/1     Running            1 (2m53s ago)    8m59s   172.16.22.244   zb-ab-bm09   <none>           <none>
    test-vm-project                            importer-test-vm-2-boot-disk-npjc8                          1/1     Running            6 (12m ago)      40m     172.16.22.180   zb-ab-bm09    <none>           <none>

    所有磁盘导入最终都会在 3 小时内完成。

    升级 1.12.2

    从 1.11.1 升级到 1.12.2 时,unet-nodenetworkpolicy-infra 子组件无法协调

    症状

    失败消息可能如下所示:

         message: 'Reconciliation error: E0111 - upgrade chart: release unet-nodenetworkpolicy-infra-assets
          failed, and has been rolled back due to atomic being set: cannot patch "mgmt-network"
          with kind Network: admission webhook "vnetwork.networking.gke.io" denied the
          request: Network.networking.gke.io "mgmt-network" is invalid: Spec.NodeInterfaceMatcher:
          Forbidden: Field is immutable'
          observedGeneration: 2

    临时解决方法:

    1. 如果失败发生在根上,请在以下步骤中将 KUBECONFIG 替换为根管理员 kubeconfig。
    2. 如果组织出现故障,请在以下步骤中将 KUBECONFIG 替换为组织管理员 kubeconfig。
    3. 运行以下命令:
               alias k="kubectl --kubeconfig=KUBECONFIG"
               k get networks mgmt-network -o json | jq '.spec.nodeInterfaceMatcher.interfaceName'
    4. 如果输出为 eth0,请运行:
      k patch network mgmt-network -p '{"metadata":{"finalizers":null}}' --type=merge
    5. 删除 mgmt-network
      k delete network mgmt-network
    6. 验证 unet-nodenetworkpolicy-infra 的状态是否没有错误。

      例如:

               alias k="kubectl kubeconfig=KUBECONFIG"
               k get subcomponent unet-nodenetworkpolicy-infra -n org-1

      输出如下所示:

               NAME                           AGE   STATUS
               unet-nodenetworkpolicy-infra   34d   ReconciliationCompleted

    升级 1.12.2

    系统集群在从 1.11.x 升级到 1.12.2 期间失败

    症状

    在从 1.11.x 升级到 1.12.2 期间或之后,名称中包含 bm-system-add-ons-* 的作业可能会失败,并显示以下错误:

       E0326 17:04:22.997270       1 main.go:180] configdrift: Config drift health check failed
    
       F0326 17:04:22.997365       1 main.go:184] One or more checks failed.

    临时解决方法:

    在开始从 1.11 升级到 1.12.2 之前,请将以下注释应用于所有 Kubernetes 集群。

          # To bypass preflight check errors:
          baremetal.cluster.gke.io/bypass-check="vip_subnet"

    例如,在根管理员集群上使用:

       kubectl annotate -n root cluster root-admin baremetal.cluster.gke.io/bypass-check="vip_subnet" --kubeconfig=ROOT_ADMIN_KUBECONFIG
       

    升级 1.12.2

    file-observability 子组件在 org-1-system-cluster 上失败

    症状

    此问题会在从 1.11.1 升级到 1.12.2 时出现。

    查看 file-observability 子组件的 .yaml 文件:

    kubectl get subcomponent file-observability -n org-1-system-cluster -o yaml

    该文件可能在 backendStatus 部分中包含以下消息。

    message: 'E0100 - deploy: failed to install chart: release file-observability-backend
            failed, and has been uninstalled due to atomic being set: deployments.apps
            "file-observability-backend-controller" not found'

    临时解决方法:

    1. 检查 file-system 命名空间,验证它是否未在 org-admin cluster 中终止:
      kubectl --kubeconfig ORG_ADMIN_KUBECONFIG get namespace file-system
    2. 如果正在终止,请删除 file-system 命名空间中的所有监控目标:
      kubectl --kubeconfig ORG_ADMIN_KUBECONFIG delete monitoringtarget -n file-system --all
    3. 通过向子组件添加以下注释,暂停 file-observability 子组件,直到 mon-admin 子组件启动:
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG annotate -n org-1 subcomponent file-observability lcm.private.gdc.goog/paused='true'
      kubectl --kubeconfig ORG_ADMIN_KUBECONFIG annotate -n org-1-system-cluster subcomponent file-observability lcm.private.gdc.goog/paused='true'
    4. 移除注解以在升级完成后暂停子组件:
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG annotate -n org-1 subcomponent file-observability lcm.private.gdc.goog/paused-
      kubectl --kubeconfig ORG_ADMIN_KUBECONFIG annotate -n org-1-system-cluster subcomponent file-observability lcm.private.gdc.goog/paused-
    升级 1.12.2

    HSMupgrade 失败,因为 hsmcluster 未准备就绪

    症状

    此问题会在从 1.11.1 升级到 1.12.2 时出现。

    hsmupgraderequestctmclusterupgraderequest 的所有升级步骤都完成后,系统会显示以下错误:

    HSMCluster "hsmcluster" is not ready. 

    例如:

     - lastTransitionTime: "2024-04-08T15:18:45Z" message: HSMCluster "hsmcluster" is not ready observedGeneration:
       2 reason: ziabhsm01PostUpgradeCheckFailed status: "False" type: AllComplete

    临时解决方法:

    1. 验证 HSM 是否已完成升级,并获取每个 HSM 的 IP 地址:
      kubectl get hsm -A --kubeconfig=ROOT_ADMIN_KUBECONFIG

      输出如下所示:

      NAMESPACE    NAME          AGE   IP              READY   REASON
      gpc-system   zi-aa-hsm01   11d   10.252.96.192   True    ReconcileHSMSuccess
      gpc-system   zi-ab-hsm01   11d   10.252.97.192   True    ReconcileHSMSuccess
      gpc-system   zi-ac-hsm01   11d   10.252.98.192   True    ReconcileHSMSuccess
    2. 下载并配置 ksctl
    3. 运行 ksctl system info get --url=https://HSM_MANAGEMENT_IP 以验证所有 HSM 版本是否已升级到 ctmclusterupgraderequest.Spec.TargetVersion

      输出如下所示:

            ksctl system info get
          {
            "name": "zi-aa-hsm01",
            "version": "2.13.1+10196",
            "model": "CipherTrust Manager k570",
            "vendor": "Thales Group",
            "crypto_version": "1.7.0",
            "uptime": "0 days, 1 hours, 20 minutes",
            "system_time": "2024-04-08T19:51:27Z"
          }

    4. 将每个 HSM 的 Status.FirmwareVersion 字段更新为在上一步中获得的升级版本:

      例如:

          kubectl edit-status hsm HSM_NAME -n gpc-system
    5. ctmclusterupgraderequest.status.conditions 上次条件状态从 False 更新为 True。之后,hsmupgraderequest.status.conditions 最后一个条件的状态也变为 true。

      例如:

         kubectl edit-status ctmclusterupgraderequest CTM_VERSION -n gpc-system
         kubectl get ctmclusterupgraderequest CTM_VERSION -n gpc-system -o yaml

    升级 1.12.2
    1.12.4

    无法访问的管理 IP

    升级期间,服务器的管理 IP 无法访问,尤其是在交换机操作系统升级后。

    在 Rocky Linux 中,添加静态路由时,用于到达静态路由的目标 IP 必须在添加静态路由之前可访问。如果交换机在操作系统升级后重新启动,则该管理 IP 地址可能暂时无法访问。

    临时解决方法:

    使用数据 IP 地址建立与服务器的 SSH 连接,然后重启网络服务以重新创建缺少的静态路由:

    systemctl restart NetworkManager.service
    工单系统 1.12.2

    工单系统知识库同步失败

    症状

    知识库同步期间,您可能会看到以下错误:

    Error: Article creation request failed status:400, body:map[error:map[detail:Rejected large REST payload with content-length = 10725676 bytes. Max allowed: 10485760 bytes. 

    临时解决方法:

    添加系统属性以增加最大长度:

    1. 在 ServiceNow 平台中,在导航过滤条件中输入 sys_properties.list
    2. 点击 New(新建)。
    3. 名称字段中,输入 glide.rest.max_content_length
    4. 类型字段中,选择 string
    5. 字段中,输入 15
    6. 点击提交
    7. 再次同步知识库。
    工单系统 1.12.2

    工单系统没有健康的上游

    症状

    手动部署 gdchservices 组织时,工单系统没有正常的上游,没有创建虚拟机,并且 support 命名空间中 gdchservices-system 集群中的 midserver pod 处于不健康状态。

    临时解决方法:

    gdchservices-admin 集群中创建具有正确虚拟机映像的新 TicketingSystem 自定义资源:

    apiVersion: ticketing.private.gdc.goog/v1
    kind: TicketingSystem
    metadata:
      name: as-replacement
      namespace: support
    spec:
      replicas: 2
      spec:
        image: ts-controller-app-server-2024-02-07-231907
        imagenamespace: vm-system
        memory: 12G
        size: 100G
        vcpus: 8
      version:
        name: glide-vancouver-07-06-2023__patch5-12-01-2023_12-11-2023_2006.zip
    升级 1.12.2

    通过 SSH 连接到具有管理 IP 的虚拟机时失败,并且 cilium 日志显示失败

    症状

    登录访问权限不适用于具有管理 IP 的虚拟机。您可能会在 anetd pod 日志中看到如下所示的错误:

    Unable to create endpoint:[PUT /endpoint/{id}][400] putEndpointIdInvalid failed setting up layer2 interface

    临时解决方法:

    删除虚拟机的 virt-launcher pod。

    升级 1.12.2

    mz-etcd 子组件更新了 spec.deployTargetspec.Namespace,导致从 1.11.x 升级到 1.12.x 失败

    症状

    在从 1.11x 升级到 1.12.x 的过程中,您可能会看到如下所示的错误:

          kubectl --kubeconfig PATH_TO_ROOT_ADMIN_KUBECONFIG get subcomponent -n root mz-etcd -o yaml
          kubectl --kubeconfig PATH_TO_ROOT_ADMIN_KUBECONFIG get subcomponent -n org-1 mz-etcd -o yaml

    在升级之前,mz-etcd 子组件具有以下规范:

                  spec:
              crds:
                helmManifestSpec:
                  chartURL: gcr.io/mz-etcd-crds:1.11.1-gdch.260
                  upgradeHookPolicy: OnVersionChange
              deployTarget: Local
              namespace: ""

    临时解决方法:

    1. 删除根管理员集群上的以下子组件:
            kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG delete subcomponent -n root mz-etcd
            kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG delete subcomponent -n org-1 mz-etcd
    2. 检查根命名空间和组织命名空间中的子组件:
            kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG get subcomponent -n root mz-etcd -o yaml
            kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG get subcomponent -n org-1 mz-etcd -o yaml
    3. 新子组件必须具有以下规范,并且 chat网址 必须显示集群已升级到的版本:
                backend:
              helmManifestSpec:
                chartURL: gcr.io/mz-etcd-backend:1.12.2-gdch.785
          ...
            dash:
              helmManifestSpec:
                chartURL: gcr.io/mz-etcd-dash:1.12.2-gdch.785
          ...
            deployTarget: Remote
            namespace: mz-system
            mon:
              helmManifestSpec:
                chartURL: gcr.io/mz-etcd-mon:1.12.2-gdch.785
                upgradeHookPolicy: OnVersionChange
          ...
            targetClusterName: root-admin
            targetClusterNamespace: root
            webhooks:
              helmManifestSpec:
                chartURL: gcr.io/mz-etcd-webhooks:1.12.2-gdch.785
                upgradeHookPolicy: OnVersionChange
    升级 1.12.2

    对象存储升级在飞行后或飞行前检查期间显示错误

    症状

    预检检查或飞行后检查失败并显示错误。查看日志:

    kubectl logs -n gpc-system upgrade-managed-check-objectstorageupgrade-87698-rrjhrW0410

    错误可能如下所示:

     03:42:05.701163       1 upgrade_check.go:276] 1 error occurred:
          * Group "/rbac.sysstd.role.vm-system.wtwf7txfmbhvujhpxrfampnrkdwqsvzro6i7rmo5tsfst4wbxldq" not ready for RBAC resource {Role vm-system g-vm-image-bucket-reader    }
    
       Error: check "ObjectStorageUpgrade" preflight check failed: 1 error occurred:
          * Bucket "gpc-system/range-read-internal" not ready
    
      F0410 03:42:05.701901       1 main.go:80] check "ObjectStorageUpgrade" preflight check failed: 1 error occurred:
          * Bucket "gpc-system/range-read-internal" not ready

    临时解决方法:

    如果错误发生在飞行后检查期间,并且所有其他检查均已完成且未出现任何错误,请跳过飞行后检查。当升级重新开始时,您还必须使用根管理员 kubeconfig 跳过预检检查:

     kubectl delete organizationupgrade -n gpc-system ORG_NAME && kubectl annotate -n gpc-system organization ORG_NAME upgrade.private.gdc.goog/skip-postflight-check=ok && kubectl annotate -n gpc-system organization ORG_NAME upgrade.private.gdc.goog/skip-preflight-check=ok

    例如,如果错误发生在组织 1 上,则命令如下所示:

     kubectl delete organizationupgrade -n gpc-system org1 && kubectl annotate -n gpc-system organization org-1 upgrade.private.gdc.goog/skip-postflight-check=ok && kubectl annotate -n gpc-system organization org-1 upgrade.private.gdc.goog/skip-preflight-check=ok

    如果错误发生在预检检查期间,并且所有其他预检检查均已完成且未出现任何错误,请跳过预检检查:

    kubectl delete organizationupgrade -n gpc-system ORG_NAME && kubectl annotate -n gpc-system organization ORG_NAME upgrade.private.gdc.goog/skip-preflight-check=ok

    例如,如果错误发生在组织 1 上,则命令如下所示:

    kubectl delete organizationupgrade -n gpc-system org-1 && kubectl annotate -n gpc-system organization org-1 upgrade.private.gdc.goog/skip-preflight-check=ok

    如果此解决方法未能成功应用,您可能需要多次应用。

    ATAT Portfolio 1.12.0
    1.12.1
    1.12.2
    1.12.4

    组合无法同步

    症状

    ConfigSync 错误,并显示以下消息:

     KNV2009: failed to apply Portfolio.atat.config.google.com, atat-system/***: failed to create typed patch object (atat-system/***; atat.config. ││ google.com/v1alpha1, Kind=Portfolio): .spec.portfolioName: field not declared in schema. 

    临时解决方法:

    在 GDC 1.12 版中,Portfolio 架构发生了变化。portfolioName 字段已重构为 portfolioID。找到错误消息中提及的包含组合自定义资源的 YAML 文件。将字段 portfolioName 重命名为 portfolioID

    升级 1.12.2

    NTP OSPolicy 失败会阻止所有其他 OSPolicies 运行

    症状

    如果修补作业仅完成了预检作业,但未创建正在运行的作业,则可能存在以下原因:

    1. NTP 故障会阻止所有其他补丁作业执行。
    2. 节点处于运行状况不佳的状态。
    3. OS Config 代理未运行。
    4. OS Config 代理无法与 OS Config 服务通信。
    5. OS Config 服务存在问题。

    临时解决方法:

    1. 检查节点的 `NodeTargetPolicy` CR。
    2. 搜索具有以下特征的 `NodeTargetPolicy` CR 的 `.spec.osPolicies`:`ref.name=admin-ntp-policy` 和 `type: Ready`,且状态为 false:
            # Enter the node InventoryMachine name.
            NAME=
            kubectl get nodetargetpolicy -n gpc-system $NAME -ojsonpath="{.spec.osPolicies}" | jq
    3. 输出如下所示:
       - conditions:
                - lastTransitionTime: "2024-04-19T19:12:01Z"
                  message: ""
                  observedGeneration: 7
                  reason: Complete
                  status: "True"
                  type: PolicyPreflightCompleted
                - lastTransitionTime: "2024-04-19T19:12:01Z"
                  message: ""
                  observedGeneration: 7
                  reason: None
                  status: "True"
                  type: PolicyConflictNone
                - lastTransitionTime: "2024-04-19T19:56:35Z"
                  message: ""
                  observedGeneration: 7
                  reason: Reconciled
                  status: "True"
                  type: Ready
                diff: os-policy-preflight-admin-ntp-policymf2w4-dpbxw
                playbookName: server-ntp-config
                ref:
                  name: admin-ntp-policy
                  namespace: gpc-system
    4. 删除这些 `osPolicies` 的所有条件,仅保留以下部分:
      - conditions:
                diff: os-policy-preflight-admin-ntp-policymf2w4-dpbxw
                playbookName: server-ntp-config
                ref:
                  name: admin-ntp-policy
                  namespace: gpc-system
    升级 1.12.3
    1.12.4

    NodeUpgrade 显示 Rocky Linux

    症状

    即使升级的节点是 Ubuntu,NodeUpgrade CR 也会在其规范中提及 version: rocky-86-xyz

    临时解决方法:

    您无需采取任何解决方法,因为此信息无害。节点已正确升级到较新版本的 Ubuntu。

    SIEM 1.12.0
    1.12.1
    1.12.2
    1.12.3
    1.12.4

    SIEM 预安装作业失败

    症状

    根管理员集群中根命名空间和 org-1 命名空间中的 siem-*-preinstall 作业反复失败。

    临时解决方法:

    预计在停用 SIEMComponent 功能门时,作业会失败。这些失败并不表示相应组件已损坏。如果噪声干扰较大,可以暂停 SIEM 组件的协调,但一般建议尽可能保持该组件处于启用状态。如果组件协调处于暂停状态,则必须在未来的升级中不再限制 SIEM 组件安装时手动重新启用该功能。

    节点升级 1.12.0
    1.12.1
    1.12.2

    节点升级因 lvm.conf 文件过时而失败

    症状

    vgsblkid 和 Ansible 的 gather_facts 可能存在不响应的问题。此问题会影响 Rocky 和 Ubuntu 操作系统。

    如果节点已升级,请执行以下步骤。更新 lvm.conf 文件的流程包括以下步骤:

    1. 获取所有节点的列表,以便将此修复应用于所有节点。
    2. 创建 Ansible playbook 和 OS 政策文件。
    3. 将修复应用到节点。
    4. 检查修复是否已应用。

    前提条件

    1. 按照 IAM-R0004 运行手册中的步骤,为根管理员集群生成 ROOTCONFIG,为组织管理员集群生成 ORGCONFIG
    2. 按照 IAM-R0005 运行手册中的步骤操作,以获取组织的以下角色。

    临时解决方法:

    1. 确定与集群对应的 InventoryMachines
      kubectl --kubeconfig=$ROOTCONFIG get inventorymachines
          kubectl --kubeconfig=$ORGCONFIG get inventorymachines

      将输出分开。一次修复一个集群。输出可能如下所示:

          NAME
          bm-2bca8e3f
          bm-4caa4f4e
    2. 创建策略方案和政策文件:
      apiVersion: system.private.gdc.goog/v1alpha1
          kind: AnsiblePlaybook
          metadata:
            name: lvm-conf-device-filter-node-update
            namespace: gpc-system
          spec:
            playbook: |
              - name: Add a device filter to /etc/lvm/lvm.conf
                hosts: all
                gather_facts: no
                tasks:
                  # Change lvm.conf
                  - name: Configure lvm for filtering out "dm" and "sg" devices
                    ansible.builtin.lineinfile:
                      path: /etc/lvm/lvm.conf
                      insertafter: '^(\s+|)devices(\s+|)\{'
                      line: '  filter = [ \"r|/dev/dm.|\", \"r|/dev/sg.|\" ]'
      
          ---
          apiVersion: system.private.gdc.goog/v1alpha1
          kind: OSPolicy
          metadata:
            name: lvm-conf-device-filter-node-update
            namespace: gpc-system
          spec:
            interval:
              period: 1m
            inventory:
               # this is the inventory from step 1 above,
               # see the syntex below
            policy:
              installPlaybook:
                name: lvm-conf-device-filter-node-update
    3. 必须按此示例填写上述清单部分。 为第 1 步中找到的每个节点添加一个段落。您将一次处理一个集群,因此请在“inventory”部分中填充一个集群的节点。
      inventory:
            # Node: bm-2bca8e3f
            - apiVersion: baremetal.cluster.gke.io/v1
              kind: InventoryMachine
              name: bm-2bca8e3f
      
            # Node: bm-4caa4f4e
            - apiVersion: baremetal.cluster.gke.io/v1
              kind: InventoryMachine
              name: bm-4caa4f4e
    4. 将修复应用于根管理员集群:
      kubectl --kubeconfig=$ROOTCONFIG apply -f PRECEDING_FILENAME_WITH_ROOT_NODES
    5. 将修复应用于组织管理员集群:
      kubectl --kubeconfig=$ORGCONFIG  apply -f PRECEDING_FILENAME_WITH_ORG_NODES
    6. 重新启动服务器以使新设置生效。
    7. 按照 OS-P0005 运行手册中的步骤验证节点是否已更新。
    8. 确认政策已成功完成,然后使用 k9s 工具删除政策:
      1. 前往操作系统政策,例如 :ospolicies
      2. 找到并选择 lvm-conf-device-filter-node-update 政策。
      3. Ctrl + d
      4. 确认删除。

    如需上报此问题,请使用 SUPP-G0008 运行手册提交支持服务工单。 工单应包含以下信息:

    1. 执行的命令及其输出消息
    2. 详细信息,例如 InventoryMachineName 和集群
    3. 日志消息
    操作系统 1.12.0
    1.12.1
    1.12.2
    1.12.4

    为新集群或组织错误地选择了 Rocky OS

    症状

    如果环境之前部署的是 1.11,然后升级到 1.12,就会出现此问题。在 1.12.x 版本中创建新集群或组织时,由于 ReleaseMetadataUserclustermetadata CR 中指定的 Rocky OS 版本,系统会选择 Rocky OS 而不是 Ubuntu OS 来预配裸机和虚拟机节点。

    临时解决方法:

    在创建新组织之前,请应用以下解决方法:

    1. 检查是否存在未处于 Succeeded: true 状态的 OrganizationUpgrade CR:
      for item in $(kubectl --kubeconfig=KUBECONFIG get OrganizationUpgrade -A -o custom-columns=NAME:.metadata.name,NAMESPACE:.metadata.namespace --no-headers); do
        NAME=$(echo $item | awk '{print $1}')
        NAMESPACE=$(echo $item | awk '{print $2}')
        STATUS=$(kubectl --kubeconfig=KUBECONFIG get organizationupgrade ${NAME} -n ${NAMESPACE} -o json | jq '.status.conditions[] |  select(.type=="Succeeded") | .status')
        if [[ "$STATUS" != "True" ]]; then
           echo "Not in Succeeded: true state, stop following operations"
        fi
      done

      如果是这种情况,请先上报给工程团队,然后再继续执行后续步骤。

    2. 移除所有现有的 OrganizationUpgrade CR,以避免意外的节点操作系统升级:
      for item in $(kubectl --kubeconfig=KUBECONFIG get OrganizationUpgrade -A -o custom-columns=NAME:.metadata.name,NAMESPACE:.metadata.namespace --no-headers); do
        NAME=$(echo $item | awk '{print $1}')
        NAMESPACE=$(echo $item | awk '{print $2}')
        echo "Deleting OrganizationUpgrade $NAME in namespace $NAMESPACE"
        kubectl --kubeconfig=KUBECONFIG delete OrganizationUpgrade $NAME -n $NAMESPACE
      done
    3. 定义新组织创建的目标 GDC 版本。此目标版本应有对应的 ReleaseMetadata:
      TARGET_RELEASE=
    4. 在根管理员集群中,为目标 Ubuntu 操作系统确定最新的 OSImageMetadata CR,并定义 OS_VERSION 变量:
      OS_VERSION=$(kubectl --kubeconfig=KUBECONFIG get osimagemetadata --sort-by=.metadata.creationTimestamp | grep -wv rocky | tail -1 |  awk '{print $1}' |  sed 's/gdch-node-os-//g')
      
      echo $OS_VERSION

      输出可能如下所示:

      1.12.4-gdch.4

      确保该变量使用与 TARGET_RELEASE 相同的主版本.次版本.补丁版本,例如 1.12.4。如果不是,请先上报给工程团队,然后再继续执行后续步骤。

    5. 更新目标 ReleaseMetadata 以使用根管理员集群中的 Ubuntu OS_VERSION
      kubectl --kubeconfig=KUBECONFIG patch releasemetadata "${TARGET_RELEASE}" --type='json' -p='[{"op": "replace", "path": "/spec/adminCluster/bmNodeImage", "value": '"${OS_VERSION}"'}, {"op": "replace", "path": "/spec/adminCluster/vmNodeImage", "value": '"${OS_VERSION}"'}, {"op": "replace", "path": "/spec/systemCluster/bmNodeImage", "value": '"${OS_VERSION}"'}, {"op": "replace", "path": "/spec/systemCluster/vmNodeImage", "value": '"${OS_VERSION}"'}]'
    6. 确定目标 ReleaseMetadata 的已映射 UserclusterMetadata 列表:
      UCMS=$(kubectl --kubeconfig=KUBECONFIG get releasemetadata  "${TARGET_RELEASE}" -o json | jq -r '.spec.userClusters[].name')
    7. 更新目标 UserclusterMetadata,以在根管理员集群和组织管理员集群中使用 Ubuntu OS_VERSION。针对每个集群运行以下命令:
      for UCM in ${UCMS}; do
        echo "Updating UserclusterMetadata $UCM"
        kubectl --kubeconfig=KUBECONFIG patch userclustermetadata.upgrade.private.gdc.goog "${UCM}" --type='json' -p='[{"op": "replace", "path": "/spec/vmNodeImage", "value": '"${OS_VERSION}"'}]'
      done
    虚拟机 1.12.1
    1.12.2
    1.12.4

    BYO 映像导入对于 qcow2 和原始映像失败

    症状

    使用 gdcloud compute images import CLI 导入本地虚拟机映像时,导入状态停留在 WaitingForTranslationVMImportJobNotCreated。这是因为为转换或导入创建的临时磁盘使用与 qcow2 或原始映像完全相同的尺寸,但 LUKS 会增加几 MiB 的开销,从而导致磁盘配置失败。

    临时解决方法:

    手动创建一个新的 VirtualMachineImageImport,该 VirtualMachineImageImport 具有相同的映像名称,但 spec.minimumDiskSize 更大。例如,如果用于导入映像的命令如下:

    gdcloud compute images import $IMPORT_NAME --project $PROJECT --source-file=$LOCAL_FILENAME --os=$OS

    如果 CLI 自动创建的原始 VirtualMachineImageImport 具有 minimumDiskSize(以 Gi 为单位)的容量,请创建一个容量为 X+1 Gi 的新 VirtualMachineImageImport。该值取决于要导入的图片的大小。对于 qcow2,它将是虚拟大小,例如 20Gi 应替换为 21Gi。

    根据调用 CLI 的方式替换占位值。

    1. 查找 VirtualMachineImageImport
      kubectl get virtualmachineimageimport $IMPORT_NAME -n $PROJECT -o yaml

      如果该对象不存在,请再次触发 gdcloud compute images import ... 命令。当控制台输出从 Uploading image to ... 变为 Image import has started for ... 后,按 CTRL + C,以便将本地映像上传到对象存储空间,并保留 VirtualMachineImageImport 以供参考,从而创建新的 VirtualMachineImageImport

    2. 创建具有更大 minimumDiskSize 的新 VirtualMachineImageImport
      apiVersion: virtualmachine.gdc.goog/v1
      kind: VirtualMachineImageImport
      metadata:
        name: $IMPORT_NAME_NEW
        namespace: $NAMESPACE
      spec:
        imageMetadata:
          minimumDiskSize: $NEW_SIZE
          name: $IMAGE_NAME
          operatingSystem: $OS
        source:
           objectStorage:
            bucketRef:
              name: vm-images-bucket
            objectName: $LOCAL_FILENAME
    虚拟机 1.12.0
    1.12.1
    1.12.2
    1.12.3

    映像导入卡在 TranslationInProgress 状态

    症状

    系统集群的项目命名空间中的 importer-image-import-$VMII pod 崩溃,并显示以下错误:Unable to process data: Unable to transfer source data to target file: unable to write to file: stream error: stream ID 1; NO_ERROR; received from peer`)。在启动导入 2 小时后,VirtualMachineImageImport VMII 对象的条件类型为 Ready,状态为 False,原因是 TranslationInProgress

    临时解决方法:

    为了提高速度,请将映像的最小磁盘大小修改为 200Gi,如下所示:

    kubectl get validatingwebhookconfiguration vmm-image-controller-v1-webhook -oyaml > /tmp/vmm-image-controller-v1-webhook.yaml
    kubectl delete validatingwebhookconfiguration vmm-image-controller-v1-webhook
    kubectl patch virtualmachineimageimport $VMII -n $PROJECT -p '{"spec": {"imageMetadata": {"minimumDiskSize": "200Gi"}}}'
    kubectl apply -f /tmp/vmm-image-controller-v1-webhook.yaml

    请注意,如需删除并应用 ValidatingWebhookConfiguration,您需要组织管理员集群的集群管理员 kubeconfig。您可以获取以下操作手册 IAM-R0004

    如果您使用 gdcloud 开始导入,请注意,您无法提供 minimumDiskSize 参数。您必须创建一个 VMII 对象,并按照上一个命令所示修改该 VMII。

    VirtualMachineImageImport 流程继续进行,但在后续步骤中再次卡住。在系统集群的项目命名空间中,您会看到 image-import-$VMII 作业持续失败,并显示错误:error: stream error: stream ID x; NO_ERROR; received from peer。此时,图片导入完成。最终图片会上传到对象存储空间,但缺少 VirtualMachineImage。您可以按如下方式手动创建 VirtualMachineImage

    kubectl apply -f - <<EOF
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineImage
    metadata:
      name: $NAME
      namespace: $PROJECT
    spec:
      minimumDiskSize: 200Gi
      operatingSystem:
        name: $OS_NAME
    EOF

    `$NAME` 应与 `VMII.ImageMetadata.Name` 匹配,`$OS_NAME` 可以是 [`ubuntu-2004`、`ubuntu-2204`、`windows-2019`、`rhel-8`] 之一,并且应与导入的映像的类型匹配。

    Istio 1.12.4

    istio-system 命名空间中的 istio-eastwestgateway 部署卡住

    症状

    istio-system 命名空间中的 istio-eastwestgateway 部署卡住了,pod 事件显示来自 kubeletBack-off pulling image "auto" 错误。

    如需诊断问题,请检查名为 mutatingwebhookconfigurationistio-revision-tag-default 是否与卡住的网关部署位于同一集群中。

    kubectl --kubeconfig=KUBECONFIG get mutatingwebhookconfiguration istio-revision-tag-default

    临时解决方法:

    • 如果配置存在,请重启 istio-system 命名空间中的部署 istio-eastwestgateway
      kubectl --kubeconfig=KUBECONFIG rollout restart deployment/istio-eastwestgateway -n istio-system
    • 如果配置不存在,请等待 webhook 存在,这应该很快就会发生,因为 webhook 处于协调循环中。
    监控 1.12.2

    cortex-store-gateway 重启并出现切片边界超出范围的错误

    症状

    cortex-store-gateway Pod 重新启动,并在日志中显示以下错误消息:

    panic: runtime error: slice bounds out of range

    临时解决方法:

    1. 暂停系统集群中的 mon-cortex 子组件。
      kubectl --kubeconfig $ORG_ADMIN_CONFIG annotate subcomponent mon-cortex -n $SYSTEM_CLUSTER_NAMESPACE lcm.private.gdc.goog/paused=true
    2. 修改系统集群中的 cortex-config configMap,并将 index_cache 中 memcached 的超时时间设置为 2 秒,以便 index_cache 配置如下所示:
       index_cache:
            backend: memcached
            memcached:
              addresses: dnssrvnoa+_memcached._tcp.cortex-index-memcached.mon-system.svc.cluster.local
              timeout: 2s
    3. 重启系统集群中的 cortex-store-gateway pod,以便它们使用更新后的配置。
    升级 1.12.4

    升级期间根管理员节点重新启动会导致子组件故障

    症状

    裸机节点显示为 NotReady,服务器卡在启动界面,最后一条消息显示为 Retrieving encryption keys

    临时解决方法:

    1. 重启 iLO。
    2. iLO 恢复运行后,重新启动服务器。
    升级 1.12.4

    升级期间不显示 storagecluster 的版本号

    症状

    升级后,StorageCluster CR 的 StorageVersion 状态字段不显示任何值。查看版本:

    kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG get StorageCluster -n gpc-system
    如果版本字段为空,请按照解决方法中的步骤操作。

    临时解决方法:

    重启 file-storage-backend-controller 部署:

    kubectl --kubeconfig  ROOT_ADMIN_KUBECONFIG rollout restart deployment -n file-system file-storage-backend-controller

    Operations Suite Infrastructure (OI) 1.12.4

    Fluent Bit 安装程序路径不正确

    症状

    fluent-bit 安装程序位置已更改为 operations_center\bin\fluent-bit-win64.msiCopy-ConfigHostFiles.ps1 要求客户端安装程序与 fluent-bit-*-win64.* 模式匹配。 fluent-bit安装程序无法找到安装程序,因为该模式不再匹配。

    临时解决方法:

    1. 打开 Copy-ConfigHostFiles.ps1 文件。
    2. 找到以下行:
      $(Get-Item -Path 'H:\operations_center\bin\fluent-bit-*-win64.*').FullName
    3. 修改上一行,添加正确的安装程序位置:
      $(Get-Item -Path 'H:\operations_center\bin\fluent-bit-win64.*').Name
    Operations Suite Infrastructure (OI) 1.12.4

    Nessus 安装程序路径不正确

    症状

    Nessus 安装程序位置已更改为 operations_center\bin\NessusAgent-x64.msiCopy-ConfigHostFiles.ps1 要求客户端安装程序与 /NessusAgent-10.4.1-x64.msi 文件名匹配。 安装程序无法找到安装程序,因为该模式不再匹配。

    临时解决方法:

    1. 打开 Copy-ConfigHostFiles.ps1 文件。
    2. 找到以下代码行:
      [pscustomobject]@{source = "H:\operations_center\bin\Nessus-10.4.1-x64.msi"; destination = "C:\config\nessus_mgr\Nessus-10.4.1-x64.msi" }
      [pscustomobject]@{source = "H:\operations_center\bin\Nessus-10.4.1-x64.msi"; destination = "C:\config\nessus_oob\Nessus-10.4.1-x64.msi" }
    3. 修改上述行,添加正确的安装程序位置,将 Nessus-10.4.1-x64.msi 更改为 NessusAgent-x64.msi
      [pscustomobject]@{source = "H:\operations_center\bin\NessusAgent-x64.msi"; destination = "C:\config\nessus_mgr\NessusAgent-x64.msi" }
      [pscustomobject]@{source = "H:\operations_center\bin\NessusAgent-x64.msi"; destination = "C:\config\nessus_oob\NessusAgent-x64.msi" }
    对象存储 1.12.4

    创建新组织时卡在 VMImageDistributing 状态

    症状

    您可能会看到类似如下内容的消息:

    Reason:                NamespaceCreated
    Status:                True
    Type:                  ObjectNamespaceReady
    Last Transition Time:  2024-07-12T00:49:29Z
    Message:               awaiting images distribution to be finished
    Observed Generation:   1
    Reason:                VMImageDistributing
    Status:                Unknown
    Type:                  Ready  

    此问题是由新组织的 S3 端点配置缺失导致的。

    临时解决方法:

    为新组织手动创建高可用性群组。

    1. 通过紧急情况处理程序,获取对以下资源具有读取权限的根管理员集群的 kubeconfig:
      • 组织
      • ObjectStorageAdminNode
      • SubnetClaim
      • ObjectStorageSite
      • Secret
    2. 记下组织名称:
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get Organization -A
    3. 记下根管理员集群中 ObjectStorageAdminNode CR 的客户端 IP 地址。
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get ObjectStorageAdminNode

      对于每个 AdminNode CR:

      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get ObjectStorageAdminNode NODE_NAME -o jsonpath='{.spec.network.clientIP}'
    4. 记下可用 IP 地址范围以及该范围内的预留 IP:
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get SubnetClaim -n root external-objectstorage-client-lif-subnet -o jsonpath='{.status.ipv4SubnetStatus}'
    5. 从根管理员集群中的 gpc-system/objectstorage-breakglass-root-level1 secret 中提取 StorageGRID 管理界面登录凭据。
    6. 使用上一步中的凭据登录 StorageGRID 管理界面。网址处于 ObjectStorageSite 状态:
      kubectl --kubeconfig /root/release/root-admin/root-admin-kubeconfig get ObjectStorageSite -n gpc-system mb-obj-site-1 -o jsonpath='{.status.managementAPIEndpointURL}'
    7. 前往配置标签页,然后点击高可用性群组
    8. 打开每个 HA 组的详细视图,并记下其虚拟 IP 地址 (VIP)。
    9. 创建新的 HA 群组:
      1. 群组名称:名称格式为 ORGANIZATION_NAME-ha。在本例中,该值为 org-2-ha
      2. 群组说明:使用现有的 HA 群组作为说明模式。
      3. 接口:选择所有 eth2
      4. 优先级顺序:主接口应具有最高优先级。
      5. SubnetCIDR:此字段由 StorageGRID 自动填充。 验证子网是否与 SubnetClaim external-objectstorage-client-lif-cidr 中的 status.ipv4SubnetStatus.cidrBlock 相匹配。
      6. 虚拟 IP:可用 IP 范围中的下一个 IP。该 IP 不能与预留 IP、管理员节点的客户端 IP 和现有 HA 组的 VIP 冲突。
    10. 轮替 StorageGRID 紧急情况凭据。
    升级 1.12.4

    子组件中的持续协调

    症状

    将根组织从 1.12.2 升级到 1.12.4 时,iac-gitlab 子组件处于持续协调状态。如需诊断问题,请检查 Prometheus 日志,例如:

    kubectl logs gitlab-prometheus-server-5d6d9599f-l2l7s -n gitlab-system -c prometheus-server

    日志可能包含如下错误:

    unexpected fault address 0x7f217cf26000
    fatal error: fault
    [signal SIGBUS: bus error code=0x2 addr=0x7f217cf26000 pc=0x46c302]
    
    goroutine 1 [running]:
    runtime.throw({0x3018bed?, 0x0?})
        /usr/local/go/src/runtime/panic.go:992 +0x71 fp=0xc000a3b098 sp=0xc000a3b068 pc=0x438431

    临时解决方法:

    1. 执行 sleep 3600 以在运行中的容器中获取 shell,例如。
      kubectl exec --stdin --tty POD_NAME -n gitlab-system -c prometheus-server -- /bin/sh
      /prometheus $ df -h

      POD_NAME 替换为 pod 的名称,例如 gitlab-prometheus-server-d7969c968-hppsl

    2. 检查输出,看看 /data 文件夹是否已满:
      Filesystem                Size      Used Available Use% Mounted on
      overlay                 866.4G    147.1G    719.3G  17% /
      tmpfs                    64.0M         0     64.0M   0% /dev
      tmpfs                    94.3G         0     94.3G   0% /sys/fs/cgroup/dev/mapper/luks-trident_pvc_6fb4dc48_72df_4bf1_825f_267818e3fefd
                                7.8G      7.3G         0 100% /data
    3. 如果升级期间出现此问题,请删除迁移作业(因为该作业的超时时间为 3600 秒),然后继续升级:
      kubectl delete job gitlab-migrations-1-fe7-2 -n gitlab-system
    升级 1.12.4

    IAM 预检检查失败

    症状

    如需诊断问题,请检查 IAM 升级日志,例如:

    kubectl logs -n gpc-system upgrade-managed-check-iamupgrade-qbdm5-tl264 

    输出可能如下所示:

    I0724 21:57:20.456782       1 upgrade_check.go:39] IAM preflight check failed after 60000000000: Org iam-system deployments not ready: Deployment iam-authzpdp-backend-server is not ready; ready replicas 2,replicas 3

    临时解决方法:

    1. 请参阅之前的错误消息,并记下部署的命名空间和名称。在此示例中,NAMEiam-authzpdp-backend-serverNAMESPACEiam-system
    2. 获取 Pod 列表:
      kubectl get pods -n NAMESPACE | grep NAME
    3. 请注意,结果采用以下格式:
      iam-authzpdp-backend-server-6875654c4b-64h4t            2/2     Running   0             29h
      iam-authzpdp-backend-server-6875654c4b-pvscg            1/2     Running   0             29h
      iam-authzpdp-backend-server-6875654c4b-v7jnl            2/2     Running   0             29h

      记下未准备好所有容器的 pod。在这种情况下,POD_NAMEiam-authzpdp-backend-server-6875654c4b-pvscg,其中一个容器未就绪,以 1/2 状态表示。如果存在多个此类 pod,请针对每个受影响的 pod 重复执行下一步。

    4. 删除健康状况不佳的 pod:
      kubectl delete pod -n NAMESPACE POD_NAME>
    5. 再次运行第 2 步中的命令。请注意,现在所有 pod 都应处于正常运行状态。此步骤可能需要几分钟时间。
    6. 如果被删除的 pod 未被健康 pod 替换,请提交支持服务工单。
    升级 1.12.1
    1.12.2
    1.12.4

    OrganizationUpgrade 状态为 Unknown

    症状

    升级完成后,OrganizationUpgrade 状态为 Unknown

    临时解决方法:

    如果 Organization 上的版本字段与 targetVersion 字段匹配,则可以放心地忽略“未知”状态。

    升级 1.12.4

    opa gatekeeper 的子组件升级失败

    症状

    在租户组织从 1.12.2 升级到 1.12.4 期间,opa gatekeeper 子组件升级失败,并显示 ReconciliationError

    临时解决方法:

    1. 修改受影响的用户集群的 mutatingwebhookconfiguration 对象 edr-sidecar-injector-webhook-cfg。如果有多个受影响的用户集群,请为每个受影响的用户集群重复执行以下步骤:
           kubectl edit mutatingwebhookconfiguration edr-sidecar-injector-webhook-cfg
    2. 修改 webhooks > (edr-sidecar-injector.gpc-system.internal) > namespaceSelector > matchExpressions > (key: kubernetes.io/metadata.name) > values 部分,向其中添加以下两个值:
      • opa-system
      • cert-manager

      更新后的对象应如下所示:

                  apiVersion: admissionregistration.k8s.io/v1
              kind: MutatingWebhookConfiguration
              ...
              webhooks:
              - admissionReviewVersions:
                name: edr-sidecar-injector.gpc-system.internal
                namespaceSelector:
                  matchExpressions:
                  - key: kubernetes.io/metadata.name
                    operator: NotIn
                    values:
                    - kube-system
                    - opa-system
                    - cert-manager
              ...

    3. 这些更改可能需要长达 1 小时才能解决问题。
    升级 1.12.4

    ansibleplaybook 不会作为集群升级的一部分进行升级

    症状

    从 1.12.2 升级到 1.12.4 时,ansibleplaybook 不会作为集群升级的一部分进行升级。ansibleplaybook 中更新的修复程序未应用,并阻止运行旧版 ansibleplaybook 的操作系统政策。

    临时解决方法:

    1. 删除 create-ansible-playbooks Kubernetes 作业:
            JOB_NAME=create-ansible-playbooks-xxx
            JOB_NAMESPACE=xxx
            kubectl delete job $JOB_NAME -n JOB_NAMESPACE --kubeconfig=/path/to/admin-cluster-config 
    2. 重启 os-core-controller 部署。
    3. 此操作会重新触发作业并更新 playbook。
    DNS 1.12.4

    组织创建失败,因为发送到根管理员节点的 DNS 流量超时

    症状

    创建新组织时,您可能会在日志中看到 core-dns 子组件超时:

    [INFO] 192.0.2.0:60741 - 40400 "A IN objectstorage-tenant-mgmt.gdch.example.com. udp 72 false 1232" - - 0 2.000828817s
    [ERROR] plugin/errors: 2 objectstorage-tenant-mgmt.gdch.example.com. A: read udp 10.244.4.184:59927->192.0.2.1:53: i/o timeout
    [INFO] 192.0.2.0:51401 - 5813 "AAAA IN objectstorage-tenant-mgmt.gdch.example.com. udp 72 false 1232" - - 0 2.000585231s
    [ERROR] plugin/errors: 2 objectstorage-tenant-mgmt.gdch.example.com. AAAA: read udp 10.244.4.184:48542->192.0.2.1:53: i/o timeout

    临时解决方法:

    1. 更新根管理员集群的 gpc-coredns-forwarder-udp 服务和 gpc-coredns-forwarder-tcp 服务,并在负载均衡器源范围中添加新的 IP 地址范围。
    2. 如果 CR 更改被覆盖,请使用注解 lcm.private.gdc.goog/paused="true" 暂停 dns-core 子组件。
    文件存储和块存储 1.12.4

    根集群上的 file-netapp-trident 子组件失败

    症状

    从 1.12.2 升级到 1.12.4 时,file-netapp-trident 子组件卡在 StorageClasses 的删除上。系统会显示以下状态:

          status:
      backendStatus:
        conditions:
        - lastTransitionTime: "2024-05-02T06:04:14Z"
          message: 'E0121 - rollback chart: no StorageClass with the name "standard-rwo-non-luks"
            found'
          observedGeneration: 2
          reason: ReconciliationError
          status: "True"
          type: Reconciling
        - lastTransitionTime: "2024-04-08T00:12:53Z"
          message: Successfully pulled chart
          observedGeneration: 2
          reason: ChartPullDone
          status: "True"
          type: ChartPull
        - lastTransitionTime: "2024-05-01T10:10:08Z"
          message: Fetched parameters from default, runtime
          observedGeneration: 2
          reason: ParametersDone
          status: "True"
          type: Parameters
        - lastTransitionTime: "2024-05-02T06:04:04Z"
          message: 'E0121 - rollback chart: no StorageClass with the name "standard-rwo-non-luks"
            found'
          observedGeneration: 2
          reason: DeployError
          status: "False"
          type: Deployed
        - lastTransitionTime: "2024-04-23T06:50:12Z"
          message: Readiness check job passed
          observedGeneration: 1
          reason: ReadinessCheckDone
          status: "True"
          type: Ready
        deploymentFinished: false
        lastDeployTimestamp: "2024-05-02T06:03:16Z"
        readyAfterDeploy: true
        version: ""
      conditions:
      - lastTransitionTime: "2024-05-02T06:04:14Z"
        message: 'Reconciliation error: E0121 - rollback chart: no StorageClass with the
          name "standard-rwo-non-luks" found'
        observedGeneration: 2
        reason: ReconciliationError
        status: "True"
        type: Reconciling
      crdsStatus:
        conditions:
        - lastTransitionTime: "2024-04-07T08:02:33Z"
          message: Successfully pulled chart
          observedGeneration: 2
          reason: ChartPullDone
          status: "True"
          type: ChartPull
        - lastTransitionTime: "2024-04-07T08:02:33Z"
          message: No parameters to fetch
          observedGeneration: 2
          reason: ParametersDone
          status: "True"
          type: Parameters
        - lastTransitionTime: "2024-04-07T08:02:34Z"
          message: Readiness source is empty
          observedGeneration: 2
          reason: ReadinessCheckSkipped
          status: "True"
          type: Ready
        - lastTransitionTime: "2024-05-01T18:37:52Z"
          message: Ready
          observedGeneration: 2
          reason: ReconciliationCompleted
          status: "False"
          type: Reconciling
        deploymentFinished: true
        lastDeployTimestamp: "2024-05-02T06:04:03Z"
        readyAfterDeploy: true
        version: 1.12.3-gdch.312

    临时解决方法:

    1. 暂停 file-netapp-trident 子组件:
            ## Set KUBECONFIG to root-admin KUBECONFIG
            export KUBECONFIG=ROOT_ADMIN_KUBECONFIG
            kubectl annotate subcomponent file-netapp-trident -n $cluster_namespace lcm.private.gdc.goog/paused=true
    2. 删除作业未能创建的 StorageClasses,例如 standard-rwostandard-blockstandard-rwo-non-luksstandard-block-non-luks
            kubectl delete storageclass $(kubectl get storageclasses -o jsonpath='{.items[?(@.provisioner=="csi.trident.netapp.io")].metadata.name}
    3. 通过为集群重启 oclcm-backend-controller(根管理员集群和组织管理员集群的根管理员控制器,系统集群和用户集群的组织管理员控制器),触发 StorageClasses 的重新创建:
            kubectl rollout restart deployment oclcm-cm-backend-controller -n oclcm-system
    4. 重启集群中的 netapp-trident 部署和 netapp-trident DaemonSet
            kubectl rollout restart deployment netapp-trident-controller -n netapp-trident
            kubectl rollout restart daemonset netapp-trident-node-linux -n netapp-trident
    5. 验证是否已为您的 PersistentVolumeClaim (PVC) 资源创建 LUKS Secret。每个 PVC 都必须有一个格式为 g-luks-$pvc_name 的 Secret。
            kubectl get secret -n $pvc_namespace g-luks-$pvc_name
    6. 验证 file-netapp-trident 子组件的状态是否没有错误:
            kubectl get subcomponent -n $cluster_namespace file-netapp-trident -o jsonpath='{.status}' | jq
      注意:消息和 `backendStatus` 中不得有任何错误。`crdStatus` 应显示 `delpoymentFinished: true`
    7. 取消暂停子组件,以使替换生效。
    物理服务器 1.12.4

    服务器启动失败

    症状

    在引导服务器时,您可能会在裸机日志中看到类似如下的消息:

    Conditions:
        Last Transition Time:  2024-08-12T17:10:23Z
        Message:               Introspection timeout
        Observed Generation:   2
        Reason:                FailedProvision
        Status:                True
        Type:                  BaremetalFailure
        Last Transition Time:  2024-08-10T12:23:30Z
        Message:
        Observed Generation:   2
        Reason:                KeyManagerConfigurationSucceeded
        Status:                True
        Type:                  KeyManagerConfigured
        Last Transition Time:  2024-08-10T12:11:17Z
        Message:               The server is powered off or unknown
        Observed Generation:   2
        Reason:                NotPoweredOn
        Status:                False
        Type:                  Ready

    临时解决方法:

    1. 对于每个卡住的阶段,请按照以下运行手册中的说明操作:
      1. SERV-R0006
      2. SERV-R0007
      3. SERV-R0008
    2. 如果问题仍未解决,请按照 SERV-R0001 运行手册中的步骤操作。
    3. 如果问题仍未解决,请提交支持服务工单。
    升级 1.12.0
    1.12.1
    1.12.2
    1.12.4

    升级期间未清理主 Prometheus pod

    症状

    primary-prometheus-shardX-replicaX pod 在 obs-system 命名空间和 mon-system 命名空间中均可见。如果升级到 1.12 后,primary-prometheus-shardX-replicaX 仅存在于 obs-system 命名空间中,则表示存在其他未知问题,不应执行此解决方法。

    预期行为是,在 1.12 升级完成后,primary-prometheus-shardX-replicaX 仅存在于 mon-system 命名空间中。

    临时解决方法:

    1. 手动删除 obs-system 命名空间中的 primary-prometheus-shardX-replicaX StatefulSet。
    2. 请勿删除 mon-system 命名空间中的 primary-prometheus-shardX-replicaX StatefulSet。
    网络 1.12.4

    即使已创建 ClusterCIDRConfigPodCIDR 也未分配给节点

    症状

    ClusterCIDRConfig 是分配 PodCIDRs 所需的对象。尽管已创建 ClusterCIDRConfig,但未分配 PodCIDRs。如果 ClusterCIDRConfig 是在 ipam-controller Pod 启动时创建的,就会出现此问题。集群创建卡在协调状态:

    1. 检查是否已在集群上创建 ClusterCIDRConfig 对象:
      kubectl --kubeconfig=CLUSTER_KUBECONFIG get clustercidrconfigs -oyaml

      输出可能如下所示:

      apiVersion: v1
          items:
          - apiVersion: networking.gke.io/v1alpha1
            kind: ClusterCIDRConfig
            metadata:
              annotations:
                baremetal.cluster.gke.io/managed: "true"
                kubectl.kubernetes.io/last-applied-configuration: |
                  {"apiVersion":"networking.gke.io/v1alpha1","kind":"ClusterCIDRConfig","metadata":{"annotations":{"baremetal.cluster.gke.io/managed":"true"},"creationTimestamp":null,"name":"root-admin-control-plane"},"spec":{"ipv4":{"cidr":"172.24.0.0/21","perNodeMaskSize":23},"ipv6":{"cidr":"fd00:1::2:0/112","perNodeMaskSize":119}},"status":{}}
              creationTimestamp: "2024-06-17T05:27:55Z"
              finalizers:
              - networking.kubernetes.io/cluster-cidr-config-finalizer
              generation: 1
              name: root-admin-control-plane
              resourceVersion: "2172"
              uid: d1216fe3-04ed-4356-a105-170d72d56c90
            spec:
              ipv4:
                cidr: 172.24.0.0/21
                perNodeMaskSize: 23
              ipv6:
                cidr: fd00:1::2:0/112
                perNodeMaskSize: 119
          kind: List
          metadata:
            resourceVersion: ""
    2. 针对卡在调和状态的集群运行其中一个节点对象的 describe 命令,并检查节点对象上是否存在 CIDRNotAvailable 事件:
      kubectl --kubeconfig=CLUSTER_KUBECONFIG describe node NODE_NAME

      输出事件可能如下所示:

      Type     Reason            Age                   From             Message
            ----     ------            ----                  ----             -------
            Normal   CIDRNotAvailable  3m22s (x96 over 21h)  cidrAllocator    Node gpc-adhoc-4f533d50vm-worker-node2-zone1 status is now: CIDRNotAvailable
            Warning  ReconcileError    3m22s (x96 over 21h)  ipam-controller  CIDRAssignmentFailed, retrying: failed to get cidrs for node gpc-adhoc-4f533d50vm-worker-node2-zone1, unable to get clusterCIDRs for node gpc-adhoc-4f533d50vm-worker-node2-zone1, no available CIDRs

    临时解决方法:

    1. 重启 ipam-controller-manager pod:
      kubectl --kubeconfig=CLUSTER_KUBECONFIG -n kube-system rollout restart ds ipam-controller-manager
    2. ipam-controller-manager pod 处于运行状态后,检查 podCIDR 是否已分配给节点:
      kubectl --kubeconfig=CLUSTER_KUBECONFIG get nodes -oyaml | grep podCIDR

      输出可能如下所示:

      podCIDR: 172.24.4.0/23
          podCIDRs:
          podCIDR: 172.24.2.0/23
          podCIDRs:
          podCIDR: 172.24.0.0/23
          podCIDRs:
    Vertex AI 1.12.0
    1.12.1
    1.12.2
    1.12.4

    预训练的 API 在界面中显示 Enabling 状态

    MonitoringTarget 在创建用户集群时显示 Not Ready 状态,导致预训练的 API 在界面中持续显示 Enabling 状态。

    临时解决方法:

    1. 打开 Chrome 浏览器中的菜单(三点状图标)。
    2. 依次点击更多工具 > 开发者工具,打开控制台。
    3. 点击控制台中的网络标签页。
    4. 找到 ai-service-status 请求。
    5. 点击 ai-service-status 请求中的响应标签页,以显示相应请求的内容。
    6. 验证除 MonitoringTargetLoggingTarget 组件之外的所有组件是否都已准备就绪。
    对象存储 1.12.4

    可以忽略部分对象存储升级警告

    症状

    升级对象存储时,您可能会看到如下警告:

     Type     Reason          Age                From                              Message
      ----     ------          ----               ----                              -------
      Warning  ReconcileError  55m (x2 over 55m)  ObjectStorageAdminNodeReconciler  Reconcile error, retrying: error storing the ssh creds: 500 Internal Server Error:ErrorMessage: {"text":"The GDU service is currently busy. Try again later. Contact technical support if the issue persists.","key":"maintenance.gdu.gdu_server_locked

    临时解决方法:

    1. 检查每个节点是否都有存储在 Secret 中的相应 SSH 凭据。
      1. 检查管理员节点:
        kubectl get objectstorageadminnodes -o json | jq -r '.items[].metadata.name' | while read -r nodeName; do kubectl get secret -n gpc-system $nodeName-ssh-creds; done
      2. 检查存储节点:
        kubectl get objectstoragestoragenodes -o json | jq -r '.items[].metadata.name' | while read -r nodeName; do kubectl get secret -n gpc-system $nodeName-ssh-creds; done

      成功输出如下所示(以存储节点为例):

      NAME                                      TYPE     DATA   AGE
      gpcstgecn01-gce-gpcstgesite01-ssh-creds   Opaque   2      3d23h
      NAME                                      TYPE     DATA   AGE
      gpcstgecn02-gce-gpcstgesite01-ssh-creds   Opaque   2      3d23h
      NAME                                      TYPE     DATA   AGE
      gpcstgecn03-gce-gpcstgesite01-ssh-creds   Opaque   2      3d23h

      如果未找到 Secret,则会显示如下所示的错误:

      Error from server (NotFound): secrets "gpcstgeadm02-gce-gpcstgesite01-ssh-creds" not found
    2. 如果该命令未返回任何错误,您可以放心地忽略协调器报告的错误。
    Vertex AI 1.11.x
    1.12.x

    翻译前端 pod 和服务无法初始化

    症状

    在升级期间,系统会重新创建 Translation DB 集群,这会导致 ODS 系统集群 secret-store Secret 过时并处于不同步状态。因此,翻译前端 pod 和服务无法完成初始化。

    临时解决方法:

    删除系统集群中的 Secret:

    kubectl --kubeconfig SYSTEM_CLUSTER_KUBECONFIG delete secret postgres-secret-store -n ai-translation-system

    SYSTEM_CLUSTER_KUBECONFIG 替换为系统集群中 kubeconfig 文件的路径。

    控制器会自动重新创建 Secret,并将其与数据库集群重新同步。

    物理服务器 1.12.4

    服务器无法连接到密钥管理器

    症状

    服务器无法连接到密钥管理器,导致服务器状态无法变为可用状态。此问题会导致 server-encrypt-and-create-logical-drive 作业失败,并且管理员集群无法就绪。您可能会在作业日志中看到如下错误:

    Error: Error during command execution: ansible-playbook error: one or more host failed
    Command executed: /usr/local/bin/ansible-playbook --extra-vars {"server_generation":"gen10","ssa_crypto_pwd":"vf{kXgbL?VFcV]%0","ssa_master_key":"ten-admin-org-2"} --inventory 192.0.2.0, --private-key /etc/ssh-key/id_rsa --become serve
    r/encrypt_and_create_logical_drive.yaml
    exit status 2   

    临时解决方法:

    执行 AuxCycle 并检查 iLO 是否可以连接到密钥管理器。

    日志记录 1.12.4

    预写式日志填满了永久性卷

    症状

    Loki 只有一个永久性卷 (PV),用于预写式日志 (WAL) 和索引。如果 Loki pod 无法连接到存储桶长达数小时,WAL 可能会填满 PV。如果 PV 没有剩余空间,除非您删除 PV 并重启 StatefulSet,否则 Loki 无法恢复。

    临时解决方法:

    如需从这种状态恢复 Loki pod,您必须缩减相应 StatefulSet 的规模,并删除剩余空间为零的 PV。

    请按照以下步骤恢复 Loki pod:

    1. 确保工作站上已安装 IO 工具容器。如需了解详情,请参阅 OOPS-P0065 操作手册。
    2. 如需获得修改资源所需的权限,请让 Security Admin 为您授予以下角色:
      • observability-viewer
      • observability-admin
    3. 使用根管理员集群中 kubeconfig 文件的路径设置 KUBECONFIG 环境变量。如需了解详情,请参阅 IAM-R0004 运行手册。
    4. ORG_NAME 环境变量设置为受影响组织的名称。
    5. 将以下内容保存到名为 log-admin-overrides.yaml 的 YAML 文件中:
      apiVersion: lcm.private.gdc.goog/v1
      kind: SubcomponentOverride
      metadata:
        name: log-admin-overrides
      spec:
        subComponentRef: log-admin
        backend:
          operableParameters:
            controller:
              disableReconcilers: "LoggingPipelineReconciler"
    6. 停用 LoggingPipelineReconciler
      kubectl apply -f log-admin-overrides.yaml -n ${ORG_NAME}
    7. 使用受影响的 Loki pod 运行所在的集群中 kubeconfig 文件的路径设置 KUBECONFIG 环境变量。如需了解详情,请参阅 IAM-R0004 运行手册。
    8. LOKI_POD_NAME 环境变量设置为受影响的 Loki pod 的名称。
    9. 获取 Loki StatefulSet 名称:
      export LOKI_STATEFULSET_NAME=$(kubectl get pod $LOKI_POD_NAME -n obs-system -o json | jq -r '.metadata.labels.app')
    10. 获取 Loki PVC 名称:
      export LOKI_PVC_NAME=$(kubectl get pod $LOKI_POD_NAME -n obs-system -o json | jq -r '.spec.volumes[] | select(.persistentVolumeClaim != null) | .persistentVolumeClaim.claimName')
    11. 获取 Loki StatefulSet 副本:
      export LOKI_STATEFULSET_REPLICAS=$(kubectl get statefulset $LOKI_STATEFULSET_NAME -n obs-system -o json | jq -r '.status.replicas')
    12. 缩减 Loki StatefulSet
      kubectl scale statefulset $LOKI_STATEFULSET_NAME -n obs-system --replicas=0
    13. 验证没有 StatefulSet pod 正在运行:
      kubectl get statefulset $LOKI_STATEFULSET_NAME -n obs-system

      输出必须如下例所示:

      NAME                      READY   AGE
      audit-logs-loki-io        0/0     4d3h
    14. 删除受影响的 PVC:
      kubectl delete pvc $LOKI_PVC_NAME -n obs-system
    15. 扩容 Loki StatefulSet
      kubectl scale statefulset $LOKI_STATEFULSET_NAME -n obs-system --replicas=${LOKI_STATEFULSET_REPLICAS}
    16. 使用受影响组织的管理员集群中 kubeconfig 文件的路径设置 KUBECONFIG 环境变量。如需了解详情,请参阅 IAM-R0004 运行手册。
    17. 按如下方式修改 log-admin-overrides.yaml YAML 文件中的内容:
      apiVersion: lcm.private.gdc.goog/v1
      kind: SubcomponentOverride
      metadata:
        name: log-admin-overrides
        namespace: root
      spec:
        subComponentRef: log-admin
        backend:
          operableParameters:
            controller:
              disableReconcilers: ""
    18. 启用 LoggingPipelineReconciler
      kubectl apply -f log-admin-overrides.yaml -n ${ORG_NAME}
    19. 验证所有 StatefulSet pod 是否正在运行且运行状况良好:
      kubectl get statefulset $LOKI_STATEFULSET_NAME -n obs-system

      输出必须如下例所示:

      NAME                 READY   AGE
      audit-logs-loki-io   5/5     2d5h

      在本例中,StatefulSet 有 5 个副本,其中 5 个 (5/5) 可用。

    升级 1.12.4

    作业会持续安排

    症状

    作业会持续安排。作业一终止,系统就会安排新作业。持续调度的作业包括:

    • unet-networkpolicy-assets-parameter
    • unet-nodenetworkpolicy-assets-parameter
    • unet-nodenetworkpolicy-assets-readiness
    • unet-userclusterpolicy-assets-parameter
    • unet-clustermesh-backend-parameter
    • unet-clustermesh-backend-readiness

    临时解决方法:

    1. 暂停以下子组件:
      • unet-networkpolicy
      • unet-nodenetworkpolicy
      • unet-nodenetworkpolicy
      • unet-userclusterpolicy
      • unet-clustermesh
    2. 每当根管理员集群中的 fleet-info Secret 发生更改时,取消暂停子组件。当实例的管理交换机发生更改(例如 kr get managementswitches -A)或组织命名空间中的任何 cidrclaim 发生更改时,就会出现此问题。
    3. 每当组织管理员集群中的任何 NodePool 资源发生更改时,都会取消暂停子组件。在开始之前,请先取消暂停子组件。
    升级 1.12.4

    没有可用的 ServiceNow 健康上游

    症状

    1. 从 1.12.2 版升级到 1.12.4 版时,没有可用的 ServiceNow 正常上游。您可能会看到以下消息:failed to stage volume: LUKS passphrase cannot be empty
    2. 未为 LUKS 启用 system-performance-rwo 存储类别。卷附件表明 PVC 已启用 LUKS。
    3. 协调器会搜索包含 LUKS 口令的 Secret。由于卷附件表明已启用 LUKS,而存储类未启用 LUKS,因此不会创建密钥口令。

    临时解决方法:

    1. 获取出现问题的根集群或组织管理员集群的 Kubeconfig
            export KUBECONFIG=${ROOT_OR_ORG_ADMIN_KUBECONFIG}
    2. 删除 system-performance-rwo 存储类并重新创建:
            kubectl delete storageclass system-performance-rwo
            kubectl apply -f system-performance-rwo.yaml
    3. system-performance-rwo 存储类创建新的 YAML 并启用 LUKS:
                 # kubectl get sc system-performance-rwo -o yaml
           allowVolumeExpansion: true
           apiVersion: storage.k8s.io/v1
           kind: StorageClass
           metadata:
             annotations:
               disk.gdc.goog/luks-encrypted: "true"
               helm.sh/resource-policy: keep
               lcm.private.gdc.goog/claim-by-force: "true"
               meta.helm.sh/release-name: file-netapp-trident-backend
               meta.helm.sh/release-namespace: netapp-trident
               storageclass.kubernetes.io/is-default-class: "false"
             labels:
               app.kubernetes.io/managed-by: Helm
             name: system-performance-rwo
           parameters:
             backendType: ontap-san
             csi.storage.k8s.io/node-expand-secret-name: g-luks-${pvc.name}
             csi.storage.k8s.io/node-expand-secret-namespace: ${pvc.namespace}
             csi.storage.k8s.io/node-publish-secret-name: g-luks-${pvc.name}
             csi.storage.k8s.io/node-publish-secret-namespace: ${pvc.namespace}
             csi.storage.k8s.io/node-stage-secret-name: g-luks-${pvc.name}
             csi.storage.k8s.io/node-stage-secret-namespace: ${pvc.namespace}
             fsType: ext4
             selector: tier=performance
           provisioner: csi.trident.netapp.io
           reclaimPolicy: Delete
           volumeBindingMode: Immediate
    升级 1.12.4

    file-netapp-trident 子组件升级处于 Reconciliation ongoing 状态

    症状

    您可能会看到 file-netapp-trident 子组件的状态在 ReconcilingReconciliationCompleted 之间来回切换。

    临时解决方法:

    如果满足以下条件,则可以放心地忽略正在进行的数据对账:

    1. TridentBackendonline
    2. TridentBackend 配置为 bound
    3. netapp-trident-controller 部署健康状况良好。
    4. netapp-trident-node-linux DaemonSet 运行状况良好。
    升级 1.12.4

    系统集群工作器节点升级无法在 manifestsnapshot 之间生成增量

    症状

    从 1.12.2 升级到 1.12.4 时,组织升级卡在 NodeUpgrade 阶段,节点升级任务显示以下错误:

          Message: failed to generate delta between manifest and snapshot: failed to create or update delta configmap: failed to calculate delta between snapshot and manifest: failed to get valid OS distribution for delta comparison, distribution:

    如需确认此问题,请执行以下步骤:

    1. 获取节点升级失败的根集群或组织管理员集群的 Kubeconfig,并检查 nodeupgradetask 是否失败:
           export KUBECONFIG=${ROOT_OR_ORG_ADMIN_KUBECONFIG}
           kubectl get nodeupgradetask -A -ojsonpath='{.items[*].status.conditions[?(@.status != "True")]}' | jq 
    2. 检查该消息是否与之前的错误消息一致:
            Message: failed to generate delta between manifest and snapshot: failed to create or update delta configmap: failed to calculate delta between snapshot and manifest: failed to get valid OS distribution for delta comparison, distribution:
    3. 检查 osartifactsnapshot 是否缺少分发:
            kubectl get osartifactsnapshots.system.private.gdc.goog -A -o json | jq '.items[] | select(.status.distribution == "") | .metadata.name'
    4. 检查是否至少有一个已打印但未设置分发的快照。

    临时解决方法:

    1. 获取节点所属集群的 Kubeconfig:
           export KUBECONFIG=${CLUSTER_KUBECONFIG}
           kubectl rollout restart -n os-system os-core-controller 
    2. 检查快照现在是否具有分布。(此命令可能需要几分钟时间):
            kubectl get osartifactsnapshots.system.private.gdc.goog -A -o json | jq '.items[] | select(.status.distribution == "") | .metadata.name'
    3. 此命令不应返回任何结果。如果您仍然发现缺少发行版,请提交支持请求。
    升级 1.12.4

    kubelet 无法移除具有垃圾日志的 pod 的 cgroup

    症状

    1. kubelet 一直输出以下垃圾日志:
      May 22 23:08:00 control-1--f1c6edcdeaa9e08-e387c07294a9d3ab.lab.anthos kubelet[3751]: time="2024-05-22T23:08:00Z" level=warning msg="Failed to remove cgroup (will retry)" error="rmdir /sys/fs/cgroup/freezer/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podea876418628af89ec2a74ea73d4a6023.slice/cri-containerd-d06aacfec2b399fcf05a187883341db1207c04be3698ec058214a6392cfc6148.scope: device or resource busy"
      ……
      May 22 23:09:04 control-1 kubelet[3751]: time="2024-05-22T23:09:04Z" level=warning msg="Failed to remove cgroup (will retry)" error="rmdir /sys/fs/cgroup/net_cls,net_prio/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podea876418628af89ec2a74ea73d4a6023.slice/cri-containerd-d06aacfec2b399fcf05a187883341db1207c04be3698ec058214a6392cfc6148.scope: device or resource busy"
    2. runc init 进程被冻结,导致 kubelet 无法删除 cgroup pod。

    临时解决方法:

    1. 使用以下脚本查找阻止 cgroup 删除的进程:
           # Find matching cgroup directories
      MATCHING_CGROUPS=$(find /sys/fs/cgroup -type d -name "*74353c*")
      
      
      if [ -z "$MATCHING_CGROUPS" ]; then
       echo "No cgroups found containing 'd06aac'."
       exit 0
      fi
      
      
      echo "Matching cgroups:"
      
      
      for cgroup in $MATCHING_CGROUPS; do
       echo "- $cgroup"  # Print cgroup path
      
      
       # Check if cgroup.procs exists
       if [ -f "$cgroup/cgroup.procs" ]; then
         echo "  Processes:"
      
      
         # List PIDs in cgroup.procs
         for pid in $(cat "$cgroup/cgroup.procs"); do
           # Get process details
           ps -o pid,comm,cmd --no-headers $pid 2>/dev/null  # Suppress errors if process doesn't exist
         done
       else
         echo "  No cgroup.procs file found."  # Handle cases where cgroup.procs is missing
       fi
      
      
       echo  # Add a newline for better readability
       done
    2. 使用 cat freezer.state 检查冷冻器状态。状态应为 FROZEN
    3. Echo "THAWED" > freezer.state
    4. 已成功删除 cgroupKubelet 停止向日志中发送大量信息。
    性能 1.12.4

    存在对账错误的子组件 perf-ptaas

    症状

    perf-ptaas 子组件显示以下错误代码,导致无法部署 PTaaS:

    Reconciliation error: E0100 - deploy: failed to transfer ownership of conflicting resources for install: these resources need to be force claimed, but they are not annotated: [Resource: "resourcemanager.gdc.goog/v1, Resource=projects", GroupVersionKind: "resourcemanager.gdc.goog/v1, Kind=Project"

    临时解决方法:

    PTaaS 部署在 gdchservices 组织中。

    1. 检查 perftest 命名空间 gdch-perftest 中 PTaaS 项目 gdch-perftest 和存储桶 perftest-bucket-reports 的注释和标签。相应存储桶可能缺少标签:app.kubernetes.io/managed-by=Helm,以及注释:meta.helm.sh/release-name=perf-ptaas-assetsmeta.helm.sh/release-namespace=gdch-perftest。 手动添加以下标签和注释:
      kubectl --kubeconfig gdchservices-admin-kubeconfig label buckets -n gdch-perftest perftest-bucket-reports app.kubernetes.io/managed-by=Helm
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate buckets -n gdch-perftest perftest-bucket-reports meta.helm.sh/release-name=perf-ptaas-assets
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate buckets -n gdch-perftest perftest-bucket-reports meta.helm.sh/release-namespace=gdch-perftest
      确保 OCLCM 强制声明存储桶:
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate buckets -n gdch-perftest perftest-bucket-reports lcm.private.gdc.goog/claim-by-force=true
    2. 检查 PTaaS 项目 gdch-perftest 的注释。项目可能配置错误,并带有注解:meta.helm.sh/release-name=perf-ptaas-assets。 将此注解更改为 meta.helm.sh/release-name=perf-ptaas-backend
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate projects -n gpc-system gdch-perftest meta.helm.sh/release-name=perf-ptaas-backend --overwrite=true
      确保 OCLCM 强制声明项目:
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate projects -n gpc-system gdch-perftest lcm.private.gdc.goog/claim-by-force=true
    3. 验证子组件是否在根管理员集群中协调:
      kubectl get subcomponent -n gdchservices perf-ptaas