排查 kro 功能问题 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

帮助改进此页面

要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。

排查 kro 功能问题

本主题旨在介绍 EKS 托管型 kro 问题排查指引,内容涵盖功能运行状况检查、RBAC 权限、CEL 表达式错误以及资源组合编排问题。

注意

EKS 功能完全托管,可在您的集群之外运行。您无法访问控制器日志或 kro-system 命名空间。问题排查侧重于功能运行状况、RBAC 配置和资源状态。

功能状态显示为 ACTIVE,但 ResourceGraphDefinition 无法正常工作

若 kro 功能状态显示为 ACTIVE,但 ResourceGraphDefinition 无法创建底层资源,请检查功能运行状况、RBAC 权限以及资源状态。

检查功能运行状况

您可以在 EKS 控制台或使用 Amazon CLI 查看功能运行状况和状态问题。

控制台

  1. 从以下位置打开 Amazon EKS 控制台:https://console.aws.amazon.com/eks/home#/clusters

  2. 选择集群名称。

  3. 选择可观测性选项卡。

  4. 选择监控集群

  5. 选择功能选项卡,查看所有功能的运行状况和状态。

AmazonCLI

# View capability status and health aws eks describe-capability \ --region region-code \ --cluster-name my-cluster \ --capability-name my-kro # Look for issues in the health section

常见原因

  • RBAC 权限缺失:kro 缺少创建底层 Kubernetes 资源的权限

  • CEL 表达式无效:ResourceGraphDefinition 中存在语法错误

  • 资源依赖异常:被依赖的资源未处于就绪状态

  • 模式验证失败:实例不符合 RGD 模式要求

验证 RBAC 权限

# Check if capability has cluster admin policy kubectl get accessentry -A | grep kro

若该功能不具备所需权限,可将 AmazonEKSClusterAdminPolicy 关联到 kro 功能的访问条目;对于生产环境,也可创建权限范围更严格的 RBAC 策略。有关详细信息,请参阅 配置 kro 权限

检查 ResourceGraphDefinition 状态

# List all RGDs kubectl get resourcegraphdefinition # Describe specific RGD kubectl describe resourcegraphdefinition my-rgd # Check for validation errors kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.status.conditions}'

ResourceGraphDefinition 包含三项关键状态条件:

  • ResourceGraphAccepted:RGD 是否通过验证(CEL 语法、类型校验、字段存在性验证)

  • KindReady:自定义 API 对应的 CRD 是否已生成并完成注册

  • ControllerReady:kro 是否正在主动监听自定义 API 的实例

ResourceGraphAccepted 状态为 False,请查看状态条件信息,排查是否存在未知字段、类型不匹配或循环依赖等验证类错误。

已创建实例但未生成底层资源

若自定义资源实例已存在,但对应的底层 Kubernetes 资源(如 Deployment、Service、ConfigMap)未被创建,请验证 kro 是否具备相应权限,同时排查资源组合编排错误。

检查实例状态

# Describe the instance (replace with your custom resource kind and name) kubectl describe custom-kind my-instance # View instance events kubectl get events --field-selector involvedObject.name=my-instance # Check instance status conditions kubectl get custom-kind my-instance -o jsonpath='{.status.conditions}' # Check instance state kubectl get custom-kind my-instance -o jsonpath='{.status.state}'

实例包含一个 state 字段,用于展示其宏观状态:

  • ACTIVE:实例已成功运行

  • IN_PROGRESS:实例正被处理或协调

  • FAILED:实例协调失败

  • DELETING:实例正被删除

  • ERROR:处理过程中发生错误

