《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、内存这样的系统资源)的数量进行控制和限制。资源限制主要针对以下三个层面:

  1. 限制多个项目使用的资源和对象的总数量
  2. 限制一个项目使用的资源和对象的数量
  3. 限制一个Pod和Container使用资源的数量

OpenShift使用以下对象实现资源使用限额:

  1. Quota:一种K8s对象,用来限制项目可以累计使用的资源总和。Quota分为限制单个项目的ResourceQuota(简称Quota)和多个项目的ClusterResourceQuota(简称ClusterQuota)。配额的资源可以是计算资源、存储资源和对象数量。
  2. LimitRange:一种K8s对象,用来限制一个项目中的Pod和Container缺省可以使用多少资源。
  3. Resource:非K8s对象,用来限制特定Container使用的资源。如果它比LimitRanges定义的缺省值高,则Container无法正常启动。

限制多个项目使用的资源和对象的总数量

可以用ClusterResourceQuota对象来限制租户消耗的资源总量,因为它可以使用基于项目的Annotation和Lable的Selector来实现跨多个项目限制资源使用的总配额(不像ResourceQuota仅与一个项目相关)。ClusterResourceQuota对象不属于任何一个项目,它属于整个集群。

  1. 设置本实验使用的用户标识。
$ export USER_ID=YOUR-USER-ID
  1. 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
  1. 执行以下命令,查看刚刚创建的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
  1. 从OpenShift控制台的“管理员”视图进入“管理”的“资源配额”菜单,查看刚刚创建的ClusterResourceQuota对象。

限制一个项目使用的资源和对象的数量

可以用ResourceQuota对象来限制一个项目中能消耗的资源量,ResourceQuota对象属于一个特性项目。

  1. 用一般用户USER_ID新建一个项目。
$ oc new-project ${USER_ID}-resourcequota
  1. 用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
  1. 用一般用户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
  1. 还可以用USER_ID用户进入OpenShift控制台的管理员视图的“管理”菜单,然后进入“资源配额”,确保当前是“USER-ID-resourcequota”项目,在列表中找到可以看到“user1-quota”(会列出所有ResourceQuotaClusterResourceQuota对象),进入“”user1-quota可以看到当前资源使用情况。

  2. 我们在上面的“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对使用资源的数量:

  1. OpenShift会为每个项目设置一个缺省的LimitRange对象来限制其下所有的Pod和Container缺省能用的资源量,LimitRange是该项目中为资源设置的缺省上限。
  2. 在Pod对象的YAML定义中的resources区域可定义该Pod和所含Container对象可以使用的资源量(包括:初始分配量 - request、最高分配量 - limit)。当针对Pod单独定义的使用资源超过了其所属项目为Pod定义的缺省能用资源的时候(或整个租户级别已经没有可用资源的时候),Pod就不能正常启动了。

通过设置项目级LimitRange,为该项目的Pod和Container设置缺省可用资源上限

LimitRange对象可对项目中的计算资源进行约束限制,这些资源包括:Pod,Container,Image,ImageStream和PVC。如果这些项目中的已有的资源已经超过了限制,则新的资源将无法创建。OpenShift会为每个项目设置一个缺省的LimitRange对象来限制其下所有的Pod和Container缺省能用的资源量,LimitRange是该项目中为资源设置的缺省上限。

  1. 我们可以通过以下命令查看自动创建的项目级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  -                -              -
  1. 执行命令创建创建一个pod。
$ oc run ruby-hello-world --image=openshift/ruby-hello-world -n ${USER_ID}-limitrange
  1. 查看这个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
。。。
  1. 可以根据以下内容修改项目缺省的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"
  1. 用一般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          -
  1. 进入USER-ID用户的“管理员”视图,然后进入“管理”菜单的LimitRanges项目。可以看到“user1-limitrange-core-resource-limits”,进入它可以看到设置的相关指标和上限。

针对每个Pod和Container设置可用资源

我们还可为每个Pod以及其中的Container进一步指定特定的使用资源上限。需要注意的是当针对Pod单独定义的使用资源超过了其所属项目为Pod定义的缺省能用资源的时候(或整个租户级别已经没有可用资源的时候),Pod是不能正常启动的。

  1. 执行命令创建一个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]
  1. 调整参数重新执行命令创建一个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
  1. 查看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

  1. 创建内容如下的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"
  1. 执行命令创建该对象。
$ oc apply -f only-limit.yaml -n ${USER_ID}-limit-project
  1. 查看名为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

  1. 创建内容如下的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"
  1. 执行命令创建该对象。
$ oc apply -f only-request.yaml  -n ${USER-ID}-limit-project
  1. 查看名为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占用网络带宽进行限制。

  1. 创建测试项目。
