故障场景一:策略语法错误导致策略拒绝创建
在 Cilium 网络策略的日常运维中,语法错误是最常见且最容易排查的故障类型。这类错误通常源于 YAML 格式不规范、字段拼写错误或缩进层级混乱,导致 kubectl apply 直接拒绝创建资源。本章将模拟该场景,并演示从错误定位到修复的完整流程。
核心要点:Kubernetes API Server 在准入阶段会对 CiliumNetworkPolicy CRD 进行严格的 Schema 校验。任何不符合 OpenAPI 规范的 YAML 都会在 apply 时被拒绝,不会写入 etcd,也不会被 Cilium Agent 加载。
4.1 故障模拟:构造语法错误的策略 YAML
以下 YAML 文件 bad-policy.yaml 包含三处典型语法错误:
- YAML 格式错误:缩进不一致(混用空格与 Tab)。
- 字段拼写错误:将
endpointSelector误写为endpointSelektor。 - 层级错误:
toPorts下的ports列表缩进层级错误。
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: bad-http-policy
spec:
endpointSelektor: # 拼写错误:应为 endpointSelector
matchLabels:
app: frontend
ingress:
- fromEndpoints:
- matchLabels:
app: backend
toPorts:
- ports: # 缩进层级错误
- port: "8080"
protocol: TCP
常见陷阱:YAML 对缩进极其敏感。即使字段名完全正确,缩进层级错误也会导致整个策略被拒绝。建议始终使用 2 个空格缩进,并避免使用 Tab 键。
4.2 故障现象:kubectl apply 拒绝创建
执行 kubectl apply -f bad-policy.yaml 后,API Server 返回类似以下错误:
error: error validating "bad-policy.yaml": error validating data:
ValidationError(CiliumNetworkPolicy.spec): unknown field "endpointSelektor" in io.cilium.v2.CiliumNetworkPolicy.spec;
if you choose to ignore these errors, turn validation off with --validate=false
错误信息明确指出了问题所在:endpointSelektor 是一个未知字段。Kubernetes 的准入控制器在 Schema 校验阶段直接拒绝了该资源。
4.3 故障根因分析
下表总结了三种常见语法错误的类型、现象及根因:
| 错误类型 | 错误示例 | kubectl 返回现象 | 根因 |
|---|---|---|---|
| YAML 格式错误 | 混用 Tab 与空格 | error converting YAML to JSON: yaml: line 8: found a tab character that violates indentation |
YAML 解析器无法正确解析缩进 |
| 字段拼写错误 | endpointSelektor |
unknown field "endpointSelektor" |
CRD Schema 校验未通过 |
| 层级/缩进错误 | ports 缩进层级不对 |
spec.ingress[0].toPorts[0]: Invalid type. Expected: array, given: object |
字段类型与 Schema 定义不匹配 |
4.4 故障修复步骤
修复过程分为以下四个步骤:
- 使用 YAML Lint 工具检查格式:运行
yamllint bad-policy.yaml可快速定位缩进和 Tab 问题。 - 对照 Cilium CRD Schema 修正字段名:将
endpointSelektor改为endpointSelector。 - 修正缩进层级:确保
ports列表正确缩进在toPorts条目下。 - 重新 apply 并验证:使用
kubectl apply --validate=true -f fixed-policy.yaml确认无报错。
修复后的正确 YAML 如下:
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: good-http-policy
spec:
endpointSelector: # 修正拼写
matchLabels:
app: frontend
ingress:
- fromEndpoints:
- matchLabels:
app: backend
toPorts:
- ports: # 修正缩进层级
- port: "8080"
protocol: TCP
4.5 策略语法错误修复流程
下图展示了从错误发生到修复完成的完整流程:
4.6 预防性检查清单
为避免语法错误进入生产环境,建议在 CI/CD 流程中加入以下检查:
- YAML 语法校验:使用
yamllint或kubectl apply --dry-run=client --validate=true进行预检查。 - Schema 校验:使用
kubectl explain CiliumNetworkPolicy.spec.endpointSelector确认字段路径和类型。 - IDE 插件:在 VS Code 中安装 YAML 插件和 Kubernetes 扩展,开启实时校验。
- Git Hooks:在 pre-commit 阶段运行 YAML 校验脚本,阻止错误文件提交。
最佳实践:始终使用
kubectl apply --dry-run=client -f policy.yaml 进行预验证。该命令会在不实际写入 etcd 的情况下执行客户端 Schema 校验,是发现语法错误的最快方式。