【Kubernetes】三证集齐 Kubernetes实现资源超卖(附镜像包)

目录

  • 插叙
  • 前言
  • 一、思考和原理
  • 二、实现步骤
    • 0. 资料包
    • 1. TLS证书签发
    • 2. 使用 certmanager 生成签发证书
    • 3. 获取secret的内容 并替换CA_BUNDLE
    • 4.部署svc + deploy
  • 三、测试验证
    • 1. 观察pod情况
    • 2. 给node 打上不需要超售的标签【可以让master节点资源不超卖】
    • 3. 资源实现超卖
    • 4. 删除还原
  • 四、总结

插叙

友友们好久不见,插播一个最近get的证书,完成了第一步,一起努力鸭~
在这里插入图片描述

前言

小涛运维时遇到一个问题,发现:容器在Kubernetes中,使用率要远低于申请率
比如:申请了1G内存,实际只用了200M左右,
就会产生这种情况:node上还有资源,但是不能调度了(Why?因为k8s默认调度器是 按allocate算的,并不是真实剩余的)

那么怎么办呢?

  1. 用scheduler extender写一个调度器 ,用usage调度pod
  2. 按照namespace 把业务分开,在每个ns上设置resourceQuota -->相对最容易实现【yaml文件限制】
  3. 把pod的request降低
  4. 基于MutatingWebhook 把node的 allocatable 调高

今天,小涛讲解的方法,是第四种----基于MutatingWebhook 把node的 allocatable 调高
下面和小涛看看吧~

一、思考和原理

思想:基于MutatingWebhook将allocatable调高,实现node资源超卖

#查看某个node节点当前资源情况
kubectl get nodes node2 -o yaml |grep allocatable: -A6

在这里插入图片描述

核心点:动态修改节点Node对象的allocatable字段值

  • 而我们看到allocatable字段属于Status字段
  • 显然不能直接通过kubectl edit命令来直接修改。
  • 因为Status字段和Spec字段不同,Spec是用户设置的期望数据
  • 而Status是实际数据(Node节点通过不断向apiServer发送心跳来更新自己的实时状态,最终存在etcd中)。那么怎么去修改Stauts字段呢?

二、实现步骤

0. 资料包

链接:https://pan.baidu.com/s/12AmYn5h_c_XrlH6iS-gSDQ
提取码:sell

  • 实现的核心步骤
    • 证书和签名:tls双向认证需要
    • 编写go项目代码,实现webhook服务器,对node status字段更改
    • 部署webhook服务,编写MutatingWebhookConfiguration 测试【把node 的status推送到中间件服务中】

1. TLS证书签发

借助certmanager 签发证书

#安装部署
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.2/cert-manager.yaml#================================================================
#如果是内网环境,将yaml文件 wget后,再docker pull 对应的镜像后,再导入到离线环境的镜像仓库【资料包里有相关镜像资料】
wget https://github.com/cert-manager/cert-manager/releases/download/v1.8.2/cert-manager.yaml
docker pull quay.io/jetstack/cert-manager-cainjector:v1.8.2
docker pull quay.io/jetstack/cert-manager-controller:v1.8.2
docker pull quay.io/jetstack/cert-manager-webhook:v1.8.2
docker pull registry.cn-beijing.aliyuncs.com/dbatao/k8s-node-oversell:v1

检查certmanager服务是否正常

$ kubectl apply -f cert-manager.yaml
$ kubectl get pod -n cert-manager

在这里插入图片描述

2. 使用 certmanager 生成签发证书

# cat cert.yaml
---
apiVersion: v1
kind: Namespace
metadata:name: node-oversell-webhook
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:name: selfsigned-issuernamespace: node-oversell-webhook
spec:selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:name: serving-certnamespace: node-oversell-webhook
spec:dnsNames:- node-oversell-webhook.node-oversell-webhook.svc- node-oversell-webhook.node-oversell-webhook.svc.cluster.localissuerRef:kind: Issuername: selfsigned-issuersecretName: webhook-server-cert
---# kubectl apply -f cert.yaml

