4. kube-apiserver 参数详解:认证、授权、准入控制、审计日志、etcd 连接等关键参数配置
kube-apiserver 是 Kubernetes 控制面的核心组件,所有对集群的读写操作(包括 kubectl、Pod 内部调用、调度器、控制器管理器)都必须经过它。理解其关键参数配置,是保障集群安全、稳定与可观测性的基础。本章按请求处理的生命周期顺序,逐一解析认证、授权、准入控制、审计日志及 etcd 连接的核心参数。
4.1 请求处理生命周期总览
一个 API 请求在 kube-apiserver 内部依次经过以下五个阶段,每个阶段都有对应的参数控制其行为:
- 认证(Authentication):验证请求发起者的身份。
- 授权(Authorization):判断该身份是否有权限执行请求的操作。
- 准入控制(Admission Control):在对象持久化前,对请求内容进行修改或校验。
- 审计日志(Audit Logging):记录请求的详细信息,用于事后追溯。
- etcd 持久化:将最终的对象数据存储到后端 etcd 集群。
核心原则: 认证失败则直接拒绝,不进入授权阶段;授权失败则不进入准入控制阶段。审计日志在请求处理的不同阶段都会记录事件。
4.2 认证(Authentication)参数
kube-apiserver 支持多种认证方式,可以同时启用。请求到达时,会按顺序尝试每种认证模块,只要有一个成功即通过认证。
| 参数 | 默认值 | 说明 |
|---|---|---|
--client-ca-file |
空 | 指定 CA 证书文件路径,用于验证客户端 TLS 证书。启用 TLS 双向认证(X.509 证书认证)。 |
--token-auth-file |
空 | 指定静态令牌文件路径(CSV 格式:token,user,uid,group)。适用于服务账户或自动化工具。 |
--oidc-issuer-url |
空 | OIDC 提供者的 URL。启用 OpenID Connect 认证,常用于集成企业 SSO(如 Dex、Keycloak)。 |
--oidc-client-id |
空 | OIDC 客户端 ID,用于验证 ID Token 的 audience 字段。 |
--oidc-username-claim |
sub | 指定 ID Token 中的哪个 claim 作为用户名。 |
--service-account-key-file |
空 | 指定 PEM 编码的公钥文件,用于验证 ServiceAccount 签名的 JWT Token。可重复指定多个。 |
--authentication-token-webhook-config-file |
空 | 指定 webhook 配置文件路径,用于将 TokenReview 请求发送到外部认证服务。 |
生产建议: 至少同时启用
--client-ca-file(X.509 证书)和 --service-account-key-file(ServiceAccount Token)。对于多集群或企业环境,强烈建议集成 OIDC 认证,避免使用静态令牌文件。
4.3 授权(Authorization)参数
授权模块决定一个已认证的用户能否执行特定操作。Kubernetes 支持多种授权模式,可以组合使用。
| 参数 | 默认值 | 说明 |
|---|---|---|
--authorization-mode |
AlwaysAllow | 指定授权模式,逗号分隔。常用值:Node、RBAC、Webhook、ABAC、AlwaysDeny。生产环境推荐 Node,RBAC。 |
--authorization-webhook-config-file |
空 | 指定 webhook 配置文件路径,用于将 SubjectAccessReview 请求发送到外部授权服务。 |
--authorization-webhook-cache-authorized-ttl |
5m0s | 授权通过结果的缓存时间。 |
--authorization-webhook-cache-unauthorized-ttl |
30s | 授权拒绝结果的缓存时间。 |
安全警告: 永远不要在非测试环境使用
--authorization-mode=AlwaysAllow。该模式会绕过所有权限检查,任何拥有 API Server 网络访问权限的客户端都可以执行任意操作。
4.4 准入控制(Admission Control)参数
准入控制器在对象被持久化到 etcd 之前拦截请求,可以修改请求内容(Mutating)或校验请求内容(Validating)。
| 参数 | 默认值 | 说明 |
|---|---|---|
--enable-admission-plugins |
内置默认列表 | 启用额外的准入控制器插件,逗号分隔。例如:PodSecurity,NodeRestriction,NamespaceLifecycle。 |
--disable-admission-plugins |
空 | 禁用默认启用的准入控制器插件。 |
--admission-control-config-file |
空 | 指定准入控制器配置文件路径,用于精细化配置每个插件的参数(如 PodSecurity 的豁免命名空间)。 |
关键插件推荐:
NamespaceLifecycle:防止在正在删除的命名空间中创建新对象。NodeRestriction:限制 kubelet 只能修改自身节点和 Pod 对象。PodSecurity:替代废弃的 PodSecurityPolicy,按命名空间级别实施 Pod 安全标准。MutatingAdmissionWebhook/ValidatingAdmissionWebhook:允许通过 Webhook 扩展自定义准入逻辑。
4.5 审计日志(Audit Logging)参数
审计日志记录每个 API 请求的详细信息,是安全审计和故障排查的关键数据源。
| 参数 | 默认值 | 说明 |
|---|---|---|
--audit-log-path |
空 | 审计日志文件路径。如果为空,则不输出审计日志。 |
--audit-log-maxage |
30 | 保留旧审计日志文件的最大天数。 |
--audit-log-maxbackup |
10 | 保留的旧审计日志文件的最大数量。 |
--audit-log-maxsize |
100 | 审计日志文件轮转前的最大大小(MB)。 |
--audit-policy-file |
空 | 指定审计策略文件路径。策略文件定义了哪些请求、哪些资源、哪些操作需要记录,以及记录的详细级别(None、Metadata、Request、RequestResponse)。 |
--audit-webhook-config-file |
空 | 指定 webhook 配置文件路径,用于将审计事件发送到外部日志系统(如 Elasticsearch、Splunk)。 |
审计策略最佳实践:
- 对
metadata级别的操作(如 get、list、watch)记录Metadata级别即可。 - 对
create、update、delete操作记录RequestResponse级别,以便追溯变更内容。 - 对 ServiceAccount 的 Token 请求(
TokenReview)建议记录Request级别。
4.6 etcd 连接参数
etcd 是 Kubernetes 集群的持久化后端,所有集群状态都存储在 etcd 中。连接参数直接影响集群的可用性和性能。
| 参数 | 默认值 | 说明 |
|---|---|---|
--etcd-servers |
空 | etcd 集群的地址列表,逗号分隔。例如:https://10.0.0.1:2379,https://10.0.0.2:2379。 |
--etcd-cafile |
空 | 用于验证 etcd 服务端证书的 CA 证书文件路径。 |
--etcd-certfile |
空 | kube-apiserver 与 etcd 通信时使用的客户端证书文件路径。 |
--etcd-keyfile |
空 | 客户端证书对应的私钥文件路径。 |
--etcd-prefix |
/registry | etcd 中 Kubernetes 数据的键前缀。多集群共享同一 etcd 时,必须使用不同的前缀。 |
--etcd-compaction-interval |
5m0s | etcd 历史压缩的时间间隔。压缩会清理旧版本数据,释放存储空间。 |
关键安全配置: 生产环境必须启用 etcd 的 TLS 双向认证。确保
--etcd-cafile、--etcd-certfile、--etcd-keyfile 三个参数都正确配置。未加密的 etcd 通信意味着集群所有数据(包括 Secret)都在网络上明文传输。
4.7 综合配置示例
以下是一个生产环境 kube-apiserver 的启动参数示例,涵盖了上述所有关键配置:
kube-apiserver \
--advertise-address=192.168.1.10 \
--secure-port=6443 \
--service-cluster-ip-range=10.96.0.0/12 \
--service-node-port-range=30000-32767 \
\
# 认证配置
--client-ca-file=/etc/kubernetes/pki/ca.crt \
--service-account-key-file=/etc/kubernetes/pki/sa.pub \
--oidc-issuer-url=https://dex.example.com \
--oidc-client-id=kubernetes \
--oidc-username-claim=email \
\
# 授权配置
--authorization-mode=Node,RBAC \
\
# 准入控制配置
--enable-admission-plugins=NodeRestriction,PodSecurity,NamespaceLifecycle \
--admission-control-config-file=/etc/kubernetes/admission-config.yaml \
\
# 审计日志配置
--audit-log-path=/var/log/kubernetes/audit.log \
--audit-log-maxage=30 \
--audit-log-maxbackup=10 \
--audit-log-maxsize=100 \
--audit-policy-file=/etc/kubernetes/audit-policy.yaml \
\
# etcd 连接配置
--etcd-servers=https://10.0.0.1:2379,https://10.0.0.2:2379,https://10.0.0.3:2379 \
--etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt \
--etcd-certfile=/etc/kubernetes/pki/etcd/server.crt \
--etcd-keyfile=/etc/kubernetes/pki/etcd/server.key \
--etcd-prefix=/registry
参数配置检查清单:
- ✅ 认证:至少启用 X.509 证书认证 + ServiceAccount Token 认证。
- ✅ 授权:使用
Node,RBAC模式,禁用AlwaysAllow。 - ✅ 准入控制:启用
NodeRestriction、PodSecurity、NamespaceLifecycle。 - ✅ 审计日志:配置日志文件路径和轮转策略,并编写审计策略文件。
- ✅ etcd 连接:启用 TLS 双向认证,配置多节点地址列表。