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

在 kubernetes 集群中,各种操作权限是赋予角色(Role 或者 ClusterRole)的。通过创建 RoleBinding 或者 ClusterBinding 把 用户(User),用户组(Group)或服务账号(Service Account)绑定在 Role 或 ClusterRole 上。这样用户,用户组或者服务账号就有了相对应的操作权限。

这里有个需要注意的地方

ClusterRoleBinding 只能绑定 ClusterRole,而 RoleBinding 可以绑定 Role 或者 ClusterRole。

根据上图:

1.User1 通过 RoleBinding 把 Role 绑定,可以在 Namespace A 获得 Role 中的权限;

2.User2 和 User3 通过 RoleBinding 把 ClusterRole 绑定,这两个用户即可以在 Namespace B 空间中获得 ClusterRole 权限;

3.如果 User1 通过 ClusterRoleBinding 把 ClusterRole 绑定,这个用户即可在所有的 Namespace 空间中获得 ClusterRole 权限;

创建 role

  1. su - klvchen
  2. cd sa/
  3. kubectl create role pods-reader --verb=get,list,watch --resource=pods --dry-run -o yaml > role-demo.yaml
  4. kubectl apply -f role-demo.yaml
  5. kubectl get role
  6. kubectl describe role pods-reader

创建 rolebinding

  1. kubectl create rolebinding klvchen-read-pods --role=pods-reader --user=klvchen --dry-run -o yaml > rolebinding-demo.yaml
  2. kubectl apply -f rolebinding-demo.yaml
  3. kubectl describe rolebinding klvchen-read-pods

测试账号

  1. kubectl config use-context klvchen@kubernetes
  2. kubectl config view
  3. kubectl get pods

为了方便测试,创建一个新的用户 ik8s

  1. useradd ik8s
  2. cp -rf .kube/ /home/ik8s/
  3. chown -R ik8s. /home/ik8s/
  4. su - ik8s
  5. kubectl config use-context klvchen@kubernetes
  6. kubectl config view

创建 clusterrole

  1. kubectl create clusterrole cluster-reader --verb=get,list,watch --resource=pods -o yaml --dry-run > clusterrole-demo.yaml
  2. kubectl apply -f clusterrole-demo.yaml
  3. kubectl get rolebinding
  4. # 删除 klvchen-read-pods ,解除 role 角色 pods-reader 和 user 用户 klvchen 的绑定关系
  5. kubectl delete rolebinding klvchen-read-pods

创建 clusterrolebinding

  1. kubectl create clusterrolebinding klvchen-read-all-pods --clusterrole=cluster-reader --user=klvchen --dry-run -o yaml > clusterrolebinding-demo.yaml
  2. kubectl apply -f clusterrolebinding-demo.yaml
  3. kubectl describe clusterrolebinding klvchen-read-all-pods

测试

  1. #切换到 ik8s 账户
  2. kubectl get pods -n kube-system
  3. # 所有命名空间都可以正常显示 pods

使用 rolebinding 关联 clusterrole

  1. kubectl delete clusterrolebinding klvchen-read-all-pods
  2. kubectl create rolebinding klvchen-read-pods --clusterrole=cluster-reader --user=klvchen --dry-run -o yaml > rolebinding-clusterrole-demo.yaml
  3. kubectl apply -f rolebinding-clusterrole-demo.yaml
  4. #测试
  5. #切换到 ik8s 账户
  6. kubectl get pods
  7. # 只有默认的命名空间可以正常显示 pods

