Kubernetes 中的 ServiceAccount 使用指南
Kubernetes 中的 ServiceAccount 使用指南
在Kubernetes(K8s)中,ServiceAccount是一种专门用于控制Pod与Kubernetes API之间交互的资源。它提供身份验证的凭据,通常用于向Pod授予访问Kubernetes API的权限。本文将详细介绍ServiceAccount的概念、用途、创建方法、与RBAC的结合使用以及相关场景。
1. ServiceAccount 的概念
默认情况下,Kubernetes集群会自动为每个Pod分配一个默认的default
ServiceAccount。ServiceAccount本质上是K8s内部的一种身份标识,用于关联Pod与相关的权限。
2. ServiceAccount 的用途
- 授予Pod访问Kubernetes API的权限。
- 结合RBAC(Role-Based Access Control)实现细粒度的权限控制。
- 配合Kubernetes中的身份认证、访问控制和审计功能。
- 用于在Kubernetes中运行需要访问K8s API的应用程序(如Operators、Controllers)。
3. 创建和使用 ServiceAccount
3.1 创建 ServiceAccount
需要定义一个ServiceAccount的YAML文件service-account.yaml
:
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-service-account
namespace: default
执行以下命令来创建:
kubectl apply -f service-account.yaml
3.2 将 ServiceAccount 绑定到 Pod
需要在Pod的YAML文件中指定serviceAccountName
,例如my-pod.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
namespace: default
spec:
serviceAccountName: my-service-account
containers:
- name: my-container
image: nginx
执行以下命令来创建Pod:
kubectl apply -f my-pod.yaml
3.3 查看 ServiceAccount
使用以下命令查看集群中的ServiceAccount:
kubectl get serviceaccounts
4. 查询 ServiceAccount
可以使用多种方式来查询ServiceAccount的详细信息:
4.1 列出所有 ServiceAccount
列出当前命名空间中的所有ServiceAccount:
kubectl get serviceaccounts
如果需要查看其他命名空间的ServiceAccount,可以使用-n
选项:
kubectl get serviceaccounts -n <namespace-name>
4.2 查看特定 ServiceAccount 的详细信息
可以使用kubectl describe
命令查看ServiceAccount的详细信息:
kubectl describe serviceaccount my-service-account
4.3 查看 ServiceAccount 关联的 Secret
执行以下命令列出所有关联的Secret:
kubectl get secrets
并通过以下命令查看Secret的详细信息:
kubectl describe secret <secret-name>
5. RBAC 与 ServiceAccount
可以为ServiceAccount配置RBAC权限,例如赋予my-service-account
读取Pod列表的权限。
5.1 创建 Role
定义一个role.yaml
文件,包含如下内容:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
执行以下命令来创建Role:
kubectl apply -f role.yaml
5.2 创建 RoleBinding
定义一个rolebinding.yaml
文件,绑定my-service-account
到pod-reader
角色:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: pod-reader-binding
namespace: default
subjects:
- kind: ServiceAccount
name: my-service-account
namespace: default
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
执行以下命令来创建RoleBinding:
kubectl apply -f rolebinding.yaml
6. ServiceAccount 的 Token
每个ServiceAccount都会自动创建一个Secret,包含访问Kubernetes API所需的token。可以通过以下命令查看:
kubectl get secrets
也可以通过描述ServiceAccount看到关联的Secret:
kubectl describe serviceaccount my-service-account
7. 使用场景
- 授权某个Pod访问集群中的资源。
- 安全运行需要Kubernetes API交互的自定义控制器。
- 与GitOps或CI/CD相关的工作负载集成。
通过正确地创建和配置ServiceAccount,可以在Kubernetes集群中实现更安全、灵活的权限管理。