玩转 K8s 权限控制:RBAC + kubeconfig 搞定 kubectl 权限管理那些事

1. 先抛需求

当一个 K8s 集群需要被多个租户共享时,就涉及到了权限问题,比如你是管理员,这时候你会面临着“给每个用户分配一个 Namespace”类似的需求。

更进一步,可能你需要限制特定用户只能够对集群进行特定的操作,比如不能让“张三”有机会执行 kubectl delete node <NODE_NAME> 这种 sao 命令。

在上一篇文章《通过 VS Code 优雅地编辑 Pod 内的代码(非 NodePort)》中我们讲到怎样在不暴露一堆 NodePort 的前提下,通过 VS Code 更新 Pod 内的代码。VS Code 里去 Attach Pod 其实也是用的本地 kubeconfig 来和 apiserver 通信,进而操作到 Pod。换言之,要实现“多租户通过 VS Code 连接自己的 Pod”这个需求,也涉及到给不同租户创建合适的“最小权限 kubeconfig”。行,今天就来解决这个问题。

2. RBAC 配置

整体就两步,先倒腾 RBAC,然后倒腾 kubeconfig。我们先来看 RBAC吧。

2.1. K8s 里的 RBAC 机制介绍

先复习下 K8s 里的 RBAC 机制。

(这时候需要用到 GPT 了。)

  • :Hello ChatGPT,用中文总结下 K8s 里的 RBAC 是个啥。

  • ChatGPT:

在 Kubernetes 中,RBAC 是一种强大的访问控制机制,用于管理对集群资源的访问权限。RBAC 可以帮助管理员精确地控制用户、ServiceAccount 或其他实体对 Kubernetes API 中资源的操作权限。RBAC 基于角色的授权模型使得管理员可以定义角色和角色绑定,从而实现对不同用户或实体的访问权限控制。

RBAC 由四个基本概念组成:

  • 角色(Role):角色定义了一组操作权限,例如对某个命名空间下资源的读取、创建或删除等操作。

  • 角色绑定(RoleBinding):角色绑定将特定的角色授予 User、Group 或者 ServiceAccount,从而赋予它们相应的权限。

  • 集群角色(ClusterRole):类似于角色,但作用范围更广,可以授权对整个集群中资源的操作权限。

  • 集群角色绑定(ClusterRoleBinding):将集群角色绑定给 User、Group 或者 ServiceAccount,授予它们在整个集群范围内的权限。

通过 RBAC,管理员可以根据需求精确控制不同用户或实体在集群中的权限范围,避免了不必要的权限泄露或误操作,提高了集群的安全性和管理灵活性。

行,就总结到这里,接着我们要实操了。

2.2 创建 ServiceAccount、Role、RoleBinding 和 Secret

  1. ServiceAccount:以用户 user1 为例,来一个 user1-account

apiVersion: v1
kind: ServiceAccount
metadata:
  name: user1-account
  namespace: default

  1. Role:继续来一个 user1-role

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: user1-role
  namespace: default
rules:
- apiGroups: [""]
  resources: ["pods", "pods/exec"]
  verbs: ["get", "list", "watch", "create", "delete", "update", "patch"]

这里就可以在 rules 下精细地控制这个角色所能够访问的资源、执行的操作了。如果需要集群维度资源的控制,比如 Node,那就得用到 ClusterRole 了,玩法类似,不赘述。

  1. RoleBinding:把用户和角色绑起来

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: user1-access-default-namespace
  namespace: default
subjects:
- kind: ServiceAccount
  name: user1-account
  namespace: default
roleRef:
  kind: Role
  name: user1-role
  apiGroup: rbac.authorization.k8s.io

  1. Secret:在 K8s 1.24 版本之后,ServiceAccount 对应的 Secret 就不会自动创建了。哎,手动搞吧

apiVersion: v1
kind: Secret
metadata:
  name: user1-account-secret
  annotations:
    kubernetes.io/service-account.name: "user1-account"
type: kubernetes.io/service-account-token

这个 Secret 创建出来之后,K8s 会自动将 ServiceAccount 对应的 token 写进这个 Secret。

一顿 apply 操作之后,RBAC 相关的几个资源就都有了。前几个没啥好说的,Secret 的关键字段贴一下,大家感受下 K8s 在背地里偷偷干了些啥:

  • kgsec user1-account-secret -o yaml

