故障场景一:策略语法错误导致策略拒绝创建

在 Cilium 网络策略的日常运维中,语法错误是最常见且最容易排查的故障类型。这类错误通常源于 YAML 格式不规范、字段拼写错误或缩进层级混乱,导致 kubectl apply 直接拒绝创建资源。本章将模拟该场景,并演示从错误定位到修复的完整流程。

核心要点:Kubernetes API Server 在准入阶段会对 CiliumNetworkPolicy CRD 进行严格的 Schema 校验。任何不符合 OpenAPI 规范的 YAML 都会在 apply 时被拒绝,不会写入 etcd,也不会被 Cilium Agent 加载。

4.1 故障模拟:构造语法错误的策略 YAML

以下 YAML 文件 bad-policy.yaml 包含三处典型语法错误:

  1. YAML 格式错误:缩进不一致(混用空格与 Tab)。
  2. 字段拼写错误:将 endpointSelector 误写为 endpointSelektor。
  3. 层级错误: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 故障修复步骤

修复过程分为以下四个步骤:

  1. 使用 YAML Lint 工具检查格式:运行 yamllint bad-policy.yaml 可快速定位缩进和 Tab 问题。
  2. 对照 Cilium CRD Schema 修正字段名:将 endpointSelektor 改为 endpointSelector。
  3. 修正缩进层级:确保 ports 列表正确缩进在 toPorts 条目下。
  4. 重新 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 策略语法错误修复流程

下图展示了从错误发生到修复完成的完整流程:

策略语法错误修复流程 kubectl apply 拒绝 解析错误信息 YAML 格式检查 字段名修正 缩进层级修正 重新 apply 验证 策略创建成功 提示 使用 yamllint 工具可快速定位 缩进和格式问题

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 校验,是发现语法错误的最快方式。