kubernetes授予用户指定命名空间的使用权限

kubernetes授予用户指定命名空间的使用权限

  • 问题描述
  • 具体实现
    • 签发客户端证书
    • 创建RBAC策略
    • 生成kubeconfig文件

问题描述

假如我们部门来了个新同事,他需要使用kubernetes集群,但是因为他刚来,还不熟悉,所以不能直接将kubernetes集群的所有权限给他,我希望他能够在test这个namespace里面操作,对于其他的namespace,则都没有权限,那么我应该如何给这个用户授权呢?

可以通过kubernetes的RBAC机制来完成授权工作,只给某个用户某个namespace的权限

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

具体实现

示例,加入我需要给用户lilei授权test命名空间的完全使用权限

  1. 用K8S CA签发客户端证书 基于证书的客户端认证方式
  2. 创建RBAC权限策略 做一定的权限分配
  3. 生成kubeconfig授权文件 kubectl使用kubeconfig连接集群

最终目的也就是生成一个kubeconfig文件,让指定用户拿着这个文件去访问集群

签发客户端证书

  1. 安装签发证书服务cfssl
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl*
mv cfssl_linux-amd64 /usr/bin/cfssl
mv cfssljson_linux-amd64 /usr/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
  1. 使用k8s CA签发客户端证书
    如果是使用kubeadm部署的kubernetes集群,那么根证书存放在/etc/kubernetes/pki中
root@master:~# ls /etc/kubernetes/pki/
apiserver.crt              apiserver-etcd-client.key  apiserver-kubelet-client.crt  ca.crt  etcd                front-proxy-ca.key      front-proxy-client.key  sa.pub
apiserver-etcd-client.crt  apiserver.key              apiserver-kubelet-client.key  ca.key  front-proxy-ca.crt  front-proxy-client.crt  sa.key

提前创建配置文件

root@master:~# cat > ca-config.json <<EOF
{"signing": {"default": {"expiry": "87600h"},"profiles": {"kubernetes": {"usages": ["signing","key encipherment","server auth","client auth"],"expiry": "87600h"}}}
}
EOF#API Server会把客户端证书的CN字段作为User,把names.O字段作为Group。k8s在校验授权的时候就会读取这两个字段
root@master:~# cat > lulei-csr.json <<EOF
{"CN": "lilei","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "ShenZhen","L": "ShenZhen","O": "k8s","OU": "System"}]
}
EOF

cfssl使用根证书来签发lilei客户端的证书

cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes lilei-csr.json | cfssljson -bare lilei

签发完成会在当前目录下产生lulei-key.pem lulei.pem 两个文件
上面就是客户端证书,有多个用户需要生成多个

  • lilei-key.pem 私钥 类似配置nginx https访问 .key私钥
  • lilei.pem 数字证书 类似配置nginx https访问的 .crt证书

创建RBAC策略

  1. 创建rbac策略,也就是创建一个role角色,然后进行rolebinding绑定,这里授予了这个用户dev namespace下的所有权限(可根据实际需求更改)
root@master:~# cat > rbac.yaml <<EOF
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:namespace: testname: pod-reader
rules:          
- apiGroups: ["", "apps", "batch", "networking.k8s.io"]  #deployments属于apss这个资源对象里面;里面为空,为核心的api组,常用的资源都在核心组里面resources: ["deployments", "pods", "services", "pods/exec", "ingresses", "secrets", "pods/log"]verbs: ["get", "list", "watch", "create", "delete", "update", "patch"]  #资源操作方法
--- 
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: read-podsnamespace: test
subjects:
- kind: Username: lileiapiGroup: rbac.authorization.k8s.io
roleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.io
EOFroot@master:~# kubectl apply -f rbac.yaml

生成kubeconfig文件

  1. 集群参数设置
root@master:~# kubectl config set-cluster kubernetes \--certificate-authority=/etc/kubernetes/pki/ca.crt \--embed-certs=true \--server=https://10.98.99.140:6443 \--kubeconfig=lulei.kubeconfig#然后当前目录下会生成一个lilei.kubeconfig文件

本段设置了所需要访问的集群的信息。
使用set-cluster设置了需要访问的集群,如上为kubernetes,这只是个名称,实际为–server指向的apiserver
–certificate-authority设置了该集群的公钥
–embed-certs为true表示将–certificate-authority证书写入到kubeconfig中
–server则表示该集群的kube-apiserver地址
生成的kubeconfig 被保存到 lilei.kubeconfig文件

  1. 用户参数设置
root@master:~# kubectl config set-credentials lulei \--client-key=lulei-key.pem \--client-certificate=lulei.pem \--embed-certs=true \--kubeconfig=lilei.kubeconfig#会追加user信息到lilei.kubeconfig文件中,注意,当前目录下需要有lilei-key.pem和lilei.pem

