背景说明
api server是整个访问请求进入的网关接口,请求过程中认证用于身份识别,而授权用于权限检查,准入控制是进一步补充授权检查。和APIserver打交道的有两类:
- 来自集群外部的进程
- 来自集群内部的Pod
kubernetes中有两种账号,分别为用户账号[User Account]和服务账号[ServiceAccount]
账号组[Group]这是用来关联多个账号的,集群中有一些默认创建的组,比如cluster-admin
用户账号
由外部独立服务进行管理的,管理员进行私钥的分配,用户可以使用KeyStone或者Goolge账号,甚至一个用户名和密码的文件列表也可以,对于用户的管理集群内部没有一个关联的资源对象,所以用户不能通过集群内部API来进行管理
账号特点
- 外部客户端程序以什么身份访问
- 用户账号是为人设计的,外部客户端用户用来通过证书进行访问,当证书验证通过,则该用户具备该证书用户的全部权限
- 用户账号跨Namespace[命名空间],作用于全局,需要全局唯一
- 用户账号访问系统资源需要通过角色绑定进行赋权
服务账号
通过kubernetes API 来管理一些用户账号,和namesapces 进行关联的,适用于集群内部运行的应用程序,需要通过API来完成权限认证,所以在集群内部进行权限操作,我们都需要用到ServiceAccount
它是k8s之上的一个标准资源,它通过secrets保存着这个用户帐号要接入APIServer时的密码,作为一个secrets资源存在。
术语缩写
账号特点
- Pod里面的进程以什么身份运行
- 服务账号是为Pod调用Kubernetes API设计的,是某个服务/资源/程序使用的
- 服务账号局限于它所在的Namespace[命名空间],在不同命名空间中的同名ServiceAccount被认为是不同的资源
- 服务账号访问系统资源需要通过角色绑定进行赋权
每个Namespace都会附带一个默认的default服务账号,并且有默认的secret
[root@cka-master ~]# kubectl get sa
NAME SECRETS AGE
default 1 18h
[root@cka-master ~]# kubectl describe sa default
Name: default
Namespace: nsrole
Labels: <none>
Annotations: <none>
Image pull secrets: <none>
Mountable secrets: default-token-2d9lz
Tokens: default-token-2d9lz
Events: <none>
[root@cka-master ~]# kubectl get secrets |grep -i default
default-token-2d9lz kubernetes.io/service-account-token 3 18h
[root@cka-master ~]#
[root@cka-master ~]# kubectl describe secrets default-token-2d9lz
Name: default-token-2d9lz
Namespace: nsrole
Labels: <none>
Annotations: kubernetes.io/service-account.name: default
kubernetes.io/service-account.uid: ffe795fe-a410-47e4-937c-a911b9309c86
Type: kubernetes.io/service-account-token
Data
====
namespace: 6 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6InV1N3FiZC04UDRIa1dWRW43S05fNEhpbXNzQ05Vb3JVQ0VVVGhCeGVfb28ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJuc3JvbGUiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoiZGVmYXVsdC10b2tlbi0yZDlseiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZmZlNzk1ZmUtYTQxMC00N2U0LTkzN2MtYTkxMWI5MzA5Yzg2Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Om5zcm9sZTpkZWZhdWx0In0.i6f7FzRoYn5yPFmzWjlKu_ESLFmGcYkC_dN3qrgGMMPQ_NYP_cc1kb3t1Yi0m3FDbS-GoXeyYbQZEQB7-C_6UtYWPziYXBMEOtgRJMwFsAosFae1X_Cwcl3V5woCKQNfHWHg1W9oRBJBKP85Spcg65sl4Krs0wLUKURm_OeM9ehjEwugWhC6fuwJ6kvq42hMnGwjOd-GwSht9oiWkAeC3di_RJPU0jBnyXuE33el9_zuBEl6Dw51SpS5imNIrxQnuzzLL_k_PflAgmoCaSMJIcdakyZF1hdQr89hUQfhOk_8fZi9ejMq7z_jHbiOjRp8k1qS19PdHEV3LolUbVJG4Q
ca.crt: 1099 bytes
[root@cka-master ~]#
账号创建
在创建SA资源的时候我们可以指定metadata.name来指定该SA的名称,metadata.namespace来指定该ServiceAccount所属的namespace,当前用户的认证信息是什么则需要靠secrets来提供,
[root@cka-master ~]# kubectl get sa default -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: "2022-03-14T06:34:52Z"
name: default
namespace: nsrole
resourceVersion: "76884"
uid: ffe795fe-a410-47e4-937c-a911b9309c86
secrets:
- name: default-token-2d9lz
[root@cka-master ~]#
apiVersion: v1
kind: Pod
metadata:
name: pod-sa
spec:
containers:
- name: pod-sa
image: nginx
serviceAccountName: podsa