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
目录。令牌包含以下信息:
其中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中使用专用服务账户实现部署权限控制:
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安全实践的重要基础。