Kubernetes之RBAC

API Server的授权管理

API Server 内部通过用户认证后,然后进入授权流程。对合法用户进行授权并且随后在用户访问时进行鉴权,是权限管理的重要环节。API Server 目前支持一下几种授权策略。

  • Always Deny: 表示拒绝所有的请求,一般用户测试。
  • Always Allow:允许接收所有请求,如果集群不需要授权流程,则可以采用该策略,这也是Kubernetes的默认配置。
  • ABAC: 基于属性的访问控制,表示使用用户配置的授权规则对用户请求进行匹配和控制。
  • Webhook:通过调用外部REST服务对用户进行授权。
  • RBAC:Role-Base Access Control, 基于角色的访问空。

授权管理配置

我们来看一下kubectl使用的配置文件。

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://172.16.138.44:8443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-[email protected]
current-context: kubernetes-[email protected]
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

授权管理也是kubernetes的标准资源对象,顶层配置有

  • clusters  配置多个集群
  • contexts 配置多个上下文
  • users 配置多个用户
  • current-context 当前默认上下文

当前配置文件详解,clusters中有一个集群名字叫kubernetes,users中有一个叫kubernetes-admin的用户,contexts有一个叫kubernetes-a[email protected]的上下文配置,而关联起来的集群是kubernetes和user名为kubernetes-admin的关系,而前面的上下文配置是使用的kubernetes-[email protected]。

主要讲解RBAC

Role和ClusterRole

对某个kubernetes的对象(Objects)上施加的一种行为(get post delete 等),我们称为Permissions,把Permissions授于Role,就是一个角色了。能够扮演为主体的就是我们之前讲到的serviceAccount。UserAccount和ServiceAccount。

角色可以由命名空间(namespace)内的Role对象定义,而整个Kubernetes集群范围内有效的角色则通过ClusterRole对象实现。一个Role对象只能用于授予对某一单一命名空间中资源的访问权限。

ClusterRole对象可以授予与Role对象相同的权限,但由于它们属于集群范围对象, 也可以使用它们授予对以下几种资源的访问权限:

  • 集群范围资源(例如节点,即node)
  • 非资源类型endpoint(例如”/healthz”)
  • 跨所有命名空间的命名空间范围资源(例如pod,需要运行命令kubectl get pods --all-namespaces来查询集群中所有的pod)

定义一个读取Pods 的Role

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pods-reader
  namespace: default
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
  - watch

定义一个clusterrole

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: clusterrole-reader
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
  - watch

RoleBinding和ClusterBinding

RoleBinding将定义的Role授权给一个或者一组用户,RoleBinding就包含了一组相关主体(即subject, 包括用户——User、用户组——Group、或者服务账户——Service Account)以及对被授权的Role的引用。在命名空间中可以通过RoleBinding对象授予权限,而集群范围的权限授予则通过ClusterRoleBinding对象完成。如下图:

解释:NamespaceA中的Role绑定在RoleBinding上并授权给User1,即User1就拥又了NamespaceA的权限。集群ClusterRole通过ClusterRoleBinding授权给User1,即User1拥有集群权限。NamespaceB中的RoleBinding引用了集群中ClusterRole,RoleBinding授权给User2 User3,即User2 User3拥有NamespaceB的权限。这是大家会又给疑问,为什么RoleBinding非要引用了ClusterRole,而不在NamespaceB下创建一个Role呢?因为当我们又很多Namespace的时候,我们这样需要创建很多的Role,为了重复创建Role,我们可以创建一个ClusterRole来让各个Namespace来用RoleBinding去引用,这样就避免重新创建Role了。大大减少运维的工作。

RoleBinding样例

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: jaxzhai-rolebinding
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: pods-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: jaxzhai

roleRef

  • apiGroup
  • kind
  • name

subjects

  • apiGroup
  • kind
  • name
  • namespace

ClusterRoleBinding样例

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: read-pods-all
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: clusterrole-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: jaxzhai
kubectl describe clusterrolebinding read-pods-all
Name:         read-pods-all
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"rbac.authorization.k8s.io/v1beta1","kind":"ClusterRoleBinding","metadata":{"annotations":{},"name":"read-pods-all","namespace":""},"role...
Role:
  Kind:  ClusterRole
  Name:  clusterrole-reader