查看证书是否已签发完成

$ kubectl get certificate -n node-oversell-webhook

在这里插入图片描述

3. 获取secret的内容 并替换CA_BUNDLE

CA_BUNDLE=$(kubectl -n node-oversell-webhook get secrets webhook-server-cert  -o jsonpath="{.data.ca\.crt}")echo ${CA_BUNDLE}
sed -i "s|\${CA_BUNDLE}|${CA_BUNDLE}|g"  mutating_webhook.yamlcat mutating_webhook.yaml
kubectl apply -f mutating_webhook.yaml

在这里插入图片描述

4.部署svc + deploy

kubectl apply -f webhook_deployment.yamlkubectl apply -f svc.yaml
curl -k https://svc_ip:443/readyz   #预期---返回ok

在这里插入图片描述

三、测试验证

1. 观察pod情况

kubectl logs -n node-oversell-webhook node-oversell-webhook-7b75dd467b-hs9m9 --tail 10

2. 给node 打上不需要超售的标签【可以让master节点资源不超卖】

#将<node_name>更换为不用超卖节点的名称,非常智能!!
$ kubectl label node <node_name> node-oversell/disable=true#例如
kubectl label node master01 node-oversell/disable=true#如果需要这个节点超卖,将标签去掉即可
kubectl label node master01  node-oversell/disable-

3. 资源实现超卖

$ kubectl get nodes node2 -o yaml |grep allocatable: -A6#在Prometheus里用PromeQL也能查看到
kube_node_status_allocatable{}		#QL查询语句

在这里插入图片描述

4. 删除还原

$ kubectl delete deploy -n node-oversell-webhook node-oversell-webhook
$ kubectl delete mutatingwebhookconfigurations node-oversell-webhook

四、总结

  • 我们再来回顾一下大致步骤
    在这里插入图片描述

  • API-Server支持准入控制器中,准入控制器中有一个“修改性质的控制器”

    • 监听node status的服务资源,牵引到某个服务上【这个服务中,把10G改成20G,再推送API-Server中】
    • Admission controller是拦截(经过身份验证)API Server请求的网关,并且可以修改请求对象或拒绝请求。
    • k8s在Api-Server中就提供Admission Controller(准入控制器)的机制,包括MutatingAdmissionWebhook,通过这个webhook,所有在集群中和Api-Sever交互的请求都被发送到一个指定的接口中,我们只要提供一个这样的接口,就可以获取到Node往ApiServer发送心跳的Staus数据了。然后将这个数据进行我们的自定义修改,再往后传给etcd,就能让etcd以为我们修改过的Status数据就是节点的真实Status,最终实现资源的超卖。
    • MutatingAdmissionWebhook 作为kubernetes的 ApiServer中Admission Controller的一部分,提供了非常灵活的扩展机制,通过配置MutatingWebhookConfiguration对象,理论上可以监听并修改任何经过ApiServer处理的请求。
  • 形象的通俗理解:古代时,大臣(node资源汇报)想汇报情况给皇帝(ETCD),需要通过太监进行传达,那么太监可以修改奏本(allocatable)再传给皇帝,以达到以假乱真的情形。

    • 而 k8s在Api-Server中就提供Admission Controller(准入控制器)的机制(可以修改性质的控制器)

今天也是充实的一天呢,有问题欢迎大家评论区交流,咱们下篇文章再见了~ 😉
在这里插入图片描述

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

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

相关文章

数据结构--实验

话不多说&#xff0c;直接启动&#xff01;&#x1f44c;&#x1f923; 目录 一、线性表&#x1f60e; 1、建立链表 2、插入元素 3、删除特定位置的元素 4、输出特定元素值的位置 5、输出特定位置的元素值 6、输出整个链表 实现 二、栈和队列&#x1f618; 栈 顺序栈 …