查看 k8s 集群中 admin 拥有的权限

  1. kubectl get clusterrole admin -o yaml
  2. kubectl get clusterrolebinding cluster-admin -o yaml
  3. [root@master ~]# kubectl get clusterrolebinding cluster-admin -o yaml
  4. apiVersion: rbac.authorization.k8s.io/v1
  5. kind: ClusterRoleBinding
  6. metadata:
  7. annotations:
  8. rbac.authorization.kubernetes.io/autoupdate: "true"
  9. creationTimestamp: 2018-11-07T10:12:36Z
  10. labels:
  11. kubernetes.io/bootstrapping: rbac-defaults
  12. name: cluster-admin
  13. resourceVersion: "107"
  14. selfLink: /apis/rbac.authorization.k8s.io/v1/clusterrolebindings/cluster-admin
  15. uid: a6252a77-e275-11e8-8c94-cad98100ca95
  16. roleRef:
  17. apiGroup: rbac.authorization.k8s.io
  18. kind: ClusterRole
  19. name: cluster-admin
  20. subjects:
  21. - apiGroup: rbac.authorization.k8s.io
  22. kind: Group
  23. name: system:masters # admin 所在的组是 system:masters
  24. # kubernetes-admin 是属于 system:masters 组
  25. [root@master ~]# kubectl config view
  26. apiVersion: v1
  27. clusters:
  28. - cluster:
  29. certificate-authority-data: DATA+OMITTED
  30. server: https://192.168.0.205:6443
  31. name: kubernetes
  32. contexts:
  33. - context:
  34. cluster: kubernetes
  35. user: klvchen
  36. name: klvchen@kubernetes
  37. - context:
  38. cluster: kubernetes
  39. user: kubernetes-admin
  40. name: kubernetes-admin@kubernetes
  41. current-context: kubernetes-admin@kubernetes
  42. kind: Config
  43. preferences: {}
  44. users:
  45. - name: klvchen
  46. user:
  47. client-certificate-data: REDACTED
  48. client-key-data: REDACTED
  49. - name: kubernetes-admin
  50. user:
  51. client-certificate-data: REDACTED
  52. client-key-data: REDACTED

查看对应的证书,这里注意了,证书的有效期为1年

  1. [root@master ~]# cd /etc/kubernetes/pki/
  2. [root@master pki]# openssl x509 -in ./apiserver-kubelet-client.crt -text -noout
  3. Certificate:
  4. Data:
  5. Version: 3 (0x2)
  6. Serial Number: 3302614080992031284 (0x2dd53e0237bbb234)
  7. Signature Algorithm: sha256WithRSAEncryption
  8. Issuer: CN=kubernetes
  9. Validity
  10. Not Before: Nov 7 10:11:55 2018 GMT
  11. Not After : Nov 7 10:11:56 2019 GMT
  12. Subject: O=system:masters, CN=kube-apiserver-kubelet-client
  13. Subject Public Key Info:
  14. Public Key Algorithm: rsaEncryption
  15. Public-Key: (2048 bit)
  16. ...后面信息忽略