Subjects:
  Kind  Name     Namespace
  ----  ----     ---------
  User  jaxzhai  

RoleBind 引用ClusterRole

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: clusterrole-test
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: clusterrole-reader
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: jaxzhai

原文地址:https://www.cnblogs.com/xzkzzz/p/9909468.html

时间: 2024-10-10 19:00:31

Kubernetes之RBAC的相关文章

Kubernetes 基于 RBAC 的授权(十六)

一.RBAC介绍 在Kubernetes中,授权有ABAC(基于属性的访问控制).RBAC(基于角色的访问控制).Webhook.Node.AlwaysDeny(一直拒绝)和AlwaysAllow(一直允许)这6种模式.从1.6版本起,Kubernetes 默认启用RBAC访问控制策略.从1.8开始,RBAC已作为稳定的功能.通过设置--authorization-mode=RBAC,启用RABC.在RABC API中,通过如下的步骤进行授权:定义角色:在定义角色时会指定此角色对于资源的访问控制

10、kubernetes之RBAC认证

一.kubectl proxy # kubectl proxy --port=8080 # curl http://localhost:8080/api/v1/ # curl http://localhost:8080/apis/apps/v1/namespaces/kube-system/deployments/ 二.serviceaccount资源 创建自定义serviceaccount:用于pod与api通信的认证账号 # kubectl create serviceaccount adm

kubernetes 1.8 高可用安装(五)

5安装网络组件calico 安装前需要确认kubelet配置是否已经增加--network-plugin=cni如果没有配置就加到kubelet配置文件里 Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin 5.1先装rbac 官方URLhttps://docs.projectcalico.org/v2.6/getting-s

Kubernetes之部署calico网络

部署calico网络 Calico组件: Felix:Calico agent     运行在每台node上,为容器设置网络信息:IP,路由规则,iptable规则等 etcd:calico后端存储 BIRD:  BGP Client: 负责把Felix在各node上设置的路由信息广播到Calico网络 , 通过BGP协议来着 BGP Route Reflector: 大规则集群的分级路由分发. calico: calico命令行管理工具 为Node节点部署calico网络,参照官方文档:htt

Kubernetes之部署calico网络Update

部署calico网络 Calico组件介绍: Felix:Calico agent 运行在每台node上,为容器设置网络信息:IP,路由规则,iptable规则等 etcd:calico后端存储 BIRD: BGP Client: 负责把Felix在各node上设置的路由信息广播到Calico网络( 通过BGP协议). BGP Route Reflector: 大规模集群的分级路由分发. calico: calico命令行管理工具 calico的部署: 参照官方文档:https://docs.p

手动部署 kubernetes 1.9 记录

前言 目前 kubernetes 正式版本已经到1.10版本.因为前面有大佬(漠然)已经采完坑,所以自己也试着部署 kubernetes 1.9 体验下该版本的新特性.对于前面部署的 kubernetes 1.7 HA版本而言,本质上变化不大.主要是总结一下某些参数的变动以及其他组件的部署. 一.相关配置变更 1.1 关于 API SERVER 配置出现的变动 移除了 --runtime-config=rbac.authorization.k8s.io/v1beta1 配置,因为 RBAC 已经

kubernetes 1.11 部署

kubernetes 1.11 部署 参考文档文档编译 [https://github.com/kubernetes/kubernetes/tree/release-1.11/cluster/images/hyperkube]() 参考文档文档编译 环境安装 1. docker install 所有节点都按照docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-rep

34 【kubernetes】安装手册

全文参考了两篇中文文档: 1,https://www.cnblogs.com/RainingNight/p/using-kubeadm-to-create-a-cluster.html 2,http://running.iteye.com/blog/2322634 注意: 运行命令是一定要区分是在master节点还是在pods节点上运行的,有些命令只能在master节点执行,有些命令只能在pods节点执行.这个要区分. 运行命令一定要区分清用户是谁,是root还是普通用户. 大步骤: 1,在ma

RBAC授权

给用户授予RBAC权限 没有权限会报如下错误: 执行查看资源报错: unable to upgrade connection: Forbidden (user=kubernetes, verb=create, resource=nodes, subresource=proxy) [[email protected] ~]# kubectl exec -it http-test-dm2-6dbd76c7dd-cv9qf sh error: unable to upgrade connection: