试图了解用于资源的值和多容器部署的限制

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 和内存 requestslimits 字段使用什么值。主要是由于可变副本数,即我是否需要考虑每个使用其资源或一般部署的最大副本数,我是按 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,因为它没有工作。

考虑到下面的部署,我应该查看/考虑什么以确定我的资源 requestslimits 的最佳值?

以下 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


但是 Horizo​​ntal Pod Autoscaler works with Cluster Autoscaler 如何实现?

  • Horizo​​ntal Pod Autoscaler 根据当前 CPU 负载更改部署或副本集的副本数。如果负载增加,HPA 将创建新的副本,集群中可能有也可能没有足够的 space。

  • 如果资源不够,CA会尝试调出一些节点,让HPA创建的pods有地方给运行。如果负载减少,HPA 将停止一些副本。因此,一些节点可能会变得未充分利用或完全空置,然后 CA 将终止这些不需要的节点。

注意:关键是根据您的应用程序可用的节点数量(和预算)在集群级别上设置 HPA 思考的最大副本数,您可以开始设置非常高的最大副本数,监控然后根据使用指标和未来负载预测更改它。

如果您有任何问题,请在评论中告诉我。