一、什么是K8s服务账户ServiceAccount

ServiceAccount是Kubernetes中的一种资源,主要用于身份验证和授权,可以让应用或用户以特定的身份访问集群内部的其他资源和服务。

Kubernetes 1.24 版本对 Service Account(SA)的 Secret 创建行为确实做了重大调整。以下是版本差异的详细说明:

1.24 版本之前的行为

  • 自动创建 Secret:在 Kubernetes 1.20 及更早版本中,每创建一个 Service Account,系统会自动生成一个关联的 Secret。该 Secret 包含一个永不过期的 token,并通过投射卷(Projected Volume)挂载到 Pod 的 /var/run/secrets/kubernetes.io/serviceaccount 目录下,供 Pod 访问 Kubernetes API 时使用
  • 1.21~1.23 版本的过渡:在 1.21 到 1.23 版本中,虽然仍会为 SA 自动生成 Secret,但 Pod 不再直接使用 Secret 中的 token,而是由 kubelet 通过 TokenRequest API 动态申请一个有效期为 1 小时的临时 token。此 token 会被自动刷新,旧 token 会在过期后失效

1.24 版本之后的变更

  • 不再自动创建 Secret:从 1.24 版本开始,Kubernetes 彻底移除了为 SA 自动生成 Secret 的功能。所有 token 均需通过 TokenRequest API 动态生成,且默认有效期为 1 小时
  • 动态 token 的特性:动态生成的 token 具有短期有效性,且在 Pod 删除后立即失效。这种设计增强了安全性,但可能导致需要长期 token 的场景(如跨集群操作)出现问题

二、K8s服务账户ServiceAccount应用场景

K8s服务账户ServiceAccount主要应用场景如下:

  • 1)授权给应用程序指定的权限,让其可以访问集群中的资源
  • 2)生成受限的kubeconfig,供不同的用户使用
  • 3)生成临时或永久token,可以登录Kubernetes的Dashboard

三、K8s服务账户ServiceAccount资源定义

3.1 命令格式定义

使用 kubectl create 命令直接创建 ServiceAccount:

# 在default命名空间下进行创建
kubectl create serviceaccount sa-demo  

3.2 yaml格式定义

# 编写yaml文件
vim sa.yaml  

apiVersion: v1  
kind: ServiceAccount  
metadata:  
  name: sa-demo  # ServiceAccount 名称  
  namespace: default  # 所属命名空间,默认可不写  

# 应用yaml文件
kubectl apply -f sa.yaml