kubernetes-ServiceAccount介绍

311 阅读2分钟

为何需要Service Account?

image.png

Kubernetes原生(kubernetes-native)托管运行于Kubernetes之上,通常需要直接与API Server进行交互以获取必要的信息

API Server同样需要对这类来自于Pod资源中客户端程序进行身份验证,ServiceAccount也就是设计专用于这类场景的账号

ServiceAccount是API Server支持的标准资源类型之

创建示例

kubectl create serviceaccount my-service-account --dry-run=client -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: null
  name: my-service-account

查看当前的ServiceAccount

kubectl get ServiceAccount

image.png

kubectl get ServiceAccount -n kube-system

image.png

查看pod中使用的serviceaccount image.png

在Pod上使用Service Account

flannel 需要特殊的权限

自动设定:Service Account通常由API Server自动创建并通过 ServiceAccount准入控制器自动关联到集群中创建的每个Pod上

自定义:在Pod规范上,使用serviceAccountName指定要使用的特定ServiceAccount

ServiceAccount资源类型

ServiceAccount是Kubernetes API上的标准资源类型

  • 基于资源对象保存ServiceAccount的数据

  • 认证信息保存于ServiceAccount对象专用的Secret中

  • 隶属名称空间级别,专供集群上的Pod中的进程访问API Server时使用

  • Kubernetes基于三个组件完成Pod上serviceaccount的自动化

    • ServiceAccount Admission Controller
    • Token Controller
    • ServiceAccount Controller
  • 需要用到特殊权限时,可为Pod指定要使用的自定义ServiceAccount资源对象

ServiceAccount专用的Secret类型

ServiceAccount使用专用的Secret类型存储相关的敏感信息

  • 类型标识为“kubernetes.io/serviceaccount”
  • 有三个固定的数据项,键名称分别为
    • ca.crt:Kubernetes CA的数字证书
    • namespace:该ServiceAccount可适用的名称空间
    • token:认证到API Server的令牌

ServiceAccount Admission Controller负责完成Pod上的ServiceAccount的自动化

  • 为每个名称空间生成一个默认的default ServiceAccount及其依赖到的Secret对象;
  • 为未定义serviceAccountName的Pod资源自动附加名称空间下的serviceaccounts/default;
  • 为定义了serviceAccountName的Pod资源检查其引用的目标对象是否存在

创建和使用ServiceAccount

创建示例

kubectl create serviceaccount my-service-account --dry-run=client -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: null
  name: my-service-account

Pod上引用ServiceAccount对象

image.png

好处

imagepullsecret

serviceaccount 关联 imagepullsecret

pod 关联 serviceaccount就好了 当需要切换仓库的时候 只需要修改serviceaccount的定义