背景说明

api server是整个访问请求进入的网关接口,请求过程中认证用于身份识别,而授权用于权限检查,准入控制是进一步补充授权检查。和APIserver打交道的有两类:

  1. 来自集群外部的进程
  2. 来自集群内部的Pod

kubernetes中有两种账号,分别为用户账号[User Account]和服务账号[ServiceAccount]

账号组[Group]这是用来关联多个账号的,集群中有一些默认创建的组,比如cluster-admin

用户账号

由外部独立服务进行管理的,管理员进行私钥的分配,用户可以使用KeyStone或者Goolge账号,甚至一个用户名和密码的文件列表也可以,对于用户的管理集群内部没有一个关联的资源对象,所以用户不能通过集群内部API来进行管理

账号特点

  1. 外部客户端程序以什么身份访问
  2. 用户账号是为人设计的,外部客户端用户用来通过证书进行访问,当证书验证通过,则该用户具备该证书用户的全部权限
  3. 用户账号跨Namespace[命名空间],作用于全局,需要全局唯一
  4. 用户账号访问系统资源需要通过角色绑定进行赋权

服务账号

通过kubernetes API 来管理一些用户账号,和namesapces 进行关联的,适用于集群内部运行的应用程序,需要通过API来完成权限认证,所以在集群内部进行权限操作,我们都需要用到ServiceAccount
它是k8s之上的一个标准资源,它通过secrets保存着这个用户帐号要接入APIServer时的密码,作为一个secrets资源存在。

术语缩写

SA

账号特点

  1. Pod里面的进程以什么身份运行
  2. 服务账号是为Pod调用Kubernetes API设计的,是某个服务/资源/程序使用的
  3. 服务账号局限于它所在的Namespace[命名空间],在不同命名空间中的同名ServiceAccount被认为是不同的资源
  4. 服务账号访问系统资源需要通过角色绑定进行赋权

每个Namespace都会附带一个默认的default服务账号,并且有默认的secret

  1. [root@cka-master ~]# kubectl get sa
  2. NAME SECRETS AGE
  3. default 1 18h
  4. [root@cka-master ~]# kubectl describe sa default
  5. Name: default
  6. Namespace: nsrole
  7. Labels: <none>
  8. Annotations: <none>
  9. Image pull secrets: <none>
  10. Mountable secrets: default-token-2d9lz
  11. Tokens: default-token-2d9lz
  12. Events: <none>
  13. [root@cka-master ~]# kubectl get secrets |grep -i default
  14. default-token-2d9lz kubernetes.io/service-account-token 3 18h
  15. [root@cka-master ~]#
  16. [root@cka-master ~]# kubectl describe secrets default-token-2d9lz
  17. Name: default-token-2d9lz
  18. Namespace: nsrole
  19. Labels: <none>
  20. Annotations: kubernetes.io/service-account.name: default
  21. kubernetes.io/service-account.uid: ffe795fe-a410-47e4-937c-a911b9309c86
  22. Type: kubernetes.io/service-account-token
  23. Data
  24. ====
  25. namespace: 6 bytes
  26. token: eyJhbGciOiJSUzI1NiIsImtpZCI6InV1N3FiZC04UDRIa1dWRW43S05fNEhpbXNzQ05Vb3JVQ0VVVGhCeGVfb28ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJuc3JvbGUiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoiZGVmYXVsdC10b2tlbi0yZDlseiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZmZlNzk1ZmUtYTQxMC00N2U0LTkzN2MtYTkxMWI5MzA5Yzg2Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Om5zcm9sZTpkZWZhdWx0In0.i6f7FzRoYn5yPFmzWjlKu_ESLFmGcYkC_dN3qrgGMMPQ_NYP_cc1kb3t1Yi0m3FDbS-GoXeyYbQZEQB7-C_6UtYWPziYXBMEOtgRJMwFsAosFae1X_Cwcl3V5woCKQNfHWHg1W9oRBJBKP85Spcg65sl4Krs0wLUKURm_OeM9ehjEwugWhC6fuwJ6kvq42hMnGwjOd-GwSht9oiWkAeC3di_RJPU0jBnyXuE33el9_zuBEl6Dw51SpS5imNIrxQnuzzLL_k_PflAgmoCaSMJIcdakyZF1hdQr89hUQfhOk_8fZi9ejMq7z_jHbiOjRp8k1qS19PdHEV3LolUbVJG4Q
  27. ca.crt: 1099 bytes
  28. [root@cka-master ~]#

账号创建

在创建SA资源的时候我们可以指定metadata.name来指定该SA的名称,metadata.namespace来指定该ServiceAccount所属的namespace,当前用户的认证信息是什么则需要靠secrets来提供,

  1. [root@cka-master ~]# kubectl get sa default -o yaml
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5. creationTimestamp: "2022-03-14T06:34:52Z"
  6. name: default
  7. namespace: nsrole
  8. resourceVersion: "76884"
  9. uid: ffe795fe-a410-47e4-937c-a911b9309c86
  10. secrets:
  11. - name: default-token-2d9lz
  12. [root@cka-master ~]#
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: pod-sa
  5. spec:
  6. containers:
  7. - name: pod-sa
  8. image: nginx
  9. serviceAccountName: podsa