试图了解用于资源的值和多容器部署的限制
Trying to understand what values to use for resources and limits of multiple container deployment
我正在尝试为我的应用设置 HorizontalPodAutoscaler
自动缩放器,以及自动 Cluster Autoscaling of DigitalOcean
我将在下面添加我的部署 yaml,我还按照上面 link 中的指南部署了 metrics-server
。目前我正在努力弄清楚如何确定要为我的 cpu 和内存 requests
和 limits
字段使用什么值。主要是由于可变副本数,即我是否需要考虑每个使用其资源或一般部署的最大副本数,我是按 pod 计划还是针对每个容器单独计划?
对于某些上下文,我 运行 在最多可以有两个节点的集群上,每个节点有 1 个 vCPU 和 2GB 内存(因此总共可以有 2 个 vCPU 和 4 GB 内存)。
现在我的集群是 运行 个节点,我的 kubectl top
pods 统计数据和节点如下所示:
kubectl top pods
NAME CPU(cores) MEMORY(bytes)
graphql-85cc89c874-cml6j 5m 203Mi
graphql-85cc89c874-swmzc 5m 176Mi
kubectl 顶级节点
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
skimitar-dev-pool-3cpbj 62m 6% 1151Mi 73%
我已经尝试了 cpu 和资源的各种组合,但是当我部署我的文件时,我的部署要么停留在 Pending
状态,要么不断重新启动多次,直到它被终止。我的水平 Pod 自动缩放器也将目标报告为 <unknown>/80%
,但我认为这是由于我从我的部署中删除了 resources
,因为它没有工作。
考虑到下面的部署,我应该查看/考虑什么以确定我的资源 requests
和 limits
的最佳值?
以下 yaml 已从 env 变量/服务等内容中清除,它按原样工作,但当 resources
字段未注释时会导致上述问题。
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: graphql
spec:
replicas: 2
selector:
matchLabels:
app: graphql
template:
metadata:
labels:
app: graphql
spec:
containers:
- name: graphql-hasura
image: hasura/graphql-engine:v1.2.1
ports:
- containerPort: 8080
protocol: TCP
livenessProbe:
httpGet:
path: /healthz
port: 8080
readinessProbe:
httpGet:
path: /healthz
port: 8080
# resources:
# requests:
# memory: "150Mi"
# cpu: "100m"
# limits:
# memory: "200Mi"
# cpu: "150m"
- name: graphql-actions
image: my/nodejs-app:1
ports:
- containerPort: 4040
protocol: TCP
livenessProbe:
httpGet:
path: /healthz
port: 4040
readinessProbe:
httpGet:
path: /healthz
port: 4040
# resources:
# requests:
# memory: "150Mi"
# cpu: "100m"
# limits:
# memory: "200Mi"
# cpu: "150m"
# Disruption budget
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: graphql-disruption-budget
spec:
minAvailable: 1
selector:
matchLabels:
app: graphql
# Horizontal auto scaling
---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: graphql-autoscaler
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: graphql
minReplicas: 2
maxReplicas: 3
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 80
How to determine what values to use for my cpu and memory requests and limits fields. Mainly due to variable replica count, i.e. do I need to account for maximum number of replicas each using their resources or for deployment in general, do I plan it per pod basis or for each container individually
请求和限制是 Kubernetes 用来控制 CPU 和内存等资源的机制。
- 请求是容器保证得到的。如果容器请求资源,Kubernetes 只会将其调度到可以为其提供该资源的节点上。
- 限制,另一方面,确保容器永远不会超过某个值。容器只允许上到limit,然后限制。
副本数将由 ReplicaController
上的自动缩放器确定。
when I deploy my file my deployment is either stuck in a Pending state, or keeps restarting multiple times until it gets terminated.
pending
状态表示没有资源可用于安排新的 pods.
restarting
可能是其他问题触发的,建议解决scaling问题后再调试
My horizontal pod autoscaler also reports targets as <unknown>/80%
, but I believe it is due to me removing resources from my deployment, as it was not working.
你是对的,如果你不设置请求限制,所需的百分比将保持未知,自动缩放器将无法触发向上或向下缩放。
Here 你可以看到算法负责。
Horizontal Pod Autoscaler 将根据 pod 上请求的使用百分比触发新的 pods。在这种情况下,每当 pod 达到最大请求值的 80% 时,它将触发新的 pods 达到指定的最大值。
对于一个好的 HPA 示例,请查看此 link:Horizontal Pod Autoscale Walkthrough
但是 Horizontal Pod Autoscaler works with Cluster Autoscaler 如何实现?
Horizontal Pod Autoscaler 根据当前 CPU 负载更改部署或副本集的副本数。如果负载增加,HPA 将创建新的副本,集群中可能有也可能没有足够的 space。
如果资源不够,CA会尝试调出一些节点,让HPA创建的pods有地方给运行。如果负载减少,HPA 将停止一些副本。因此,一些节点可能会变得未充分利用或完全空置,然后 CA 将终止这些不需要的节点。
注意:关键是根据您的应用程序可用的节点数量(和预算)在集群级别上设置 HPA 思考的最大副本数,您可以开始设置非常高的最大副本数,监控然后根据使用指标和未来负载预测更改它。
如果您有任何问题,请在评论中告诉我。
我正在尝试为我的应用设置 HorizontalPodAutoscaler
自动缩放器,以及自动 Cluster Autoscaling of DigitalOcean
我将在下面添加我的部署 yaml,我还按照上面 link 中的指南部署了 metrics-server
。目前我正在努力弄清楚如何确定要为我的 cpu 和内存 requests
和 limits
字段使用什么值。主要是由于可变副本数,即我是否需要考虑每个使用其资源或一般部署的最大副本数,我是按 pod 计划还是针对每个容器单独计划?
对于某些上下文,我 运行 在最多可以有两个节点的集群上,每个节点有 1 个 vCPU 和 2GB 内存(因此总共可以有 2 个 vCPU 和 4 GB 内存)。
现在我的集群是 运行 个节点,我的 kubectl top
pods 统计数据和节点如下所示:
kubectl top pods
NAME CPU(cores) MEMORY(bytes)
graphql-85cc89c874-cml6j 5m 203Mi
graphql-85cc89c874-swmzc 5m 176Mi
kubectl 顶级节点
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
skimitar-dev-pool-3cpbj 62m 6% 1151Mi 73%
我已经尝试了 cpu 和资源的各种组合,但是当我部署我的文件时,我的部署要么停留在 Pending
状态,要么不断重新启动多次,直到它被终止。我的水平 Pod 自动缩放器也将目标报告为 <unknown>/80%
,但我认为这是由于我从我的部署中删除了 resources
,因为它没有工作。
考虑到下面的部署,我应该查看/考虑什么以确定我的资源 requests
和 limits
的最佳值?
以下 yaml 已从 env 变量/服务等内容中清除,它按原样工作,但当 resources
字段未注释时会导致上述问题。
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: graphql
spec:
replicas: 2
selector:
matchLabels:
app: graphql
template:
metadata:
labels:
app: graphql
spec:
containers:
- name: graphql-hasura
image: hasura/graphql-engine:v1.2.1
ports:
- containerPort: 8080
protocol: TCP
livenessProbe:
httpGet:
path: /healthz
port: 8080
readinessProbe:
httpGet:
path: /healthz
port: 8080
# resources:
# requests:
# memory: "150Mi"
# cpu: "100m"
# limits:
# memory: "200Mi"
# cpu: "150m"
- name: graphql-actions
image: my/nodejs-app:1
ports:
- containerPort: 4040
protocol: TCP
livenessProbe:
httpGet:
path: /healthz
port: 4040
readinessProbe:
httpGet:
path: /healthz
port: 4040
# resources:
# requests:
# memory: "150Mi"
# cpu: "100m"
# limits:
# memory: "200Mi"
# cpu: "150m"
# Disruption budget
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: graphql-disruption-budget
spec:
minAvailable: 1
selector:
matchLabels:
app: graphql
# Horizontal auto scaling
---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: graphql-autoscaler
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: graphql
minReplicas: 2
maxReplicas: 3
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 80
How to determine what values to use for my cpu and memory requests and limits fields. Mainly due to variable replica count, i.e. do I need to account for maximum number of replicas each using their resources or for deployment in general, do I plan it per pod basis or for each container individually
请求和限制是 Kubernetes 用来控制 CPU 和内存等资源的机制。
- 请求是容器保证得到的。如果容器请求资源,Kubernetes 只会将其调度到可以为其提供该资源的节点上。
- 限制,另一方面,确保容器永远不会超过某个值。容器只允许上到limit,然后限制。
副本数将由 ReplicaController
上的自动缩放器确定。
when I deploy my file my deployment is either stuck in a Pending state, or keeps restarting multiple times until it gets terminated.
pending
状态表示没有资源可用于安排新的 pods.restarting
可能是其他问题触发的,建议解决scaling问题后再调试
My horizontal pod autoscaler also reports targets as
<unknown>/80%
, but I believe it is due to me removing resources from my deployment, as it was not working.
你是对的,如果你不设置请求限制,所需的百分比将保持未知,自动缩放器将无法触发向上或向下缩放。
Here 你可以看到算法负责。
Horizontal Pod Autoscaler 将根据 pod 上请求的使用百分比触发新的 pods。在这种情况下,每当 pod 达到最大请求值的 80% 时,它将触发新的 pods 达到指定的最大值。
对于一个好的 HPA 示例,请查看此 link:Horizontal Pod Autoscale Walkthrough
但是 Horizontal Pod Autoscaler works with Cluster Autoscaler 如何实现?
Horizontal Pod Autoscaler 根据当前 CPU 负载更改部署或副本集的副本数。如果负载增加,HPA 将创建新的副本,集群中可能有也可能没有足够的 space。
如果资源不够,CA会尝试调出一些节点,让HPA创建的pods有地方给运行。如果负载减少,HPA 将停止一些副本。因此,一些节点可能会变得未充分利用或完全空置,然后 CA 将终止这些不需要的节点。
注意:关键是根据您的应用程序可用的节点数量(和预算)在集群级别上设置 HPA 思考的最大副本数,您可以开始设置非常高的最大副本数,监控然后根据使用指标和未来负载预测更改它。
如果您有任何问题,请在评论中告诉我。