kubernetes -- helm charts 开发: 10、 helm charts中修改组件的resource limit

1 k8s中的资源限制


request:容器使用的最小资源需求,容器调度时资源分配的判断依赖。
只有当节点上可分配资源量>=容器资源请求数时,才会虚将容器调度到该节点,
但Request参数不限制容器的最大可使用资源。
limit:容器能使用资源的资源最大值,设置为0表示使用资源无上限。

request:保证pod有足够资源运行
limit:防止pod中无限制使用资源
0<=Request<=Limit<=Infinity(如果Limit为0表示不对资源进行限制)

每个pod的容器可以选择指定下面一个或多个
指定资源的请求或者限制时可选的。在某些集群下,当一个pod被创建或更新的时候,不设置限制或请求将会被默认值替代。

默认值依赖于集群时如何配置的。如果requests值没有指定。它们会被设置了默认的限制值。请注意,限制limits必须大于或等于
requests。
尽管requests/limits仅仅可以被单独的容器所指定,但是时很方便讨论pod资源的requests/limits。
一个pod资源request/limit对于一个特别的资源类型来说,是等于该中类型资源的requests/limits的总和,没有设置值的会被当作0(或者等于某些集群配置中的默认值)

CPU的含义
对于cpu的limits和requests是在cpu中被很量的。
一个cpu,在Kubernetes中,是等于
1 AWS vCPU
少量的请求是被允许的。一个容器中的。spec.container[].resources.requests.cpu表达式为0.1等同于表达式中100M。
CPU也会被绝对的数量,而不是相对的数量;0.1

内存的含义:
内存是以butes来衡量的。内存可以被表达为一个普通的整数或者一个固定小数的整数。
例如,下面代表相同的值:
128974848, 129e6, 129M , 123Mi

例子:
apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: db
    image: mysql
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  - name: wp
    image: wordpress
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

如何衡量资源请求被调度
当一个pod创建了,kubernetes调度器会为pod选择节点去运行。
每个节点针对每一种类型的资源类型有一个最大的容量:CPU和内存可以为pod提供的数量多少。调度器确保了,每一种资源类型(CPU和内存),容器中的资源请求的总和必须小于节点的容量。
注意到尽管实际的内存或者cpu资源的使用量是比较低的,调度器将会拒绝将pod放到节点上如果容量监测失败。喆保护了一个节点上的资源存储当资源使用量后面增长,例如在请求速率中的日常的峰值。

资源限制下POd如何运行。
当kubelet开启一个pod的容器时,它将CPu和内存的限制传递到容器的运行中。
当使用Docker:
spec.container[].resources.requests.cpu会被转换为它的的core值,并且会乘以1024,使用--cpu-shares的值到docker run的命令中。
spec.container[].resources.limits.cpu被转换到到的millicore(前分值一core)值,乘以10000,并用1000进行除法,使用
cpu-quota的值到docker run的命令中。
--cpu-period的标记将会被设置为100000,这表示了默认100ms的阶段,用于衡量值表的使用。
kubelet强制cpu的限制,如果开启的时候是用—cpu-cfs-quota标记被设置为true。
这些标记将会默认被设置为true。
spec.container[].resources.limits.memory会被转换为一个整数中,并且使用--memory标记到docker run命令。
如果一个容器超过了最大内存使用,它需要被销毁,如果重启表哥,它将会被kubelet,正如其他运行失败的。
一个容器可能或者不会被允许超过它的最大cpu限制在扩展的事件中。
监控计算资源的使用
一个pod的资源使用回被上报为Pod的状态
如果可选的监控已经为你的集群配置好了,pod资源使用可以被监控系统使用。


2 如何修改一个组件资源的limit值防止out of memory


以ceilometer为例,介绍如何修改ceilometer-collector的内存最大值
查看ceilometer的values.yaml
pod:
......
  resources:
    enabled: true
    collector:
      requests:
        memory: "124Mi"
        cpu: "100m"
      limits:
        memory: "1024Mi"
        cpu: "2000m"

修改为如下即可:

pod:
......
  resources:
    enabled: true
    collector:
      requests:
        memory: "124Mi"
        cpu: "100m"
      limits:
        memory: "3072Mi"
        cpu: "3000m"
......

注意: 请确保resources下面的enabled值为true,否则表示不开启资源限制,即使修改也会无效

参考:
[1] https://cloud.tencent.com/developer/article/1004976
[2] http://kubernetes.kansea.com/docs/user-guide/compute-resources/
[3] http://blog.csdn.net/yan234280533/article/details/62965993
[4] http://blog.csdn.net/yan234280533/article/details/63685451

猜你喜欢

转载自blog.csdn.net/qingyuanluofeng/article/details/86670174
今日推荐