Kube Resource Orchestrator (kro) 测验
这些问题保留了使用 kro 0.9.4 的原始 20 个主题。
1. kro 的核心概念是什么?
显示答案
在 RGD 中定义 API schema 和资源图,通过 CEL 引用推断依赖关系并协调实例。kro 不是命令式脚本运行器。
2. 受管资源定义在哪里声明?
显示答案
在 spec.resources 下,使用每个条目的 id 以及 template 或 externalRef。以前的 childResources 已不是当前的 RGD 字段。
3. kro 与 Helm 一起提供什么?
显示答案
资源引用图和持续的实例协调。Helm 提供 chart 渲染和 release 管理;它们可以协同工作。对于每一种工作负载,没有任何一个能普遍优于另一个。
4. 如何在 CEL 中引用实例输入?
显示答案
使用 schema.spec 或 schema.metadata,例如 ${schema.spec.replicas}。不要使用 .parent 或 Go-template 语法。
5. 如何配置条件性资源包含?
显示答案
在 includeWhen 中使用 Boolean CEL 表达式。更改条件可能会添加或清理资源,因此请审查对有状态资源的生命周期影响。
6. 受管资源 status 值投射到哪里?
显示答案
在 spec.schema.status 下定义 CEL 表达式,例如 ${deployment.status.availableReplicas}。statusMappings 不是当前字段。
7. 如何排序依赖关系和就绪状态?
显示答案
对其他资源 ID 的 CEL 引用会推断出一个 DAG。存在 readyWhen 条件时,依赖资源也会等待这些条件。循环会被拒绝;YAML 列出顺序不能替代依赖关系。
8. 删除实例时会发生什么?
显示答案
当前 kro 使用 ApplySet inventory 和删除波次,先移除依赖其他资源的对象(依赖方),并保留 finalizer。子资源的 finalizer 可能会阻塞进度。外部引用目标不会被删除。
9. 什么会监视实例变更?
显示答案
kro 的动态实例 controllers 会观察变更并协调图。RGD/GraphRevision 验证和编译会影响实例进度。
10. kubectl apply 做什么?
显示答案
它会创建或更新 CR 的期望状态,随后 controllers 进行协调。apply 成功并不表示图编译完成或应用已就绪,也不保证外部影响具有事务性。
11. 什么是 RGD?
显示答案
ResourceGraphDefinition 定义生成的 API schema、受管资源和 status 关系。它不同于应用实例 CR。
12. 什么提供了类似 Helm values 的输入?
显示答案
生成的 API 实例的 spec。它的 SimpleSchema 类型、默认值和边界必须与 template 实际使用的字段相匹配。
13. 如何引用另一个资源?
显示答案
直接引用其资源 ID,例如 ${deployment.spec.selector.matchLabels} 或 ${service.metadata.name}。不要使用 .children。
14. 什么会跟踪受管资源并支持删除诊断?
显示答案
检查当前 ApplySet inventory、owner metadata 和 internal.kro.run/apply-order 删除波次。不要把虚构的 kro.run/owner annotation 视为完整的跟踪契约。
15. 如何验证输入 schema?
显示答案
SimpleSchema 会成为生成的 CRD 的 OpenAPI schema,Kubernetes 使用它来验证实例。RGD 结构、图编译器的 CEL 类型检查和运行时就绪状态是独立的检查。
16. 编写示例 NginxApp 实例。
显示答案
首先确保 RGD 为 Active 且其生成的 CRD 为 Established。此实例禁用了 ingress。
apiVersion: platform.example.com/v1alpha1
kind: NginxApp
metadata:
name: reviewed-web
namespace: example
spec:
replicas: 2
image: nginxinc/nginx-unprivileged:1.30.4-alpine
ingress:
enabled: false
className: internal
host: app.example.com
tlsSecret: app-tls17. 编写创建 Deployment 的资源条目。
显示答案
这与指南中的 template 相同。readyWhen 仅引用 Deployment 本身;请在实际环境中验证 image、namespace 和 policies。
resources:
- id: deployment
readyWhen:
- ${deployment.status.availableReplicas >= deployment.spec.replicas}
- ${deployment.status.observedGeneration >= deployment.metadata.generation}
template:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ${schema.metadata.name}
namespace: ${schema.metadata.namespace}
labels:
app.kubernetes.io/name: ${schema.metadata.name}
spec:
replicas: ${schema.spec.replicas}
selector:
matchLabels:
app.kubernetes.io/name: ${schema.metadata.name}
template:
metadata:
labels:
app.kubernetes.io/name: ${schema.metadata.name}
spec:
automountServiceAccountToken: false
securityContext:
runAsNonRoot: true
runAsUser: 101
runAsGroup: 101
fsGroup: 101
seccompProfile:
type: RuntimeDefault
containers:
- name: web
image: ${schema.spec.image}
ports:
- name: http
containerPort: 8080
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL
resources:
requests:
cpu: 100m
memory: 64Mi
limits:
cpu: 500m
memory: 128Mi
readinessProbe:
httpGet:
path: /
port: http
volumeMounts:
- name: tmp
mountPath: /tmp
volumes:
- name: tmp
emptyDir:
sizeLimit: 64Mi18. 在 status 中公开 availableReplicas。
显示答案
这是 RGD spec.schema 下的 status 部分。解析可能会等待缺失的值;它并不代表全面的应用健康状况。
status:
availableReplicas: ${deployment.status.availableReplicas}
serviceIP: ${service.spec.clusterIP}19. 设计一个 dev/staging/prod 策略。
显示答案
共享经过验证的 API 契约和 image digests,同时按实例分离 namespace、replicas、ingress 和 policies。在每个 cluster 中准备 kro/RGD/permissions,并使用 fleet tooling 进行同步。未使用的 autoscaling 字段不会创建 HPA。
20. Helm 和 kro 对有状态应用的限制是什么?
显示答案
两者都不会自动实现数据库备份、恢复、failover 或 schema migration。请验证专用 operator/managed-service 的行为和数据保留。恢复 Git spec 不等于数据库回滚;失败的最新 GraphRevision 不会自动回退。