HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

Kubernetes 身份认证和授权操作全攻略:上手操作 Kubernetes 授权

  • 2020-05-16
  • 本文字数:2477 字

    阅读完需:约 8 分钟

Kubernetes身份认证和授权操作全攻略:上手操作Kubernetes授权

这是本系列文章中的第三篇,前两篇文章分别介绍了Kubernetes访问控制以及身份认证。本文将通过上手实践的方式,带你理解 Kubernetes 授权这一概念。


在文章正式开始之前,我们先快速回顾一下我们实操过程中的环境和场景。我们正在处理生产环境中的集群,其中每个部分都与命名空间相关联。现在,组里新来了一位同事叫 Bob,我们在上篇教程中帮助 Bob 以 engineering 命名空间管理员的身份加入集群。并且他已经获得私钥以及签名证书来访问集群。


如果你还没有完成上述操作,请查看上篇教程,运行其中的命令以完成环境设置以及为 Bob 配置证书。


好,我们正式开始本篇教程。


现在我们要给 Bob 授权,以控制属于 engineering 命名空间的资源。


首先,我们要为 kubectl 创建一个上下文(context),方便它在不同的环境之间切换。


kubectl config set-context eng-context \  --cluster=minikube \  --namespace=engineering \  --user=bobContext "eng-context" created.
复制代码


上面的命令使用 Bob 在 minikube 集群中的凭据创建了一个指向 engineering 命名空间的新上下文。这会导致在〜/ .kube / config 文件中添加一个新的部分。



我们现在在 engineering 命名空间中创建一个简单的 pod:


apiVersion: v1kind: Podmetadata:  name: myapp  namespace: engineering  labels:    app: myappspec:  containers:  - name: myapp    image: busybox    command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
复制代码


 kubectl create -f myapp.yamlpod/myapp created
复制代码


kubectl get pods -n=engineeringNAME    READY   STATUS    RESTARTS   AGEmyapp   1/1     Running   0          89s
复制代码


虽然您可以作为集群管理员在工程命名空间中创建和操作 pod,但 Bob 甚至无法在同一名称空间中列出 pod。


kubectl get pods --namespace engineering --as bobError from server (Forbidden): pods is forbidden: User "bob" cannot list resource "pods" in API group "" in the namespace "engineering"
复制代码


为了使得 Bob 可以在 engineering 命名空间中访问资源,我们需要给他授权。这可以通过创建具有适当权限的角色然后将其绑定到用户 Bob 来完成。实质上,我们使用的是基于角色访问控制(RBAC)来允许 Bob 对 engineering 命名空间中的某些 Kubernetes 资源执行特定操作。


创建一个名为 eng-reader 的 Kubernetes 角色,允许其在 engineering 命名空间中列出 pod。


apiVersion: rbac.authorization.k8s.io/v1metadata:  namespace: engineering   name: eng-readerrules:- apiGroups: [""] # "" indicates the core API group  resources: ["pods", "services", "nodes"]  verbs: ["get", "watch", "list"]
复制代码


kubectl create -f role.yamlrole.rbac.authorization.k8s.io/eng-reader created
复制代码


kubectl get roles --namespace=engineeringNAME         AGEeng-reader   58s
复制代码


注意,这一角色目前和 Bob 毫无关联。我们需要通过角色绑定将角色中指定的权限应用于 Bob。


kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:  name: eng-read-access  namespace: engineeringsubjects:- kind: User  name: bob # Name is case sensitive  apiGroup: rbac.authorization.k8s.ioroleRef:  kind: Role #this must be Role or ClusterRole  name: eng-reader # this must match the name of the Role or ClusterRole you wish to bind to  apiGroup: rbac.authorization.k8s.io
复制代码


kubectl create -f role-binding.yamlrolebinding.rbac.authorization.k8s.io/eng-read-access created
复制代码


kubectl get rolebindings --namespace=engineeringNAME              AGEeng-read-access   31s
复制代码


让我们来检查一下 Bob 现在是否可以访问 pod。


kubectl get pods --namespace engineering --as bobNAME    READY   STATUS    RESTARTS   AGEmyapp   1/1     Running   0          11m
复制代码


既然他现在已经关联了 eng-reader 角色,那么他就获得了 pod 列表的权限。


此时,Bob 在集群中的访问权限依旧十分有限。他所能做的只是在 engineering 命名空间中列出 pod。这对 Bob 帮助不大。他想要检查集群中的节点数量,但是令他失望的是,他遇到了 forbidden error。


kubectl get nodes --as bobError from server (Forbidden): nodes is forbidden: User "bob" cannot list resource "nodes" in API group "" at the cluster scope
复制代码


