首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Kubernetes中部署应用程序时,如何定义资源限制和计算消耗?

在Kubernetes中部署应用程序时,如何定义资源限制和计算消耗?
EN

Stack Overflow用户
提问于 2020-07-11 15:32:57
回答 2查看 233关注 0票数 2

我正试图按照Kubernetes官方网站的教程部署一个简单的动物园管理员集合。这个教程说我需要

具有至少四个节点和每个节点的集群至少需要2个CPU和4个GiB内存。

当我试图应用vCPU文件时,我忽略了这个事实,创建了一个具有n1标准1 (1 .yaml,3.73 GB内存)节点的集群。

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: zk-hs
  labels:
    app: zk
spec:
  ports:
    - port: 2888
      name: server
    - port: 3888
      name: leader-election
  clusterIP: None
  selector:
    app: zk
---
apiVersion: v1
kind: Service
metadata:
  name: zk-cs
  labels:
    app: zk
spec:
  ports:
    - port: 2181
      name: client
  selector:
    app: zk
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: zk-pdb
spec:
  selector:
    matchLabels:
      app: zk
  maxUnavailable: 1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: zk
spec:
  selector:
    matchLabels:
      app: zk
  serviceName: zk-hs
  replicas: 3
  updateStrategy:
    type: RollingUpdate
  podManagementPolicy: OrderedReady
  template:
    metadata:
      labels:
        app: zk
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                      - zk
              topologyKey: "kubernetes.io/hostname"
      containers:
        - name: kubernetes-zookeeper
          imagePullPolicy: Always
          image: "k8s.gcr.io/kubernetes-zookeeper:1.0-3.4.10"
          resources:
            requests:
              memory: "1Gi"
              cpu: "0.5"
          ports:
            - containerPort: 2181
              name: client
            - containerPort: 2888
              name: server
            - containerPort: 3888
              name: leader-election
          command:
            - sh
            - -c
            - "start-zookeeper \
          --servers=3 \
          --data_dir=/var/lib/zookeeper/data \
          --data_log_dir=/var/lib/zookeeper/data/log \
          --conf_dir=/opt/zookeeper/conf \
          --client_port=2181 \
          --election_port=3888 \
          --server_port=2888 \
          --tick_time=2000 \
          --init_limit=10 \
          --sync_limit=5 \
          --heap=512M \
          --max_client_cnxns=60 \
          --snap_retain_count=3 \
          --purge_interval=12 \
          --max_session_timeout=40000 \
          --min_session_timeout=4000 \
          --log_level=INFO"
          readinessProbe:
            exec:
              command:
                - sh
                - -c
                - "zookeeper-ready 2181"
            initialDelaySeconds: 10
            timeoutSeconds: 5
          livenessProbe:
            exec:
              command:
                - sh
                - -c
                - "zookeeper-ready 2181"
            initialDelaySeconds: 10
            timeoutSeconds: 5
          volumeMounts:
            - name: datadir
              mountPath: /var/lib/zookeeper
      securityContext:
        runAsUser: 1000
        fsGroup: 1000
  volumeClaimTemplates:
    - metadata:
        name: datadir
      spec:
        accessModes: [ "ReadWriteOnce" ]
        resources:
          requests:
            storage: 10Gi

当然,我得到了错误PodUnschedulable

在这个文件中,我没有发现任何表明我需要一个由4个节点和2个CPU和4G Ram组成的集群的东西。所以:

  • 什么定义了我的部署需要多少资源?
  • 如何事先理解/计算应用程序所需的资源及其各自的部署?
  • 动物园管理员根据要求在2GB RAM上运行,但这只是推荐的配置。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-11 16:46:32

默认情况下,一个kubernetes节点不会出现空。相反,在运行应用程序工作负载之前,它已经运行了进程:

  • kubelet正在运行(在每个节点中)
  • kube-代理作为守护进程运行(在每个节点中)。
  • 容器-运行时(Docker)在每个节点中运行。
  • 其他守护进程也可以运行(在EKS.中,类似于aws)。

我们在这里讨论的是工人节点,而不是大师。

所以想象一下,你最终会为每个节点选择一个值得尊敬的资源。

并非所有节点都必须具有相同的大小。不过,您可以根据应用程序的类型来决定您需要的大小:

  • 如果应用程序占用内存多于CPU(如Java ),则需要选择2CPU的节点,8GB优于4CPU、8GB。
  • 如果应用程序占用CPU多于内存(如ML工作负载),则需要选择相反的方法:计算优化实例。
  • 金科玉律是计算整体容量,比查看每个节点的单个容量要好。

这意味着3大型节点在成本上可能优于4中型节点,但在容量的最佳使用方面也优于4。

最后,节点资源必须是:

  • 不少于2个CPU
  • 不少于4GB内存

否则,您应该预料到容量问题。

现在,我们达到了答案的一半:确定集群的容量。

下半部分是关于回答如何为每个应用程序(pod)分配资源。

这是另一个问题:你的应用程序消耗了多少?

要回答这个问题,您需要使用Prometheus + Grafana等APM工具监视您的应用程序。

一旦你了解了消费的平均水平,现在是时候为你的应用程序设置资源限制了(它的荚)。

Limits可能会节流这个应用程序,这就是为什么,您需要与其他东西一起设置水平自动缩放:

  • 在部署中运行Pods来管理副本和部署。
  • HPA或水平Pod自动分频器:它监视部署的吊舱,然后根据阈值(CPU、内存)缩小/输入。

作为这一部分的结论,我们可以说:

-度量:开始度量来识别resources.limitsresources.requests

- :运行应用程序后的度量,以再次确定所需的资源。

-度量:保持度量

票数 3
EN

Stack Overflow用户

发布于 2020-07-11 15:53:36

部署yaml中的resources部分定义了荚中容器的资源需求。

代码语言:javascript
复制
resources:
  requests:
    memory: "1Gi"
    cpu: "0.5"

requests意味着一个节点需要有超过1GB的内存和0.5CPU才能在该节点上调度一个副本荚。

limits还有另一个概念,它定义了豆荚在从节点被逐出之前可以消耗的最大资源。

代码语言:javascript
复制
resources:
  requests:
    memory: "1Gi"
    cpu: "0.5"
  limits:
    memory: "2Gi"
    cpu: "2"

虽然您有3个节点,但在默认情况下,主节点并不是计划的。

您可以通过kubectl describe nodename了解节点的资源可用性,并检查CapacityAllocatable部分。

代码语言:javascript
复制
Capacity:
  cpu:                4
  ephemeral-storage:  8065444Ki
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             16424256Ki
  pods:               110
Allocatable:
  cpu:                4
  ephemeral-storage:  7433113179
  hugepages-1Gi:      0
  hugepages-2Mi:      0
  memory:             16321856Ki
  pods:               110

关于计算豆荚的资源需求(requestslimits),没有银弹。它取决于应用程序,应该通过分析它来确定和调整。但是建议在部署pod时定义requestslimits的最佳实践。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62851159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档