$ oc new-project ${USER-ID}-limited-bandwidth
$ oc adm policy add-scc-to-user anyuid -z default
  1. 创建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
  1. 查看状态为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
  1. 进入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) 限制集群资源的使用量相关推荐

  1. 10 Kafka集群与运维

    Kafka集群与运维 10.1 集群应用场景 10.1.1 消息传递 Kafka可以很好地替代传统邮件代理.消息代理的使用有多种原因(将处理与数据生产者分离,缓冲未处理的消息等).与大多数邮件系统相比 ...

  2. electron 使用json作为本地存储_使用腾讯云对象存储 COS 作为 Velero 后端存储,实现集群资源备份和还原...

    Velero(以前称为 Heptio Ark)是一个开源工具,可以安全地备份和还原,执行灾难恢复以及迁移 Kubernetes 集群资源和持久卷,可以在 TKE 集群或自建 Kubenetes 集群中 ...

  3. Spark集群资源如何分配

    前言 新来的实习小伙,在公司的一个小集群(14台服务器,用于处理一些数据量较小的月数据)上面提交了一个spark application,然后其他人提交的application都在排队中,一个个的在抱 ...

  4. 使用 Velero 跨云平台迁移集群资源到 TKE

    作者:李全江(jokey),腾讯云工程师,热衷于云原生领域.目前主要负责腾讯云 TKE 的售中.售后的技术支持,根据客户需求输出合理技术方案与最佳实践. 概述 Velero 是一个非常强大的开源工具, ...

  5. K8s 集群资源监控、高可用搭建、部署java项目 (下)

    目录 集群资源监控 监控指标和搭建方案 搭建监控平台(k8s部署) 部署守护进程 部署prometheus 部署Grafana 高可用k8s集群 系统初始化 master节点部署keepalived ...

  6. DaoCloud道客云原生开源项目Clusterpedia(The Encyclopedia of Kubernetes clusters)加持kubectl,检索多集群资源

    DaoCloud道客云原生开源项目Clusterpedia,全称The Encyclopedia of Kubernetes clusters,源码查看地址:https://github.com/cl ...

  7. k8s-3_1集群资源总结

    k8s-3_1集群资源总结 原文大佬文章, 1.K8S中的资源对象 Kubernetes的API对象大体可分为工作负载(Workload).发现和负载均衡(Discovery& LB).配置和 ...

  8. Kubernetes基本入门-集群资源(二)

    资源 在kubernetes中包含很多中类型的资源,所有内容都可以抽象为资源,资源实例化之后称为对象.资源按照不同的类型可以划分为集群类.名称空间类.元数据类资源. 集群级资源 集群级别的资源是所有名 ...

  9. 利用yarn capacity scheduler在EMR集群上实现大集群的多租户的集群资源隔离和quota限制...

    转自:https://m.aliyun.com/yunqi/articles/79700 背景 使用过hadoop的人基本都会考虑集群里面资源的调度和优先级的问题,假设你现在所在的公司有一个大hado ...

最新文章

  1. Spring定时器的运用
  2. Ubuntu 16.04 主题美化及常用软件安装
  3. 数据结构 10分钟让你掌握经典排序(二)
  4. (一)获取上下文绘图环境
  5. Latex排版:CTeX winEdit 输出“系统找不到指定的文件”的解决办法)
  6. 基于忆阻器的神经网络应用研究
  7. 【甄选靶场】Vulnhub百个项目渗透——项目十:stapler-1(文件上传,多方式提权)
  8. 泰然金融全国用户见面会走进豫陕,与用户零距离对话
  9. 我的msn的博客 欢迎大家点击
  10. c++ 序列化库iguana使用总结
  11. 灰色预测 Matlab
  12. 计算机专业方面期刊介绍--
  13. 查看san交换机端口流量_H3C 交换机telnet查看端口流量小工具
  14. boost库在工作(23)任务之三
  15. 从后台得到webshell十大技巧大汇总
  16. 李煜《浪淘沙令·帘外雨潺潺》赏析
  17. Excel-财务函数3
  18. 人因工程学的研究内容与应用领域(笔记)
  19. 如何将电脑和手机连起来,实现同步打字?
  20. 低代码如何助力石油行业数字化?

热门文章

  1. 倒N字形排列java_Java实现n位数字的全排列
  2. python编写函数判断三角形_使用Python三角函数公式计算三角形的夹角案例
  3. 收获不止oracle在线,重温《收获不止Oracle》
  4. centos修改磁盘uuid_如何修改linux磁盘的uuid
  5. cuda linux 算力_华为AI再进化,CANN 3.0释放算力狂魔
  6. 甜品果汁饮品拍摄设计海报,美如蓬莱仙境!
  7. 网易云音乐刷听歌量_网易云音乐极速版悄然上线!听歌体验同之前没有差别
  8. 根据进程名判断该进程是否存在(C++)
  9. 4KB/2MB PAE分页模式下的线性地址翻译以及CR3
  10. linux内存管理:kmap、vmap、ioremap