在 Kubernetes 中角色和角色绑定既可以应用在命名空间层面也可以应用在集群层面。我们现在创建一个集群角色以及一个与 Bob 关联的角色绑定,以使他能够列出节点。


kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata:  # "namespace" omitted since ClusterRoles are not namespaced  name: cluster-node-readerrules:- apiGroups: [""]  resources: ["nodes"]  verbs: ["get", "watch", "list"]
复制代码


kubectl create -f cluster-role.yamlclusterrole.rbac.authorization.k8s.io/cluster-node-reader created
复制代码


kubectl get clusterroles cluster-node-readerNAME                  AGEcluster-node-reader   49s
复制代码


kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:  name: read-cluster-nodessubjects:- kind: User  name: bob # Name is case sensitive  apiGroup: rbac.authorization.k8s.ioroleRef:  kind: ClusterRole  name: cluster-node-reader  apiGroup: rbac.authorization.k8s.io
复制代码


kubectl create -f cluster-role-binding.yamlclusterrolebinding.rbac.authorization.k8s.io/read-cluster-nodes created
复制代码


kubectl get clusterrolebindings read-cluster-nodesNAME                 AGEread-cluster-nodes   35s
复制代码


现在,Bob 已经设置为可以在集群中列出节点。


kubectl get nodes --as bobNAME       STATUS   ROLES    AGE   VERSIONminikube   Ready    master   52m   v1.15.2
复制代码


本篇教程的目的是为了帮助你理解角色以及角色绑定如何在 Kubernetes 中工作的。在本系列下一篇文章中,我们将来看看 service account,保持关注哟~


2020-05-16 17:18701

评论

发布
暂无评论
发现更多内容

解决 error: failed to push some refs to 'https://github.com/

timerring

git bug 10月月更

鸿蒙开发入门 | 开发第一个鸿蒙应用+页面跳转

TiAmo

华为 鸿蒙开发 10月月更

前端培训学习后的就业方向哪个比较好

小谷哥

Go语言入门03—条件语句

良猿

Go golang 后端 10月月更

【10.14-10.21】写作社区优秀技术博文更新啦!

InfoQ写作社区官方

优质创作周报

golang中的map

六月的

Go map

UIE Slim满足工业应用场景,解决推理部署耗时问题,提升效能

汀丶人工智能

Paddlenlp之UIE模型实战实体抽取任务【打车数据、快递单】

汀丶人工智能

nlp

常见恶意软件类型及危害

郑州埃文科技

网络安全 恶意软件 办公安全

Go语言入门04—循环语句

良猿

Go golang 后端 10月月更

自主创新、领先一代,星环科技成功登陆科创板

星环科技

大数据 开源

北京培训java开发的机构比较好

小谷哥

java线下培训机构哪里比较好

小谷哥

低代码开发平台盘点,让你的开发告别低效

SoFlu软件机器人

【云舟说直播间】数字可视化专场来袭

云计算

“程”风破浪的开发者|Lombok的使用

楠羽

学习方法 lombok “程”风破浪的开发者

Mysql数据库基础之数据库的安装与配置

渔戈

MySQL 数据库 10月月更

途游游戏 DevOps 实践|都说「单元测试」好,「AAAC四步法」少不了

极狐GitLab

DevOps 运维 单元测试 CI/CD 代码安全

为什么vue3要选用proxy,好处是什么?

hellocoder2029

JavaScript

阿里巴巴 Noslate 正式开源 - 面向云原生的 JavaScript 容器方案

阿里巴巴终端技术

JavaScript 开源 云原生 前端 企业号十月PK榜

pt尾递归优化

hellocoder2029

JavaScript

一文彻底搞懂前端缓存机制

hellocoder2029

JavaScript

“程”风破浪的开发者|OpenHarmony应用开发环境搭建

技能实验室

OpenHarmony “程”风破浪的开发者

BH1750 光照传感器文档详解 及 驱动设计

矜辰所致

传感器 stm32 I2C协议 10月月更 BH1750

强烈推荐!腾讯T8架构师手写的SpringBoot分布式架构笔记

小小怪下士

Java 分布式 后端 springboot

Plan Stitch:一种使用缝合物理计划解决查询计划性能退化问题的方法

KaiwuDB

2022年上海前端培训开发技术就业前景如何

小谷哥

企业级开发平台的演进

世开 Coding

软件开发 低代码 快速开发平台 少代码

原来Vue3的computed属性还能这么用啊🔥

渔戈

Vue 前端 10月月更

uniapp打开地图选择位置

源字节1号

软件开发 前端开发 后端开发 小程序开发

遮罩和蒙版有什么区别,视频遮罩怎么用

懒得勤快

Kubernetes身份认证和授权操作全攻略:上手操作Kubernetes授权_文化 & 方法_Rancher_InfoQ精选文章