浅谈 K8S QoS(服务质量等级)

2024-03-01 18:10

本文主要是介绍浅谈 K8S QoS(服务质量等级),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

QoS(Quality of Service) 简介

QoS(Quality of Service),大部分译为 “服务质量等级”,又译作 “服务质量保证”,是作用在 Pod 上的一个配置,当 Kubernetes 创建一个 Pod 时,它就会给这个 Pod 分配一个 QoS 等级,可以是以下等级之一:

  • Guaranteed:Pod 里的每个容器都必须有内存/CPU 限制和请求,而且值必须相等。如果一个容器只指明limit而未设定request,则request的值等于limit值。
  • Burstable:Pod 里至少有一个容器有内存或者 CPU 请求且不满足 Guarantee 等级的要求,即内存/CPU 的值设置的不同。
  • BestEffort:容器必须没有任何内存或者 CPU 的限制或请求。

该配置不是通过一个配置项来配置的,而是通过配置 CPU/MEM的 limitsrequests 值的大小来确认服务质量等级

下面是 Guaranteed 例子:

    spec:containers:- name: demoimage: mritd/demoresources:limits:cpu: 100mmemory: 100Mirequests:cpu: 100mmemory: 100Miports:- containerPort: 80

下面是 Burstable 例子:

    spec:containers:- name: demoimage: mritd/demoresources:limits:cpu: 100mmemory: 100Mirequests:cpu: 10mmemory: 10Miports:- containerPort: 80

下面是 BestEffort 例子:

    spec:containers:- name: demoimage: mritd/demoports:- containerPort: 80

资源限制 Limits 和 资源需求 Requests

对于CPU:如果pod中服务使用CPU超过设置的 limits,pod不会被kill掉但会被限制。如果没有设置limits,pod可以使用全部空闲的cpu资源。

对于内存:当一个pod使用内存超过了设置的 limits,pod中 container 的进程会被 kernelOOM kill掉。当container因为OOM被kill掉时,系统倾向于在其原所在的机器上重启该container或其他重新创建一个pod。

下面是三个资源限制,作用域在不同点上

  • 针对 Node 节点资源预留,在 kubelet 组件中配置
# 下面配置根据实际情况调整--system-reserved=cpu=500m,memory=1.5Gi \
--eviction-hard=memory.available<1.5Gi,nodefs.available<20Gi,imagefs.available<15Gi \
--eviction-soft=memory.available<2Gi,nodefs.available<25Gi,imagefs.available<10Gi \
--eviction-soft-grace-period=memory.available=2m,nodefs.available=2m,imagefs.available=2m \
--eviction-max-pod-grace-period=30 \
--eviction-minimum-reclaim=memory.available=200Mi,nodefs.available=5Gi,imagefs.available=5Gi
  • 针对 namespace 限制配置
apiVersion: "v1"
kind: "LimitRange"
metadata:name: "test-resource-limits"namespace: test
spec:limits:- type: "Pod"max:cpu: "2"memory: "2Gi"min:cpu: "30m"memory: "50Mi"- type: "Container"max:cpu: "2"memory: "2Gi"min:cpu: "30m"memory: "50Mi"default:cpu: "300m"memory: "600Mi"defaultRequest:cpu: "30m"memory: "50Mi"maxLimitRequestRatio:cpu: "30"
  • 针对 Pod 限制,可以通过 Deployment 配置
apiVersion: apps/v1beta1
kind: Deployment
metadata:name: demo-deployment
spec:replicas: 1template:metadata:annotations:sidecar.istio.io/inject: "false"labels:app: demospec:containers:- name: demoimage: mritd/demoresources:limits:cpu: 100mmemory: 100Mirequests:cpu: 10mmemory: 10Miports:- containerPort: 80

QoS 优先级

三种 QoS 优先级,从高到低(从左往右)

Guaranteed --> Burstable --> BestEffort

Kubernetes 资源回收策略

Kubernetes 资源回收策略:当集群监控到 node 节点内存或者CPU资源耗尽时,为了保护node正常工作,就会启动资源回收策略,通过驱逐节点上Pod来减少资源占用。

三种 QoS 策略被驱逐优先级,从高到低(从左往右)

BestEffort --> Burstable --> Guaranteed

使用建议

  • 如果资源充足,可以将 pod QoS 设置为 Guaranteed
  • 不是很关键的服务 pod QoS 设置为 Burstable 或者 BestEffort。比如 filebeat、logstash、fluentd等

建议:k8s 安装时,建议把 Swap 关闭,虽然 Swap 可以解决内存不足问题,但当内存不足使用Swap时,系统负载会出现过高,原因是 swap 大量 占用磁盘IO

参考链接

  • https://jimmysong.io/kubernetes-handbook/concepts/qos.html
  • http://dockone.io/article/2592

您的关注是小站的动力


欢迎大家关注交流,定期分享自动化运维、DevOps、Kubernetes、Service Mesh和Cloud Native

这篇关于浅谈 K8S QoS(服务质量等级)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/763334

相关文章

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

浅谈MySQL的容量规划

《浅谈MySQL的容量规划》进行MySQL的容量规划是确保数据库能够在当前和未来的负载下顺利运行的重要步骤,容量规划包括评估当前资源使用情况、预测未来增长、调整配置和硬件资源等,感兴趣的可以了解一下... 目录一、评估当前资源使用情况1.1 磁盘空间使用1.2 内存使用1.3 CPU使用1.4 网络带宽二、

浅谈mysql的not exists走不走索引

《浅谈mysql的notexists走不走索引》在MySQL中,​NOTEXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引,下面就来介绍一下mysql的notexists走不走索... 在mysql中,​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

浅谈Redis Key 命名规范文档

《浅谈RedisKey命名规范文档》本文介绍了Redis键名命名规范,包括命名格式、具体规范、数据类型扩展命名、时间敏感型键名、规范总结以及实际应用示例,感兴趣的可以了解一下... 目录1. 命名格式格式模板:示例:2. 具体规范2.1 小写命名2.2 使用冒号分隔层级2.3 标识符命名3. 数据类型扩展命

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col