【问题标题】:What is the default memory allocated for a pod为 pod 分配的默认内存是多少
【发布时间】:2019-11-24 05:41:14
【问题描述】:

我正在我的 google kubernetes 引擎上设置一个 pod,例如 test-pod。当我使用 google 控制台部署 pod 并查看工作负载时,我可以看到 100m CPU 默认分配给我的 pod,但我无法看到我的 pod 消耗了多少内存。内存请求部分总是在那里显示0。我知道我们可以在部署 YAML 中限制内存限制和初始分配。但是我想知道当没有通过 YAML 指定值时,一个 pod 分配了多少默认内存,它可以使用的最大限制是多少?

【问题讨论】:

    标签: kubernetes google-cloud-platform google-kubernetes-engine


    【解决方案1】:

    如果您的 pod 上没有资源请求,它可以在任何地方进行调度,甚至是集群中最繁忙的节点,就好像您请求了 0 个内存和 0 个 CPU。如果您没有资源限制并且可以消耗其节点上的所有可用内存和 CPU。

    (如果不明显,现实的资源请求和限制是最佳实践!)

    【讨论】:

    • 感谢您的回答!那么这是否意味着如果没有定义限制,存在内存泄漏或消耗大量资源的 pod 会导致其他 pod 崩溃并最终导致节点崩溃?
    • 是的!设置正确的资源请求是一门艺术:将它们设置得太低,节点可能会过度使用,并在峰值负载时遇到麻烦;太高了,节点会闲置。第 1 步通常是分析容器的实际内存使用情况。
    【解决方案2】:

    可以使用metrics-server 服务和kubectl top pod 命令查看 Kubernetes pod 的 CPU 和内存使用情况:

    $ kubectl top --help
    ...
    Available Commands:
    ...
      pod         Display Resource (CPU/Memory/Storage) usage of pods
    ...
    

    Minikube 中的示例如下:

    minikube addons enable metrics-server
    
    # wait 5 minutes for metrics-server to be up and running
    
    $ kubectl top pod -n=kube-system
    NAME                               CPU(cores)   MEMORY(bytes)   
    coredns-fb8b8dccf-6t5k8            6m           10Mi            
    coredns-fb8b8dccf-sjkvc            5m           10Mi            
    etcd-minikube                      37m          60Mi            
    kube-addon-manager-minikube        17m          20Mi            
    kube-apiserver-minikube            55m          201Mi           
    kube-controller-manager-minikube   30m          46Mi            
    kube-proxy-bsddk                   1m           11Mi            
    kube-scheduler-minikube            2m           12Mi            
    metrics-server-77fddcc57b-x2jx6    1m           12Mi            
    storage-provisioner                0m           15Mi            
    tiller-deploy-66b7dd976-d8hbk      0m           13Mi            
    

    This link 有更多信息。

    【讨论】:

      【解决方案3】:
      1. 您可以对单个 pod 设置限制

      2. 如果没有,您可以对整个命名空间设置限制

      3. 默认值,没有限制

      但是有一些滴答声:

      这是一个非常好的视图:

      https://blog.balthazar-rouberol.com/allocating-unbounded-resources-to-a-kubernetes-pod

      在 Kubernetes 集群中部署 pod 时,通常有 2 个 资源分配方面的选择:

      在 pod 级别定义 CPU/内存资源请求和限制

      在命名空间级别定义默认 CPU/内存请求和限制 使用 LimitRange

      来自 Docker 文档(假设您使用的是 docker 运行时):

      默认情况下,容器没有资源限制,可以用作 主机的内核调度程序允许的大部分给定资源

      https://docs.docker.com/v17.09/engine/admin/resource_constraints/

      【讨论】:

        【解决方案4】:

        在许多情况下,真正的问题不是节点太小,而是我们没有准确地指定 Pod 的资源限制。

        使用 containerSpec 的 resources 属性在每个容器的基础上设置资源限制,它是 ResourceRequirements 类型的 v1 api 对象。每个对象都为资源类型指定“limits”和“requests”。

        如果不为容器指定内存限制,则适用以下情况之一:

        容器对其使用的内存量没有上限。容器可以使用它运行的节点上的所有可用内存,这反过来又可以调用 OOM Killer。此外,在 OOM Kill 的情况下,没有资源限制的容器将有更大的机会被杀死。

        容器在具有默认内存限制的命名空间中运行,并且容器自动分配了默认限制。集群管理员可以使用 LimitRange 来指定内存限制的默认值。

        当你设置了一个限制而不是一个请求时,kubernetes 将请求默认为限制。如果您从调度程序的角度考虑它是有道理的。

        设置正确的资源请求很重要,设置太低会导致节点过载;太高会使节点闲置。

        有用的文章:memory-limits.

        【讨论】:

          【解决方案5】:

          Kubernetes 不提供开箱即用的默认资源限制。这意味着除非您明确定义限制,否则您的容器可以消耗无限的 CPU 和内存。

          https://medium.com/@reuvenharrison/kubernetes-resource-limits-defaults-and-limitranges-f1eed8655474

          【讨论】:

            【解决方案6】:

            Kubernetes 不提供开箱即用的默认资源限制。这意味着除非您明确定义限制,否则您的容器可以消耗无限的 CPU 和内存。

            更多详情:https://medium.com/@reuvenharrison/kubernetes-resource-limits-defaults-and-limitranges-f1eed8655474

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-03-03
              • 1970-01-01
              • 1970-01-01
              • 2019-12-29
              • 1970-01-01
              • 1970-01-01
              • 2013-01-07
              • 1970-01-01
              相关资源
              最近更新 更多