博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kubernetes技术分析之资源管理
阅读量:5742 次
发布时间:2019-06-18

本文共 5178 字,大约阅读时间需要 17 分钟。

hot3.png

Kubernetes技术分析之资源管理 博客分类: Kubernetes

Docker的流行激活了一直不温不火的PaaS,随着而来的是各类Micro-PaaS的出现,Kubernetes是其中最具代表性的一员,它是 Google多年大规模容器管理技术的开源版本。本系列文章将逐一分析Kubernetes,本文主要通过一个例子介绍Kubernetes的资源管理机制(Limit Range和Resource Quota)。

Kubernetes资源管理

作为一个容器管理平台,难免地会部署多套应用,如果没有合理的资源管理机制,应用对资源的需求是不受限的,那么就很快会耗尽所有资源,影响到其他应用。所以需要对资源进行合理的分配,这是一项需要积累的课题。

资源隔离和限制,这是PaaS的基础能力,Kubernetes对此也有初步的设计,有3 个层次的资源限制方式,分别在Container、Pod、Namespace 层次。Container层次主要利用容器本身的支持,比如Docker 对CPU、内存等的支持;Pod方面可以限制系统内创建Pod的资源范围,比如最大或者最小的CPU、memory需求;Namespace层次就是对用户级别的资源限额了,包括CPU、内存,还可以限定Pod、rc、service的数量。
Kubernetes中有2个元素Limit Range和Resource Quota用来进行资源管理,下面将采用一个例子进行介绍。
注意:kube-apiserver启动参数需要设置“--admission_control=LimitRanger,ResourceQuota...”

示例

首先创建一个namespace,

namespace.yaml:

apiVersion: v1kind: Namespacemetadata:name: quota-example

 

$ kubectl create -f docs/user-guide/resourcequota/namespace.yaml$ kubectl get namespacesNAME             LABELS    STATUSdefault          
    Activequota-example    
    Active

默认情况下namespace是没有资源配额的,现在给namespace设置配额,
quota.yaml:

apiVersion: v1kind: ResourceQuotametadata:name: quotaspec:hard:cpu: "20"memory: 1Gipersistentvolumeclaims: "10"pods: "10"replicationcontrollers: "20"resourcequotas: "1"secrets: "10"services: "5"

 

$ kubectl create -f docs/user-guide/resourcequota/quota.yaml --namespace=quota-example$ kubectl describe quota quota --namespace=quota-exampleName:             quotaNamespace:        quota-exampleResource                   Used        Hard--------                   ----        ----cpu                        100m        20memory                     536870912   1Gipersistentvolumeclaims     0           10pods                       1           10replicationcontrollers     1           20resourcequotas             1           1secrets                    1           10services                   0           5

可以看出资源配额包括2方面:

  • 计算资源配额
    cpu Total cpu limits of containers
    memory Total memory limits of containers
  • Kubernetes元素数量限制
    pods Total number of pods
    services Total number of services
    replicationcontrollers Total number of replication controllers
    resourcequotas Total number of resource quotas
    secrets Total number of secrets
    persistentvolumeclaims Total number of persistent volume claims

现在在namespace下创建Pod,
nginx-rc.yaml:

apiVersion: v1kind: ReplicationControllermetadata:name: nginxnamespace: quota-examplelabels:name: nginxspec:replicas: 1selector:name: nginxtemplate:metadata:  labels:    name: nginxspec:  containers:  - name: nginx    image: nginx

 

$ kubectl create -f ./niginx-rc.yaml$ kubectl describe rc nginx --namespace=quota-example... Error creating: Pod "nginx-" is forbidden: Limited to 1Gi memory, but pod has no specified memory limit

因为Pod没有设置资源限制,Kubeneters会拒绝创建Pod。有2种方法可以解决,一是给Pod配置资源限制,
nginx-rc.yaml:

