K8S默认基于sa进行认证
介绍以及背景****
1.为何需要Service Account
Kubernetes原生(kubernetes-native)托管运行于Kubernetes之上,通常需要直接与API Server进行交互以获取必要的信息。
API Server同样需要对这类来自于Pod资源中客户端程序进行身份验证,Service Account也就是设计专用于这类场景的账号。
ServiceAccount是API Server支持的标准资源类型之一。
- 1.基于资源对象保存ServiceAccount的数据;
- 2.认证信息保存于ServiceAccount对象专用的Secret中(v1.23-版本)
- 3.隶属名称空间级别,专供集群上的Pod中的进程访问API Server时使用;
2.Pod使用ServiceAccount方式
在Pod上使用Service Account通常有两种方式:
自动设定:
Service Account通常由API Server自动创建并通过ServiceAccount准入控制器自动关联到集群中创建的每个Pod上。
自定义:
在Pod规范上,使用serviceAccountName指定要使用的特定ServiceAccount。
Kubernetes基于三个组件完成Pod上serviceaccount的自动化,分别对应: ServiceAccount Admission Controller,Token Controller,ServiceAccount Controller。
ServiceAccount Admission Controller:
API Server准入控制器插件,主要负责完成Pod上的ServiceAccount的自动化。
为每个名称空间自动生成一个"default"的sa,若用户未指定sa,则默认使用"default"。
- Token Controller:
为每一个sa分配一个token的组件,已经集成到Controller manager的组件中。
- ServiceAccount Controller:
为sa生成对应的数据信息,已经集成到Controller manager的组件中。
3.ServiceAccount Token的不同实现方式
-
1.Secret对象的类型标识为“kubernetes.io/service-account-token”
-
2.该Secret对象会自动附带认证到API Server用到的Token,也称为ServiceAccount Token
ServiceAccount Token的不同实现方式 -
1.Kubernetes v1.20-
系统自动生成专用的Secret对象,并基于secret卷插件关联至相关的Pod;
Secret中会自动附带Token且永久有效(安全性低,如果将来获取该token可以长期登录)。 -
2.Kubernetes v1.21-v1.23:
系统自动生成专用的Secret对象,并通过projected卷插件关联至相关的Pod;
Pod不会使用Secret上的Token,被弃用后,在未来版本就不在创建该token。
而是由Kubelet向TokenRequest API请求生成,默认有效期为一年,且每小时更新一次; -
3.Kubernetes v1.24+:
系统不再自动生成专用的Secret对象。
而是由Kubelet负责向TokenRequest API请求生成Token,默认有效期为一年,且每小时更新一次;
测试实例
点击查看代码
cat 02-deploy-sa-secrets-harbor.yaml
apiVersion: v1
kind: Secret
metadata:
name: harbor-linux98
type: kubernetes.io/dockerconfigjson
stringData:
# 解码:
# echo bGludXg5ODpMaW51eDk4QDIwMjU= | base64 -d
# 编码:
# echo -n linux98:Linux98@2025 | base64
.dockerconfigjson: '{"auths":{"harbor250.oldboyedu.com":{"username":"linux98","password":"Linux98@2025","email":"linux98@oldboyedu.com","auth":"bGludXg5ODpMaW51eDk4QDIwMjU="}}}'
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: sa-linux98
# 让sa绑定secret,将来与sa认证时,会使用secret的认证信息。
imagePullSecrets:
- name: harbor-linux98
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-xiuxian-sa-secrets-harbor
spec:
replicas: 3
selector:
matchLabels:
apps: v1
template:
metadata:
labels:
apps: v1
spec:
#imagePullSecrets:
#- name: "harbor-linux98"
# 指定服务账号,该字段官方已经弃用。推荐使用'serviceAccountName',如果不指定,则默认名称为"default"的sa。
# serviceAccount: sa-linux98
# 推荐使用该字段来指定sa的认证信息
serviceAccountName: sa-linux98
containers:
- name: c1
image: harbor250.oldboyedu.com/oldboyedu-xiuxian/apps:v3
imagePullPolicy: Always

浙公网安备 33010602011771号