添加审计日志后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
错误分析
从日志可定位两个核心问题:
- 路径不匹配:实际策略文件路径为
/etc/kubernetes/policy/audit/policy.yaml,但启动参数中写的是/etc/kubernetes/audit-policy/policy.yaml,路径完全不符。 - 参数格式错误:日志中
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:验证并重启
- 保存修改后的清单文件,kubelet会自动检测变更并重启kube-apiserver。
- 等待2-3分钟后执行
crictl ps | grep api,确认容器是否正常运行。 - 执行
journalctl -u kubelet | grep kube-apiserver,检查是否还有报错。
额外排查点
如果容器仍无法启动,检查:
- 主机上
/etc/kubernetes/policy/audit/policy.yaml是否存在,权限是否为644(确保kube-apiserver容器用户可读取)。 - 卷挂载的
hostPath和mountPath是否完全对应,无拼写错误。
内容的提问来源于stack exchange,提问作者Rahul Sharma
相关产品推荐
相关产品推荐

