为何需要Service Account?
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
kubectl get ServiceAccount -n kube-system
查看pod中使用的serviceaccount
在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对象
好处
imagepullsecret
serviceaccount 关联 imagepullsecret
pod 关联 serviceaccount就好了 当需要切换仓库的时候 只需要修改serviceaccount的定义