16.RBAC
一、简介
API Server是访问和管理资源对象的唯一入口,是k8s的网关。k8s集群中各组件访问都需要经过网关才能进行正常访问和管理。每一次访问都需要进行身份、操作权限、操作规范的验证。

ServiceAccount的作用:方便Pod里面的进程调用k8s API或其他外部服务。
SA是仅局限它所在的namespace。
每个namespace都会自动创建一个default service account。
Token controller会检测service account的创建,并为它们创建secret。
开启ServiceAccount Admission Controller后
-
- 每个pod在创建后都会自动设置spec.serviceAccout为default。
- 验证pod引用的service account已经存在,否则拒绝创建。
- 如果pod没有指定imagePullSecrets,则把service account的imagePullSecrets加到Pod中。
- 每个container启动后都会挂载该service account的token 和ca.crt到/var/run/secrets/kubernetes.io/serviceaccount/。
当创建pod时,如果没有指定一个service account,系统会自动在与该pod相同的namespace下为其指派一个default service account。而pod和apiserver之间进行通信的账号称为serviceAccountName。

kubectl describe pod myapp-0

以上可以看到pod即使没有定义都会有这个存储卷default-token***。它存储了pod和serviceaccount的认证信息。
每个namespace都有一个默认的名为default的service account。可以在名称空间内的secret,也可以看到对应default-token。

默认的service account不能获取其它namespace的pod信息。
service account的使用,pod 的spec.serviceAccountName设置使用的service account名字。
在pod创建之初service account就必须存在,已创建的pod不支持更新service account。
kubectl create serviceaccount admin
对资源的访问可以是token,也可以是通过配置文件的方式进行保存和使用认证信息
kubeclt config view

下图admin、user1分别对kubernetes、cluster1集群的访问

二、RBAC
user属于一个Role,Role拥有某个权限,从而user拥用相应权限。
RBAC使用rbac.authorization.k8s.io的API Group实现授权决策,允许通过k8s API动态配置策略。
Role分为namespace级的cluster级的。
Role、RoleBinding、ClusterRole、ClusterRoleBinding。
RoleBinding仅对当前名称空间有对应的权限。
也可以把ClusterRole与RoleBinding进行绑定:例:有10个namespace,每个namespace都要一个管理员,权限相同,这样就要用RoleBinding绑定10个Role,如果用ClusterRole就只需绑定一个RoleBinding。
三、例
例1. user--->Rolebinding--->Role
3.1.创建用户
自建证书和账号进行访问api-server
3.1.1生成证书
(umask 077;openssl genrsa -out ben.key 2048) ##生成自签证书
3.1.2使用ca.crt进行签署
openssl req -new -key ben.key -out ben.csr -subj "/CN=ben" ##证书签署请求 openssl x509 -req -in ben.csr -CA ./ca.crt -CAkey ./ca.key -CAcreateserial -out ben.crt -days 3650 ##证书签署 cp /etc/kubernetes/pki/ca.crt ./ ##copy用kubespace安装时产生的根证书进行签发 cp /etc/kubernetes/pki/ca.key ./ (openssl x509 -req -in ben.csr -CA ./ca.crt -CAkey ./ca.key -CAcreateserial -out ben.crt -days 3650 ##证书签署) openssl x509 -in ben.crt -text -noout
3.1.3添加到用户认证
kubectl config set-credentials ben --client-certificate=./ben.crt --client-key=./ben.key --embed-certs=true kubectl config set-context ben@cluster.local --cluster=cluster.local --user=ben
kubectl config view

切换上下文,即切换管理用户
kubectl config use-context ben@cluster.local
kubectl get pods

切换回原cluster上下文
kubectl config use-context kubernetes-admin@cluster.local
3.2.创建角色
kubectl create role -h
kubectl create role pods-reader --verb=get,list,watch --resource=pods --dry-run --o yaml ##不实际创建,仅输出role的yaml文件。

kubectl create role pods-reader --verb=get,list,watch --resource=pods --dry-run -o yaml > role-demo.yaml

kubectl apply -f role-demo.yaml
kubectl get role
kubectl describe role pods-reader

3.3.角色绑定
Rolebinding可以引用在同一命名空间内定义的Role对象。
kubectl create rolebinding -h

kubectl create rolebinding ben-read-pods --role=pods-reader --user=ben --dry-run -o yaml >rolebinding-demo.yaml ##创建角色绑定
kubectl apply -f rolebinding-demo.yaml

3.4.切换context进行账号切换验证
kubectl config use-context ben@cluster.local
kubectl get pods

例2. user--->ClusterRolebinding--->ClusterRole
ClusterRole对像可以授予与Role对象相同的权限,但由于它们属于集群范围对象,也可以使用它们授予以下几种资源的访问权限:
- 集群范围资源(如node)
- 非资源类型endpoint
- 跨所有命名空间的命名空间范围资源(如pod,运行时加上--all-namespaces,kubectl get pods --all-namespaces
3.5.定义ClusterRole
切换回kubernetes-admin@cluster.local,否则报权限不足的错误。
kubectl config use-context kubernetes-admin@cluster.local
kubectl create clusterrole cluster-read --verb=get,list,watch --resource=pods -o yaml > clusterrole-demo.yaml

kubectl create -f clusterrole-demo.yaml
kubectl get rolebinding
kubectl delete rolebinding ben-read-pods ##删除上面原来的rolebinding。
删除之后再切换到ben@cluster.local账号,出现错误

3.6.创建clusterrolebinding
kubectl create clusterrolebinding ben-read-all-pods --clusterrole=cluster-read --user=ben --dry-run -o yaml >clusterrolebinding-demo.yaml kubectl create -f clusterrolebinding-demo.yaml
kubectl get clusterrole
kubectl describe clusterrolebinding ben-read-all-pods



切换账号
kubeclt config use-context ben@cluster.local
kubeclt get pods -n kube-system ##可看查看到其它namespace下的pod

删除pods权限不足,因为没有给clusterrole授予delete权限。
t
例3.User--->Rolebinding--->Clusterrole
kubectl delete clusterrolebinding ben-read-all-pods ##先删除前面的clusterrolebinding
kubectl create rolebinding ben-read-pods --clusterrole=cluster-read --user=ben --dry-run -o yaml >rolebinding-clusterrole-demo.yaml
kubectl create -f rolebinding-clusterrole-demo.yaml
4.RBAC的三种授权访问
除了可以对user进行授权,还可以对group、 serviceaccount进行授权。


浙公网安备 33010602011771号