怎么换自己手机的ip地址

在互联网时代&#xff0c;IP地址已经成为了我们数字身份的一部分。无论是浏览网页、下载文件还是进行在线交流&#xff0c;我们的IP地址都在默默发挥着作用。然而&#xff0c;有时出于安全或隐私保护的考虑&#xff0c;我们可能需要更换手机的IP地址。那么&#xff0c;如何轻松…

Rust基础学习-Rust宏

Rust中的宏是生成另一段代码的一段代码。可以根据输入生成代码&#xff0c;简化重复模式&#xff0c;使得代码更加简洁。比如我们一直在用的println!,vec!,panic!都是宏。 创建宏 可以使用macro_rules!创建一个宏&#xff1a; macro_rules! macro_name {(...) > {...} }这…

自制植物大战僵尸:HTML5与JavaScript实现的简单游戏

引言 在本文中&#xff0c;我们将一起探索如何使用HTML5和JavaScript来创建一个简单的植物大战僵尸游戏。这不仅是一项有趣的编程挑战&#xff0c;也是学习游戏开发基础的绝佳机会。 什么是植物大战僵尸&#xff1f; 植物大战僵尸是一款流行的策略塔防游戏&#xff0c;玩家需…

2024年pmp的考试时间是什么时候?

2024年的考试时间已经确定&#xff1a;分别是3月、6月、8月、11月&#xff0c;共四次。具体的考试日期还需关注官网的通知。目前只能报名8月和11月的。 一、PMP报考条件 只要年满22周岁并且获得官方授权的培训机构颁发的35个PDU&#xff08;学时&#xff09;&#xff0c;就有…

类和对象(二)(C++)

初始化列表 class Date{public:Date(int year, int month, int day){_year year;_month month;_day day;}private:int _year;int _month;int _day;}; 虽然上述构造函数调用之后&#xff0c;对象中已经有了一个初始值&#xff0c;但是不能将其称为对对象中成员变量的初始化…

elementui Menu 二级菜单 min-width修改无效

原因&#xff1a;可能是生成的二级菜单样式里面没有带特定的hash属性 而vue代码里面样式里带了 scoped生成的样式有改样式选择器 从而无法成功选择 解决&#xff1a;让样式可以全局选择 不带属性选择器 单文件组件 CSS 功能 | Vue.js :global(.el-menu--vertical .el-menu--p…

Flink端到端的精确一次(Exactly-Once)

目录 状态一致性 端到端的状态一致性 端到端精确一次&#xff08;End-To-End Exactly-Once&#xff09; Flink内部的Exactly-Once 输入端保证 输出端保证 幂等写入 事务写入 Flink和Kafka连接时的精确一次保证 整体介绍 需要的配置 案例 状态一致性 流式计算本身就…

探索智慧林业系统的总体架构与应用

背景&#xff1a; 随着人们对森林资源保护和管理的重视&#xff0c;智慧林业系统作为一种新兴的林业管理手段&#xff0c;正在逐渐受到广泛关注和应用。智慧林业系统的总体架构设计与应用&#xff0c;将现代信息技术与林业管理相结合&#xff0c;为森林资源的保护、管理和利用…

Unity3d简单对话系统的实现——使用Dialogue editor完成对话系统

目录 前言 使用方法 1.下载dialogue editor 2.新建空物体 3.对对话内容进行编辑 4.对话画布建立 5.触发对话框代码 结束语 前言 今天是坚持写博客的第21天&#xff0c;很高兴自己可以坚持&#xff0c;也希望能与大家一起进步。我们今天来看unity3d当中的一个可以轻松实…

Qt下调用Snap7库与西门子PLC通信

文章目录 前言一、Snap7源码下载二、Snap7的dll常用函数功能介绍三、Snap7Lib.pri模块的封装四、下载链接总结 前言 本文主要讲述了在Qt下调用Snap7库与西门子PLC进行通信&#xff0c;在这里将Snap7的源码与动态库整合在一起封装了一个自己的Snap7Lib.pri子模块&#xff0c;方…

