为什么内存使用量比我在 Kubernetes 节点中设置的要大?

2024-03-30

我仅将资源分配给 1 个 pod,内存为 650MB/30%(对于其他内置 pod,限制内存仅为 69%)

然而,在 Pod 处理过程中,Pod 的使用量在 650MB 以内,但 Node 的总体使用率为 94%。

为什么会出现这种情况,因为它的上限应该是 69%?是不是其他内置pod没有设置限制的原因?如果内存使用率 > 100%,有时我的 pod 会出错,如何防止这种情况发生?

My allocation setting (kubectl describe nodes): enter image description here

Memory usage of Kubernetes Node and Pod when idle:
kubectl top nodes
enter image description here
kubectl top pods
enter image description here

Memory usage of Kubernetes Node and Pod when running task:
kubectl top nodes
enter image description here
kubectl top pods
enter image description here


进一步测试的行为:
1. 准备命名空间下的deployment、pods和servicetest-ns
2. 因为只有kube 系统 and test-ns有 pod,因此为每个 pod 分配 1000Mi(从kubectl describe nodes) 目标小于 2GB
3. 假设内存使用于kube 系统 and test-ns会小于2GB,小于100%,为什么内存使用率可以是106%?

In .yaml 文件:

    apiVersion: v1
    kind: LimitRange
    metadata:
      name: default-mem-limit
      namespace: test-ns
    spec:
      limits:
      - default:
          memory: 1000Mi
        type: Container
    ---
    apiVersion: v1
    kind: LimitRange
    metadata:
      name: default-mem-limit
      namespace: kube-system
    spec:
      limits:
      - default:
          memory: 1000Mi
        type: Container
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: devops-deployment
      namespace: test-ns
      labels:
        app: devops-pdf
    spec:
      selector:
        matchLabels:
          app: devops-pdf
      replicas: 2
      template:
        metadata:
          labels:
            app: devops-pdf
        spec:
          containers:
          - name: devops-pdf
            image: dev.azurecr.io/devops-pdf:latest
            imagePullPolicy: Always
            ports:
            - containerPort: 3000
            resources:
              requests:
                cpu: 600m
                memory: 500Mi
              limits:
                cpu: 600m
                memory: 500Mi
          imagePullSecrets:
          - name: regcred
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: devops-pdf
      namespace: test-ns
    spec:
      type: LoadBalancer
      ports:
      - port: 8007
      selector:
        app: devops-pdf

这种影响很可能是由该节点上运行的 4 个 Pod 引起的without指定的内存限制,显示为0 (0%)。当然0并不意味着它不能使用哪怕一个字节的内存,因为不使用内存就无法启动程序;相反,这意味着没有限制,可以使用尽可能多的东西。此外,不在 pod 中运行的程序(ssh、cron 等)也包含在总使用量中,但不受 kubernetes(cgroup)限制。

现在,kubernetes 以一种巧妙的方式设置内核 oom 调整值,以支持其内存下的容器request,使其更有可能杀死内存之间的容器中的进程request and limit,并使其最有可能杀死没有内存的容器中的进程limits。然而,这仅在长期运行中表现得相当好,有时内核可以杀死你最喜欢的容器中表现良好的你最喜欢的进程(使用少于其内存的进程)request). See https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/#node-oom-behavior https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/#node-oom-behavior

在这种特殊情况下,没有内存限制的 pod 来自 aks 系统本身,因此在 pod 模板中设置其内存限制不是一个选项,因为有一个协调器将恢复它(最终)。为了解决这种情况,我建议您在 kube-system 命名空间中创建一个 LimitRange 对象,该对象将为所有 pod 分配内存限制,而没有限制(在创建它们时):

apiVersion: v1
kind: LimitRange
metadata:
  name: default-mem-limit
  namespace: kube-system
spec:
  limits:
  - default:
      memory: 150Mi
    type: Container

(您需要删除已经存在的Pods没有内存限制才能生效;他们将被重新创建)

这并不能完全消除问题,因为您最终可能会遇到过度使用的节点;然而,内存使用将是有意义的,并且 oom 事件将更可预测。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么内存使用量比我在 Kubernetes 节点中设置的要大? 的相关文章

随机推荐