OpenShift 4 Hands-on Lab (10) 限制集群资源的使用量
《OpenShift 4.x HOL教程汇总》
说明:本文已经在OpenShift 4.8环境中验证
文章目录
- OpenShift集群的规模
- 限制多个项目使用的资源和对象的总数量
- 限制一个项目使用的资源和对象的数量
- 限制一个Pod和Container使用资源的数量
- 通过设置项目级LimitRange,为该项目的Pod和Container设置缺省可用资源上限
- 针对每个Pod和Container设置可用资源
- 一些场景说明
- 只声明容器的limit,而不声明request
- 只声明容器的request,而不声明limit
- 限制使用网络带宽
- 其它参考
OpenShift集群的规模
单一的OpenShift集群可以运行数量非常可观的资源和对象。下表列出了从OpenShift 4.1到OpenShift 4.8各个版本支持的对象和资源的最高配置上限(可以看出基本没有变化)。根据Red Hat的说明,这些上限大都并非硬性限制,而是当环境没有出现性能差( Poor Performance)情况时的最高数量。例如每个node运行的pod数量其实是可以超过250个,只不过当所有node部署的pod都超过250个,而且还运行了2000个node,此时OpenShift集群会出现性能显著下降的情况。下表中的数量上限其实都是经过Red Hat测试验证过的,所以用户可以在项目中放心大规模部署OpenShift集群。不过这些数据使用的是样例应用,因此在实际项目中,能运行的对象规模还需要根据用户的应用情况进行评估。
在OpenShift中为了能合理地分配和使用对象和资源,我们可以对一个对象使用相关资源(可以是另一类对象,或着是诸如CPU、内存这样的系统资源)的数量进行控制和限制。资源限制主要针对以下三个层面:
- 限制多个项目使用的资源和对象的总数量
- 限制一个项目使用的资源和对象的数量
- 限制一个Pod和Container使用资源的数量
OpenShift使用以下对象实现资源使用限额:
- Quota:一种K8s对象,用来限制项目可以累计使用的资源总和。Quota分为限制单个项目的ResourceQuota(简称Quota)和多个项目的ClusterResourceQuota(简称ClusterQuota)。配额的资源可以是计算资源、存储资源和对象数量。
- LimitRange:一种K8s对象,用来限制一个项目中的Pod和Container缺省可以使用多少资源。
- Resource:非K8s对象,用来限制特定Container使用的资源。如果它比LimitRanges定义的缺省值高,则Container无法正常启动。
限制多个项目使用的资源和对象的总数量
可以用ClusterResourceQuota对象来限制租户消耗的资源总量,因为它可以使用基于项目的Annotation和Lable的Selector来实现跨多个项目限制资源使用的总配额(不像ResourceQuota仅与一个项目相关)。ClusterResourceQuota对象不属于任何一个项目,它属于整个集群。
- 设置本实验使用的用户标识。
$ export USER_ID=YOUR-USER-ID
- 用OpenShift集群管理员执行以下命令,为USER-ID用户创建clusterresourcequota,限制用户USER-ID下所有项目(假设该用户下面已有"USER-ID-xxx"、“USER-ID-yyy”、"USER-ID-zzz"三个项目,它们是通过annotation选出来的)使用的CPU和内存总量。
$ oc create clusterresourcequota ${USER_ID}-crq --project-annotation-selector openshift.io/requester=${USER_ID} --hard limits.cpu=20 --hard limits.memory=40Gi
- 执行以下命令,查看刚刚创建的ClusterResourceQuota对象。可以看到Namespace Selector中是和USER-ID用户相关的项目。
$ oc describe clusterquota ${USER_ID}-crq
Name: user1-crq
Created: 38 hours ago
Labels: <none>
Annotations: <none>
Namespace Selector: ["user1-xxx" "user1-yyy" "user1-zzz"]
Label Selector:
AnnotationSelector: map[openshift.io/requester:user1]
Resource Used Hard
-------- ---- ----
limits.cpu 17500m 20
limits.memory 41064Mi 45Gi
- 从OpenShift控制台的“管理员”视图进入“管理”的“资源配额”菜单,查看刚刚创建的ClusterResourceQuota对象。
限制一个项目使用的资源和对象的数量
可以用ResourceQuota对象来限制一个项目中能消耗的资源量,ResourceQuota对象属于一个特性项目。
- 用一般用户USER_ID新建一个项目。
$ oc new-project ${USER_ID}-resourcequota
- 用Openshift集群管理员执行以下命令,为USER_ID用户新建的项目创建一个ResourceQuota。
$ oc create resourcequota ${USER_ID}-quota --hard=cpu=10,memory=10G,pods=10,services=10,replicationcontrollers=10,resourcequotas=10,secrets=20,persistentvolumeclaims=10 -n ${USER_ID}-resourcequota
resourcequota/user1-quota created
- 用一般用户USER_ID查看新建的ResourceQuota对象,其中Hard一列是允许使用资源的最大值。
$ oc describe resourcequota ${USER_ID}-quota -n ${USER_ID}-resourcequota
Name: user1-quota
Namespace: user1-resourcequota
Resource Used Hard
-------- ---- ----
cpu 0 10
memory 0 10G
persistentvolumeclaims 0 10
pods 0 10
replicationcontrollers 0 10
resourcequotas 1 10
secrets 9 20
services 0 10
- 还可以用USER_ID用户进入OpenShift控制台的管理员视图的“管理”菜单,然后进入“资源配额”,确保当前是“USER-ID-resourcequota”项目,在列表中找到可以看到“user1-quota”(会列出所有ResourceQuota和ClusterResourceQuota对象),进入“”user1-quota可以看到当前资源使用情况。
- 我们在上面的“user1-quota”中限制了当前项目所能包含的相关资源总量。执行以下命令创建3个Pod对象(每个Pod的CPU分配“4000m”),确认此时会有错误提示,提示申请的CPU总量已经超过项目允许设置的最大值“10”。
$ oc run ruby-hello-world-1 --image=openshift/ruby-hello-world --limits=cpu=4000m,memory=400Mi --requests=cpu=4000m,memory=400Mi -n ${USER_ID}-resourcequota
$ oc run ruby-hello-world-2 --image=openshift/ruby-hello-world --limits=cpu=4000m,memory=400Mi --requests=cpu=4000m,memory=400Mi -n ${USER_ID}-resourcequota
$ oc run ruby-hello-world-3 --image=openshift/ruby-hello-world --limits=cpu=4000m,memory=400Mi --requests=cpu=4000m,memory=400Mi -n ${USER_ID}-resourcequota
Error from server (Forbidden): pods "ruby-hello-world-3" is forbidden: exceeded quota: user1-quota, requested: cpu=4, used: cpu=8, limited: cpu=10
限制一个Pod和Container使用资源的数量
可以通过2种方式可限制Pod和Container对使用资源的数量:
- OpenShift会为每个项目设置一个缺省的LimitRange对象来限制其下所有的Pod和Container缺省能用的资源量,LimitRange是该项目中为资源设置的缺省上限。
- 在Pod对象的YAML定义中的resources区域可定义该Pod和所含Container对象可以使用的资源量(包括:初始分配量 - request、最高分配量 - limit)。当针对Pod单独定义的使用资源超过了其所属项目为Pod定义的缺省能用资源的时候(或整个租户级别已经没有可用资源的时候),Pod就不能正常启动了。
通过设置项目级LimitRange,为该项目的Pod和Container设置缺省可用资源上限
LimitRange对象可对项目中的计算资源进行约束限制,这些资源包括:Pod,Container,Image,ImageStream和PVC。如果这些项目中的已有的资源已经超过了限制,则新的资源将无法创建。OpenShift会为每个项目设置一个缺省的LimitRange对象来限制其下所有的Pod和Container缺省能用的资源量,LimitRange是该项目中为资源设置的缺省上限。
- 我们可以通过以下命令查看自动创建的项目级LimitRange对象中定义的Pod和Container中对CPU和内存的使用配额限制,其中容器可以使用的最大CPU量为“4”个。
$ oc new-project ${USER_ID}-limitrange
$ oc get limitrange -n ${USER_ID}-limitrange
NAME CREATED AT
user1-limitrange-core-resource-limits 2020-02-22T06:51:32Z$ oc describe limitrange ${USER_ID}-limitrange-core-resource-limits -n ${USER_ID}-limitrange
Name: user1-limitrange-core-resource-limits
Namespace: user1-limitrange
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container cpu - 4 50m 500m -
Container memory - 6Gi 256Mi 1536Mi -
Pod cpu - 4 - - -
Pod memory - 12Gi - - -
- 执行命令创建创建一个pod。
$ oc run ruby-hello-world --image=openshift/ruby-hello-world -n ${USER_ID}-limitrange
- 查看这个pod内部的Container的“Requests”和“Limits”。
$ oc describe pod/ruby-hello-world -n ${USER_ID}-limitrange
。。。
Containers:ruby-hello-world:Container ID: cri-o://93c17bd35af219f02be89ce2ba1985576407ced7bc508e8ab783dc2486d3b153Image: openshift/ruby-hello-worldImage ID: docker.io/openshift/ruby-hello-world@sha256:f86a2ae290f30ee25810cd2f271668fb46d19dc1ec4e59f17b97ef2aa2ef98e7Port: <none>Host Port: <none>State: RunningStarted: Thu, 09 Sep 2021 14:24:37 +0000Ready: TrueRestart Count: 0Limits:cpu: 500mmemory: 1536MiRequests:cpu: 50mmemory: 256Mi
。。。
- 可以根据以下内容修改项目缺省的LimitRange。
apiVersion: "v1"
kind: "LimitRange"
metadata:name: "user1-limitrange-core-resource-limits"
spec:limits:- type: "Pod"max:cpu: "2" memory: "1Gi" min:cpu: "200m" memory: "60Mi" - type: "Container"max:cpu: "2" memory: "1Gi" min:cpu: "100m" memory: "4Mi" default:cpu: "400m" memory: "200Mi" defaultRequest:cpu: "200m" memory: "100Mi" maxLimitRequestRatio:cpu: "10"
- 用一般USER-ID用户查看项目中的project-limitrange。
$ oc describe limits/${USER_ID}-limitrange-core-resource-limits -n ${USER_ID}-limitrange
Name: user1-limitrange-core-resource-limits
Namespace: user1-limitrange
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Pod cpu 200m 2 - - -
Pod memory 60Mi 1Gi - - -
Container cpu 100m 2 200m 400m 10
Container memory 4Mi 1Gi 100Mi 200Mi -
- 进入USER-ID用户的“管理员”视图,然后进入“管理”菜单的LimitRanges项目。可以看到“user1-limitrange-core-resource-limits”,进入它可以看到设置的相关指标和上限。
针对每个Pod和Container设置可用资源
我们还可为每个Pod以及其中的Container进一步指定特定的使用资源上限。需要注意的是当针对Pod单独定义的使用资源超过了其所属项目为Pod定义的缺省能用资源的时候(或整个租户级别已经没有可用资源的时候),Pod是不能正常启动的。
- 执行命令创建一个Pod,申请的CPU资源是“5000m”,确认出现错误提示。
$ oc run ruby-hello-world --image=openshift/ruby-hello-world --limits=cpu=5000m,memory=400Mi --requests=cpu=5000m,memory=400Mi -n ${USER_ID}-limitrange
Error from server (Forbidden): pods "ruby-hello-world" is forbidden: [maximum cpu usage per Container is 4, but limit is 5, maximum cpu usage per Pod is 4, but limit is 5]
- 调整参数重新执行命令创建一个Pod,确认可以成功。
$ oc run ruby-hello-world --image=openshift/ruby-hello-world --limits=cpu=500m,memory=100Mi --requests=cpu=300m,memory=100Mi -n ${USER_ID}-limitrange
- 查看Running状态的Pod名称,再查看其内部名为ruby-hello-world的Container中指定的limists和requests配置。
$ oc get pod -n ${USER_ID}-limitrange
NAME READY STATUS RESTARTS AGE
ruby-hello-world 1/1 Running 0 59s$ oc describe pod ruby-hello-world -n ${USER_ID}-limitrange
。。。
Containers:ruby-hello-world:Container ID: cri-o://c8e1886fc9133141fdc9ebae5a3df884ca32f4313c0e53cf68fc4f038ab6390aImage: openshift/ruby-hello-worldImage ID: docker.io/openshift/ruby-hello-world@sha256:52384f1f4cc137335b59c25eb69273e766de7646c04c22f66648313f12f1828fPort: <none>Host Port: <none>State: RunningStarted: Fri, 21 Feb 2020 05:45:02 +0000Ready: TrueRestart Count: 0Limits:cpu: 500mmemory: 100MiRequests:cpu: 300mmemory: 100MiEnvironment: <none>
。。。
一些场景说明
只声明容器的limit,而不声明request
- 创建内容如下的only-limit.yaml文件,其中只定义了Container的cpu limit。
apiVersion: v1
kind: Pod
metadata:name: only-limit
spec:containers:- name: only-limit-2-ctrimage: openshift/hello-openshiftresources:limits:cpu: "1"
- 执行命令创建该对象。
$ oc apply -f only-limit.yaml -n ${USER_ID}-limit-project
- 查看名为only-limit的Pod中container的resources limit。可以看到此时系统已经自动将cpu的request和limit设为一样了,另外没有明确指定的memory也适用了上一节为该项目创建的LimitRange中定义的default limit和default request。
containers:- image: openshift/hello-openshiftimagePullPolicy: Alwaysname: only-request-2-ctrresources:resources:limits:cpu: "1"memory: 200Mirequests:cpu: "1"memory: 100Mi
只声明容器的request,而不声明limit
- 创建内容如下的only-request.yaml文件,其中只定义了Container的cpu request。
apiVersion: v1
kind: Pod
metadata:name: only-request
spec:containers:- name: only-request-2-ctrimage: openshift/hello-openshiftresources:requests:cpu: "0.3"
- 执行命令创建该对象。
$ oc apply -f only-request.yaml -n ${USER-ID}-limit-project
- 查看名为only-request的Pod中container的resources limit。可以看到此时系统已经自动将CPU和内存的limit设为limitrange中的default limit,而request的CPU为(1)步骤中定义的“0.3”(即300m),request的内存为default request中的内存量(100Mi)。
containers:- image: openshift/hello-openshiftimagePullPolicy: Alwaysname: only-request-2-ctrresources:limits:cpu: 400mmemory: 200Mirequests:cpu: 300mmemory: 100Mi
限制使用网络带宽
在OpenShift中还可对Constainer占用网络带宽进行限制。
- 创建测试项目。
$ oc new-project ${USER-ID}-limited-bandwidth
$ oc adm policy add-scc-to-user anyuid -z default
- 创建DeploymentConfig,其中对Pod的进出访问都限制了0.5M网络带宽。
apiVersion: apps.openshift.io/v1
kind: DeploymentConfig
metadata:labels:app: nginxname: nginxnamespace: limited-bandwidth
spec:replicas: 1selector:deploymentconfig: nginxtemplate:metadata:annotations:kubernetes.io/egress-bandwidth: 0.5Mkubernetes.io/ingress-bandwidth: 0.5Mlabels:app: nginxdeploymentconfig: nginxspec:containers:- image: nginxname: nginx
- 查看状态为Running的Pod名称
$ oc get pod -n ${USER-ID}-limited-bandwidth
NAME READY STATUS RESTARTS AGE
nginx-1-deploy 0/1 Completed 0 12m
nginx-1-rcn7j 1/1 Running 0 11m
- 进入Pod,然后下载一个文件,观察下载速度已经被限流了。
$ oc rsh nginx-1-rcn7j -n ${USER-ID}-limited-bandwidth
# curl -LO https://mirror.openshift.com/pub/openshift-v4/clients/ocp/latest/openshift-install-linux.tar.gz% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed0 80.0M 0 400k 0 0 31848 0 0:43:54 0:00:12 0:43:42 59953
其它参考
https://docs.openshift.com/container-platform/4.3/applications/quotas/quotas-setting-per-project.html
https://docs.openshift.com/container-platform/3.11/admin_guide/limits.html
https://docs.openshift.com/container-platform/3.11/dev_guide/compute_resources.html
https://kubernetes.io/zh/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/
OpenShift 4 Hands-on Lab (10) 限制集群资源的使用量相关推荐
- 10 Kafka集群与运维
Kafka集群与运维 10.1 集群应用场景 10.1.1 消息传递 Kafka可以很好地替代传统邮件代理.消息代理的使用有多种原因(将处理与数据生产者分离,缓冲未处理的消息等).与大多数邮件系统相比 ...
- electron 使用json作为本地存储_使用腾讯云对象存储 COS 作为 Velero 后端存储,实现集群资源备份和还原...
Velero(以前称为 Heptio Ark)是一个开源工具,可以安全地备份和还原,执行灾难恢复以及迁移 Kubernetes 集群资源和持久卷,可以在 TKE 集群或自建 Kubenetes 集群中 ...
- Spark集群资源如何分配
前言 新来的实习小伙,在公司的一个小集群(14台服务器,用于处理一些数据量较小的月数据)上面提交了一个spark application,然后其他人提交的application都在排队中,一个个的在抱 ...
- 使用 Velero 跨云平台迁移集群资源到 TKE
作者:李全江(jokey),腾讯云工程师,热衷于云原生领域.目前主要负责腾讯云 TKE 的售中.售后的技术支持,根据客户需求输出合理技术方案与最佳实践. 概述 Velero 是一个非常强大的开源工具, ...
- K8s 集群资源监控、高可用搭建、部署java项目 (下)
目录 集群资源监控 监控指标和搭建方案 搭建监控平台(k8s部署) 部署守护进程 部署prometheus 部署Grafana 高可用k8s集群 系统初始化 master节点部署keepalived ...
- DaoCloud道客云原生开源项目Clusterpedia(The Encyclopedia of Kubernetes clusters)加持kubectl,检索多集群资源
DaoCloud道客云原生开源项目Clusterpedia,全称The Encyclopedia of Kubernetes clusters,源码查看地址:https://github.com/cl ...
- k8s-3_1集群资源总结
k8s-3_1集群资源总结 原文大佬文章, 1.K8S中的资源对象 Kubernetes的API对象大体可分为工作负载(Workload).发现和负载均衡(Discovery& LB).配置和 ...
- Kubernetes基本入门-集群资源(二)
资源 在kubernetes中包含很多中类型的资源,所有内容都可以抽象为资源,资源实例化之后称为对象.资源按照不同的类型可以划分为集群类.名称空间类.元数据类资源. 集群级资源 集群级别的资源是所有名 ...
- 利用yarn capacity scheduler在EMR集群上实现大集群的多租户的集群资源隔离和quota限制...
转自:https://m.aliyun.com/yunqi/articles/79700 背景 使用过hadoop的人基本都会考虑集群里面资源的调度和优先级的问题,假设你现在所在的公司有一个大hado ...
最新文章
- Spring定时器的运用
- Ubuntu 16.04 主题美化及常用软件安装
- 数据结构 10分钟让你掌握经典排序(二)
- (一)获取上下文绘图环境
- Latex排版:CTeX winEdit 输出“系统找不到指定的文件”的解决办法)
- 基于忆阻器的神经网络应用研究
- 【甄选靶场】Vulnhub百个项目渗透——项目十:stapler-1(文件上传,多方式提权)
- 泰然金融全国用户见面会走进豫陕,与用户零距离对话
- 我的msn的博客 欢迎大家点击
- c++ 序列化库iguana使用总结
- 灰色预测 Matlab
- 计算机专业方面期刊介绍--
- 查看san交换机端口流量_H3C 交换机telnet查看端口流量小工具
- boost库在工作(23)任务之三
- 从后台得到webshell十大技巧大汇总
- 李煜《浪淘沙令·帘外雨潺潺》赏析
- Excel-财务函数3
- 人因工程学的研究内容与应用领域(笔记)
- 如何将电脑和手机连起来,实现同步打字?
- 低代码如何助力石油行业数字化?
热门文章
- 倒N字形排列java_Java实现n位数字的全排列
- python编写函数判断三角形_使用Python三角函数公式计算三角形的夹角案例
- 收获不止oracle在线,重温《收获不止Oracle》
- centos修改磁盘uuid_如何修改linux磁盘的uuid
- cuda linux 算力_华为AI再进化,CANN 3.0释放算力狂魔
- 甜品果汁饮品拍摄设计海报,美如蓬莱仙境!
- 网易云音乐刷听歌量_网易云音乐极速版悄然上线!听歌体验同之前没有差别
- 根据进程名判断该进程是否存在(C++)
- 4KB/2MB PAE分页模式下的线性地址翻译以及CR3
- linux内存管理:kmap、vmap、ioremap