在 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 的节点上。
我有一个 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 的节点上。