apiVersion: v1
data:
  ca.crt: LS0t……==
  namespace: ZGVmYXVsdA==
  token: ZXlKa……=
kind: Secret
metadata:
  annotations:
    kubernetes.io/service-account.name: user1-account
  name: user1-account-secret
  namespace: default
type: kubernetes.io/service-account-token

data 部分,发现了吗,ca.crt 和 token 信息被填进去了。这两段配置在后面要用到。

3. 配置 kubeconfig 文件

user1 的权限配置已经 OK 了,下一步就是将 token 搞到 kubeconfig 里。

3.1 kubeconfig 文件介绍

呵呵,老规矩,我这么懒的人,怎么可能自己总结。

  • ChatGPT:

kubeconfig 是 Kubernetes 的一个配置文件,它包含了访问 Kubernetes 集群所需的所有信息。这些信息包括集群的地址、用户证书、用户名和命名空间等。kubeconfig 文件使得用户和 CI/CD 工具可以方便地与 Kubernetes 集群进行交互。

kubeconfig 文件通常位于用户的主目录下的 .kube 目录中,文件名为 config。然而,用户也可以通过设置 KUBECONFIG 环境变量来指定其他位置的 kubeconfig 文件。

kubeconfig 文件主要由以下三部分组成:

  • 集群(clusters):定义了要连接的 Kubernetes 集群的信息,包括集群的名称、服务器的地址和 CA 证书。

  • 用户(users):定义了用户的认证信息,包括用户的名称、客户端证书和密钥。

  • 上下文(contexts):定义了用户和集群之间的关系。一个上下文包含了一个用户和一个集群,以及用户在该集群中的默认命名空间。

通过在 kubeconfig 文件中定义不同的上下文,用户可以轻松地在不同的 Kubernetes 集群和命名空间之间切换。

稍显稚嫩,不过将就吧。关于 kubeconfig 是个啥的资料太多了,我就不过多啰嗦了。

贴一个 minikube 默认创建的 kubeconfig 文件:

apiVersion: v1
clusters:
- cluster:
    certificate-authority: /Users/danielhu/.minikube/ca.crt
    extensions:
    - extension:
        last-update: Wed, 13 Dec 2023 15:28:46 CST
        provider: minikube.sigs.k8s.io
        version: v1.32.0
      name: cluster_info
    server: https://127.0.0.1:60719
  name: minikube
contexts:
- context:
    cluster: minikube
    extensions:
    - extension:
        last-update: Wed, 13 Dec 2023 15:28:46 CST
        provider: minikube.sigs.k8s.io
        version: v1.32.0
      name: context_info
    namespace: default
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /Users/danielhu/.minikube/profiles/minikube/client.crt
    client-key: /Users/danielhu/.minikube/profiles/minikube/client.key

总之就是 clusters 里定义一堆可用的集群信息,users 里定义一堆用户信息,然后在 contexts 里将 user 和 cluster 关联起来;最后通过切换 context 就可以实现切换“用户/集群”了。

3.2 具体的 kubeconfig 配置

