跳转到内容

Kubernetes服务账户

来自代码酷

Kubernetes服务账户[编辑 | 编辑源代码]

介绍[编辑 | 编辑源代码]

Kubernetes服务账户(Service Account)是Kubernetes中用于管理Pod身份验证和授权的核心机制。与普通用户账户不同,服务账户专门供集群内的进程(如Pod中运行的应用程序)使用,用于与Kubernetes API服务器交互。服务账户通过关联的令牌(Token)和RBAC规则实现细粒度的权限控制。

主要特点:

  • 每个命名空间自动创建默认服务账户(default
  • 服务账户通过Secret存储认证令牌
  • 可与Role/RoleBinding结合实现权限分配
  • 支持多服务账户配置(一个Pod可关联多个服务账户)

核心概念[编辑 | 编辑源代码]

服务账户与用户账户的区别[编辑 | 编辑源代码]

对比项 服务账户 用户账户
使用者 Pod内部进程 人类用户或外部服务
创建方式 自动或通过kubectl创建 通过外部身份提供商管理
命名空间 属于特定命名空间 全局范围
典型用途 Pod访问API服务器 管理员操作集群

服务账户令牌[编辑 | 编辑源代码]

服务账户通过JWT(JSON Web Token)进行认证,令牌存储在Secret中并自动挂载到Pod的/var/run/secrets/kubernetes.io/serviceaccount目录。令牌包含以下信息: header.payload.signature 其中payload包含:

{
  "iss": "kubernetes/serviceaccount",
  "sub": "system:serviceaccount:namespace:serviceaccountname"
}

实际操作[编辑 | 编辑源代码]

创建服务账户[编辑 | 编辑源代码]

基本创建命令:

kubectl create serviceaccount my-sa

查看创建的Secret:

kubectl get serviceaccount my-sa -o yaml

输出示例:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-sa
  namespace: default
secrets:
- name: my-sa-token-xyz12

在Pod中使用服务账户[编辑 | 编辑源代码]

在Pod定义中指定服务账户:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  serviceAccountName: my-sa
  containers:
  - name: main
    image: nginx

检查挂载的令牌[编辑 | 编辑源代码]

进入Pod查看挂载的令牌:

kubectl exec -it my-pod -- cat /var/run/secrets/kubernetes.io/serviceaccount/token

安全实践[编辑 | 编辑源代码]

最小权限原则[编辑 | 编辑源代码]

通过RBAC限制服务账户权限示例:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: ServiceAccount
  name: my-sa
  namespace: default
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

禁用自动挂载[编辑 | 编辑源代码]

对于不需要API访问的Pod,可禁用令牌自动挂载:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  automountServiceAccountToken: false
  containers:
  - name: main
    image: nginx

实际案例[编辑 | 编辑源代码]

CI/CD流水线中的使用[编辑 | 编辑源代码]

在Jenkins Pod中使用专用服务账户实现部署权限控制:

使用
绑定
Jenkins Pod
deployer-sa
Deploy Role
创建Deployment
更新ConfigMap

YAML配置示例:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: deployer-sa
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: deploy-role
rules:
- apiGroups: ["apps"]
  resources: ["deployments"]
  verbs: ["create", "update", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: deployer-binding
subjects:
- kind: ServiceAccount
  name: deployer-sa
roleRef:
  kind: Role
  name: deploy-role
  apiGroup: rbac.authorization.k8s.io

常见问题[编辑 | 编辑源代码]

服务账户令牌轮换[编辑 | 编辑源代码]

Kubernetes 1.21+支持自动令牌轮换:

  • 令牌默认有效期1年
  • 可配置--service-account-max-token-expiration参数
  • kube-controller-manager自动维护有效令牌

跨命名空间访问[编辑 | 编辑源代码]

需要创建ClusterRole和ClusterRoleBinding:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cross-ns-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cross-ns-binding
subjects:
- kind: ServiceAccount
  name: my-sa
  namespace: default
roleRef:
  kind: ClusterRole
  name: cross-ns-reader
  apiGroup: rbac.authorization.k8s.io

最佳实践[编辑 | 编辑源代码]

1. 避免使用default服务账户进行操作 2. 为不同工作负载创建专用服务账户 3. 定期审计服务账户权限 4. 在安全敏感环境禁用自动挂载 5. 使用RBAC实现最小权限分配

总结[编辑 | 编辑源代码]

Kubernetes服务账户是集群内部身份认证的关键组件,通过合理配置可以实现:

  • Pod与API服务器的安全通信
  • 细粒度的权限控制
  • 工作负载隔离
  • 自动化流程的安全保障

理解并正确使用服务账户是Kubernetes安全实践的重要基础。