Kubernetes 账户详解:用户账户与服务账户全解析

在 Kubernetes(K8s)中,账户是访问集群资源的关键凭据。Kubernetes 的账户体系分为 用户账户(User Account)服务账户(Service Account)。两者的职责和适用场景截然不同:用户账户是给人用的,而服务账户则是给程序用的。今天我们来深挖两种账户的使用场景、配置方法和具体案例。


一、服务账户(Service Account)

服务账户(SA)是 Kubernetes 为 Pod 提供访问 Kubernetes API 的身份凭据。每个命名空间默认会创建一个 default 服务账户,但在实际应用中,通常需要为不同的服务创建独立的服务账户以实现更精细的权限管理。

服务账户的特点

  1. 自动挂载令牌
  • 服务账户令牌会自动挂载到 Pod 的 /var/run/secrets/kubernetes.io/serviceaccount 路径下,Pod 中的应用可以使用该令牌与 Kubernetes API 交互。
  1. 与 RBAC 配合使用
  • 服务账户通过绑定角色(Role 或 ClusterRole)来定义具体可以访问哪些资源及操作范围。
  1. 命名空间隔离
  • 服务账户属于特定命名空间,无法直接访问其他命名空间的资源。

使用场景

  • 监控工具访问集群
    Prometheus 等监控工具通过服务账户获取集群状态信息,例如 Pod、节点的运行状态。
  • 自动化任务执行
    CI/CD 流水线中的任务通过服务账户操作集群,如部署新版本应用。
  • 权限最小化
    不同服务使用独立的服务账户,只分配其所需的最小权限,确保安全性。

服务账户的配置与使用

1. 创建服务账户

配置文件示例:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: custom-sa
  namespace: default

应用配置文件:

kubectl apply -f service-account.yaml
2. 在 Pod 中指定服务账户

配置 Pod 使用自定义服务账户:

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: nginx
    image: nginx
  serviceAccountName: custom-sa
3. 为服务账户绑定权限

使用 RBAC 为服务账户绑定权限:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: example-rolebinding
  namespace: default
subjects:
- kind: ServiceAccount
  name: custom-sa
  namespace: default
roleRef:
  kind: Role
  name: example-role
  apiGroup: rbac.authorization.k8s.io

二、用户账户(User Account)

与服务账户不同,用户账户是为开发者、运维人员等人类用户设计的身份凭据。Kubernetes 本身并不管理用户账户,而是通过外部认证机制来实现。

用户账户的认证方式

1. 证书认证
  • 场景:管理员生成用户的私钥和证书,用于 kubeconfig 配置文件中登录 Kubernetes 集群。
  • 配置方法
    生成用户证书
openssl genrsa -out user.key 2048
openssl req -new -key user.key -out user.csr -subj "/CN=user1/O=developers"
openssl x509 -req -in user.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out user.crt -days 365

配置 kubeconfig 文件

kubectl config set-credentials user1 --client-certificate=user.crt --client-key=user.key
kubectl config set-context user1-context --cluster=my-cluster --user=user1
2. 令牌认证
  • 场景:为用户分发令牌,通过令牌文件认证用户身份。
  • 配置方法:在 API Server 的启动参数中指定令牌文件:
kube-apiserver --token-auth-file=tokens.csv
3. 外部身份认证系统
  • 场景:企业需要集成现有的身份认证系统(如 LDAP、Google OAuth 或 Keycloak)。
  • 配置方法:使用 OIDC 配置 API Server:
kube-apiserver \
  --oidc-issuer-url=https://issuer.example.com \
  --oidc-client-id=k8s-client \
  --oidc-username-claim=email \
  --oidc-groups-claim=groups
4. Webhook 认证
  • 场景:通过 Webhook 调用自定义服务进行用户认证。

Webhook 配置示例:

{
  "apiVersion": "authentication.k8s.io/v1beta1",
  "kind": "TokenReview",
  "spec": {
    "token": "user-jwt-token"
  }
}

API Server 参数:

kube-apiserver --authentication-token-webhook-config-file=webhook-config.json

用户账户与服务账户的实际应用对比

特性

用户账户

服务账户

用途

人类用户操作 Kubernetes 集群

Pod 与 API Server 通信

管理方式

外部认证系统,如证书、OIDC、Webhook

Kubernetes 内部自动管理

命名空间

跨命名空间

作用范围限制在命名空间内

权限分配

通过 RBAC 或 ClusterRoleBinding 分配权限

通过 Role 或 ClusterRoleBinding 分配权限

使用场景

管理员登录、开发者调试

服务访问 API、任务自动化


验证账户权限

无论是用户账户还是服务账户,配置完成后都可以使用以下命令验证权限:

kubectl auth can-i get pods --as=user1

或者验证服务账户权限:

kubectl auth can-i create deployments --as=system:serviceaccount:default:custom-sa

总结

  • 服务账户:适用于 Pod 和服务之间的通信,主要用于程序或工具与 API Server 交互。
  • 用户账户:为人类用户设计,通过外部认证机制接入,适用于管理员和开发者登录集群。

在 Kubernetes 的实际使用中,通过合理配置服务账户和用户账户,可以有效提升集群的安全性和访问控制的灵活性。希望这篇文章能帮助你理解 Kubernetes 的账户体系!如有疑问,欢迎留言交流。