前面创建的 Secret 里有一个 token,将其复制出来备用。(这里要注意,别拿 base64 转码后的结果。kubectl get -o yaml 拿到的是 base64 编码的;kubectl describe 拿到的是原始的,你可以直接拿原始的,也可以拿编码后的自己 echo "xxx" | base64 -d 解码一下。

此外 Secret 里有一个 ca.crt,这个 ca 的内容是集群维度统一的,你在其他地方复制也行,不过这里有,顺手拿一个也不打紧。这里需要是 base64 编码后的内容,注意这个细节。

然后准备这样一个 kubeconfig 文件:

apiVersion: v1
kind: Config
clusters:
- name: minikube1
  cluster:
    server: https://127.0.0.1:60719
    certificate-authority-data: <ca.crt, base64>

users:
- name: user1-account
  user:
    token: <token>

contexts:
- name: user1-context
  context:
    cluster: minikube1
    namespace: default
    user: user1-account

注意几个细节:

  1. clusters 下面的 name 记得不要和你系统内默认 config 中的 clusters 重名;

  2. server 地址可以抄你的默认 config 里的配置;

  3. ca 配置其实也是一样的,你的系统内有,复用配置也行;我这里选择贴一个 base64 版本的内容,为了不引入“外部文件”,方便分发;

  4. token 填写前面准备的 token,非 base64。

3.3 kubeconfig 切换测试

最简单粗暴的办法,你可以直接备份 $HOME/.kube/config,然后将这个新文件替换进去,这样就能测试新的 kubeconfig 是不是正常工作了。

或者,你可以配置上 KUBECONFIG 环境变量,将新的 kubeconfig 保存路径追加进去。比如 mac 可以这样:

export KUBECONFIG=/Users/danielhu/.kube/config:/Users/danielhu/Work/test/kubeconfig

Windows 系统得用分号(;)。

这时候你再执行 kubectl config view 就可以看到一个 merge 之后的 kubeconfig 配置,也就是新的旧的 kubeconfig 都在一起了。

下一步,我推荐你用 kubectx来切换 context

  • kubectx

minikube
user1-context

  • kubectx user1-context

OK,这时候就能切换到新的 context 了。接着可以试下是不是只有 pods 能被操作到:

4. 总结

打完收工。没啥好总结的。See you next day.

文章转载自:胡说云原生

原文链接:https://www.cnblogs.com/daniel-hutao/p/17899757.html

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/244088.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Dialogue Transformers:如何解决医学大模型【偏离主诉和没抓住核心】,建立抗干扰的能力,使得发现用户问题会一追到底?

Dialogue Transformers&#xff1a;实现抗干扰能力的对话模型 抗干扰能力基于 Transformer 的实现技术优化目标 抗干扰能力 前置知识&#xff1a;从【注意力机制】开始&#xff0c;到【Transformer】的零基础【大模型】系列 Dialogue Transformers 论文地址&#xff1a;https:/…

如何用CHAT写复习教案?

近日天气恶劣&#xff0c;好多地方的学校都停课了&#xff0c;改为线上学习&#xff0c;那作为老师&#xff0c;如何安排好线上的教学方案呢&#xff1f;下面小编分享下朋友用CHATGPT写的这份复习教案。 问CHAT&#xff1a;一年级语文上册复习计划教案 CHAT回复&#xff1a;教…

网络安全事件分级指南

文章目录 一、特别重大网络安全事件符合下列情形之一的&#xff0c;为特别重大网络安全事件&#xff1a;通常情况下&#xff0c;满足下列条件之一的&#xff0c;可判别为特别重大网络安全事件&#xff1a; 二、重大网络安全事件符合下列情形之一且未达到特别重大网络安全事件的…

HarmonyOS--基础组件Text

Text组件 可以包含Span子组件。 接口 Text(content? : string | Resource) string: Text(我是ttttt) Resource: Text($r(app.string.aaaaaa)) 先找限定词目录&#xff0c;找不到内容 找base目录 属性 除支持通用属性外&#xff0c;还支持以下属性&#xff1a; 名称 参数…

工厂设备数据采集如何更高效?

​随着工业4.0时代的到来&#xff0c;工厂设备数据采集变得越来越重要。然而&#xff0c;在实际的生产环境中&#xff0c;工厂设备数据采集面临着诸多痛点和难点。本文将分析这些痛点和难点&#xff0c;并介绍如何解决这些问题&#xff0c;提高工厂设备数据采集的效率。 一、工…

Linux 线程池源码剖析

1 了解线程池 1-1线程池的概述 由一个任务队列和一组处理队列的线程组成。一旦工作进程需要处理某个可能“阻塞”的操作,不用自己操作,将其作为一个任务放到线程池的队列,接着会被某个空闲线程提取处理。 1-2线程池的组件 任务 待处理的工作,通常由标识、上下文和处理…

xilinx 产品系列分类

1. 按照产品代数&#xff0c;分为6代&#xff0c;7代&#xff0c;ultrascale&#xff0c;ultrascale&#xff0c;Versal。6代是较早的器件&#xff0c;现在基本是7代及之后的产品&#xff0c;最新的一代是Versal&#xff0c;网上很多说法提到7系列也即是7代&#xff0c;在第二章…

以柔克刚:软体机器人的柔性革命与无限可能

原创 | 文 BFT机器人 戳“精彩内容”不容错过 你知道什么是软体机器人吗&#xff1f;真的是表面所理解的那样&#xff0c;这个“机器人是软的&#xff1f;”。当然不是啦&#xff01;那下面小编将带你具体解读一下软体机器人的来源与发展。 软体机器人是一类由软体驱动材料构成…

seata的安装及基本使用

seata的安装及基本使用 安装注意事项1. 启动时需要带上seata所在服务器的地址和端口&#xff08;默认是8091&#xff09;2. seata的服务端配置文件application.yml中在配置nacos的namespace时&#xff0c;需要注意的是&#xff1a;对应的值是nacos中namespace的id, 而不是名称&…

3分钟打造私人微信ChatGPT助手:新手友好指南!

接上文&#xff1a; https://mp.weixin.qq.com/s/RCqX0rx7TEu1gIwHEBBWKQ 本文适用于小白用户&#xff0c;技术大佬勿入&#xff01; 前言 这里教大家如何快速的拥有一个属于自己的微信GPT助手 我个人其实不是这么部署的&#xff0c;但是为了方便小白用户&#xff0c;探索了一个…

【AI底层逻辑】——“数学华尔兹”之一元线性回归

一元线性回归模型想必大家都耳熟能详&#xff0c;这里不再赘述。但在使用python中机器学习包时一定见过类似模型评价参数的输出&#xff0c;这一章我们就讲一讲回归分析里一些模型评价概念&#xff01; 一、方差分析ANOVA 方差分析是一种用于确定线性回归模型中不同变量对目标…

Java版工程行业管理系统源码-专业的工程管理软件-提供一站式服务

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 项目背景 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管理的提…

数字孪生轻量化引擎——AMRT3D引擎

随着全球经济亟待复苏&#xff0c;作为科技发展主要需求技术之一&#xff0c;数字孪生已经成为全球多个国家重点布局行业。例如&#xff0c;美国工业互联网盟将数字孪生作为工业互联网落地的核心和关键&#xff0c;德国工业4.0参考架构将数字孪生作为重要内容。 数字孪生已经形…

【问题解决】将页面下载为PDF文件(前端实现)

在前端开发过程中&#xff0c;将html页面下载为pdf文件的思路&#xff1a;使用html2canvas和jsPDF两个库&#xff0c;大致流程就是首先使用html2canvas库将组件内容转换为图像&#xff0c;然后使用jsPDF库将图像生成为PDF文件。 安装html2canvas库 npm install html2canvas安…

联邦学习算法介绍-FedAvg详细案例-Python代码获取

联邦学习算法介绍-FedAvg详细案例-Python代码获取 一、联邦学习系统框架二、联邦平均算法&#xff08;FedAvg&#xff09;三、联邦随梯度下降算法 (FedSGD&#xff09;四、差分隐私随联邦梯度下降算法 (DP-FedSGD&#xff09;五、差分隐私联邦平均算法 (DP-FedAVG&#xff09;六…

word图片点击放大,word图片双击放大

网上自己搜了半天&#xff0c;都是顾左右而言他&#xff0c;直接实践一下。 干货就是&#xff1a;调整word视图为阅读模式&#xff0c;双机图片 就能放大查看&#xff0c;然后还会有一个 放大镜供点击放大到整个屏幕。 其实挺好理解的&#xff0c;word跟wps不同&#xff0c;w…

二十六、模型、视图、代理

二十六、模型、视图、代理 模型&#xff08;Model&#xff09; InterView框架中所有模型都基于抽象基类QAbstractItemModel类&#xff0c;此类由QAbstractListModel、QAbstractTableModel和QAbstractProxyModel类继承。 视图&#xff08;View&#xff09; InterView框架中的…

为什么需要分库分表,如何实现?

本文我们主要讲解“为什么需要分库分表&#xff0c;如何实现”。 在前文中讲到了读写分离&#xff0c;读写分离优化了互联网读多写少场景下的性能问题&#xff0c;考虑一个业务场景&#xff0c;如果读库的数据规模非常大&#xff0c;除了增加多个从库之外&#xff0c;还有其他…

爬虫 scrapy ——scrapy shell调试及下载当当网数据(十一)

目录 一、scrapy shell 1.什么是scrapy shell&#xff1f; 2.安装 ipython 3.使用scrapy shell 二、当当网案例 1.在items.py中定义数据结构 2.在dang.py中解析数据 3.使用pipeline保存 4.多条管道的使用 5.多页下载 参考 一、scrapy shell 1.什么是scrapy shell&am…

行业锦囊|住建厅CA证书使用指南

数字化、高效率、低成本已成为企业发展转型的重要考量因素&#xff0c;建筑工程企业也不例外。而工程资料签署和管理又是每个建筑工程企业发展转型绕不开的课题&#xff1a;在建工程项目异地盖章周期性长、庞大的签署量及海量的文件管理如何优化&#xff1b;企业如何缩短对公业…