&引用;“限制”;在Kubernetes群集中部署容器时忽略属性

&引用;“限制”;在Kubernetes群集中部署容器时忽略属性,kubernetes,google-cloud-platform,google-kubernetes-engine,Kubernetes,Google Cloud Platform,Google Kubernetes Engine,我正在Google Kubernetes引擎中部署一个包含以下YAML片段的容器: spec: containers: - name: service image: registry/service-go:latest resources: requests: memory: "20Mi" cpu: "20m" limits:

我正在Google Kubernetes引擎中部署一个包含以下YAML片段的容器:

    spec:
      containers:
      - name: service
        image: registry/service-go:latest
        resources:
          requests:
           memory: "20Mi"
           cpu: "20m"
          limits:
           memory: "100Mi"
           cpu: "50m"
但它一直需要120米为什么忽略“限制”属性?其他所有功能都正常工作。如果我请求200米,200米将被保留,但限制一直被忽略

我的Kubernetes版本是1.10.7-gke.1

我只有默认名称空间,在执行时

kubectl描述命名空间默认值

名称:默认值
标签:
注释:
状态:活动
没有资源配额。
资源限制
类型资源最小最大默认请求默认限制最大限制/请求比率
----       --------  ---  ---  ---------------  -------------  -----------------------
集装箱cpu--100m--

您可以尝试登录运行pod的节点并运行:

ps -Af | grep docker
您将看到kubelet发送给docker的完整命令行。表示内存限制,它应该有类似于
--内存
。请注意,内存请求值仅由Kubernetes调度程序用于确定它是否已超过节点上运行的所有吊舱/容器

表示对cpu的请求,您将看到
--cpu共享
标志。在这种情况下,限制不是硬限制,但这也是Kubernetes调度器在特定节点上运行多个容器/吊舱时不分配超过该限制的容器/吊舱的一种方式。您可以从Kubernetes方面了解更多关于cpu共享的信息。因此,从本质上讲,如果节点上没有足够的工作负载,那么如果需要,它将始终超过其CPU共享,这可能就是您看到的

Docker还有其他限制cpu的方法,如cpu周期/cpu配额和cpu使用量cpu,但在本文撰写时未使用bu Kubernetes。在这方面,我相信mesos在处理CPU/内存保留和配额方面做得更好

希望有帮助。

仅考虑资源请求 谷歌云控制台运行良好,我认为你的pod中有多个容器,这就是为什么。上面显示的值是在截断的YAML文件中声明的资源请求的总和。您可以使用
kubectl
轻松验证

首先验证吊舱中的容器数量

kubectl描述pod服务-85cc4df46d-t6wc9

然后,通过kubectl查看节点的描述,您应该拥有与控制台所述相同的信息

kubectl描述节点gke默认池abcdefgh…

资源请求和限制之间的区别是什么? 你可以把你的集群想象成一个巨大的方形盒子。这是可分配资源的总数。当你把一个豆荚放在大盒子里时,库伯内特斯会检查豆荚中是否有一个空的空间来存放请求的资源(小盒子是否适合放在大盒子里?)。如果有足够的可用空间,它将在所选节点上安排您的工作负载

调度程序不考虑资源限制。所有这些都是通过cgroup在内核级别完成的。目标是限制工作负载,使其占用调度节点上的所有CPU或内存

如果您的资源请求==资源限制,则工作负载无法脱离其“框”,并且无法使用其旁边的可用CPU/内存。换句话说,你的资源是pod的保证

但是,如果限制大于您的请求,则称为过度使用资源。您可以打赌,同一节点上的所有工作负载不会同时完全加载(通常情况下)


我建议不要过度使用内存资源,不要让pod从内存的“盒子”中逃脱,它会导致OOMKilling。

您的命名空间有没有可能设置了LimitRange?如果您运行
kubectl描述pod服务-85cc4df46d-t6wc9
您看到了什么?在谷歌云控制台的哪个页面上,你发现pod仅限于120mCPU?服务是用golang编写的?@Light.G是的,我的服务是用golang编写的。@YannC。我看到CPU不受限制的页面位于“节点详细信息”中,可以使用以下路径进行导航:Google cloud Engine->Kubernetes Engine->Clusters->“testProjectCluster”->“Nodes Tab”->gke testProject cluster master PoolThank@Rico,文档可能会误导您:“容器可能被允许或不被允许在较长时间内超过其CPU限制。但是,它不会因CPU过度使用而被杀死。在谷歌的官方视频教程中,他们提到这个参数确实限制了CPU的数量。我会按照文档所说的去做。你是对的,问题是我有连接到google cloud SQL代理的映像,因为默认配置的资源请求是100ms。它添加了100ms的SQL代理和20ms的golang服务。谢谢你的帮助,很抱歉,这是一件非常简单的事情,我本应该发现的。
ps -Af | grep docker