当前位置: 首页 > news >正文

K8s 多租户管理

一、K8s 多租户管理

多租户是指在同一集群中隔离多个用户或团队,以避免他们之间的资源冲突和误操作。在K8s中,多租户管理的核心目标是在保证安全性的同时,提高资源利用率和运营效率。

K8s中,该操作可以通过命名空间(Namespaces)+ RBAC角色权限控制实现资源的隔离。每个租户都可以拥有自己的命名空间,从而避免资源名称的冲突。此外,通过资源配额(Resource Quotas)和限制范围(Limit Ranges),进一步确保每个租户只能使用一定量的计算资源,如CPU、内存,以及API对象的数量等。通过RBAC,为每个租户或用户组分配不同的角色和权限,从而确保他们只能访问和操作他们有权管理的资源。

例如下图所示,这是一个简单的多租户案例,租户A仅能操控命名空间 ns1 中的资源,而租户B也只能操控命名空间 ns2 中的资源,对于对方的的资源均无法操作。并且每个租户的资源也不是无限使用的,通过资源配额为每个命名空间限制了使用额度,这样就不会因为某一个租户资源使用过大影响其他租户的应用。

在这里插入图片描述

下面开始实践下上图中的结构。

二、创建租户

1. 创建租户的命名空间

这里创建两个命名空间,下面分配给租户A和租户B使用:

kubectl create ns ns1
kubectl create ns ns2

2. 对两个命名空间进行资源配额

vi ns_rq.yml
apiVersion: v1
kind: ResourceQuota
metadata:name: ns1-rqnamespace: ns1
spec:hard:requests.cpu: "2"requests.memory: 2Gilimits.cpu: "4"limits.memory: 4Gipods: "200"services: "50"persistentvolumeclaims: "30"secrets: "100"configmaps: "100"
---
apiVersion: v1
kind: ResourceQuota
metadata:name: ns2-rqnamespace: ns2
spec:hard:requests.cpu: "2"requests.memory: 2Gilimits.cpu: "4"limits.memory: 4Gipods: "200"services: "50"persistentvolumeclaims: "30"secrets: "100"configmaps: "100"

上面控制了cpu和内存的请求总和大小,以及一些资源的数量。

注意:这里为了方便后续的测试 cpu 和 内存 都给的比较少,根据你实际的情况进行配置。

kubectl apply -f ns_rq.yml

3. 创建租户A和租户B,指定命名空间,并分配权限

vi user.yml
# 创建租户
apiVersion: v1
kind: ServiceAccount
metadata:name: user-anamespace: ns1
---
# 分配操作权限
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: user-a-rolenamespace: ns1
rules:- apiGroups:- apps- ''resources:- deployments- replicasets- statefulsets- daemonsets- services- pods- pods/log- pods/exec- namespaces- configmaps- secrets- endpoints- storageclasss- persistentvolumes- persistentvolumeclaims- jobs- daemonsets- cronjobsverbs:- list- get- watch- create- update- delete- patch- edit- view---
# 绑定用户
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: user-a-role-bdnamespace: ns1
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: user-a-role
subjects:
- kind: ServiceAccountname: user-anamespace: ns1---
# 创建租户
apiVersion: v1
kind: ServiceAccount
metadata:name: user-bnamespace: ns2
---
# 分配操作权限
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: user-b-rolenamespace: ns2
rules:- apiGroups:- apps- ''resources:- deployments- replicasets- statefulsets- daemonsets- services- pods- pods/log- pods/exec- namespaces- configmaps- secrets- endpoints- storageclasss- persistentvolumes- persistentvolumeclaims- jobs- daemonsets- cronjobsverbs:- list- get- watch- create- update- delete- patch- edit- view---
# 绑定用户
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: user-b-role-bdnamespace: ns2
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: user-b-role
subjects:
- kind: ServiceAccountname: user-bnamespace: ns2
kubectl apply -f user.yml

3. 查看租户 A 和 租户B 的 Token

查看租户A:

echo $(kubectl -n ns1 get secret $(kubectl -n ns1 get secret | grep user-a | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)

在这里插入图片描述

查看租户B:

echo $(kubectl -n ns2 get secret $(kubectl -n ns2 get secret | grep user-b | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)

在这里插入图片描述

下面就可以将用户名、tokenmaster 的地址给到具体租户去使用了,例如:

租户:user-a

token:eyJhbGciOiJSUzI1NiIsImtpZCI6IlA5SnRxTkVjcGV3bVdmeWV5SHo0VFBSaXdWVVYwWGMzNmYtY1NZMVRwYkUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJuczEiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoidXNlci1hLXRva2VuLWx3Yjc4Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6InVzZXItYSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjRhZTUwZWI4LThhMTEtNDQ2Yy05NTEyLWE1MmI3NzMxNDNlMSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpuczE6dXNlci1hIn0.LI72bJeJERegwnwkAp8AKlvplcJMrhhYvr6K70dtQ02MXepbhVtouB_1yUiZODQZvyaRgrbgFUhEzVFB6YunB7cm2WH2blOaj_3hvuLw9FZRQ7IWmeKV7a07aviUg58ZGlrdOzUXYKNBT-A3y1zb6XrHOXNSiOZjHwQob1ft1GOM04bu7GnO6docgDXjQ0h6knpiwNFUqG-I9tI9I52dUOsUbxnhyrCzxUIJsfa2eoHOP-mz3m8ud-WLFwaOmH0G49STZnmkWs2pJJqBqP0LRJ_fs2gmgS6kMITwxraR81kBXywmVi6szNReX74fHhNVyNa-kE0gZSG6S9C-uqEJUw
master-server:https://11.0.1.144:6443

三、租户使用测试

使用 kubectl 指向提供的集群,如果已经指定可不设置:

kubectl config set-cluster cluster --insecure-skip-tls-verify=true --server=https://11.0.1.144:6443

在这里插入图片描述

设置租户的 token

格式:kubectl config set-credentials {租户名} --token={token}

kubectl config set-credentials user-a --token=eyJhbGciOiJSUzI1NiIsImtpZCI6IlA5SnRxTkVjcGV3bVdmeWV5SHo0VFBSaXdWVVYwWGMzNmYtY1NZMVRwYkUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJuczEiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoidXNlci1hLXRva2VuLWx3Yjc4Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6InVzZXItYSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjRhZTUwZWI4LThhMTEtNDQ2Yy05NTEyLWE1MmI3NzMxNDNlMSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpuczE6dXNlci1hIn0.LI72bJeJERegwnwkAp8AKlvplcJMrhhYvr6K70dtQ02MXepbhVtouB_1yUiZODQZvyaRgrbgFUhEzVFB6YunB7cm2WH2blOaj_3hvuLw9FZRQ7IWmeKV7a07aviUg58ZGlrdOzUXYKNBT-A3y1zb6XrHOXNSiOZjHwQob1ft1GOM04bu7GnO6docgDXjQ0h6knpiwNFUqG-I9tI9I52dUOsUbxnhyrCzxUIJsfa2eoHOP-mz3m8ud-WLFwaOmH0G49STZnmkWs2pJJqBqP0LRJ_fs2gmgS6kMITwxraR81kBXywmVi6szNReX74fHhNVyNa-kE0gZSG6S9C-uqEJUw

在这里插入图片描述

设置 context ,指定默认的命名空间名称:

kubectl config set-context user-context --cluster=cluster --user user-a --namespace=ns1

在这里插入图片描述

切换到上面的 context 中:

kubectl config use-context user-context

在这里插入图片描述

测试访问其他命名空间的资源

查看 ns2 下有哪些 pod

kubectl get pods -n ns2

在这里插入图片描述

可以看出无法访问。

测试创建资源,申请配额大于限制时

vi test-nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxspec:replicas: 3selector:matchLabels:run: nginxtemplate:metadata:labels:run: nginxspec:containers:- image: nginx:1.20.1name: nginxports:- containerPort: 80protocol: TCPresources: limits:  cpu: "2" memory: "2Gi" requests: cpu: "1"  memory: "1Gi"
kubectl apply -f test-nginx.yml

查看 pod

kubectl get pods

在这里插入图片描述

可以看到仅创建成功了两个 pod,因为资源已经使用完了。

可以通过管理员查看 ns 空间的配额情况:

kubectl get quota -n ns1

在这里插入图片描述

可以看到都已经使用满了。

如果此时管理员给 ns1 空间提高配额:

kubectl edit resourcequota ns1-rq -n ns1

在这里插入图片描述

更新服务:

kubectl apply -f test-nginx.yml

等待片刻后,使用租户A再次查看pod

在这里插入图片描述

pod 已经全部起来了

相关文章:

K8s 多租户管理

一、K8s 多租户管理 多租户是指在同一集群中隔离多个用户或团队,以避免他们之间的资源冲突和误操作。在K8s中,多租户管理的核心目标是在保证安全性的同时,提高资源利用率和运营效率。 在K8s中,该操作可以通过命名空间&#xff0…...

Java面试题:Synchronized和Lock的对比

Synchronized和Lock对比 语法层面 Synchronized是关键字,源码在jvm中,用c语言实现 使用时,退出同步代码块时会自动释放 Lock是接口,源码由jdk提供,用java语言实现 使用时,需要手动调用unlock方法进行释放 功能层面 都属于悲观锁,具备基本的互斥,同步,锁重入功能 但Lock…...

VPN方案和特点

VPN方案和特点 VPN,或者称为虚拟专用网络,是一种保护你的在线安全和隐私的技术。它可以创建一个加密的连接,使你的在线活动对其他人不可见。以下是一些常见的VPN协议和它们的特点: 开放VPN (OpenVPN):这是一种极为可…...

力扣HOT100 - 84. 柱状图中最大的矩形

解题思路&#xff1a; 单调栈 对于一个高度height[ i ]&#xff0c;找左右两边均严格小于它的值。 class Solution {public int largestRectangleArea(int[] heights) {int n heights.length;int[] left new int[n];int[] right new int[n];Deque<Integer> mono_st…...

【吃透Java手写】3-SpringBoot-简易版-源码解析

【吃透Java手写】SpringBoot-简易版-源码解析 1 SpringbootDemo2 准备工作2.1 Springboot-my2.1.1 依赖2.1.2 SpringBootApplication2.1.3 SJBSpringApplication2.1.3.1 run方法 2.2 Springboot-user2.2.1 依赖2.2.2 UserController2.2.3 UserApplication 2.3 分析run方法的逻辑…...

maven mirrorOf的作用

在工作中遇到了一个问题导致依赖下载不了&#xff0c;最后发现是mirror的问题&#xff0c;决定好好去看一下mirror的配置&#xff0c;以及mirrorOf的作用&#xff0c;以前都是直接复制过来使用&#xff0c;看了之后才明白什么意思。 过程 如果你设置了镜像&#xff0c;镜像会匹…...

Centos7 安装 MySQL5.7 使用 RPM 方式

1 访问网站 https://downloads.mysql.com/archives/community/ 选择合适的版本&#xff0c;点击 Download。 2 上传下载好的 mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar 文件到 Centos7 机器&#xff0c;这里放到了 下载 目录。 3 解压 mysql-5.7.44-1.el7.x86_64.rpm-bundle.…...

代码随想录算法训练营day21 | 513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树

513.找树左下角的值 迭代法比较简单&#xff0c;层序遍历&#xff0c;找到最下面一层的第一个节点。题目已经说明节点数>1了 class Solution:def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:queue collections.deque()queue.append(root)result ro…...

微信小程序知识点归纳(一)

前言&#xff1a;适用于有一定基础的前端开发同学&#xff0c;完成从网页开发到小程序开发的知识转换。 先立框架&#xff0c;后砌墙壁 回顾&#xff1a;了解微信小程序开发流程-CSDN博客 初始页面结构&#xff0c;三部分pages、utils、配置&#xff0c;分别存放页面、工具类…...

wangEditor富文本编辑器与layui图片上传

记录&#xff1a;js 显示默认的wangEditor富文本编辑器内容和图片 <style>body {background-color: #ffffff;}.layui-form-select dl{z-index:100000;} </style> <div class"layui-form layuimini-form"><div class"layui-form-item"…...

爬虫学习:XPath提取网页数据

目录 一、安装XPath 二、XPath的基础语法 1.选取节点 三、使用XPath匹配数据 1.浏览器审查元素 2.具体实例 四、总结 一、安装XPath 控制台输入指令&#xff1a;pip install lxml 二、XPath的基础语法 XPath是一种在XML文档中查找信息的语言&#xff0c;可以使用它在HTM…...

【雅思写作】Vince9120雅思小作文笔记——P1 Intro(前言)

文章目录 链接P1 Intro&#xff08;前言&#xff09;字数限制题型综述&#xff08;problem types overview&#xff09;1. **柱状图&#xff08;Bar Chart&#xff09;** - 描述不同类别在某个或多个变量上的数据量比较。2. **线图&#xff08;Line Graph&#xff09;** - 展示…...

【面试干货】HTTPS 工作原理

【面试干货】HTTPS 工作原理 1、握手阶段&#xff08;Handshake&#xff09;2、密钥协商阶段3、加密通信阶段4、结束通信阶段 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff…...

Cocos Creator 中编码规范 (6)

Cocos中命名规范 创建文件夹&#xff0c;全小写。创建脚本&#xff0c;首字母大写的驼峰形式。创建变量&#xff0c;首字母小写的驼峰形式 官方的编码规范...

Vue3:menu导航栏出现多个同一跳转路径的菜单处理

文章目录 需求整理实现思路实现过程 需求整理&#xff0c;实现思路 最近公司想将之前老的项目整理出来&#xff0c;因为这个老项目内容太杂什么页面都往里面塞&#xff0c;导致菜单特别多&#xff0c;公司就像将这个老的项目迁出来&#xff0c;这个旧的项目本来是后端PHP写的。…...

SAM轻量化应用Auto-SAM、Group-Mix SAM、RAP-SAM、STLM

1. Auto SAM&#xff08;Auto-Prompting SAM for Mobile Friendly 3D Medical Image Segmentation&#xff09; 1.1 面临问题 医学背景&#xff1a; &#xff08;1&#xff09;与自然图像相比&#xff0c;医学图像的尺寸更小&#xff0c;形状不规则&#xff0c;对比度更低。&…...

深度优化搜索DFS使用详解,看这篇就够了!!!

深度优先搜索&#xff08;Depth-First Search&#xff0c;DFS&#xff09;是一种用于遍历或搜索树和图的算法。在最坏的情况下&#xff0c;深度优先搜索的性能为O(VE)&#xff0c;其中V是顶点数&#xff0c;E是边数。DFS常用于解决连通性问题、路径问题、生成树问题等。 ### D…...

Apache SeaTunnel 正式发布2.3.5版本,功能增强及多个Bug修复

经过两个月的筹备&#xff0c;我们在2.3.4版本基础上进行了新一轮的迭代&#xff0c;本次更新不仅修复了多个关键问题&#xff0c;还引入了若干重要功能增强和性能优化。 在此&#xff0c;我们先提前感谢社区成员的贡献和支持&#xff0c;如果你想升级最新的版本&#xff0c;快…...

interview_bak

flink内存管理 JVM 存在的几个问题: Java 对象存储密度低。一个只包含 boolean 属性的对象占用了16个字节内存:对象头占了8个,boolean 属性占了1个,对齐填充占了7个。而实际上只需要一个bit(1/8字节)就够了。Full GC 会极大地影响性能,尤其是为了处理更大数据而开了很大…...

layui 数据表格 自动定位新增行位置

由于数据表格新增行后没有到新增到当前位置 继续增加的需求&#xff1a; 因为自己是新增行后到最后一行的 所以 就定位到最后一行 并且 高亮 高亮颜色浅 可自行更改 整理了一下 可根据 情况 修改 // 初始化滚动条位置变量 let tableScroll {scrollTob: 0,scrollLeft: 0,…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...