在 Kubernetes 上为 ElasticSearch 设置资源限制会产生错误

Setting Ressource limit for ElasticSearch in Kubernetes creates bug

我有一个 Web 应用程序,我正尝试使用 Kubernetes 进行部署。它工作正常,但是当我尝试添加 资源限制 时,ElasticSearch 不会部署。

elasticsearch-deployment.yaml:

apiVersion: v1
kind: Service
metadata:
  name: elasticsearch-service
spec:
  type: NodePort
  selector:
    app: elasticsearch
  ports:
  - port: 9200
    targetPort: 9200
    name: serving
  - port: 9300
    targetPort: 9300
    name: node-to-node
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: elasticsearch-deployment
  labels:
    app: elasticsearch
spec:
  replicas: 1
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
      - name: elasticsearch
        image: elasticsearch:7.9.0
        ports:
        - containerPort: 9200
        - containerPort: 9300
        env:
        - name: discovery.type
          value: single-node
        # resources:
        #   limits:
        #     memory: 8Gi
        #     cpu: "4"
        #   requests:
        #     memory: 4Gi
        #     cpu: "2"

如果我取消注释文件的资源部分,pod 会卡在待定状态:

> kubectl get pods
NAME                                        READY   STATUS    RESTARTS       AGE
backend-deployment-bd4f98697-rxsz8          1/1     Running   1 (6m9s ago)   6m40s
elasticsearch-deployment-644475545b-t75pp   0/1     Pending   0              6m40s
frontend-deployment-8bc989f89-4g6v7         1/1     Running   0              6m40s
mysql-0                                     1/1     Running   0              6m40s

如果我检查事件:

> kubectl get events
...
Warning   FailedScheduling  pod/elasticsearch-deployment-54d9cdd879-k69js  0/1 nodes are available: 1 Insufficient cpu.
Warning   FailedScheduling  pod/elasticsearch-deployment-54d9cdd879-rjj24  0/1 nodes are available: 1 Insufficient cpu.
...

事件表明 pod 不足 cpu,但我尝试将资源限制更改为:

resources:
  limits:
    memory: 8Gi
    cpu: "18"
  requests:
    memory: 4Gi
    cpu: "18"

仍然无效,唯一有效的方法是取消资源限制,但为什么呢?

是因为要求,不是限制。这意味着您的节点没有足够的内存来调度请求 2 CPUs 的 pod。您需要将该值设置为较低的值(例如 500m)。

您可以检查服务器的可分配 CPU。所有 Pod 的 CPU 请求总和应低于此。

# kubectl describe nodes
...
Allocatable:
  cpu:                28
...

除了大悟

请求和限制基于 per-container。 Pod 中的每个容器都有自己的限制和请求。将每个容器的限制和请求加在一起时,您将获得 Pod 的聚合值。

结合每个容器的请求和限制值将表示 Pod 请求为 500m cpu 和 128Mi 内存,Pod 限制为 1 cpu 和 256Mi 内存。

请求是容器保证得到的。如果一个容器请求一个资源,k8s只会将它调度到可以给它那个资源的节点上。

限制,另一方面,确保容器不会超过特定值或限制。

如果没有定义请求和限制,调度程序可能会将 Pod 放置在可用内存少于 1 GiB 的节点上。