写点什么

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:18974

评论

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

混合应用开发新范式:2025跨端生态与企业效能跃迁双擎驱动

xuyinyin

“支付宝碰一下”成行业新宠,必胜客300+门店打造智慧餐饮新体验

科技热闻

一套稳定抓取竞品页面的Python代码方案!原来这么简单!

kookeey代理严选

Python 动态代理 代理IP 爬虫实战

孵化世界级科研成果,鲲鹏赋能超大规模应用创新

科技热闻

政务一体化平台小程序化路径:生态融合驱动数字化转型新范式

xuyinyin

社交APP的核心功能

北京木奇移动技术有限公司

社交APP 软件外包公司 APP外包公司

京东商品评论API接口指南

tbapi

京东商品评论API 京东评论API 京东商品评论数据采集 京东评价接口

基于 Flink+Paimon+Hologres 搭建淘天集团湖仓一体数据链路

Apache Flink

大数据 flink 实时计算 实时计算Flink

CAD图纸中的文字看不到,这是什么原因?

在路上

cad

烟草行业智慧学院建设方案:基于灯塔低代码平台的工作绩效管理系统

中烟创新

故障定位系列 - 4 - 波动度故障

乒乓狂魔

故障定位 AIOPS

社交APP开发的技术框架

北京木奇移动技术有限公司

社交APP 软件外包公司 APP外包公司

UCSXD高级用户体验设计师,高级在哪里?

科技热闻

通过Func实现飞书应用通知消息加急处理

观测云

监控告警

社交APP的开发流程

北京木奇移动技术有限公司

社交APP 软件外包公司 APP外包

openFuyao开源发布,建设多样化算力集群开源软件生态

BoCloud博云

开源 博云 openFuyao

大语言模型推理优化技术综述(The Art of LLM Inference)

Baihai IDP

AI LLM LLM serving LLM 推理优化

理解并解决高丢包率问题,构建清晰流畅的实时音视频通话

腾讯云音视频

“从复眼到智慧”:观测云2025发布会专访—— CEO 蒋烁淼

观测云

人工智能

百度智能云加入中国计算机学会数据库专委会 共启数据库技术新篇章

科技热闻

社交APP开发的技术难点

北京木奇移动技术有限公司

社交APP 软件外包公司 APP外包

CST sudio suite仿真案例:PCB热仿真1——元件热源

思茂信息

CST软件 CST Studio Suite 热仿真

CAD背景怎么改成黑色?

在路上

cad cad看图 cad软件 CAD看图王

Autodesk AutoCAD 2026 (CAD2026)中文激活版详细安装教程

Rose

“你好BOE”2025首站启幕 助力“横琴-澳门国际数字艺术博览会”打造沉浸式科技艺术新高地

科技热闻

《算法导论(第4版)》阅读笔记:p162-p163

codists

算法

25年宁夏等保测评机构名单汇总

行云管家

网络安全 等保 堡垒机

Spring AI Alibaba 发布企业级 MCP 分布式部署方案

阿里巴巴云原生

阿里云 开源 微服务 云原生

文旅行业需要用到堡垒机吗?理由是什么?

行云管家

网络安全 信息安全 堡垒机

传统可观测性的尽头,是LLM可观测性的起点

Yakun

可观测性 LLM GenAI LLM可观测 LLM评估

Microchip推出成本优化的高性能PolarFire® Core FPGA 和 SoC产品

新消费日报

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