跳到主要内容

Kubernetes 服务账户

在Kubernetes中,服务账户(Service Account)是一种用于为Pod中的进程提供身份验证的机制。与用户账户不同,服务账户是专门为集群内部资源(如Pod)设计的,用于与Kubernetes API进行交互。通过服务账户,Pod可以安全地访问集群资源,而无需暴露敏感的用户凭证。

什么是服务账户?

服务账户是Kubernetes中的一种资源对象,用于为Pod提供身份验证信息。每个Pod在运行时都会关联一个服务账户,如果没有显式指定,Kubernetes会为Pod分配一个默认的服务账户(通常是default)。服务账户的核心作用是允许Pod与Kubernetes API进行安全通信。

备注

服务账户与用户账户的区别:

  • 用户账户:用于人类用户(如管理员或开发者)的身份验证。
  • 服务账户:用于集群内部资源(如Pod)的身份验证。

创建服务账户

在Kubernetes中,服务账户可以通过YAML文件定义并创建。以下是一个简单的服务账户定义示例:

yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-service-account

将上述内容保存为service-account.yaml文件,然后使用以下命令创建服务账户:

bash
kubectl apply -f service-account.yaml

创建成功后,可以通过以下命令查看服务账户:

bash
kubectl get serviceaccount my-service-account

输出示例:

NAME                SECRETS   AGE
my-service-account 1 10s

服务账户与Pod的关联

创建服务账户后,可以将其与Pod关联。以下是一个Pod定义示例,其中指定了服务账户:

yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
serviceAccountName: my-service-account
containers:
- name: my-container
image: nginx

在这个示例中,Podmy-pod将使用my-service-account服务账户进行身份验证。

提示

如果没有显式指定serviceAccountName,Kubernetes会为Pod分配默认的default服务账户。

服务账户的令牌(Token)

每个服务账户都会自动生成一个关联的Secret,其中包含一个用于身份验证的令牌(Token)。这个令牌会被挂载到Pod的文件系统中,通常位于/var/run/secrets/kubernetes.io/serviceaccount/token路径下。

以下是一个Pod中查看令牌的示例:

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

输出示例:

eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9...

这个令牌可以用于与Kubernetes API进行身份验证。

服务账户的权限控制

服务账户的权限通过**角色(Role)角色绑定(RoleBinding)**进行控制。以下是一个简单的角色和角色绑定示例:

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

在这个示例中,my-service-account服务账户被授予了读取Pod的权限。

实际应用场景

场景1:Pod访问Kubernetes API

假设你有一个Pod需要访问Kubernetes API来获取集群中所有Pod的信息。你可以创建一个服务账户,并为其分配适当的权限,然后将该服务账户与Pod关联。

场景2:CI/CD流水线中的自动化任务

在CI/CD流水线中,你可能需要运行一些自动化任务(如部署应用)。通过为这些任务创建专用的服务账户,可以确保它们只拥有执行任务所需的最小权限,从而提高安全性。

总结

Kubernetes服务账户是集群内部资源身份验证的核心机制。通过服务账户,Pod可以安全地与Kubernetes API进行交互,而无需暴露敏感的用户凭证。服务账户的权限可以通过角色和角色绑定进行精细控制,从而确保最小权限原则。

警告

确保为服务账户分配最小必要的权限,以避免潜在的安全风险。

附加资源与练习

  • 官方文档Kubernetes Service Accounts
  • 练习:创建一个服务账户,并为其分配读取ConfigMap的权限。然后创建一个Pod,使用该服务账户访问ConfigMap。

通过以上内容,你应该对Kubernetes服务账户有了全面的了解。接下来,尝试在实际项目中应用这些知识,以加深理解!