RHEL - 订阅、注册系统和 Yum Repository(新版界面)

《OpenShift / RHEL / DevSecOps 汇总目录》 演示环境说明 本文需要有 redhat.com 账号以及包含 RHEL 的有效订阅。 演示环境使用了通过 minimal 方式安装的 RHEL 7.6 环境&#xff0c;RHEL 可以访问互联网。 红帽网站 access.redhat.com 针对新用户提供了新版界面&#xff0…

vue3+vite插件开发

插件开发目的:由于我司使用的前端技术栈为vue3tsvite2.Xaxios,在前端代码框架设计初期,做了把axios挂载到proxy对象上的操作,具体可见我的另一篇文章vue3TS自动化封装全局api_ts 封装腾讯位置api-CSDN博客 现在可以实现vue2的类似this.$api.xxx去调用接口,但是vue2源码使用的是…

【CS.AI】GPT-4o:重新定义人工智能的新标杆

文章目录 1 序言2 GPT-4o的技术亮点3 GPT-4o与前代版本的对比3.1 热门AI模型对比表格GPT-3.5GPT-4GPT-4oBERTT5 3.2 其他 4 个人体验与感受5 结论 1 序言 嘿&#xff0c;大家好&#xff01;今天要聊聊一个超级酷的AI新突破——GPT-4o&#xff01;最近&#xff0c;OpenAI发布了…

MTK联发科MT6897(天玑8300)5G智能移动处理器规格参数

天玑 8300 采用台积电第二代 4nm 制程&#xff0c;基于 Armv9 CPU 架构&#xff0c;八核 CPU 包含 4 个 Cortex-A715 性能核心和 4 个 Cortex-A510 能效核心&#xff0c;CPU 峰值性能较上一代提升 20%&#xff0c;功耗节省 30%。 此外&#xff0c;天玑 8300 搭载 6 核 GPU Mal…

kafka-重试和死信主题(SpringBoot整合Kafka)

文章目录 1、重试和死信主题2、死信队列3、代码演示3.1、appication.yml3.2、引入spring-kafka依赖3.3、创建SpringBoot启动类3.4、创建生产者发送消息3.5、创建消费者消费消息 1、重试和死信主题 kafka默认支持重试和死信主题 重试主题&#xff1a;当消费者消费消息异常时&…

android中调用onnxruntime框架

创建空白项目 安装Android Studio及创建空白项目参考&#xff1a;【安卓Java原生开发学习记录】一、安卓开发环境的搭建与HelloWorld&#xff08;详细图文解释&#xff09;_安卓原生开发-CSDN博客 切记&#xff1a;build configuration language 一定选择Groovy&#xff01;官…

Java——IO流(一)-(1/8):File、IO流概述、File文件对象的创建(介绍、实例演示)

目录 File IO流概述 File文件对象的创建 介绍 实例演示 File 存储数据的方案 变量 double money 9999.5 数组 int[] age new int[100];对象 Student s new Student()集合 List<Student> students new ArrayList<>()…

Chrome 源码阅读:跟踪一个鼠标事件的流程

我们通过在关键节点打断点的方式&#xff0c;去分析一个鼠标事件的流程。 我们知道chromium是多进程模型&#xff0c;那么&#xff0c;我们可以推测&#xff1a;一个鼠标消息先从主进程产生&#xff0c;再通过跨进程通信发送给渲染进程&#xff0c;渲染进程再发送给WebFrame&a…

L45---506.相对名次(java)--排序

1.题目描述 2.知识点 &#xff08;1&#xff09;String.join(" ", words) 是 Java 中的一个语法&#xff0c;用于将数组或集合中的元素连接成一个单独的字符串&#xff0c;连接时使用指定的分隔符。这里的 " " 是作为分隔符使用的一个空格字符串。 Strin…