首页 > 其他分享 >Pod数量的扩缩容

Pod数量的扩缩容

时间:2025-01-20 18:58:45浏览次数:1  
标签:扩容 CPU 扩缩容 数量 自动 节点 HPA Pod

在 K8s 中,Pod 的扩容自动扩容是帮助实现弹性伸缩和高可用性的关键功能。

1. 水平扩容 (Horizontal Scaling)

水平扩容通过增加多个相同配置的 Pod 来应对增加的流量或负载。与垂直扩容不同,水平扩容是通过在集群中分布更多相同的资源来实现的。

  • 手动水平扩容:
    通过命令 kubectl scale,你可以手动调整某个 Deployment 的副本数。举个例子:

    kubectl scale --replicas=5 deployment deloy-xiuxian
    

    这个命令将会把 deloy-xiuxian 的副本数从原本的数量扩展到 5。

  • 自动水平扩容 (HPA - Horizontal Pod Autoscaler):
    Kubernetes 提供了 HPA (Horizontal Pod Autoscaler),它可以根据 CPU、内存等资源的使用率自动扩展或缩减 Pod 数量。HPA 的工作方式是基于指定的目标指标(如 CPU 利用率)来决定是否需要增加或减少 Pod 数量。

    1. 创建 HPA 资源
      通过定义一个 HPA 资源,指定最大副本数、最小副本数,以及相关的监控指标,例如:

      kubectl autoscale deployment deloy-xiuxian --cpu-percent=85 --min=2 --max=10
      

      这条命令将自动扩缩 deloy-xiuxian 的副本数,当 CPU 利用率超过 85% 时,自动增加 Pod 数量,当 CPU 使用率低于设定阈值时,Pod 数量会自动缩减。

    2. 观察自动扩容过程

      • 执行压力测试来模拟 CPU 或内存负载。
      • 随着负载增加,HPA 将自动扩展 Pod 数量。当负载减轻时,HPA 会根据设置的最小副本数缩减 Pod 数量。

      例如,HPA 可能从 2 个副本增加到 10 个副本,然后当 CPU 使用率降低时,HPA 会自动将副本数量缩减至 2 个。

优势:

  • 可以根据系统负载自动调整资源。
  • 通过自动扩缩容,节省了手动操作的时间,并且可以确保集群的资源得到高效利用。

2. 垂直扩容 (Vertical Scaling)

垂直扩容是通过增加节点的硬件资源(例如 CPU 和内存)来提高系统的处理能力。虽然 Kubernetes 允许进行垂直扩容,但其效果相较于水平扩容有限。垂直扩容对于性能要求非常高的场景(例如单个节点需要大量资源)较为适用。

在 Kubernetes 中进行垂直扩容的常见方法:

  • 通过调整 Pod 的资源请求和限制,改变 Pod 需要的 CPU 和内存:
    resources:
      requests:
        cpu: "500m"
        memory: "512Mi"
      limits:
        cpu: "1"
        memory: "1Gi"
    
  • 如果节点的硬件资源不足,垂直扩容可能无法满足需求,此时应该考虑水平扩容来增加资源。

3. 自动水平扩容详细操作

自动水平扩容是 Kubernetes 弹性伸缩的一项核心功能。它通过监控资源使用情况(如 CPU 和内存)来自动调整 Pod 数量,以确保应用的高可用性。

步骤:

  • 部署应用:
    首先部署应用,并设定好资源限制,如 CPU 和内存请求与限制。例如,deploy-stress Deployment 会设置 CPU 和内存的请求与限制:

    containers:
    - name: stress
      image: some-stress-image
      resources:
        requests:
          cpu: 200m
          memory: 100Mi
        limits:
          cpu: 0.5
          memory: 200Mi
    
  • 配置 HPA(自动扩缩)
    配置 HPA 资源,通过设定指标来监控 CPU 或内存的使用情况,并在超过设定的阈值时自动增加 Pod 数量。

    kubectl autoscale deployment deploy-stress --cpu-percent=85 --min=2 --max=10
    

    上述命令将会创建一个 HPA,当 CPU 使用率超过 85% 时,Pod 数量自动扩展,最多不超过 10 个副本。

  • 查看 HPA 状态:
    可以通过 kubectl get hpa 来查看 HPA 的状态,监控 Pod 数量是否根据负载自动扩缩:

    kubectl get hpa
    
  • 监控 HPA 的变化:
    在压力测试期间,随着负载的增加,Pod 数量会自动增加。当负载减轻时,Pod 数量会减少,直到达到最小副本数。

4. 压测与自动扩缩

使用负载生成工具(如 stress)对系统进行压力测试,模拟高负载场景,观察 HPA 如何自动扩容。当压力降低时,HPA 会自动缩容,确保不浪费资源。

例如,执行以下命令进行压力测试

stress --cpu 8 --io 4 --vm 2 --vm-bytes 90M --timeout 10m --vm-keep

查看 HPA 的调整
压力测试进行时,你可以看到 HPA 会不断扩展 Pod 数量。当压力消失后,Pod 数量会根据 CPU 使用率自动缩减。