本段主要设置用户的相关信息,主要是用户证书。如上的用户名为lilei,证书为:lilei.pem,私钥为:lilei-key.pem。注意客户端的证书首先要经过集群CA的签署,否则不会被集群认可。此处使用的是ca认证方式,也可以使用token认证,如kubelet的 TLS Boostrap机制下的bootstrapping使用的就是token认证方式。上述kubectl使用的是ca认证,不需要token字段

  1. 上下文参数设置
root@master:~# kubectl config set-context kubernetes \--cluster=kubernetes \--user=lilei \--kubeconfig=lulei.kubeconfig#会追加context信息到lilei.kubeconfig文件中

集群参数和用户参数可以同时设置多对,在上下文参数中将集群参数和用户参数关联起来。上面的上下文名称为kubenetes,集群为kubenetes,用户为lilei,表示使用lilei的用户凭证来访问kubenetes集群的default命名空间,也可以增加–namspace来指定访问的命名空间。

  1. 设置当前使用的配置
#切换context为kubernetes,集群默认的context为kubernetes-admin@kubernetes,如果root用户直接执行这个会失败,因为当前root用的kubeconfig文件中没有kubernetes这个context的信息,下面第二种指定kubeconfig即可
kubectl config use-context kubernetes
kubectl config use-context kubernetes --kubeconfig=lulei.kubeconfig
#列出可用的上下文,跟你的当前用户的kubeconfig设置有关
kubectl config get-contexts <name>
#列出当前使用的上下文
kubectl config current-context <name>
#设置新的上下文,可以包括集群、用户和命名空间
kubectl config set-context <name> [--cluster=<cluster>] [--user=<user>] [--namespace=<namespace>]
#删除指定上下文
kubectl config delete-context <name>
#可以查看当前kubeconfig的内容,包括集群、用户、上下文等配置信息
kubectl config view

最终生成的kubeconfig文件就是lilei.kubeconfig,将其复制到某个用户的的.kube文件中,就可以使用该限制了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring如何控制Bean加载+执行顺序

1. Order 注解和 Ordered 接口 用途&#xff1a;控制组件执行顺序或排序&#xff0c;但不控制Bean初始化顺序。定义执行顺序&#xff1a;通过整数值指定组件优先级&#xff0c;数值越小优先级越高。集合排序&#xff1a;影响自动装配到集合中的组件排列顺序。使用场景&#xf…

77.MySQL的分页查询

一、LIMIT关键字 LIMIT关键字用于限制返回结果集中的行数。其基本语法如下&#xff1a; SELECT * FROM 表名 LIMIT 行数; 例如&#xff0c;要从名为mark_info的表中选择最新创建的10个工单的信息&#xff0c;可以执行以下查询&#xff1a; SELECT * FROM mark_info ORDER B…

电力需求预测挑战赛笔记 Taks1 跑通baseline

#AI夏令营 #Datawhale #夏令营 赛题 一句话介绍赛题任务可以这样理解赛题&#xff1a; 【训练时序预测模型助力电力需求预测】 电力需求的准确预测对于电网的稳定运行、能源的有效管理以及可再生能源的整合至关重要。 赛题任务 给定多个房屋对应电力消耗历史 N 天的相关序列数…

拓扑排序(算法篇)

算法之拓扑排序 拓扑排序 概念&#xff1a; 拓扑排序是对有向无圈图的顶点的一种排序。排序不必是唯一的&#xff0c;任何合理的排序都是可以的。具体做法是&#xff1a;先找出任意一个没有入边的顶点v(就是没有其他顶点指向的顶点)&#xff0c;将顶点v放入队列&#xff0c;…

element-plus el-table点击当前行和划过展示鼠标

在 Element Plus 的 el-table 组件中&#xff0c;设置滑过行时鼠标的样式可以通过 CSS 来实现。你可以使用 CSS 的 cursor 属性来定义鼠标悬停时的样式。以下是一个简单的例子&#xff1a; 首先&#xff0c;在你的 Vue 组件的 .el-table .el-table__row:hover {cursor: poin…

09.AOP-尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)

现有代码缺陷 针对带日志功能的实现类&#xff0c;我们发现有如下缺陷&#xff1a; 对核心业务功能有干扰&#xff0c;导致程序员在开发核心业务功能时分散了精力附加功能分散在各个业务功能方法中&#xff0c;不利于统一维护 解决思路 解决核心&#xff1a;解耦。把附加功能从…

glm-4 联网搜索 api 测试

今天测试了一下 glm-4 的联网搜索 web_search tool 调用&#xff0c;发现了 web_search 的网页检索返回结果中几个比较诡异的事情&#xff0c;特此记录&#xff1a; 有些检索结果没有 icon、link、media 字段&#xff0c;但从内容上看确实是联网搜索出来的结果&#xff0c;不知…

从零开始读RocketMq源码(三)Broker存储Message流程解析

