KRO Helm 迁移测验
选择题
1. 以下哪一项不是 Kubernetes Resource Operator (KRO) 的核心概念?
- A) 声明式 resource 关系
- B) 基于状态的 reconciliation
- C) 命令式脚本执行
- D) Resource graph
显示答案
答案:C) 命令式脚本执行
解释: KRO 以声明式方式管理 resources。声明式 resource 关系、基于状态的 reconciliation、resource graph 和自动化 lifecycle management 都是核心概念,而命令式脚本执行不是 KRO 核心概念的一部分。
2. childResources 在 ResourceGraphDefinition (RGD) 中的作用是什么?
- A) 定义 parent resource metadata
- B) 定义要从 parent resource 创建的 child resources 列表
- C) 定义 cluster-wide settings
- D) 定义 namespace policies
显示答案
答案:B) 定义要从 parent resource 创建的 child resources 列表
解释:childResources 定义将从 parent custom resource 创建的 child Kubernetes resources(Deployment、Service、Ingress 等)的列表和模板。
3. 与 Helm 相比,KRO 的主要差异化点是什么?
- A) 使用 Go template
- B) Chart archive packaging
- C) 显式 resource 关系建模和自动 state propagation
- D) Release history management
显示答案
答案:C) 显式 resource 关系建模和自动 state propagation
解释: KRO 将 resources 之间的关系建模为显式 graph,并自动将 child resource 状态传播到 parent resource。
4. RGD templates 中的 .parent 引用什么?
- A) Kubernetes cluster
- B) Parent custom resource
- C) Namespace
- D) Controller pod
显示答案
答案:B) Parent custom resource
解释: 在 RGD templates 中,.parent 引用应用了 ResourceGraphDefinition 的 parent custom resource。
5. KRO 中哪个字段用于有条件地创建 child resource?
- A)
when - B)
if - C)
condition - D)
enabled
显示答案
答案:C) condition
解释: RGD 的 childResources 中的 condition 字段可用于有条件地创建 child resources。
6. RGD 中 statusMappings 的用途是什么?
- A) 定义 error handling 行为
- B) 将 child resource status 映射到 parent resource status
- C) 配置 logging levels
- D) 设置 resource quotas
显示答案
答案:B) 将 child resource status 映射到 parent resource status
解释:statusMappings 定义如何从 child resources 提取 status 信息,并将其传播到 parent custom resource 的 status 字段。
7. KRO 如何处理 resource dependencies?
- A) 通过 YAML files 中的手动排序
- B) 通过自动确定创建顺序的 resource graph
- C) 通过数字 priority fields
- D) 通过字母顺序
显示答案
答案:B) 通过自动确定创建顺序的 resource graph
解释: KRO 使用 resource graph 来理解 resources 之间的 dependencies,并自动确定 resource 创建和删除的正确顺序。
8. 在 KRO 中删除 parent custom resource 时会发生什么?
- A) Child resources 保持 orphaned 状态
- B) Child resources 会被自动 garbage collected
- C) 需要手动 cleanup
- D) 会抛出 error
显示答案
答案:B) Child resources 会被自动 garbage collected
解释: KRO 会在 child resources 上设置 owner references,因此当 parent 被删除时,Kubernetes 的 garbage collector 会自动移除所有 child resources。
9. KRO 中哪个组件会 watch custom resource changes?
- A) API Server
- B) Scheduler
- C) KRO Controller
- D) Kubelet
显示答案
答案:C) KRO Controller
解释: KRO Controller 会 watch 由 ResourceGraphDefinitions 定义的 custom resources 的变化,并 reconcile 期望状态。
10. KRO 中与 Helm 的 helm upgrade --install 行为等价的是什么?
- A) 对 custom resource 执行
kubectl apply - B) 对 custom resource 执行
kubectl replace - C) 对 custom resource 执行
kubectl patch - D)
kubectl create --save-config
显示答案
答案:A) 对 custom resource 执行 kubectl apply
解释:kubectl apply 提供类似 helm upgrade --install 的幂等行为。如果 resource 不存在,它会创建;如果存在,它会更新。
简答题
1. KRO 中定义 custom resources 与 Kubernetes native resources 之间关系的核心 resource 是什么?
显示答案
答案:ResourceGraphDefinition (RGD)
解释: ResourceGraphDefinition (RGD) 是 KRO 的核心组件,用于以声明式方式定义 custom resources(parent)与 Kubernetes native resources(children)之间的关系。
2. Helm 的 values.yaml 在 KRO 中的等价物是什么?
显示答案
答案:Custom Resource (CR) 的 spec 字段
解释: 正如 Helm 通过 values.yaml 自定义配置一样,KRO 通过 custom resource 的 spec 字段定义应用配置。
3. 如何在 RGD template 中引用 sibling child resource 的输出?
显示答案
答案:使用 .children.<resourceId> 语法
解释: 在 RGD templates 中,你可以使用 .children.<resourceId> 引用其他 child resources,以访问其 metadata、spec 或 status 字段,从而实现 cross-resource 引用。
4. KRO 使用哪个 annotation 来跟踪 managed resources?
显示答案
答案:kro.run/owner annotation
解释: KRO 使用 kro.run/owner annotation 以及 Kubernetes owner references 来跟踪哪些 resources 由哪个 parent custom resource 管理。
5. KRO 如何处理 custom resources 的 schema validation?
显示答案
答案:通过 RGD 的 spec.schema 字段中定义的 OpenAPI v3 Schema
解释: KRO 会从 RGD 生成 CRD,并使用 ResourceGraphDefinition 中定义的 OpenAPI v3 Schema 执行 schema validation。
实践题
1. 将以下 Helm values.yaml 转换为 KRO custom resource instance。
# Helm values.yaml
replicaCount: 2
image:
repository: myapp
tag: "1.0.0"
service:
type: ClusterIP
port: 8080显示答案
apiVersion: kro.example.com/v1
kind: MyApp
metadata:
name: my-application
spec:
replicas: 2
image:
repository: myapp
tag: "1.0.0"
service:
type: ClusterIP
port: 80802. 编写一个基于 parent spec 创建 Deployment 的 RGD childResource 定义。
显示答案
childResources:
- id: deployment
resource:
apiVersion: apps/v1
kind: Deployment
metadata:
name: "{{.parent.metadata.name}}"
spec:
replicas: "{{.parent.spec.replicas}}"
selector:
matchLabels:
app: "{{.parent.metadata.name}}"
template:
metadata:
labels:
app: "{{.parent.metadata.name}}"
spec:
containers:
- name: app
image: "{{.parent.spec.image.repository}}:{{.parent.spec.image.tag}}"
ports:
- containerPort: "{{.parent.spec.service.port}}"3. 编写一个 statusMappings 配置,将 Deployment 的 available replicas 暴露到 parent status。
显示答案
statusMappings:
- childResourceId: deployment
fieldPath: status.availableReplicas
parentFieldPath: status.availableReplicas
- childResourceId: deployment
fieldPath: status.conditions
parentFieldPath: status.deploymentConditions解释: statusMappings 从 child resource status 中提取特定字段,并将其映射到 parent custom resource 的 status,使用户能够通过 parent resource 检查应用状态。
进阶题
1. 使用 KRO 设计一个多环境(dev/staging/production)部署策略。
显示答案
特定于环境的 Custom Resource Instances:
# dev/webapp.yaml
apiVersion: kro.example.com/v1
kind: WebApp
metadata:
name: myapp
namespace: app-dev
spec:
replicas: 1
image:
tag: "dev-latest"
resources:
requests:
cpu: "100m"
memory: "128Mi"
---
# staging/webapp.yaml
apiVersion: kro.example.com/v1
kind: WebApp
metadata:
name: myapp
namespace: app-staging
spec:
replicas: 2
image:
tag: "rc-1.0.0"
resources:
requests:
cpu: "250m"
memory: "256Mi"
---
# production/webapp.yaml
apiVersion: kro.example.com/v1
kind: WebApp
metadata:
name: myapp
namespace: app-prod
spec:
replicas: 3
image:
tag: "v1.0.0"
autoscaling:
enabled: true
minReplicas: 3
maxReplicas: 10
resources:
requests:
cpu: "500m"
memory: "512Mi"GitOps 集成: 使用 ArgoCD ApplicationSet,通过单个 RGD 在所有环境中自动化特定于环境的部署。
2. 比较 Helm 和 KRO 在管理类似 database cluster 这样的 stateful application 时的运维差异。
显示答案
Helm 方法:
- 基于 templating:在安装时生成静态 manifests
- Release management:通过 Secrets/ConfigMaps 跟踪版本
- Upgrade process:需要
helm upgradecommand - State tracking:初始部署后没有内置 reconciliation
- Rollback:使用存储的 release history
KRO 方法:
- 基于 reconciliation:持续监控并修正 drift
- Native Kubernetes:使用标准 kubectl 和 CRDs
- Upgrade process:修改 CR spec,controller 进行 reconcile
- State tracking:controller 持续 watch 并 reconcile
- Rollback:将 CR spec 还原到之前的状态
Stateful Applications 的关键差异:
| Aspect | Helm | KRO |
|---|---|---|
| Drift Detection | Manual | Automatic |
| Self-healing | No | Yes |
| Status Visibility | External (helm status) | Native (kubectl get) |
| Dependency Management | Chart dependencies | Resource graph |
| Lifecycle Hooks | pre/post hooks | Controller logic |
建议: KRO 更适合需要持续 reconciliation、自动 drift correction 和复杂 lifecycle management 的 stateful applications。对于部署简单直接的 stateless applications,Helm 更简单。