5. HPA 的声明式创建

HPA 的声明式创建 通过 YAML 文件来实现,定义了对 Deployment 的自动扩容策略,包括 CPU 利用率的目标和 Pod 数量的限制。

例如,以下是一个 HPA 的 YAML 配置文件:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: deploy-stress
  namespace: default
spec:
  maxReplicas: 10
  minReplicas: 2
  metrics:
  - resource:
      name: cpu
      target:
        averageUtilization: 85
        type: Utilization
    type: Resource
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: deploy-stress

通过创建上述文件并应用,可以在 Kubernetes 中定义一个自动扩容规则,基于 CPU 使用率自动调整 Pod 数量。

总结:

  • 水平扩容 通过增加 Pod 数量来处理更大的流量或负载。
  • 垂直扩容 是增加节点的硬件配置,提高单个节点的资源能力,但不如水平扩容灵活。
  • 自动水平扩容 (HPA) 是根据实际负载自动调整 Pod 数量的关键功能,可以基于 CPU、内存等资源的使用率动态调整。

在 K8s中,除了水平和垂直扩容、自动伸缩等基本功能之外,还有一些补充的扩展和优化策略,可以帮助提升 Kubernetes 集群的性能、可靠性和资源利用率。以下对于上面的补充

1. Pod Disruption Budgets (PDBs)

Pod Disruption Budget (PDB) 是一种保障 Pod 不会被过度驱逐的机制,尤其在进行节点维护或滚动升级时非常有用。PDB 可以帮助我们确保至少有一定数量的 Pod 处于运行状态,不会因为节点驱逐或维护而影响服务的可用性。

示例:

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: myapp-pdb
spec:
  minAvailable: 3
  selector:
    matchLabels:
      app: myapp

在这个示例中,我们确保至少有 3 个 Pod 始终在运行状态。即使进行滚动更新或节点维护时,Kubernetes 会尽量避免超过这个数量的 Pod 被驱逐。

2. Affinity 和 Anti-Affinity

Pod Affinity 和 Anti-Affinity 提供了基于拓扑(例如节点或区域)对 Pod 进行调度的能力。通过 Affinity 和 Anti-Affinity,用户可以更精确地控制 Pod 的调度规则。例如,确保某些 Pod 位于同一节点(Affinity),或者确保某些 Pod 不会调度到同一节点(Anti-Affinity)。

  • Pod Affinity:例如,我们可以将一组相关的 Pod 调度到相同节点,便于它们之间的通信。
    affinity:
      podAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchLabels:
                app: "frontend"
            topologyKey: "kubernetes.io/hostname"
    
  • Pod Anti-Affinity:用来确保 Pod 不会与指定的其他 Pod 一起调度。
    affinity:
      podAntiAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchLabels:
                app: "frontend"
            topologyKey: "kubernetes.io/hostname"
    

3. Resource Requests and Limits

Kubernetes 通过 requestslimits 来对资源使用进行限制,确保 Pod 不会使用超过分配的资源,从而避免资源竞争,确保集群中所有服务的稳定性。

  • requests: 是 Pod 在调度时请求的资源数量。它表示了 Pod 启动时最小需要的资源量。
  • limits: 是 Pod 可以使用的最大资源量。如果 Pod 超过该限制,将被限制或终止。

示例:

resources:
  requests:
    cpu: "500m"
    memory: "1Gi"
  limits:
    cpu: "1"
    memory: "2Gi"

4. 优先级和抢占 (Priority and Preemption)

Kubernetes 支持 Pod 的优先级和抢占策略,用于确保高优先级的工作负载能够获取资源,必要时会抢占低优先级的 Pod。配置优先级和抢占时,可以避免低优先级的 Pod 因资源不足而无法调度。

示例:

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000000
globalDefault: false
description: "This priority class is used for critical workloads."

5. Cluster Autoscaler

Kubernetes 集群自动扩容器(Cluster Autoscaler)是一个可以自动调整集群规模的工具。它根据 Pod 的资源请求自动增减集群的节点数量。集群自动扩容器主要是配合云提供商(例如 AWS、GCP、Azure)使用,自动增加或减少节点数量来适应负载需求。

安装与配置:
通过 Helm 或直接部署 Cluster Autoscaler,在云环境中配置自动扩容。

6. Node Pool

Node Pool 允许将节点按照特定的标签或硬件特性分组。在某些情况下,您可能希望根据不同的工作负载将节点划分到不同的节点池中。例如,将 GPU 节点与普通计算节点分开,或者将不同硬件配置的节点分到不同池中。

  • 为特定工作负载分配节点池:可以根据应用的不同需求,创建多个节点池,分别为具有不同资源需求的工作负载提供相应的节点。

7. 弹性容器和弹性服务

Kubernetes 的弹性伸缩可以与其他微服务架构的设计原则配合使用,以实现弹性负载平衡、流量控制和故障恢复。例如,可以结合 IstioKongNGINX 等 API 网关和服务网格技术,实现基于流量的动态扩容和自动负载均衡。

