You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加审计日志后Kubernetes APIServer无法启动求助

问题描述

尝试在Kubernetes集群中添加审计日志功能,已配置审计策略文件:

  • 审计策略文件路径:/etc/kubernetes/policy/audit/policy.yaml
  • 策略内容:
apiVersion: audit.k8s.io/v1
kind: Policy
rules:

# 记录Secret资源审计日志,级别为Metadata
- level: Metadata
  resources:
  - group: ""
    resources: ["secrets"]

# 记录节点相关审计日志,级别为RequestResponse
- level: RequestResponse
  userGroups: ["system:nodes"]

# 其余所有操作不记录日志
- level: None

配置后kube-apiserver无法正常启动:

  • crictl ps无名称含api的运行中容器
  • 相关日志目录无日志内容
  • 执行journalctl -u kubelet | grep "policy"得到错误:
Sep 22 15:25:32 i11806-kube-master-1 kubelet[1187]: E0922 15:25:32.312777    1187 pod_workers.go:951] "Error syncing pod, skipping" err="failed to \"StartContainer\" for \"kube-apiserver\" with RunContainerError: \"failed to create containerd task: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: \\\"--audit-policy-file=/etc/kubernetes/audit-policy/policy.yaml\\\": stat --audit-policy-file=/etc/kubernetes/audit-policy/policy.yaml: no such file or directory: unknown\"" pod="kube-system/kube-apiserver-i11806-kube-master-1" podUID=43aa05fda9c680dd3c0c77b8e1c95dac
错误分析

从日志可定位两个核心问题:

  1. 路径不匹配:实际策略文件路径为/etc/kubernetes/policy/audit/policy.yaml,但启动参数中写的是/etc/kubernetes/audit-policy/policy.yaml,路径完全不符。
  2. 参数格式错误:日志中exec: "--audit-policy-file=..."说明该参数被当成了容器的启动命令,而非kube-apiserver的启动参数。这是因为在kube-apiserver的Pod清单中,参数被错误放置在command数组,而非args数组内。
解决方案

步骤1:修正路径匹配

将kube-apiserver启动参数中的审计策略路径改为实际路径:--audit-policy-file=/etc/kubernetes/policy/audit/policy.yaml

步骤2:修正kube-apiserver清单参数格式

编辑manifests/kube-apiserver.yaml,确保所有kube-apiserver启动参数都放在args数组中,command数组仅保留kube-apiserver,同时配置正确的卷挂载,示例如下:

spec:
  containers:
  - command:
    - kube-apiserver
    args:
    - --audit-policy-file=/etc/kubernetes/policy/audit/policy.yaml
    - --advertise-address=192.168.0.100 # 替换为实际节点IP
    - --allow-privileged=true
    - # 保留其他原有启动参数
    volumeMounts:
    - name: audit-policy
      mountPath: /etc/kubernetes/policy/audit
      readOnly: true
  volumes:
  - name: audit-policy
    hostPath:
      path: /etc/kubernetes/policy/audit
      type: DirectoryOrCreate

注意:

  • 必须确保audit-policy卷已正确挂载,让容器能访问主机上的策略文件。
  • 所有启动参数必须在args数组内,不能混入command数组。

步骤3:验证并重启

  1. 保存修改后的清单文件,kubelet会自动检测变更并重启kube-apiserver。
  2. 等待2-3分钟后执行crictl ps | grep api,确认容器是否正常运行。
  3. 执行journalctl -u kubelet | grep kube-apiserver,检查是否还有报错。

额外排查点

如果容器仍无法启动,检查:

  • 主机上/etc/kubernetes/policy/audit/policy.yaml是否存在,权限是否为644(确保kube-apiserver容器用户可读取)。
  • 卷挂载的hostPath和mountPath是否完全对应,无拼写错误。

内容的提问来源于stack exchange,提问作者Rahul Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:46:58