k8s无法直接创建用户,只能通过签发集群的证书机构签名的证书的形式创建用户,用户使用证书证明自己的身份(证书中的CN可以理解为用户名),来访问集群。RBAC再根据用户权限来鉴权。
账号分为用户账号和服务账号。用户账号给个人使用,是全局唯一的;服务账号是给运行在Pod中的进程使用,是命名空间级别的,1.22版本前服务账号的凭证保存在Secret中。
SA作用
- Pod与K8S api-server之间通信。
- 与外部服务通信。
- 免密拉取私有镜像。
- 外部服务与api-server通信。
使用方式
- 创建SA账号。
- 给SA账号绑定RBAC权限。
- 将SA添加到Pod Spec中。
控制器
SA控制器作用(SA controller)
- 确保每个命名空间内都有一个名为default的sa,Pod默认都会挂载该sa。
令牌控制器作用(Token controller)
为SA绑定访问token,可以是临时的也可以是永久的。
- 监控sa的删除,并删除对应的secret。
- 监控sa secret的创建,向SA中添加secret。
- 监控sa secret的删除,从SA中删除secret。
SA准入控制器作用(SA admission controller)
创建Pod时会修改Pod
- 如果Pod没有设置serviceAccountName,则为其设置为default。
- 检查Pod引用的SA存在,若不存在则Pod创建失败。
- 如果SA中的automountServiceAccountToke设置为false,且Pod的automountServiceAccountToke也为false,则为Pod添加一个额外volume,volume中包含api access token,并将volume挂载到Pod的每一个container中,挂载路径为/var/run/secrets/kubernetes.io/serviceaccount。
- 如果Pod没有设置imagePullSecrets,则从其配置的SA中找到imagePullSecrets并添加到Pod中。
SA账号的token
token有两种获取方式,一种是TokenRequest API自动获取临时token,一种是给SA绑定secret。1.22版本之前,k8s使用的是secret,之后使用的是临时token。
K8S会自动给Pod的SA创建token,SA准入控制器会将token作为projected volume到Pod中,kubelet会定期更新token。如果Pod设置automountServiceAccountToke为false则不会挂载token到Pod中。
kubectl create token build-robot --duration xxx
手动创建token并指定有效期。手动将secret作为SA的永久token。# k8s会在data中自动补充token主键。
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: mysecretname
annotations:
kubernetes.io/service-account.name: myserviceaccount
data:
extra: YMFyCg==
- 给SA配置拉取镜像的imagePullSecrets
apiVersion: v1
kind: ServiceAccount
metadata:
name: myserviceaccount
namespace: default
imagePullSecrets:
- name: myregistrykey
secrets:
- name: mysceretname