kube-apiserver授权是用于控制对集群资源的访问控制,和认证类似,kubernetes也支持多种授权机制,并支持同时开启多个授权插件(只要有一个验证通过即可)。如果授权成功,请求会发到准入模块做进一步的请求验证,对于授权失败的请求会返回403,kubernetes支持的授权插件包括ABAC/RBAC/Webhook/Node方式。接下来将主要介绍很常用的RBAC授权模式。基于角色的访问控制(Role-Based Access Control,即”RBAC”)使用 rbac.authorization.k8s.io API Group 实现授权决策,允许管理员通过 Kubernetes API 动态配置策略。RBAC的工作原理如下所示:
首先Kubernetes中账户区分为:User Accounts(用户账户) 和 Service Accounts(服务账户) 两种,它们的设计及用途如下:
- UserAccount是给kubernetes集群外部用户使用的,例如运维或者集群管理人员,使用kubectl命令时用的就是UserAccount账户;UserAccount是全局性。在集群所有namespaces中,名称具有唯一性,默认情况下用户为admin;(查看命令:cd ~/.kube; cat config)
- ServiceAccount是给运行在Pod的程序使用的身份认证,Pod容器的进程需要访问API Server时用的就是ServiceAccount账户;ServiceAccount仅局限它所在的namespace,每个namespace都会自动创建一个default service account;创建Pod时,如果没有指定Service Account,Pod则会使用default Service Account。
Role和ClusterRole的区别,Role控制namespace范畴下的资源操作查看权限,ClusterRole控制一个集群下的资源操作查看权限。 User可以绑定Role也可以绑定ClusterRole。
上次在演示X509认证过程中,创建了myuser,当时给该user创建了role(具备default namespace下的一些pod查看操作权限),但是没有分配其他namespace资源操作权限,现在接着使用该user来看看如何完成RBAC的授权。检查目前用户的权限,可以看到查看default namespace的pod可以正常查看到,如果查看kube-system namespace下的pod会提示无权限查看。
接下来就看看如何通过创建role,rolebinding给myuser进行赋权,让其能访问kube-system namespace下的资源权限。
创建Role的yaml文件内容如下所示:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: kube-system
name: pod-reader
rules:
- apiGroups: [""] # "" 标明 core API 组
resources: ["pods"]
verbs: ["get", "watch", "list"]
创建Rolebinding文件内容如下所示:
apiVersion: rbac.authorization.k8s.io/v1
# 此角色绑定允许 "myuser" 读取 "kube-system" 名字空间中的 Pods
kind: RoleBinding
metadata:
name: read-pods
namespace: kube-system
subjects:
# 你可以指定不止一个“subject(主体)”
- kind: User
name: myuser # "name" 是区分大小写的
apiGroup: rbac.authorization.k8s.io
roleRef:
# "roleRef" 指定与某 Role 或 ClusterRole 的绑定关系
kind: Role # 此字段必须是 Role 或 ClusterRole
name: pod-reader # 此字段必须与你要绑定的 Role 或 ClusterRole 的名称匹配
apiGroup: rbac.authorization.k8s.io
通过命令在kube-system namespace下创建Role和Rolebinding.
kubectl create -f role.yaml -n kube-system
kubectl create -f rolebinding.yaml -n kube-system
再次通过myuser获取kube-system namespace下面的pod信息,可以看到正确返回了pod信息。
除了对User或者SA赋权外,还可以对Group进行赋权,对Group进行赋权后,整个Group下的User都具备了被赋予的权限。如果是对Group进行赋权,将subjects下的kind修改为Group即可。例如,对已经通过认证和未通过认证的用户进行赋权。
subjects:
- kind: Group
name: system:authenticated
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: system:unauthenticated
apiGroup: rbac.authorization.k8s.io
以上就是kube-apiserver授权过程。