Pod数量的扩缩容

news/2025/1/20 18:57:29/文章来源:https://www.cnblogs.com/leojazz/p/18682333

在 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: stressimage: some-stress-imageresources:requests:cpu: 200mmemory: 100Milimits:cpu: 0.5memory: 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-stressnamespace: default
spec:maxReplicas: 10minReplicas: 2metrics:- resource:name: cputarget:averageUtilization: 85type: Utilizationtype: ResourcescaleTargetRef:apiVersion: apps/v1kind: Deploymentname: 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: 3selector: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: dbpolicyTypes:- Ingressingress:- from:- podSelector:matchLabels:role: frontend

9. 服务发现与负载均衡

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

示例:

apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app: myappports:- protocol: TCPport: 8080targetPort: 8080type: 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: Invalues:- node1- node2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/872277.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BUU SQL COURSE 2

BUU SQL COURSE 2 BUU SQL COURSE 2 和前面那题差不多,但是注一下找到的登录成功但是显示 fault。 注一下别的看一下,在另一个数据库里找到了 flag。本文来自博客园,作者:Maplisky,转载请注明原文链接:https://www.cnblogs.com/lbh2021/p/18682313

PotPlayer 配置安装

目录一、下载1、官网链接2、微软商店 Microsoft Store二、安装1、双击安装包2、选择字体3、安装向导下一步4、接收许可协议5、选择组件及关联6、选择安装位置7、硬解选项三、设置1、关闭自动更新2、左键单双击设置3、视频下自动隐藏3.1、效果对比4、播放信息显示设置4.1、效果5…

2024年春秋杯网络安全联赛冬季赛部分wp

部分附件下载地址: https://pan.baidu.com/s/1Q6FjD5K-XLI-EuRLhxLq1Q 提取码: jay1 Misc day1-简单算术 根据提示应该是异或下载文件是一个字符串,写个代码字符串异或解密,由于需要密钥,所以先对单字节密钥进行爆破解密 爆破出flag代码如下: cipher_text = "ys~xdg/…

大夏龙雀DX-WF25(ESP32C2)蓝牙WIFI模块试用体验

模块尺寸跟引脚兼容常见的ESP8266 12-F模块,使用非常简单,vcc接3.3v,gnd接地,rx连接ch340的tx,tx连接ch340的rx即可。 如果需要通过urat下载程序,只需要把io9的引脚接地就行(下载完程序记得断开io9跟gnd的连接,否则程序无法运行)。芯片用的是ESP32C2(ESP8684),很遗…

1.20 前端连接数据库

今天完成了项目的网页前端与后端数据库的连接,已经能够将前端填写的内容添加到mysql数据库 例如页面如下:数据库内容:明天开始编写下一个功能

【vjudge训练记录】大一寒假专项训练——枚举算法

训练情况A题 给定 \((x,y)\),倒着枚举地毯的范围是否覆盖 \((x,y)\),如果覆盖直接输出,如果全部枚举完都没有则输出 -1点击查看代码 #include <bits/stdc++.h> // #define int long long #define endl \nusing namespace std;void solve(){int n; cin>>n;int x[…

Khepri C2 framework beacons记录(之前的)

1、背景 在查看进程时发现可疑隐藏进程,名称为.test(.test.93627),隐藏文件,很可疑,于是查了下进程日志发现如下:/private/tmp/.test /private/var/db/oah/4b8f81eadefb42da07e9e88fa7905df57faec82d8621008e0ae4a04d81e2169f/bb9595accf35a51de80f42e656bdb2217238af58…

(重要***)查询自己需要的SQL语句

凡是指标相关的,先清空相关干扰条件,然后点击确认,比如加载性能里的列表页面,要查慢加载次数这个指标这个时候去这个数据库 写SQL语句select* fromquery_log ql whereql.user_name = sheng.yu-n@msxf.com order byexec_time desc limit 50然后找到自己对应操作的SQL 通过结…

最强截图录屏工具ShareX v17.0.0 中文绿色版

软件介绍 ShareX 是一款功能强大的屏幕截图和屏幕录制工具,可用于创建高质量的屏幕截图、动画 GIF 和屏幕录像,并提供多种上传选项,使用户能够轻松地将它们共享到互联网上。除此之外,它还支持多种自定义功能,例如图像编辑、颜色拾取、OCR 文字识别等。软件功能快速截图:简…

动态可视化:一步步拆解LSTM和GRU

转自:https://zhuanlan.zhihu.com/p/47907312 编者按:关于LSTM,之前我们已经出过不少文章,其中最经典的一篇是chrisolah的《一文详解LSTM网络》,文中使用的可视化图片被大量博文引用,现在已经随处可见。但正如短视频取代纯文字阅读是时代的趋势,在科普文章中,用可视化取…

【大屏可视化】系统(Vue3 + ECharts5)快速实现和应用 ️

🎶【大屏可视化】系统(Vue3 + ECharts5)🎶这八部~~按照,难易的顺序来进行绘制!!!💯横向柱形图竖向柱形图雷达图环形图关系图数据云图数据展示图地图可视化02:基于 vite 与 tailwindcss 创建大屏可视化项目 1,基于 vite 创建项目,使用: npm create vite@latest …

Markdown转Beamer进阶

接上一篇介绍的基本Markdown通过pandoc编译转为Beamer风格文档的文章,本文主要介绍一些Markdown转Beamer其中的进阶用法。如Mermaid流程图,和Algorithms算法伪代码的使用等。技术背景 在前面的一篇文章中,我们介绍过Markdown转Beamer的基本方法。通过这个方案,我们可以只写…