K8S RBAC的更多相关文章

  1. 一文读懂k8s rbac 权限验证

    自我认为的k8s三大难点:权限验证,覆盖网络,各种证书. 今天就说一下我所理解的权限验证rbac. 咱不说rbac0,rbac1,rbac2,rbac3.咱就说怎么控制权限就行. 一.前言 1,反正R ...

  2. k8s结合jumpserver做kubectl权限控制 用户在多个namespaces的访问权限 rbac权限控制

    圈子太小,做人留一面,日后好相见. 其实这个文章就是用户用jumpserver登录到k8s master节点 然后执行kubectl的时候只有自己namespaces的所有权限. 背景 1,k8s 有 ...

  3. 规模、性能、弹性全面升级,让天下没有难用的 K8s

    作者 | 汤志敏 阿里云容器服务开发负责人 Kubernetes 是云原生时代的基础设施.云上的分布式操作系统. 9 月 26 日云栖大会容器专场,在<拐点已至,云原生引领数字化转型升级> ...

  4. 一定成功 k8s 安装helm v2.17 基本命令

    一.下载helm安装脚本 1.1 介绍 Helm是Kubernetes的包管理器. 其实就是管理了一推配置文件,ds,configmap,deployment......,一类规则. 就类似: yum ...

  5. kubernetes 微服务西游记(持续更新中...)

    随着微服务架构的流行,迈向云原生的趋势,容器化微服务就成为了持续集成最好的手段,镜像成为了持续交付最好的产物,容器成为了镜像运行最好的环境,kubernetes成了部署容器最好的生态系统和规范.实践出 ...

  6. 部署helm服务

    helm在ocp中相当于catalog中的template k8s中使用helm之前遇到的问题 .很难管理.编辑和维护如此多的服务.每个服务都有若干配置,缺乏一个更高层次的工具将这些配置组织起来. . ...

  7. 数字IT基础-数据采集总线

    摘要: 日志服务是阿里自产自用的产品,在双十一.双十二和新春红包期间承载阿里云/蚂蚁全站.阿里电商板块.云上几千商家数据链路,每日处理来自百万节点几十PB数据,峰值流量达到每秒百GB, 具备稳定.可靠 ...

  8. secrets 管理工具 Vault 的介绍、安装及使用

    原文:https://ryan4yin.space/posts/expirence-of-vault/ Vault 是 hashicorp 推出的 secrets 管理.加密即服务与权限管理工具.它的 ...

  9. k8s-0-集群

    Docker回顾 docker容器封装应用程序好处 内核在3.8以上,才能完整使用docker隔离功能(所有centos6不推荐用) Docker容器化封装应用程序缺点 容器编排工具有哪些 一: K8 ...

随机推荐

  1. Kali学习笔记21:缓冲区溢出实验(漏洞发现)

    上一篇文章,我已经做好了缓冲区溢出实验的准备工作: https://www.cnblogs.com/xuyiqing/p/9835561.html 下面就是Kali虚拟机对缓冲区溢出的测试: 已经知道 ...

  2. java中的全局变量如何实现?ThreadLocal~

    全局变量就是不管你在哪里,都能够直接引用的变量,还不用担心各种问题.每个语言都有自己的全局变量,我想! 一般地,面向过程的语言当中,可能就是一个声明在最前面的变量,后面的代码直接引用,就成了全局变量! ...

  3. Python爬虫-萌妹子图片

    最近发现一个可以看图的地方,一张张翻有点累,毕竟只有一只手(难道鼠标还能两只手翻?).能不能下到电脑上看呢,毕竟不用等网速,还可以预览多张,总之很方便,想怎么就怎么,是吧? 刚好这几天在学python ...

  4. txt文本处理---行未添加逗号

    做音频处理过程中,经常遇到需要对文本进行转换,今天就遇到了一个行末加逗号的问题,找到了几种有效的方式,做个记录吧. 以下是几种方法实现: python代码实现: import os with open ...

  5. Robot Framework - 2 - 创建测试库

    04- 创建测试库--基础概念 Robot Framework 实际的测试能力是由测试库提供的. ***** 支持的编程语言 Robot Framework 自身是用 Python 编写的,能使用 P ...

  6. JavaScript变量转换

    JavaScript变量转换 目录 自动转换 (1)Number与Boolean (2)Number与String (3)String与Boolean (4)null的自动转换 (5)undefine ...

  7. [linux]解析crontab

    linux提供了一个非常强大而且又比较好用的命令 [crontab] crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行, ...

  8. 在koa中想要优雅的发送响应?看这就对了

    背景 前不久把项目中用了很久的一个伪中间件撸成了一个npm包发布了出去. 为什么叫伪中间件?正常的中间件的引用方式, 就拿body-parser为例. var Koa = require('koa') ...

  9. 在关闭页面时自动清除Session cookie,页面缓存

    在默认情况下,session对象在关闭浏览器后并不是立刻被销毁,因此,为了考虑系统的安全性,在用户退出时,需要即刻清除session对象,防止他人盗用session对象中的信息. 清除session对 ...

  10. 数据库 数据去重并取id最大的数据sql

    SELECT    * FROM(SELECT        MAX(id) AS id    FROM        icbc_erp_kj_icbc_result    WHERE STATUS ...