简介:在Kubernetes
中,RBAC(基于角色的访问控制)
。在RABC API
中,通过如下的步骤进行授权:1)定义角色:在定义角色时会指定此角色对于资源的访问控制的规则;2)绑定角色:将主体与角色进行绑定,对用户进行访问授权。
目的:由于k8s对于资源管理的重要性,我们在进行构建k8s的dashboard
的时候,需要对资源进行权限的控制,需要使用到kubernets
的RBAC
进行实现权限的控制。
方案:部署两套dashboard。每一套的权限都不一样。
- 第一套:拥有超级权限,能够对
k8s
进行完全的增删查改资源的控制。 - 第二套:只能进行资源的查看。
原理:第一套dashboard的实现原理:由于k8s官方提给给面向用户的角色中,其中有一个称为:Cluster-admin的超级用户权限。因此,我们直接将创建好的service account与超级用户权限进行绑定,我们通过service account访问dashbaord进行管理k8s的资源。
第二套dashboard的实现原理:
我们在创建集群角色规则的时候,对操作资源进行定义,让资源只拥有可访问的权限。在将此集群角色与创建的service account进行绑定,我们就能够实现资源的访问权限。
我们根据方案进行yaml文件的编写。(编写yaml文件后,进行构建,即可生成dashboard)
第一套的dashboard的代码以及注释如下k8s-common.yaml
:
# ------------------- Dashboard Secret ------------------- #创建字典,登陆dashboard的时候需要使用到字典生成的Token
apiVersion: v1 #调用api的版本
kind: Secret #创建的类型
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard-certs #自定义创建字典的名称
namespace: kube-system #指定命名空间
type: Opaque #字典类型
---
# ------------------- Dashboard Service Account ------------------- #服务账号创建
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
---
# ------------------- Dashboard Role & ClusterRole Binding ------------------- #集群角色
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin #k8s中默认的面向用户的角色的超级管理员权限。直接调用
subjects:
- kind: ServiceAccount #绑定创建的sa账户
name: kubernetes-dashboard
namespace: kube-system
---
# ------------------- Dashboard Deployment ------------------- #
kind: Deployment
apiVersion: apps/v1beta2
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: kubernetes-dashboard
template:
metadata:
labels:
k8s-app: kubernetes-dashboard
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node10-18-223-243 #部署指定的k8s节点上
containers: #拉取dashboard的镜像
- name: kubernetes-dashboard
image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9090
protocol: TCP
args:
- --auto-generate-certificates
# Uncomment the following line to manually specify Kubernetes API server Host
# If not specified, Dashboard will attempt to auto discover the API server and connect
# to it. Uncomment only if the default does not work.
# - --apiserver-host=http://my-address:port
#- --heapster-host=http://heapster
volumeMounts:
- name: kubernetes-dashboard-certs
mountPath: /certs
# Create on-disk volume to store exec logs
- mountPath: /tmp
name: tmp-volume
volumes:
- name: kubernetes-dashboard-certs
secret:
secretName: kubernetes-dashboard-certs
- name: tmp-volume
emptyDir: {}
serviceAccountName: kubernetes-dashboard
# Comment the following tolerations if Dashboard must not be deployed on master
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
---
# ------------------- Dashboard Service ------------------- #
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
type: NodePort
ports:
- port: 8080
targetPort: 9090
nodePort: 30002 #暴露访问端口
selector:
k8s-app: kubernetes-dashboard
- 生成dashboard:
# kubectl create -f k8s-common.yaml
第二套的dashboard的代码以及注释如下k8s-super.yaml:
# ------------------- Dashboard Secret ------------------- #创建字典
apiVersion: v1
kind: Secret
metadata:
labels:
k8s-app: grayson-ds
name: grayson-ds-certs
namespace: kube-system
type: Opaque
---
# ------------------- Dashboard Service Account ------------------- #创建service account
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: grayson-ds
name: grayson-ds
namespace: kube-system
---
# ------------------- ClusterRole ------------------- #集群角色资源的操作定义
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: dashboard-viewonly
rules:
- apiGroups:
- ""
resources:
- configmaps
- endpoints
- persistentvolumeclaims
- pods
- replicationcontrollers
- replicationcontrollers/scale
- serviceaccounts
- services
- nodes
- persistentvolumeclaims
- persistentvolumes
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- secrets
verbs:
- get
- list
- watch
- create
- update
- delete
- apiGroups:
- ""
resources:
- bindings
- events
- limitranges
- namespaces/status
- pods/log
- pods/status
- replicationcontrollers/status
- resourcequotas
- resourcequotas/status
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- namespaces
verbs:
- get
- list
- watch
- apiGroups:
- apps
resources:
- daemonsets
- deployments
- deployments/scale
- replicasets
- replicasets/scale
- statefulsets
verbs:
- get
- list
- watch
- apiGroups:
- autoscaling
resources:
- horizontalpodautoscalers
verbs:
- get
- list
- watch
- apiGroups:
- batch
resources:
- cronjobs
- jobs
verbs:
- get
- list
- watch
- apiGroups:
- extensions
resources:
- daemonsets
- deployments
- deployments/scale
- ingresses
- networkpolicies
- replicasets
- replicasets/scale
- replicationcontrollers/scale
verbs:
- get
- list
- watch
- apiGroups:
- policy
resources:
- poddisruptionbudgets
verbs:
- get
- list
- watch
- apiGroups:
- networking.k8s.io
resources:
- networkpolicies
verbs:
- get
- list
- watch
- apiGroups:
- storage.k8s.io
resources:
- storageclasses
- volumeattachments
verbs:
- get
- list
- watch
- apiGroups:
- rbac.authorization.k8s.io
resources:
- clusterrolebindings
- clusterroles
- roles
- rolebindings
verbs:
- get
- list
- watch
---
# ------------------- Dashboard Role & Role Binding ------------------- #集群角色与service account的绑定
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: grayson-ds
labels:
k8s-app: grayson-ds
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: dashboard-viewonly
subjects:
- kind: ServiceAccount
name: grayson-ds
namespace: kube-system
---
# ------------------- Dashboard Deployment ------------------- #
kind: Deployment
apiVersion: apps/v1beta2
metadata:
labels:
k8s-app: grayson-ds
name: grayson-ds
namespace: kube-system
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: grayson-ds
template:
metadata:
labels:
k8s-app: grayson-ds
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node10-18-223-132
containers:
- name: grayson-ds
image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.8.3
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8443
protocol: TCP
args:
- --auto-generate-certificates
# Uncomment the following line to manually specify Kubernetes API server Host
# If not specified, Dashboard will attempt to auto discover the API server and connect
# to it. Uncomment only if the default does not work.
# - --apiserver-host=http://my-address:port
#- --heapster-host=http://heapster
volumeMounts:
- name: grayson-ds-certs
mountPath: /certs
# Create on-disk volume to store exec logs
- mountPath: /tmp
name: tmp-volume
volumes:
- name: grayson-ds-certs
secret:
secretName: grayson-ds-certs
- name: tmp-volume
emptyDir: {}
serviceAccountName: grayson-ds
# Comment the following tolerations if Dashboard must not be deployed on master
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
---
# ------------------- Dashboard Service ------------------- #
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: grayson-ds
name: grayson-ds
namespace: kube-system
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8443
nodePort: 30443 #暴露访问端口。
selector:
k8s-app: grayson-ds
- 生成dashboard:
# kubectl create -f k8s-super.yaml
下面是详细的k8s的rbac的介绍:
目录
- RBAC API 概览
- Role and ClusterRole
- RoleBingding and ClusterRoleBingding
- Referring to Resources
- Referring to Subject
- Command-line Utilities
RBAC API 概览
在Kubernetes中,RBAC(基于角色的访问控制)。从1.6版本起,Kubernetes 默认启用RBAC(Role Base Access Control)访问控制策略。从1.8开始,RBAC已作为稳定的功能。通过设置–authorization-mode=RBAC,启用RABC。在RABC API中,通过如下的步骤进行授权:1)定义角色:在定义角色时会指定此角色对于资源的访问控制的规则;2)绑定角色:将主体与角色进行绑定,对用户进行访问授权。
关系图RBAC 权限定义部分主要有三个层级
- apiGroups: 指定那个 API 组下的权限
- resources: 该组下具体资源,如 pod namespace node
- verbs: 指对该资源具体执行哪些动作 get list update delete
在RBAC API中,一个角色包含了一套表示一组权限的规则。 权限以纯粹的累加形式累积(没有”否定”的规则)。 角色可以由命名空间(namespace)内的Role
对象定义,而整个Kubernetes集群范围内有效的角色则通过ClusterRole
对象实现。
Role & ClusterRole
Role限定于单个namespace
一个Role
对象只能用于授予对某一单一命名空间中资源的访问权限。 以下示例描述了”default”命名空间中的一个Role对象的定义,用于授予对pod的读访问权限:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # 空字符串""表明使用core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
ClusterRole
对象可以授予与Role
对象相同的权限,但由于它们属于集群范围对象, 也可以使用它们授予对以下几种资源的访问权限:
- 集群范围资源(例如节点,即node)
- 非资源类型endpoint(例如”/healthz”)
- 跨所有命名空间的命名空间范围资源(例如pod,需要运行命令kubectl get pods --all-namespaces来查询集群中所有的pod)
下面示例中的ClusterRole定义可用于授予用户对某一特定命名空间,或者所有命名空间中的secret(取决于其绑定方式)的读访问权限:
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
# 鉴于ClusterRole是集群范围对象,所以这里不需要定义"namespace"字段
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
RoleBinding与ClusterRoleBinding
RoleBingding & ClusterRolerRoleBingding:角色绑定与集群角色绑定
角色绑定将一个角色中定义的各种权限授予一个或者一组用户。 角色绑定包含了一组相关主体(即subject, 包括用户——User、用户组——Group、或者服务账户——Service Account)以及对被授予角色的引用。 在命名空间中可以通过RoleBinding
对象授予权限,而集群范围的权限授予则通过ClusterRoleBinding
对象完成。
RoleBinding
可以引用在同一命名空间内定义的Role
对象。
RoleBinding
对象也可以引用一个ClusterRole
对象用于在RoleBinding
所在的命名空间内授予用户对所引用的ClusterRole
中 定义的命名空间资源的访问权限。这一点允许管理员在整个集群范围内首先定义一组通用的角色,然后再在不同的命名空间中复用这些角色。
例如,尽管下面示例中的RoleBinding
引用的是一个ClusterRole
对象,但是用户”dave”(即角色绑定主体)还是只能读取”development” 命名空间中的secret(即RoleBinding所在的命名空间)。
以下角色绑定允许用户"dave"读取"development"命名空间中的secret。
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: read-secrets
namespace: development # 这里表明仅授权读取"development"命名空间中的资源。
subjects:
- kind: User
name: dave
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: secret-reader
apiGroup: rbac.authorization.k8s.io
最后,可以使用ClusterRoleBinding在集群级别和所有命名空间中授予权限。
Referring to Resources
在Kubernets中,主要的资源包括:Pods、Nodes、Services、Deployment、Replicasets、Statefulsets、Namespace、Persistents、Secrets和ConfigMaps等。另外,有些资源下面存在子资源,例如:Pod下就存在log子资源:
GET /api/v1/namespaces/{namespace}/pods/{name}/log
也可以通过 resourceName 指定单个资源(而不是一类资源)。
注意,指定了单个资源后,verbs里就不能由 list, watch, create, or deletecollection 了,因为这几个verbs对应的API URL里不会出现resource name。
Referring to Subjects
RoleBinding、ClusterRoleBinding将Role、ClusterRole绑定到 subject。subject可以是 user,group,serviceAccount。
user:k8s并不管理user,而是authenticator(例如我们用的是dex)在管理。user可以是字符串(如”jane”),email(如bob@example.com),ID。这取决于管理员配置认证的时候,--oidc-username-claim配置的是什么。我们这里用的是name。system:开头的用户是保留给k8s用的。
group:group是由 Authenticator modules 在管理。可以是像user一样的普通group,也可以是 system:开头的k8s的组。
serviceaccount:由k8s管理。sa区别于user,其代表的是service,用来供service之间访问用,例如service A调用 service B的API,那么可以为service A创建一个 sa ,然后赋予该sa访问 service B API的权限。sa类似appid的概念。sa可以用 kubectl get sa来查看。
Command-line Utilities
创建某一namespace下的roleBinding。
kubectl create rolebinding bob-admin-binding --clusterrole=admin --user=bob --namespace=acme
kubectl create rolebinding myapp-view-binding --clusterrole=view --serviceaccount=acme:myapp --namespace=acme
创建clusterRoleBiding。
kubectl create clusterrolebinding root-cluster-admin-binding --clusterrole=cluster-admin --user=root
kubectl create clusterrolebinding kubelet-node-binding --clusterrole=system:node --user=kubelet
kubectl create clusterrolebinding myapp-view-binding --clusterrole=view --serviceaccount=acme:myapp
相对来说kubectl更方便一些。
网友评论