目录
- 一、服务账户的组成部分
- 二、创建服务账户
- 三、绑定权限
- 四、在Pod中使用服务账户
- 五、注意事项
在 Kubernetes 中,Service Account(服务账户)是一种特殊的 Kubernetes 账户,主要用于在 Pod 内运行的应用程序,以便这些应用程序能够与 Kubernetes API 进行交互,比如读取或修改 Kubernetes 对象。每个命名空间下默认都会有一个名为 default
的服务账户,也可以创建额外的服务账户来满足不同权限需求。
一、服务账户的组成部分
-
Token Secret: 服务账户会自动关联一个 Secret,这个 Secret 包含了一个用于 API 认证的令牌(token)。Pod 中的应用可以通过环境变量、文件挂载或 API 请求获取这个 token 来认证自己。
-
API访问权限: 服务账户可以通过关联的 Role 或 ClusterRole(通过 RoleBinding 或 ClusterRoleBinding)来定义它能访问哪些资源和执行哪些操作。
二、创建服务账户
下面是如何创建一个自定义服务账户的 YAML 示例:
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-app-account
namespace: my-namespace
三、绑定权限
接着,可以为这个服务账户绑定角色,例如赋予它读取 Pod 的权限:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: my-namespace
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-reader-binding
namespace: my-namespace
subjects:
- kind: ServiceAccount
name: my-app-account
namespace: my-namespace
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
四、在Pod中使用服务账户
一旦服务账户创建并配置好权限,就可以在 Pod 定义中指定使用哪个服务账户。默认情况下,Pod 使用所在命名空间的 default
服务账户,但可以通过以下方式指定:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
namespace: my-namespace
spec:
serviceAccountName: my-app-account # 指定服务账户
containers:
- name: my-container
image: my-image
五、注意事项
- 服务账户的权限应该遵循最小权限原则,即仅给予完成任务所必需的最小权限集。
- 服务账户的 Secret(包含 API 访问令牌)应该妥善管理,避免泄露。
- 如果Pod不需要与API服务器交互,可以考虑不指定服务账户或者使用没有附加权限的服务账户。