目录 前言 准备 消息载体CommitLog 文件持久化位置 源码解析 broker消息对象MessageExtBrokerInner 异步存储message CommitLog的真相 创建MappedFile文件 加入异步刷盘队列 Message异步存储MappedByteBuffer 总结 前言 在面试中我们经常会听到这样的回答&#x…

国产化趋势下源代码数据防泄密的信创沙盒的方案分享

随着国产化的大力推进&#xff0c;越来越多的企事业单位在逐步替换Windows、Linux等操作系统的使用。那么什是国产化了&#xff1f;国产化是指在产品或服务中采用国内自主研发的技术和标注&#xff0c;替代过去依赖的他国的产品和服务&#xff0c;国产化又被称之为“信创”&…

GitLab CI/CD实现项目自动化部署

1 GitLab CI/CD介绍 GitLab CI/CD 是 GitLab 中集成的一套用于软件开发的持续集成&#xff08;Continuous Integration&#xff09;、持续交付&#xff08;Continuous Delivery&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;工具。这套系统允许开发团队…

vue里实现点击按钮回到页面顶部功能,博客必备!

效果 步骤 1-标签结构 动态绑定样式style&#xff0c;监听点击事件&#xff0c;后续控制opacity透明度。和滚动距离 <div class"toTop" :style"dynamicStyles" click"toTop"><!--<i class"fa fa-arrow-up"></i>…

Django ORM中的F 对象

F 对象非常强大&#xff0c;可以在查询和更新操作中进行复杂的字段间运算。 假设我们有一个包含商品信息的模型 Product&#xff1a; from django.db import modelsclass Product(models.Model):name models.CharField(max_length100)price models.DecimalField(max_digits…

MySQL向自增列插入0失败问题

问题 在一次上线时&#xff0c;发现通过脚本添加的状态表中&#xff0c;待提交的状态不正确&#xff0c;本来应该是0&#xff0c;线上是101。 原因 默认情况下&#xff0c;MySQL对应自增列&#xff0c;认为0和null等价&#xff08;因为mysql认为0不是最佳实践不推荐使用&…

超简单的通配证书签发工具,免费,无需安装任何插件到本地

常见的acme.sh 或者 lego等工具需要配置&#xff0c;安装不灵活&#xff0c;续签需要配置计划任务&#xff0c;签发单域名证书或者通配证书需要不同的指令和配置&#xff0c;繁琐&#xff0c;如果自己程序想要对接签发证书的api有的不支持&#xff0c;有的用起来繁琐。 最近发…

[手机Linux PostmarketOS]三, Alpine Linux命令使用

Alpine Linux 一些常用的指令&#xff1a; 添加国内源下载链接&#xff1a; 编译以下文件&#xff0c;添加链接进去&#xff1a; sudo vi /etc/apk/repositories##清华源&#xff1a; https://mirror.tuna.tsinghua.edu.cn/alpine/latest-stable/main https://mirror.tuna.tsi…

【VIVADO SDK调试遇到DataAbortHandler】

问题 SDK调试遇到DataAbortHandler问题。 运行后不显示结果&#xff0c;debug模式下发现进入DataAbortHandler异常函数。程序中存在大数组。 原因:SDK默认的堆栈为1024bytes,需要将堆栈调大。 修改方法&#xff1a; 解决:对application中src下的lscript.ld双击&#xff0c;…

android 添加一个水平线

在Android中&#xff0c;添加一个水平线通常可以通过几种方式实现&#xff0c;最常见的是使用View组件或者自定义的Drawable。下面是一个简单的例子&#xff0c;展示如何在布局文件中添加一个水平线&#xff1a; 使用View组件 在你的布局XML文件中&#xff0c;你可以添加一个…

Linux 程序卡死的特殊处理

一、前言 Linux环境。 我们在日常编写的程序中&#xff0c;可能会出现一些细节问题&#xff0c;导致程序卡死&#xff0c;即程序没法正常运行&#xff0c;界面卡住&#xff0c;也不会闪退... 当这种问题出现在客户现场&#xff0c;那就是大问题了。。。 当我们暂时还无法排…

Python如何调用C++

ctypes 有以下优点: Python内建&#xff0c;不需要单独安装Python可以直接调用C/C 动态链接库(.dll 或 .so)在Python一侧&#xff0c;不需要了解 c/c dll 内部的工作方式提供了 C/C 数据类型与Python类型的相互映射&#xff0c;以及转换&#xff0c;包括指针类型。 在使用cty…

如何定量选择孔销基准?-DTAS来帮你!

在当今快速发展的工程领域&#xff0c;公差仿真的作用日渐重要&#xff0c;在公差仿真中&#xff0c;基准体系的选择对于最终结果更是至关重要。基准体系不同可能导致仿真过程中的参数计算、误差分析以及最终的工程设计都有所不同。基准体系作为评估和比较的参照&#xff0c;直…