自定义资源定义 (CRD) 是用于扩展 Kubernetes 功能的强大工具。不过,如果 CRD 的转换 webhook 配置 spec.conversion.webhook.clientConfig.caBundle 中包含无效或格式错误的证书授权机构 (CA) 软件包,CRD 可能会中断集群操作。此问题可能会在资源创建、更新或删除期间表现为错误,从而影响集群的稳定性和性能。
为防止出现此问题,Google Kubernetes Engine (GKE) 会自动检测具有无效 CA 软件包的 CRD,并生成建议。您可以参考本文档来查找建议、识别配置错误的 CRD 并更新它们。
对于管理 GKE 中的 CRD 和自定义资源的平台管理员和运维人员以及其他用户,此信息非常重要。
确定受影响的集群
如需获得可识别受 CA 软件包无效的 CRD 影响的集群的分析洞见,请按照说明查看分析洞见和建议(针对子类型 K8S_CRD_WITH_INVALID_CA_BUNDLE)。您可以通过以下方式获取分析洞见:
- 使用 Google Cloud 控制台。
- 使用 Google Cloud CLI 或 Recommender API 并使用子类型
K8S_CRD_WITH_INVALID_CA_BUNDLE进行过滤。
通过分析洞见确定 CRD 后,请按照说明排查配置错误的 CA 软件包。
GKE 检测到错误配置的 CRD 时
如果 GKE 集群有一个或多个 CRD 在 spec.conversion.webhook.clientConfig 中报告了 webhook 客户端配置的 caBundle 错误配置,GKE 会生成 K8S_CRD_WITH_INVALID_CA_BUNDLE 子类型的分析洞见和建议。
按照说明检查 CA 软件包配置错误的 CRD。
排查检测到的 CRD 的问题
以下部分指导您对 GKE 检测到可能配置错误的 CRD 进行问题排查。
实施相关说明并且正确配置 CRD后,建议将在 24 小时内解决,并且不再显示在控制台中。如果自您实施建议的指导后不到 24 小时,您可以将建议标记为已解决。如果您不想实施此建议,则可以忽略。
识别集群中受影响的 CRD
查看子类型为
K8S_CRD_WITH_INVALID_CA_BUNDLE的分析洞见和建议,一次选择一个分析洞见进行问题排查。GKE 会为每个存在损坏的 CRD 的集群生成一条分析洞见。运行以下命令以描述服务,从而查找可能存在问题的 CA 软件包的 CRD:
kubectl get crd -o custom-columns=NAME:.metadata.name,CABUNDLE:.spec.conversion.webhook.clientConfig.caBundle输出包括以下内容:
- 名称:CRD 的名称。
- CaBundle:与 CRD 的转换 webhook 关联的 CA 软件包(如果有)。检查输出。如果您知道某个 CRD 使用了转化 webhook,但该 CRD 的 caBundle 列为空,则表示 caBundle 可能存在问题。
重新创建 CRD
如需解决此错误,请使用有效的 CA 软件包重新创建受影响的 CRD:
备份与此存在问题的 CRD 关联的现有自定义资源(如果有)。运行以下命令以导出现有资源:
kubectl get <crd-name> -o yaml > backup.yaml删除现有 CRD:
kubectl delete crd <crd-name>确保 CRD 的
caBundle字段包含格式正确且采用 base64 编码的 PEM 证书。为此,您可以直接修改 CRD,也可以联系其作者。修改 CRD YAML 定义,使用有效的 CA 软件包数据更新
spec.conversion.webhook.clientConfig.caBundle字段。结果应该类似如下所示:spec: conversion: webhook: clientConfig: caBundle: <base64-encoded-ca-bundle>应用更正后的 CRD:
kubectl apply -f <corrected-crd-file.yaml>恢复自定义资源:
kubectl apply -f backup.yaml