8. 使用网络策略 (Network Policies) 管理流量

通过 Network Policies,可以在 Kubernetes 中设置网络访问控制规则,限制不同 Pod 或服务之间的网络流量。这对于确保不同服务或 Pod 之间的安全隔离,尤其在微服务架构中,极为重要。

示例:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-ingress
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              role: frontend

9. 服务发现与负载均衡

Kubernetes 支持基于标签的服务发现与负载均衡。Service 是 Kubernetes 中一种用来暴露应用的资源,它通过集群内部的 DNS 和负载均衡器机制实现应用的访问。

示例:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
  type: LoadBalancer

10. 多集群管理 (Multi-Cluster Management)

对于一些复杂的应用场景,可能需要跨多个 Kubernetes 集群进行资源分配。可以使用像 FederationRancher 等工具来管理和协调跨集群的部署和扩容操作。

11. Node Affinity vs Taints and Tolerations

Node AffinityTaints and Tolerations 都可以用来控制 Pod 在节点上的调度行为。它们的区别在于:

  • Node Affinity 是在调度时限制 Pod 的位置,基于节点的标签来调度 Pod。
  • Taints and Tolerations 用来防止 Pod 被调度到带有特定污点的节点,或者让 Pod 能容忍特定节点的污点。

Node Affinity 示例:

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
        - matchExpressions:
            - key: "kubernetes.io/hostname"
              operator: In
              values:
                - node1
                - node2

标签:扩容,CPU,扩缩容,数量,自动,节点,HPA,Pod
From: https://www.cnblogs.com/leojazz/p/18682333

相关文章

  • Pod调度方式(下)
    6.Pod调度之nodeSelector1.作用nodeSelector是Kubernetes的一种简单的节点调度策略,通过基于节点的标签来调度Pod。每个节点可以拥有多个标签,nodeSelector用来选择具有特定标签的节点。2.实战案例2.1给节点打标签在这个案例中,我们给所有节点都打上了一个school=oldb......
  • Kubeadm 启动原理之静态 Pod 技术
    Kubeadm启动原理之静态Pod技术1.作用静态Pod是一种特殊的KubernetesPod类型,允许你在不通过kubectl命令来创建Pod的情况下,通过直接将Pod资源清单放置在Kubelet可识别的目录中来创建Pod。Kubelet会定期检查该目录并自动管理这些Pod。对于kubeadm部署方式来......
  • MarsCode青训营打卡Day5(2025年1月18日)|稀土掘金-148.小A的子数组权值、304.计算特定条
    资源引用:148.小A的子数组权值304.计算特定条件下的四元组数量今日小记:148.题既可以如笔者给出的题解来遍历全部的子数组,也可以按照遍历权值的方式通过滑动窗口来实现,两种解题方法的时间复杂度相同,但前者的操作更为简单。304.题与Day4的三元组一题有相似之处,均通过将多元......
  • 2010-2022年地级市新增国家级、省级新区数量和总量
    2010-2022年中国地级市当年新增国家级、省级新区数量和总量STATA数据dta格式共计2781个新区,包含国家级和省级的开发区,指由国务院和省、自治区、直辖市人民政府批准在城市规划辖区内设立的开发区,具有国家或省级实行的特定的优惠政策,包含经济技术开发区、保税区、高新技术产业......
  • 工单主替料自动分配数量
    *&---------------------------------------------------------------------**&ReportZPPR0045*&---------------------------------------------------------------------**&*&-----------------------------------------------------------------......
  • 【LeetCode】力扣刷题热题100道(31-35题)附源码 搜索二维矩阵 岛屿数量 腐烂的橙子 课程
    一、搜索二维矩阵编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。可以使用从右上角开始搜索的方法来有效地找到目标值。选择起始位置:从矩阵的右上角开始。......
  • 905 路径数量统计
    //905路径数量统计.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/22/problem/1044给你一张有向图,图中可能存在重边和自环,请求出从点u出发经过恰好k条边后到达点v的通路的条数。由于答案可能很大,请输出答案模109+7......
  • LeetCode 1773. 统计匹配检索规则的物品数量
    在这个问题中,我们被要求统计一个物品数组中满足特定检索规则的物品数量。每个物品由其类型、颜色和名称定义,而检索规则由规则键和规则值指定。我们的任务是找出数组中满足这些规则的物品数量。问题描述解题思路定义索引映射:首先,我们需要定义一个映射,将规则键("type"、"color......
  • LeetCode题练习与总结:省份数量--547
    一、题目描述有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 nxn 的矩阵 isConnected ,其......
  • 深入理解Kubernetes Pod生命周期
    目录前言:1.Pod概述2.Pod生命周期的各个阶段2.1Pending(待定)2.2Running(运行中)2.3Succeeded(成功)2.4Failed(失败)2.5Unknown(未知)3.Pod状态的转变4.Pod的重启策略5.Pod的终止过程6.容器的管理与生命周期6.1容器的生命周期6.2健康检查与容器管理6.3......