如何在k3d搭建的k3s集群中启用并配置审计日志?
k3d 环境下k3s审计日志可落地配置方案
核心解决思路
利用k3d原生的文件挂载能力,在集群启动阶段就将宿主机预先准备好的审计策略文件映射到k3s server容器内的指定路径,确保kube-apiserver启动时可以直接读取到策略文件,避免因文件缺失导致的进程崩溃;同时在集群创建阶段一次性传入所有审计相关的apiserver启动参数,不需要集群启动后再做二次修改。
分步实操流程
宿主机预先准备审计策略文件
在本地工作目录创建策略文件,示例基础配置如下(可根据自身审计需求调整规则粒度):# 保存路径:当前工作目录下 ./audit-policies/policy.yaml apiVersion: audit.k8s.io/v1 kind: Policy rules: # 默认记录所有请求的元数据(不记录请求/响应内容),控制日志体量 - level: Metadata # 对Secrets资源的所有操作记录完整请求/响应内容 - level: RequestResponse resources: - group: "" resources: ["secrets"]执行集群创建命令,同时完成文件挂载和启动参数传入
注意这里需要通过k3d的--volume参数将本地的策略文件直接映射到k3s server容器内的固定路径,再传入对应的apiserver启动参数:k3d cluster create test-cluster \ --volume $(pwd)/audit-policies/policy.yaml:/etc/kubernetes/audit-policies/policy.yaml@server:* \ --k3s-server-arg '--kube-apiserver-arg=audit-log-path=/var/log/kubernetes/apiserver/audit.log' \ --k3s-server-arg '--kube-apiserver-arg=audit-policy-file=/etc/kubernetes/audit-policies/policy.yaml' \ --k3s-server-arg '--kube-apiserver-arg=audit-log-maxage=30' \ --k3s-server-arg '--kube-apiserver-arg=audit-log-maxbackup=10' \ --k3s-server-arg '--kube-apiserver-arg=audit-log-maxsize=100'命令参数说明:
--volume段的@server:*标识表示将文件挂载到集群内所有server节点,过滤匹配规则和k3d的节点标签机制一致- 传入的所有审计参数都是kube-apiserver的官方标准参数,和原生k8s的审计配置完全兼容
- 可选追加挂载:如果需要把审计日志直接持久化到宿主机,可额外加一行挂载参数,将容器内的日志目录映射到本地:
--volume $(pwd)/audit-logs:/var/log/kubernetes/apiserver@server:*
配置生效验证
- 等待集群初始化完成后,执行任意kubectl操作生成访问记录,比如
kubectl get pods -A - 进入对应k3s server容器查看日志文件:
# 进入k3d server容器(容器命名规则为k3d-<集群名>-server-<序号>) docker exec -it k3d-test-cluster-server-0 sh # 查看审计日志文件内容 cat /var/log/kubernetes/apiserver/audit.log - 如果日志中可以看到刚才执行kubectl命令对应的访问条目,即代表审计配置已经正常生效。
常见踩坑说明
- 不支持集群创建完成后在线补发审计配置参数:kube-apiserver的启动参数在k3s进程拉起时就已经固化,无法在集群运行状态下热加载参数,即便手动在节点内放入审计策略文件,因为apiserver启动参数中没有指定策略文件路径,配置也不会生效。
- 挂载路径必须和apiserver参数指定的路径完全匹配:如果挂载到容器内的路径和启动参数中
audit-policy-file的值存在拼写、层级差异,apiserver会因为找不到文件直接启动失败,导致集群反复重启无法就绪。 - 不需要额外提前创建容器内的日志目录:kube-apiserver启动时会自动创建日志文件所在的上级目录,无需额外在容器内预置路径结构。
内容的提问来源于stack exchange,提问作者Jeremy Harisch
相关产品推荐
相关产品推荐

