玩转 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
- ServiceAccount:以用户 user1 为例,来一个 user1-account
apiVersion: v1
kind: ServiceAccount
metadata:
name: user1-account
namespace: default
- 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 了,玩法类似,不赘述。
- 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
- 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
注意几个细节:
- clusters 下面的 name 记得不要和你系统内默认 config 中的 clusters 重名;
- server 地址可以抄你的默认 config 里的配置;
- ca 配置其实也是一样的,你的系统内有,复用配置也行;我这里选择贴一个 base64 版本的内容,为了不引入“外部文件”,方便分发;
- 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.
玩转 K8s 权限控制:RBAC + kubeconfig 搞定 kubectl 权限管理那些事的更多相关文章
- yii2权限控制rbac之菜单menu最详细教程
前面我们在博文 yii2搭建完美后台并实现rbac权限控制实例教程中完美实现了yii2的后台搭建和rbac权限控制,如果你还没有实现,请先看上文再回来参考本文,因为本文是在上文的基础上进行完善和补充. ...
- yii2权限控制rbac之详细操作步骤
本篇的主题是 rbac权限控制的详细操作步骤,注意是操作步骤哦,关于配置与rbac的搭建,我们在博文 yii2搭建完美后台并实现rbac权限控制实例教程说的再清楚不过了. 但是,在很多人的反馈下,说是 ...
- 权限控制-RBAC(Role-Based Access Control)
RBAC是基于角色的权限访问控制,在RBAC中角色与权限相连,用户通过成为某个角色而得到角色的权限,这就极大的简化了权限的管理,用户和角色多对多,角色和权限多对多,由此产生用户表.角色表.权限表,用户 ...
- <实训|第九天>掌握linux中普通的权限控制和三种特殊的权限(sst),做合格的运维工程师
linux中,权限的学习是必不可少的,不论是作为一名运维工程师或者是单一的管理者,学习好linux中的权限控制,你就可以保护好自己的隐私同时规划好你所管理的一切. 权限的学习是很多的,不要认为自己已经 ...
- asp.net core mvc权限控制:在视图中控制操作权限
在asp.net core mvc中提供了权限验证框架,前面的文章中已经介绍了如何进行权限控制配置,权限配置好后,权限验证逻辑自动就会执行,但是在某些情况下,我们可能需要在代码里或者视图中通过手工方式 ...
- 新能力 | 云开发CMS内容管理系统,5分钟搞定小程序管理后台
小程序·云开发的云调用能力,让用户可以免鉴权快速调用微信的开放能力,极大节约了开发成本.现在,大家期待已久的云开发 CMS 内容管理系统,终于上线啦!顺便提示,接下来还可以二次开发哦! 云开发 CMS ...
- yii2权限控制rbac之rule详细讲解
作者:白狼 出处:http://www.manks.top/yii2_rbac_rule.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留 ...
- yii2权限控制rbac之rule详细讲解(转)
在我们之前yii2搭建后台以及rbac详细教程中,不知道你曾经疑惑过没有一个问题,rule表是做什么的,为什么在整个过程中我们都没有涉及到这张表? 相信我不说,部分人也都会去尝试,或百度或google ...
- 微信小程序:一起玩连线,一个算法来搞定
微信小程序:一起玩连线 游戏玩法 将相同颜色的结点连接在一起,连线之间不能交叉. 算法思想 转换为多个源点到达对应终点的路径问题,且路径之间不相交.按照dfs方式寻找两个结点路径,一条路径探索完之后, ...
- yii2搭建完美后台并实现rbac权限控制实例教程
1.安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 或者参考yii2实战教程之详细安装步骤 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/con ...
随机推荐
- Poor God Water(ACM-ICPC 2018 焦作赛区网络预赛 矩阵快速幂)
题目描述 God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells ...
- .NET中测量多线程基准性能
多线程基准性能是用来衡量计算机系统或应用程序在多线程环境下的执行能力和性能的度量指标.它通常用来评估系统在并行处理任务时的效率和性能.测量中通常创建多个线程并在这些线程上执行并发任务,以模拟实际应用程 ...
- 万字+20张图剖析Spring启动时核心的12个步骤
大家好,我是三友~~ 今天来扒一扒Spring在启动过程中核心的12个步骤 之所以来写这篇文章,主要是来填坑的 之前在三万字盘点Spring 9大核心基础功能这篇文章的末尾中给自己挖了一个坑,提了一嘴 ...
- Web项目如何配置Eslint
介绍 ESLint 是一个根据方案识别并报告 ECMAScript/JavaScript 代码问题的工具,其目的是使代码风格更加一致并避免错误.在很多地方它都与 JSLint 和 JSHint 类似, ...
- Solution -「洛谷 P5072」「YunoOI 2015」盼君勿忘
Description Link. 无修支持查询:查询一个区间 \([l,r]\) 中所有子序列分别去重后的和 \(\bmod\ p\) Solution 这是数据结构一百题的第50题(一半了哦)的纪 ...
- Journey -「CQOI 2021」
Day -1 Thu. & Fri. 恰逢学校运动会,于是向班主任申请了不去,然后就在机房坐着.不美好的事情可能就是文化课老师还留了这两天的作业,不过-> 一旦放弃了作业,什么都好说了呢 ...
- flask中cookies的使用
flask中cookies的使用 在Flask中对cookie的处理 1. 设置cookie: 设置cookie,默认有效期是临时cookie,浏览器关闭就失效 可以通过 max_age 设置有效期, ...
- nginx配置kibana访问用户名和密码认证、及无认证访问配置
转载请注明出处: 在nginx上配置kibana页面访问时,默认是采用kibana的认证,一般直接安装kibana后,是没有用户名和密码认证的. 如果要在负载均衡上配置反向代理和用户认证,可按以下步骤 ...
- CSE 2023 混合年度回声周末
CSE 2023 混合年度回声周末(2023 年 4 月 13 日至 15 日)25 周年银周年纪念版 近 900 名参与者参加.又是成功的伟大一年.明年 2024 年 4 月在多伦多见.敬请关注全年 ...
- Oracle和达梦:连接多行查询结果
Oracle和达梦:LISTAGG连接查询结果 LISTAGG介绍 使用LISTAGG函数,您可以将多行数据连接成一个字符串,并指定分隔符进行分隔.这在需要将多行数据合并为单个字符串的情况下非常有用, ...