apiVersion: v1kind: ReplicationControllermetadata:name: nginxnamespace: quota-examplelabels:name: nginxspec:replicas: 1selector:name: nginxtemplate:metadata:  labels:    name: nginxspec:  containers:  - name: nginx    image: nginx    resources:      limits:        cpu: 100m        memory: 100Mi

另一种方法是可以设置Pod的默认资源限制:
limits.yaml:

apiVersion: v1kind: LimitRangemetadata:name: limitsspec:limits:- default:  cpu: 100m  memory: 100Mitype: Container

 

$ kubectl create -f docs/user-guide/resourcequota/limits.yaml --namespace=quota-example$ kubectl describe limits limits --namespace=quota-exampleName:       limitsNamespace:  quota-exampleType        Resource     Min    Max    Default----        --------     ---    ---    ---Container    cpu         -      -      100mContainer    memory      -      -      100Mi

那么Pod就能创建成功了,那么相应的资源也消耗了:

$ kubectl describe quota quota --namespace=quota-exampleName:            quotaNamespace:        quota-exampleResource                 Used        Hard--------                 ----        ----cpu                      100m        20memory                   104857600   1Gipersistentvolumeclaims   0           10pods                     1           10replicationcontrollers   1           20resourcequotas           1           1secrets                  1           10services                 0           5

Limit Range除了可设置Container之外,也可以设置Pod,

limits.yaml:apiVersion: v1kind: LimitRangemetadata:name: mylimitsspec:limits:- max:  cpu: "2"  memory: 1Gimin:  cpu: 250m  memory: 6Mitype: Pod- default:  cpu: 250m  memory: 100Mimax:  cpu: "2"  memory: 1Gimin:  cpu: 250m  memory: 6Mitype: Container

 

$ kubectl create -f limits.yaml --namespace=quota-example$ kubectl describe limits mylimits --namespace=quota-exampleName:   mylimitsType      Resource  Min  Max Default----      --------  ---  --- ---Pod       memory    6Mi  1Gi -Pod       cpu       250m   2 -Container memory    6Mi  1Gi 100MiContainer cpu       250m   2 250m

这个设置为:
1.一个Pod的所有容器内存使用必须在6Mi ~ 1Gi
2. 一个Pod的所有容器的CPU使用必须在250m ~ 2 cores
3. 一个容器的内存使用必须在6Mi ~ 1Gi, 默认是100Mi
4. 一个容器的CPU使用必须在250m ~ 2 cores, 默认是250m

参考

==========================================================
作者简介
吴龙辉,现任高级运营工程师,致力于云计算PaaS的研究和实践,活跃于CloudFoundry,Docker,Kubernetes等开源社区,贡献代码和撰写技术文档。 邮箱:/ 
来自:http://dockone.io/article/581

 

http://www.open-open.com/lib/view/open1439386169661.html

转载于:https://my.oschina.net/xiaominmin/blog/1598593

你可能感兴趣的文章
Tomcat部署Web应用方法总结
查看>>
Python3 django2.0 字段加密 解密 AES
查看>>
CCNA实验之:网络地址转换(NAT)实验
查看>>
计算机网络原理笔记-停止等待协议
查看>>
确定当前记录和下一条记录之间相差的天数
查看>>
sql语句返回主键SCOPE_IDENTITY()
查看>>
机器学习开源项目精选TOP30
查看>>
iOS开发-邮件发送
查看>>
/etc/resolv.conf文件详解
查看>>
【转】VC的MFC中重绘函数的使用总结(整理)
查看>>
JQuery日记_5.13 Sizzle选择器(六)选择器的效率
查看>>
oracle查看经常使用的系统信息
查看>>
Django_4_视图
查看>>
Linux的netstat命令使用
查看>>
lvm讲解,磁盘故障小案例
查看>>
大快网站:如何选择正确的hadoop版本
查看>>
经过这5大阶段,你离Java程序员就不远了!
查看>>
IntelliJ IDEA 连接数据库详细过程
查看>>
thymeleaf 学习笔记-基础篇
查看>>
PHP-X开发扩展
查看>>