3. API Server 认证机制:静态 、X509 证书、ServiceAccount、Webhook 、OIDC
Kubernetes API Server 是集群控制面的唯一入口,所有对集群状态的查询、变更操作都必须经过 API Server。在请求到达授权(RBAC/ABAC)与准入控制之前,认证(Authentication)是第一道防线。API Server 支持多种认证模块,它们以链式方式工作:只要任意一个模块成功验证请求者身份,认证即通过。
3.1 认证模块链与请求处理流程
API Server 启动时,通过 --enable-admission-plugins 和 --authentication--webhook-config-file 等参数配置认证模块。请求到达时,认证模块按以下顺序依次尝试:
- X509 客户端证书 — 验证 TLS 客户端证书的 CN 和 O 字段。
- 静态 文件 — 从
---auth-file指定的 CSV 文件中匹配 Bearer 。 - ServiceAccount — 验证挂载到 Pod 中的 JWT 。
- Webhook — 将 发送到外部认证服务进行验证。
- OIDC — 通过 OpenID Connect 协议验证 JWT 。
- 匿名请求 — 如果以上所有模块都拒绝,且未启用
--anonymous-auth=false,则视为匿名请求。
3.2 五种认证机制详解
3.2.1 静态 文件
静态 是最简单的认证方式,适用于测试环境或小规模集群。管理员在 Master 节点上创建一个 CSV 格式的 文件,通过 ---auth-file 参数传递给 API Server。
文件格式:
,username,useruid,group1,group2,...
fL9xK2mN8pQr5sT7,admin,1001,system:masters
aB3cD5eF7gH1iJ2k,developer,2001,dev-team
| 字段 | 说明 | 示例 |
|---|---|---|
| Bearer 值,需保证唯一性 | fL9xK2mN8pQr5sT7 |
|
| username | 认证后的用户名 | admin |
| useruid | 用户唯一标识 | 1001 |
| group | 用户所属组(可多个) | system:masters |
3.2.2 X509 客户端证书
X509 证书认证是 Kubernetes 最常用的认证方式之一,尤其适用于 kubectl 和集群组件(如 kubelet、scheduler)之间的通信。API Server 通过 --client-ca-file 指定 CA 证书,验证客户端证书的签名。
证书字段映射:
- CN (Common Name) → 用户名
- O (Organization) → 用户所属组(可多个 O 字段)
生成客户端证书示例:
# 生成私钥
openssl genrsa -out dev-user.key 2048
# 生成 CSR,CN 为用户名,O 为组
openssl req -new -key dev-user.key -out dev-user.csr \
-subj "/CN=dev-user/O=dev-team"
# 使用集群 CA 签发证书
openssl x509 -req -in dev-user.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out dev-user.crt -days 365
kubeadm 部署的集群默认使用 X509 证书认证。证书过期后需要手动轮换,建议使用 cert-manager 或 kubeadm certs renew 自动化管理。
3.2.3 ServiceAccount
ServiceAccount 是 Kubernetes 为 Pod 内运行的进程提供的身份标识。每个 Namespace 都有一个默认的 ServiceAccount,Pod 启动时自动将 ServiceAccount 的 挂载到 /var/run/secrets/kubernetes.io/serviceaccount/。
ServiceAccount 认证流程:
- 创建 ServiceAccount 对象,Kubernetes 自动生成对应的 Secret 并填充 。
- Pod 通过
serviceAccountName字段引用 ServiceAccount。 - API Server 验证 的签名(使用集群私钥)和过期时间。
- 认证通过后,用户名格式为
system:serviceaccount:<namespace>:<name>,组为system:serviceaccounts。
创建 ServiceAccount 并分配权限:
# 创建 ServiceAccount
kubectl create serviceaccount my-app-sa -n production
# 查看自动生成的 Secret
kubectl get secret -n production | grep my-app-sa
# 绑定 RBAC 角色
kubectl create rolebinding my-app-sa-binding \
--clusterrole=view \
--serviceaccount=production:my-app-sa \
-n production
TokenRequest API 生成绑定到 Pod 生命周期的临时 。如需长期 ,需手动创建 Secret 并添加 kubernetes.io/service-account.name 注解。
3.2.4 Webhook
Webhook 认证允许将 验证委托给外部服务。API Server 将 Bearer 发送到 Webhook 后端,后端返回包含用户信息的响应。适用于集成企业已有的认证系统(如 LDAP、AD、自定义认证服务)。
Webhook 配置示例(webhook-config.yaml):
apiVersion: v1
kind: Config
clusters:
- name: auth-service
cluster:
server: https://auth.example.com/authenticate
certificate-authority: /etc/kubernetes/pki/webhook-ca.crt
users:
- name: apiserver
user:
client-certificate: /etc/kubernetes/pki/apiserver.crt
client-key: /etc/kubernetes/pki/apiserver.key
API Server 启动参数:
--authentication--webhook-config-file=/etc/kubernetes/webhook-config.yaml
--authentication--webhook-cache-ttl=2m
Webhook 响应格式:
{
"apiVersion": "authentication.k8s.io/v1",
"kind": "TokenReview",
"status": {
"authenticated": true,
"user": {
"username": "john.doe@example.com",
"uid": "12345",
"groups": ["developers", "admins"],
"extra": {
"department": ["engineering"]
}
}
}
}
--authentication--webhook-cache-ttl),并确保 Webhook 后端高可用。
3.2.5 OIDC(OpenID Connect)
OIDC 是 Kubernetes 推荐的生产环境认证方式,基于 OAuth 2.0 协议。用户通过外部身份提供方(如 Dex、Keycloak、Azure AD、Google)获取 ID (JWT 格式),然后使用该 访问 API Server。
OIDC 认证流程:
- 用户通过
kubectl oidc-login或浏览器登录身份提供方。 - 身份提供方返回 ID (JWT)和 Refresh 。
- 用户使用 ID 作为 Bearer 请求 API Server。
- API Server 验证 的签名(使用 OIDC 提供方的公钥)、issuer、audience 和过期时间。
- 从 的
sub或email字段提取用户名,从groups字段提取组信息。
API Server OIDC 配置参数:
--oidc-issuer-url=https://dex.example.com
--oidc-client-id=kubernetes
--oidc-username-claim=email
--oidc-groups-claim=groups
--oidc-ca-file=/etc/kubernetes/pki/oidc-ca.crt
| 参数 | 说明 | 示例值 |
|---|---|---|
--oidc-issuer-url |
OIDC 提供方的 URL,API Server 从此获取公钥 | https://accounts.google.com |
--oidc-client-id |
Kubernetes 在 OIDC 提供方注册的客户端 ID | kubernetes |
--oidc-username-claim |
JWT 中用于提取用户名的字段 | email 或 sub |
--oidc-groups-claim |
JWT 中用于提取用户组的字段 | groups |
--oidc-ca-file |
验证 OIDC 提供方 TLS 证书的 CA | /etc/kubernetes/pki/oidc-ca.crt |
kubelogin(kubectl oidc-login)插件可以自动处理 OIDC 登录流程和 刷新,无需手动管理 文件。
3.3 五种认证机制对比
| 认证方式 | 适用场景 | 安全性 | 管理复杂度 | 轮换 | 外部集成 |
|---|---|---|---|---|---|
| 静态 | 测试、开发 | 低(明文存储) | 低 | 需重启 API Server | 不支持 |
| X509 证书 | 集群组件、kubectl | 高(PKI 体系) | 中(证书管理) | 需重新签发 | 不支持 |
| ServiceAccount | Pod 内应用 | 中(自动挂载) | 低 | 自动(v1.24+) | 不支持 |
| Webhook | 企业 LDAP/AD | 高(委托验证) | 高(需维护 Webhook) | 由外部系统管理 | 强 |
| OIDC | 生产环境、SSO | 高(JWT 签名) | 中(需 OIDC 提供方) | 自动(Refresh ) | 强 |
3.4 认证排错与调试
当认证失败时,可以通过以下方法快速定位问题:
- 查看 API Server 日志:
kubectl logs -n kube-system kube-apiserver-<node> | grep -i auth - 使用 curl 测试认证:直接发送请求并查看响应头中的
X-Remote-User和X-Remote-Group。 - 检查证书有效期:
openssl x509 -in client.crt -text -noout | grep -A2 "Validity" - 验证 格式:JWT 可通过
jq解析 Payload 部分确认 claims。
# 使用 X509 证书直接请求 API Server
curl --cert client.crt --key client.key \
--cacert ca.crt \
https://api-server:6443/api/v1/namespaces/default/pods
# 使用 Bearer 请求
curl -H "Authorization: Bearer <>" \
--cacert ca.crt \
https://api-server:6443/api/v1/namespaces/default/pods
# 查看认证结果(返回的 HTTP 头)
curl -v --cert client.crt --key client.key \
--cacert ca.crt \
https://api-server:6443/api/v1/namespaces/default/pods 2>&1 | grep -i "remote"
3.5 生产环境认证选型建议
- 集群组件通信:X509 证书(kubelet、scheduler、controller-manager 之间)
- Pod 内应用:ServiceAccount (自动管理,无需人工干预)
- 运维人员:OIDC(支持 SSO、MFA、 自动刷新)
- CI/CD 系统:ServiceAccount 或 OIDC Client Credentials 模式
- 遗留系统集成:Webhook (对接 LDAP/AD)
- 禁止在生产环境使用静态 文件。
- X509 证书必须设置有效期,并建立证书轮换机制。
- ServiceAccount 遵循最小权限原则,避免使用
cluster-admin绑定。 - OIDC 必须启用 HTTPS,并验证 的
aud(audience)字段。 - Webhook 后端必须使用 TLS,并配置 API Server 验证后端证书。