研发工程师玩转Kubernetes——CPU配额

news2024/9/21 8:01:42

在一个Pod中,可以有多个容器,比如一个主要业务容器和若干辅助业务容器。如果辅助业务容器内程序有问题,导致占用了大量的CPU资源,进而影响了主要业务容器的执行效率,那就需要进行干涉了。本节我们将使用“资源配额”来限制容器的CPU使用。

服务部署

为了让程序更多的消耗CPU,我们对测试代码做了相关改动

from http.server import HTTPServer, BaseHTTPRequestHandler
import argparse
import os
import random
import math

def docpu():
    random_number_a = random.randint(10000,100000000000)
    random_number_b = random.randint(100000000000,10000000000000)
    random_number = random_number_a * random_number_b
    while random_number > 2:
        random_number = math.sqrt(random_number)
    return random_number

class Resquest(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        random_number_sum = 0
        while True:
            random_number = docpu()
            if random_number_sum > 1000:
                break
            else:
                random_number_sum += random_number
            
        data = "{0}".format(random_number)
        self.wfile.write(data.encode())
 
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument('-port', metavar='N', type=int, help='port of service', required=True)
    args = parser.parse_args()
    host = ('0.0.0.0',  args.port)
    server = HTTPServer(host, Resquest)
    print("Starting server, listen at: {0}:{1}".format(os.environ.get("POD_IP", ""), args.port))
    server.serve_forever()

这段代码内部不停地对随机数开方,用于消耗CPU。

部署

在kubernetes中,1个CPU资源被切分成1000份被分配,每份叫1毫核。这是配额的最小单元了。如下,我们就让容器可以使用100毫核,即0.1个CPU核。

        resources:
          limits:
            cpu: 100m

完整的清单文件如下

apiVersion: apps/v1
kind: Deployment
metadata:
  name: simple-http-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: simple_http
  template:
    metadata:
      labels:
        app: simple_http
    spec:
      containers:
      - name: simple-http-container
        image: localhost:32000/simple_http:v4
        ports:
        - containerPort: 8888
        command: ["python","main.py","-port","$(SERVER_PORT)"]
        env:
        - name: SERVER_PORT
          value:  "8888"
        resources:
          limits:
            cpu: 100m
---
apiVersion: v1
kind: Service
metadata:
  name: simple-http-service
spec:
  type: NodePort
  selector:
    app: simple_http
  ports:
  - port: 80
    targetPort: 8888
    nodePort: 30000

在这个清单中,我们创建了一个Deployment用于部署Pod,其中resources指定每个Pod只能使用0.1个CPU(100m)。还创建了一个Service用于接收请求,这些请求将被路由到上述Pod上。

kubectl create -f simple_http_deployment.yaml

deployment.apps/simple-http-deployment created
service/simple-http-service created

使用《研发工程师玩转Kubernetes——启用microk8s的监控面板(dashboard)》中的控制面板,我们可以看到没有请求时两个Pod的CPU利用情况——最低的1毫核。
在这里插入图片描述

测试压力

我们使用wrk来做压力测试,如果没有安装它,可以使用sudo apt install wrk来安装。
下面命令让wrk启动10个线程,10个连接,发送120秒。

wrk -t10 -c10 -d120  http://192.168.137.248:30000 

运行结束会显示如下结果

  10 threads and 10 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     6.61ms   15.40ms 418.80ms   90.63%
    Req/Sec   177.20    135.77   772.00     53.58%
  77331 requests in 2.00m, 10.45MB read
  Socket errors: connect 0, read 77331, write 0, timeout 0
Requests/sec:    643.89
Transfer/sec:     89.13KB

这个结果simple_http服务每秒处理了643个请求,即我们所谓的QPS是643。
我们将压力加倍,启动20个线程,20个连接。

wrk -t20 -c20 -d120  http://192.168.137.248:30000  
Running 2m test @ http://192.168.137.248:30000
  20 threads and 20 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     6.15ms   17.88ms 455.17ms   92.87%
    Req/Sec   120.62    125.10     0.86k    81.23%
  77893 requests in 2.00m, 10.53MB read
  Socket errors: connect 0, read 77893, write 0, timeout 0
Requests/sec:    648.62
Transfer/sec:     89.79KB

可以看到QPS是648,和之前的QPS(643)相差不大。我们可以认为simple_service已经抗压到极限了。
下图是所有Pod的资源使用情况。因为我们每个Pod只有一个容器,每个容器CPU上限是0.1——即我们看到两个Pod的CPU使用最高是0.2。
在这里插入图片描述
下面两个图是每个Pod的资源使用情况。可以看到每个容器都在0.1个CPU核配额之下运行。
在这里插入图片描述
在这里插入图片描述

修改配额

我们将CPU配额从100毫核调整到200毫核,看看simple_http_service抗压能力是否有1倍的提升。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: simple-http-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: simple_http
  template:
    metadata:
      labels:
        app: simple_http
    spec:
      containers:
      - name: simple-http-container
        image: localhost:32000/simple_http:v4
        ports:
        - containerPort: 8888
        command: ["python","main.py","-port","$(SERVER_PORT)"]
        env:
        - name: SERVER_PORT
          value:  "8888"
        resources:
          limits:
            cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
  name: simple-http-service
spec:
  type: NodePort
  selector:
    app: simple_http
  ports:
  - port: 80
    targetPort: 8888
    nodePort: 30000

只做了resources.limit.cpu的修改,然后我们提交这个文件

kubectl apply -f simple_http_deployment.yaml

稍微等一会儿,待新Pod创建完成并运行(老的Pod会被删除)。
然后我们再使用wrk进行压测

wrk -t20 -c20 -d120  http://192.168.137.248:30000
Running 2m test @ http://192.168.137.248:30000
  20 threads and 20 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     2.33ms    9.79ms 429.11ms   97.27%
    Req/Sec   258.82    299.89     2.02k    76.98%
  153609 requests in 2.00m, 20.77MB read
  Socket errors: connect 0, read 153609, write 0, timeout 0
Requests/sec:   1279.56
Transfer/sec:    177.13KB

可以看到QPS上升了接近一倍(之前是648)。
在这里插入图片描述

参考资料

  • https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-cpu-resource/
  • https://kubernetes.io/zh-cn/docs/concepts/configuration/manage-resources-containers/

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

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

相关文章

Edgedetect

边缘检测,检测上升沿 对于 8 位矢量中的每个位,检测输入信号何时从一个时钟周期中的 0 变为下一个时钟周期的 1(类似于正边沿检测)。输出位应在发生 0 到 1 转换后设置周期。 以下是一些示例。为清楚起见,in[1] 和 pe…

Jenkins+GitLab+Docker搭建前端自动化构建镜像容器部署(无本地证书,映射版本)

前言 🚀 需提前安装环境及知识点: 1、Docker搭建及基础操作 2、DockerFile文件描述 3、Jenkins搭建及基础点 🚀 目的: 将我们的前端项目打包成一个镜像容器并自动发布部署,可供随时pull访问 一、手动部署镜像及容器 1…

【Linux】线程分离 | 线程库 | C++调用线程 | 线程局部存储

文章目录 1. 线程分离1. 为什么要线程分离?2. 具体使用3. 为什么有时候分离在调用join 会正常运行? 2. 如何理解线程库?如何理解 先描述 在组织? 3. C中使用多线程4. 线程局部存储局部变量全局变量 1. 线程分离 1. 为什么要线程分…

服务器虚拟化部署

服务器虚拟化部署 1、背景2、目的3、环境4、部署4.1、部署VMware ESXi4.1.1、准备工作4.1.2、部署ESXi4.1.3、配置ESXi4.1.4 、部署虚拟机 1、背景 项目上利旧9台服务器,项目需要使用15台服务器,外购已经没有项目硬件采购预算,只能从目前的…

自定义HikariCP连接池

文章目录 一、简介1、概述2、地址 二、配置参数1、Hikari原生参数2、Springboot中参数 三、springboot中使用四、自定义数据源1、各模块2、完整代码3、多数据源 五、多数据源dynamic中使用1、简介2、引入依赖3、参数配置 六、XMind整理 一、简介 1、概述 官方解释&#xff1a…

zabbix 自动发现与自动注册、部署 zabbix 代理服务器及部署 Zabbix 高可用集群

目录 一、zabbix 自动发现二、zabbix 自动注册(对于 agent2 是主动模式)三、部署 zabbix 代理服务器四、部署 Zabbix 高可用集群五、Zabbix 监控 Windows 系统六、Zabbix 监控 java 应用七、Zabbix 监控 SNMP 一、zabbix 自动发现 zabbix 自动发现&…

Nautilus Chain开启全球行,普及Layer3概念加速其采用

在去年,在 2022 年,Vitalik 进一步提出了 Layer3 的概念与早期形态,期盼弥补目前链体系存在的不足,并为 Layer3 提出了三大目标,即Layer2 用于扩展,Layer3 用于定制功能,如隐私;Laye…

【C++】哈希表特性总结及unordered_map和unordered_set的模拟实现

✍作者:阿润菜菜 📖专栏:C 文章目录 前言一、哈希表的特性 - 哈希函数和哈希冲突1 哈希函数2. 哈希冲突 二、闭散列的实现 -- 开放地址法1. 定义数据结构2.insert()3.Find()4. Erase()5.仿函数处理key值不能取模无法映射 --- BKDRHash 三、开…

【Linux系列P4】Linux需要什么?编辑器?软件包?一文帮你了解掌握 [yum][vim]———基础开发工具篇

前言 大家好,这里是YY的Linux系列part4;本章主要内容面向接触过Linux的老铁,主要内容含【学习yum工具,进行软件安装】【拓展yum源安装】【掌握vim编辑器使用,基本命令】【命令集】【懒人配置文件安装教程】 在下一章节…

Java高并发编程—可见性与有序性原理

原子性、可见性和有序性是并发编程所面临的三大问题。 Java通过CAS操作已解决了并发编程中的原子性问题,本章为大家介绍Java如何解决剩余的另外两个问题——可见性和有序性。 CPU物理缓存结构 由于CPU的运算速度比主存(物理内存)的存取速度…

Android系统原理性问题分析 - 多路并发情况下的C/S模型

声明 在Android系统中经常会遇到一些系统原理性的问题,在此专栏中集中来讨论下。Android系统中很多地方都采用了I/O多路复用的机制,为了引出I/O多路复用机制,先来分析多路并发情况下的C/S模型。此篇参考一些博客和书籍,代码基于A…

C++条件变量condition_variable

一、问题 假设没有条件变量,对于一个生产者消费者问题,消费线程在得知队列中没有产品时,将阻塞自己。生产者线程可以给队列中放入产品,但是没有办法激活消费者线程,而消费者线程处于阻塞状态也没有办法自己激活自己。…

RocketMQ 领域模型概述

本文为您介绍 Apache RocketMQ 的领域模型。 Apache RocketMQ 是一款典型的分布式架构下的中间件产品,使用异步通信方式和发布订阅的消息传输模型。通信方式和传输模型的具体说明,请参见下文通信方式介绍和消息传输模型介绍。 Apache RocketMQ 产品具备…

IOS开发指南之自定义TableViewCell使用

演示效果: 1.自定义TableViewCell创建 File->new->File... 在iOS模板中选择Empty来创建一个空的XIB文件,然后点击下一步 输入XIB文件名Cell,然后点击Create创建 创建XIB文件成功后如下: 同时按钮Shift+command+L弹出库,然后输入 table筛选,选择Table View Cell 拖到下…

一文通透spring的初始化

简述 今天重点分析ApplicationContext初始化时做的事情,我们都只到spring是个IOC和AOP容器,那再我们new一个ApplicationContext,spring内部都做了什么?怎么实现的IOC和AOP? 比如说下面这段代码 Configuration Compon…

计组 第二章 数据的表示与运算 2.1 数制与编码 知识点整理

2.1 数制与编码 二进制转八进制:3位一组,高位补0 二进制转十六进制:4位一组,高位补0 任意进制转十进制(按权展开法):数码与权值相乘,再相加 十进制转化为任意进制数(基…

全面接入:ChatGPT杀进10个商业应用,让AI替你打工

ChatGPT狂飙160天,世界已经不是两个月前的样子。 新建了一个网站 https://ai.weoknow.com/ 每天给大家更新可用的国内可用chatGPT资源 ChatGPT API已开放60多天。世界已经不是两个月前的样子了。 微软联合创始人比尔盖茨(BillGates)将GPT称…

一、预约挂号详情

文章目录 一、预约挂号详情1、需求分析 2、api接口2.1 添加service接口2.2 添加service接口实现2.2.1 在ScheduleServiceImpl类实现接口2.2.2 在获取科室信息 2.3 添加controller方法 3、前端3.1封装api请求3.2 页面展示 二、预约确认1、api接口1.1 添加service接口1.2 添加con…

FastRcnn理论合集

FastRcnn理论合集 Rcnn 论文原著 Rich feature hierarchies for accurate object detection and semantic segmentation R-CNN可以说是利用深度学习进行目标检测的开山之作。作者Ross Girshick多次在PASCAL VOC的目标检测竞赛中折桂,曾在2010年带领团队获得终身成就…

【P29】JMeter IF 控制器(If Controller)

文章目录 一、IF 控制器(If Controller)参数说明二、测试计划设计2.1、groovy 写法2.2、javaScript 写法2.3、jexl3 写法 一、IF 控制器(If Controller)参数说明 可以控制其下面的子/后代元素是否执行;如果为 true 则…