实例同时包含四项状态条件:

  • InstanceManaged:终结器与标签已正确配置

  • GraphResolved:运行时依赖图已创建,且相关资源已完成解析

  • ResourcesReady:所有资源均已创建并处于就绪状态

  • Ready:实例的整体运行状况(仅当所有子条件均为 True 时,该状态才会变为 True

可重点关注 Ready 条件来判断实例的运行状况。若 Ready 状态为 False,请检查各子条件,明确是哪个阶段执行失败。

验证 RBAC 权限

kro 功能需要具备创建 ResourceGraphDefinition 中所定义的底层 Kubernetes 资源的权限。

# Check if the capability has the AmazonEKSClusterAdminPolicy kubectl get accessentry -A | grep kro

若存在权限缺失,可将 AmazonEKSClusterAdminPolicy 关联到 kro 功能的访问条目;对于生产环境,则建议创建权限范围更严格的 RBAC 策略。有关详细信息,请参阅 配置 kro 权限

CEL 表达式错误

CEL 表达式错误会在 ResourceGraphDefinition 创建阶段被捕获,而非在实例创建阶段。当您创建 RGD 时,kro 会对所有 CEL 语法进行验证、基于 Kubernetes 模式对表达式进行类型检查,同时验证字段是否存在。

常见 CEL 验证错误

  • 未定义字段引用:引用了模式或资源中不存在的字段

  • 类型不匹配:表达式返回的类型不符合预期(例如:预期为整数类型,实际返回字符串类型)

  • 语法无效:CEL 表达式中存在缺失括号、引号或运算符的情况

  • 未知资源类型:引用了集群中未存在的 CRD

检查 RGD 验证状态

# Check if RGD was accepted kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.status.conditions[?(@.type=="ResourceGraphAccepted")]}' # View detailed validation errors kubectl describe resourcegraphdefinition my-rgd

ResourceGraphAccepted 状态为 False,对应的条件信息中会包含具体的验证错误信息。

有效的 CEL 表达式示例

# Reference schema field ${schema.spec.appName} # Conditional expression ${schema.spec.replicas > 1} # String template (expressions must return strings) name: "${schema.spec.appName}-service" # Standalone expression (can be any type) replicas: ${schema.spec.replicaCount} # Resource reference ${deployment.status.availableReplicas} # Optional field access (returns null if field doesn't exist) ${configmap.data.?DATABASE_URL}

资源依赖关系无法解析

kro 会从 CEL 表达式中自动推导资源依赖关系,并按正确顺序创建资源。若资源未按预期生成,请检查依赖顺序以及资源的就绪状态。

查看计算出的创建顺序

# See the order kro will create resources kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.status.topologicalOrder}'

该操作会展示基于资源间 CEL 表达式引用关系计算得出的资源创建顺序。

检查资源就绪状态

# View instance status to see which resources are ready kubectl get custom-kind my-instance -o jsonpath='{.status}' # Check specific resource status kubectl get deployment my-deployment -o jsonpath='{.status.conditions}'

验证 readyWhen 条件(若已配置)

readyWhen 字段为可选项。若未指定该字段,资源在创建完成后会被立即判定为就绪状态。若已定义 readyWhen 条件,请验证该条件是否能正确校验资源的就绪状态:

resources: - id: deployment readyWhen: - ${deployment.status.availableReplicas == deployment.spec.replicas}

检查资源事件

# View events for the underlying resources kubectl get events -n namespace --sort-by='.lastTimestamp'

模式验证失败

若实例因模式验证错误而无法创建,请确认该实例是否符合 RGD 模式要求。

检查验证错误

# Attempt to create instance and view error kubectl apply -f instance.yaml # View existing instance validation status kubectl describe custom-kind my-instance | grep -A 5 "Validation"

常见验证问题

  • 必填字段缺失:实例未提供模式要求的全部必填字段

  • 类型不匹配:在需要整数类型的位置传入了字符串类型

  • 枚举值无效:使用了不在允许取值列表内的数值

  • 格式不匹配:字符串未匹配正则表达式格式

查看 RGD 模式

# View the schema definition kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.spec.schema}'

确保实例提供所有必填字段且类型正确。

后续步骤