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
posted @ 2025-07-21 14:02  寻梦行  阅读(10)  评论(0)    收藏  举报