当前位置: 首页 > news >正文

【云原生kubernetes】k8s数据存储之Volume使用详解

目录

一、什么是Volume

二、k8s中的Volume

三、k8s中常见的Volume类型

四、Volume 之 EmptyDir 

4.1 EmptyDir 特点

4.2 EmptyDir 实现文件共享

4.2.1 关于busybox

4.3 操作步骤

4.3.1 创建配置模板文件yaml

4.3.2 创建Pod

4.3.3 访问nginx使其产生访问日志

4.3.4 查看容器日志

五、Volume 之 hostPath 

5.1 hostPath 概述

5.2 hostPath类型

5.3 hostPath 操作演示

5.3.1 创建模板配置文件

5.3.2 使用apply命令创建pod

5.3.3 访问nginx使其产生访问日志

5.3.4 查看容器输出日志

5.3.5 查看挂载目录日志文件

5.3.6 删除当前的pod

5.4 emptyDir和hostPath的对比

六、Volume 之 ConfigMap 

6.1 ConfigMap需求场景

6.2 ConfigMap简介

6.3 ConfigMap 创建操作演示

6.3.1 使用命令行创建

6.3.2 查看创建的configmap

6.3.3 使用yaml配置文件创建

6.3.4 查看configmap详情

6.4 ConfigMap 使用操作演示

6.4.1 使用配置文件创建pod

6.4.2 验证configmap中配置的值

七、Volume 之 Secret 

7.1 Secret 简介

7.2 secret 常见类型

7.2.1 dockerconfigjson

7.2.2 Service Account

7.3 Secret  Opaque使用

7.3.1 创建模板配置文件

7.3.2 使用apply命令创建secret

7.3.3 查看my-secret详细信息

7.3.4 创建pod

7.3.5 查看secret信息


一、什么是Volume

通过之前学习了解到,k8s中Pod是最小的运行单元,Pod中运行的是一个个容器,但是容器的生命周期可能很短,被频繁地创建和销毁。

在学习docker的时候,创建一个容器,如果没有指定容器的数据卷,容器中的文件在磁盘上通常是临时存放的,这就给容器中运行的重要应用程序带来了一些问题 ,比如像下面的场景:

  • 当容器崩溃时文件丢失,kubelet 会重新启动容器,但容器会以干净的状态重启,之前保存在容器中的数据也会被清除 ;
  • 当在一个 Pod 中同时运行多个容器时,常常需要在这些容器之间共享文件 ;

基于这些问题,k8s中就出现了“卷”这个组件来解决

Kubernetes 卷(Volume) 这一抽象概念能够解决这两个问题,卷的核心是包含一些数据的目录,Pod 中的容器可以访问该目录

二、k8s中的Volume

关于k8s中卷的总结:

  • Volume是k8s抽象出来的对象,它被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下 ;
  • kubernetes通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储 ;
  • Volume的生命周期不与Pod中单个容器的生命周期相关,当容器终止或者重启时,Volume中的数据也不会丢失;
  • K8S可以支持许多类型的卷,Pod 也能同时使用任意数量的卷;

三、k8s中常见的Volume类型

k8s中提供了很多种类型的Volume,下面列举一些常用的类型:

  • 常规存储:EmptyDir、HostPath ;
  • 高级存储:PV、PVC ;
  • 配置存储:ConfigMap、Secret ;
  • 其他:网络存储系统 NFS、CIFS,包括云服务商提供的、本地、分布式 ;

接下来,针对日常业务中使用较多的Volume,通过实例一一演示下各自的使用。

四、Volume 之 EmptyDir 

4.1 EmptyDir 特点

  • 当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,只要 Pod 在该节点上运行卷就一直存在 ;
  • 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除 ;
  • 容器崩溃并不会导致 Pod 被从节点上移除,所以容器崩溃时 emptyDir 卷中的数据是安全的;

使用场景:临时缓存空间,存储一些运行过程中的中继日志;

4.2 EmptyDir 实现文件共享

如图所示,我们的需求是,创建一个类型为EmptyDir的Volume,实现两个容器日志的共享;

4.2.1 关于busybox

1、是⼀个集成了三百多个最常⽤Linux命令和⼯具的软件;
2、包含了简单的⼯具,例如lscatecho等等,还包含了⼀些更复杂的⼯具,例grepfindtelnet等;

4.3 操作步骤

下面通过案例演示下使用的步骤

4.3.1 创建配置模板文件yaml

在当前目录下创建一个volume-emptydir.yaml 的文件,配置如下内容:

apiVersion: v1
kind: Pod
metadata:name: test-volume-emptydirnamespace: default
spec:containers:- name: test-nginximage: nginx:1.20ports:- containerPort: 80volumeMounts:  # 将nginx-log-volume挂在到nginx容器中,对应的目录为 /var/log/nginx- name: test-log-volumemountPath: /var/log/nginx- name: test-busyboximage: busybox:1.35.0 command: ["/bin/sh","-c","tail -f /usr/local/test/access.log"] # 容器启动后初始命令,读取指定文件中内容volumeMounts:  # 将nginx-log-volume挂在到busybox容器中,对应的目录为 /logs- name: test-log-volumemountPath: /usr/local/testvolumes: # 这里声明volume存储劵, name为nginx-log-volume,类型是emptyDir- name: test-log-volumeemptyDir: {}

配置中的关键位置如下:

4.3.2 创建Pod

使用apply命令执行pod的创建,创建成功后,可以看到在test-volume-emptydir 这个pod里面运行了2个容器;

4.3.3 访问nginx使其产生访问日志

随机访问一下,使nginx中产生部分日志

4.3.4 查看容器日志

使用下面的命令查看容器产生的access.log日志

kubectl logs -f test-volume-emptydir -n default -c test-busybox

五、Volume 之 hostPath 

上面我们聊了EmptyDir的使用,相信实际操作之后的同学应该能看出来,由于EmptyDir创建的这个Volume是一个虚拟的路径,所以当其销毁后,pod中容器产生的数据也就随之销毁了,即无法真正实现数据的落盘持久化,于是我们在想,是否可以做到下面这样呢?

当然是可以的,这就是接下来要说的另一种Volume : hostPath;

5.1 hostPath 概述

  • emptyDir中数据没做持久化,随着Pod的结束而销毁,需要持久化到磁盘则选其他方式 ;
  • hostPath类型的磁盘就是挂在了主机的一个文件或者目录 ;
  • 某些应用需要用到docker的内部文件,这时只需要挂在本机的/var/lib/docker作为hostPath ;

5.2 hostPath类型

根据使用场景的不同,又可以细分成多个类型

  • Directory 给定的目录路径必须存在 ;
  • DirectoryOrCreate 如果给定路径不存在,将根据需要在那里创建一个空目录 ;
  • File 给定路径上必须存在对应文件 ;
  • FileOrCreate 如果给定路径不存在,将根据需要在那里创建一个空文件 ;

5.3 hostPath 操作演示

5.3.1 创建模板配置文件

在当前目录下创建一个名叫volume-hostpath.yaml的配置文件,内容如下:

apiVersion: v1
kind: Pod
metadata:name: hostpath-volume-testnamespace: default
spec:containers:- name: test-nginximage: nginx:1.20ports:- containerPort: 80volumeMounts:  # 将nginx-log-volume挂在到nginx容器中,对应的目录为 /var/log/nginx- name: test-log-volumemountPath: /var/log/nginx- name: test-busyboximage: busybox:1.35.0 command: ["/bin/sh","-c","tail -f /usr/local/test/access.log"] # 容器启动后初始命令,读取指定文件中内容volumeMounts:  # 将nginx-log-volume挂在到busybox容器中,对应的目录为 /logs- name: test-log-volumemountPath: /usr/local/testvolumes: # 这里声明volume存储劵, name为test-log-volume,类型是hostPath- name: test-log-volumehostPath:path: /usr/local/testtype: DirectoryOrCreate #如果给定路径不存在,将根据需要在那里创建一个空目录

主要的配置和上面的emptyDir的案例中的差不多,最后的volumes类型那里改成hostPath相关的参数;

5.3.2 使用apply命令创建pod

创建成功后,可以看到产生了一个hostpath开头的一个Pod,里面包含两个容器;

5.3.3 访问nginx使其产生访问日志

5.3.4 查看容器输出日志

这这里注意使用你自己定义的那个名称

kubectl logs -f hostpath-volume-test -n default -c test-busybox

5.3.5 查看挂载目录日志文件

工作节点查看对应的挂载目录的日志文件,登录工作节点的服务器,可以看到对应的nginx日志文件也在里面了;

5.3.6 删除当前的pod

删除pod之后发现工作节点目录下的日志文件依然存在

5.4 emptyDir和hostPath的对比

通过上面的演示,最后来对比一下emptyDir和hostPath使用上的异同点:

  • 两者都是本地存储卷方式 ;
  • emptyDir是临时存储空间,完全不提供持久化支持;
  • hostPath的卷数据是持久化在node节点的文件系统中的,即便pod已经被删除了,volume卷中的数据还留存在node节点上;

六、Volume 之 ConfigMap 

6.1 ConfigMap需求场景

很多应用在其初始化或运行期间要依赖一些配置信息 ,并且在大多数时候, 存在要调整配置参数所设置的数值的需求,而ConfigMap是Kubernetes 用来向应用 Pod 中注入配置数据的一种方法 ;

6.2 ConfigMap简介

  • 是K8S的一种API对象,用来把【非加密数据】保存到键值对中,比如etcd ;
  • 可以用作环境变量、命令行参数等,将环境变量、配置信息和容器镜像解耦,便于应用配置的修改 ;

使用方式

kubectl create configmap 命令,基于目录、 文件或者键值对来创建 ConfigMap

如下示例:

kubectl create configmap NAME --from-literal=key1=value1 --from-literal=key2=value2

6.3 ConfigMap 创建操作演示

6.3.1 使用命令行创建

使用下面的命令进行ConfigMap的创建

kubectl create configmap test-config --from-literal=account=test --from-literal=password=123456

6.3.2 查看创建的configmap

kubectl get configmap test-config -o yaml

6.3.3 使用yaml配置文件创建

在当前目录下创建一个 test-configmap.yaml的文件,核心配置内容如下:

apiVersion: v1
kind: ConfigMap
metadata:name: congge-configmapnamespace: default
data:info: username:conggepassword:123456

使用apply命令执行创建

6.3.4 查看configmap详情

kubectl describe cm congge-configmap -n default

6.4 ConfigMap 使用操作演示

上面演示了两种创建configmap的方式,configmap创建出来后怎么使用呢?简单来说,只需要开启一个pod,将这个configmap挂载进去使用即可;

6.4.1 使用配置文件创建pod

注意,里面的Volume使用上文yaml中创建的那个configmap的名字:

apiVersion: v1
kind: Pod
metadata:name: pod-configmapnamespace: default
spec:containers:- name: nginximage: nginx:1.20volumeMounts: # configmap挂载的目录- name: configmountPath: /configvolumes: # 声明configmap- name: configconfigMap:name: congge-configmap

执行apply命令进行创建,然后检查下是否创建成功;

6.4.2 验证configmap中配置的值

进入pod容器

kubectl exec -it pod-configmap -n default -- /bin/sh

进入配置文件中的挂载目录 /config,查看配置信息

七、Volume 之 Secret 

有些配置需要加密存储,ConfigMap只能使用明文保存,因此ConfigMap就不适合了;

7.1 Secret 简介

Secret 作用

  • 用来保存敏感信息,例如密码、秘钥、证书、OAuth 令牌和 ssh key等 ;
  • 就不需要把这些敏感数据暴露到镜像或者Pod中 ;

不管是哪种Volume,最终都是为Pod服务的,对于Pod来说,可以用三种方式之一来使用 Secret:

  • 作为挂载到一个或多个容器上的卷 中的文件 ;
  • 作为容器的环境变量 ;
  • 由 kubelet 在为 Pod 拉取镜像时使用 ;

7.2 secret 常见类型

下面列举secret中常用的几种类型

7.2.1 dockerconfigjson

用来存储私有 docker registry的认证信息

7.2.2 Service Account

1、只要与Kubernetes API有交互的Pod,都会自动拥有此种类型的Secret;

2、K8S自动创建,并且会自动挂载到Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中;

7.2.3 Opaque

加密类型为base64,其特点就是将明文改为了密文

7.3 Secret  Opaque使用

下面以Secret中Opaque这种类型进行说明,首先用一个字符串做下测试,简单来说,就是将字符串进行base64编码,得到一串类似于密文的字符串;

7.3.1 创建模板配置文件

在当前目录下创建一个secret.yaml的配置文件,内容如下,其中,username和password用的就是上面测试中看到的:

apiVersion: v1
kind: Secret
metadata:name: my-secret
type: Opaque
data:username: YWRtaW4=password: MTIzNDU2

7.3.2 使用apply命令创建secret

创建成功后,可以顺便使用get查看下创建的secret;

7.3.3 查看my-secret详细信息

使用下面的命令进行查看

kubectl get secret my-secret -o yaml

7.3.4 创建pod

创建一个新的pod并使用上面这个secret,在当前目录下,创建一个名叫pod-secret-volume.yaml的配置文件,内容如下:

apiVersion: v1
kind: Pod
metadata:name: pod-secret
spec:containers:- name: nginximage: nginx:1.20volumeMounts: # secret挂载- name: congge-configmountPath: /etc/secretvolumes:- name: congge-configsecret:secretName: my-secret

使用apply命令执行并创建pod

7.3.5 查看secret信息

在pod中的secret信息实际已经被解密,使用下面的命令进入到pod

kubectl exec -it pod-secret -- /bin/sh

查看指定目录下secret中配置的username和password,可以看到,在pod中,加密的信息已被解密了;

相关文章:

【云原生kubernetes】k8s数据存储之Volume使用详解

目录 一、什么是Volume 二、k8s中的Volume 三、k8s中常见的Volume类型 四、Volume 之 EmptyDir 4.1 EmptyDir 特点 4.2 EmptyDir 实现文件共享 4.2.1 关于busybox 4.3 操作步骤 4.3.1 创建配置模板文件yaml 4.3.2 创建Pod 4.3.3 访问nginx使其产生访问日志 4.3.4 …...

SerDes---CDR技术

1、为什么需要CDR 时钟数据恢复主要完成两个工作,一个是时钟恢复,一个是数据重定时,也就是数据的恢复。时钟恢复主要是从接收到的 NRZ(非归零码)码中将嵌入在数据中的时钟信息提取出来。 2、CDR种类 PLL-Based CDROve…...

如何实现在on ethernetPacket中自动回复NDP response消息

对于IPv4协议来说,如果主机想通过目标ipv4地址发送以太网数据帧给目的主机,需要在数据链路层填充目的mac地址。根据目标ipv4地址查找目标mac地址,这是ARP协议的工作原理 对于IPv6协议来说,根据目标ipv6地址查找目标mac地址,它使用的不是ARP协议,而是邻居发现NDP(Neighb…...

CSS清楚浮动

先看看关于浮动的一些性质 浮动使元素脱离文档流 浮动元素可以设置宽高,在CSS中,任何元素都可以浮动,浮动元素会生成一个块级框,而不论其本身是何种元素。 如果没有给浮动元素指定高度,,那么它会以内容的…...

HTTPS详解(原理、中间人攻击、CA流程)

摘要我们访问浏览器也经常可以看到https开头的网址,那么什么是https,什么是ca证书,认证流程怎样?这里一一介绍。原理https就是httpssl,即用http协议传输数据,数据用ssl/tls协议加密解密。具体流程如下图&am…...

EventLoop机制

JavaScript 是单线程的语言 JavaScript 是一门单线程执行的编程语言。也就是说,同一时间只能做一件事情。 单线程执行任务队列的问题: 如果前一个任务非常耗时,则后续的任务就不得不一直等待,从而导致程序假死的问题。 同步任…...

倒立摆建模

前言 系统由一辆具有动力的小车和安装在小车上的倒立摆组成,系统是不稳定,我们需要通过控制移动小车使得倒立摆保持平衡。 具体地,考虑二维情形如下图,控制力为水平力FFF,输出为角度θ\thetaθ以及小车的位置xxx。 力…...

SpringSecurity支持WebAuthn认证

WebAuthn是无密码身份验证技术,解决了密码泄露的风险,主流的浏览器都支持。有很多开源的类库实现了WebAuthn规范,Java下流行的类库有:webauthn4jjava-webauthn-serververtx-authSpring Security官方暂时未支持WebAuthn&#xff0c…...

深度学习技巧应用3-神经网络中的超参数搜索

大家好,我是微学AI,今天给大家带来深度学习技巧应用3-神经网络中的超参数搜索。 在深度学习任务中,一个算法模型的性能往往受到很多超参数的影响。超参数是指在模型训练之前需要我们手动设定的参数,例如:学习率、正则…...

【信号量机制及应用】

水善利万物而不争,处众人之所恶,故几于道💦 目录 一、信号量机制 二、信号量的应用 >利用信号量实现进程互斥   >利用信号量实现前驱关系   >利用记录型信号量实现同步 三、例题 四、参考 一、信号量机制 信号量是操作系统提…...

围棋高手郭广昌的“假眼”棋局

(图片来源于网络,侵删)文丨熔财经作者|易不二2022年,在复星深陷债务压顶和变卖资产漩涡的而立之年,“消失”已久的郭广昌,在质疑与非议声中回国稳定军心,强调复星将在未来的五到十年迎来一个全新…...

学成教育-统一异常处理实现

一、统一异常处理实现 统一在base基础工程实现统一异常处理&#xff0c;各模块依赖了base基础工程都 可以使用。 首先在base基础工程添加需要依赖的包&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-web</…...

JNI内通过参数形式从C/C++中传递string类型数据至Java层

目录 0 前言 1 string类型参数形式传值 2 测试和结果 0 前言 类似之前我写过的两篇文章&#xff1a;一篇介绍了在JNI中基础类型int的传值方式&#xff1b;一篇详细梳理了在JNI层中多维数组的多种传值方式。 JNI内两种方式从C/C中传递一维、二维、三维数组数据至Java层详细…...

自动化测试——执行javaScript脚本

文章目录一、点击元素(对应的click())二、input标签对应的值&#xff08;对应的send_keys()&#xff09;修改时间控件的属性值&#xff1a;三、元素的文本属性四、js脚本滚动操作一、点击元素(对应的click()) 使用场景&#xff1a;当使用显性等待不能解决问题时 代码中实现点击…...

常用十种算法滤波

十种算法滤波1. 限幅滤波法&#xff08;又称程序判断滤波法&#xff09;2. 中位值滤波法3. 算术平均滤波法4. 递推平均滤波法&#xff08;又称滑动平均滤波法&#xff09;5. 中位值平均滤波法&#xff08;又称防脉冲干扰平均滤波法&#xff09;6. 限幅平均滤波法7. 一阶滞后滤波…...

IO多路复用

一、概述 IO多路复用&#xff1a;进程同时检查多个文件描述符&#xff0c;以找出他们中的任何一个是否可执行IO操作。 核心&#xff1a;同时检查多个文件描述符&#xff0c;看他们是否准备好了执行IO操作。文件描述符就绪状态的转化是通过一些IO事件来触发。 二、水平触发和…...

Python中的错误是什么,Python中有哪些错误

7.1 错误(errors) 由于Python代码通常是人类编写的&#xff0c;那么无论代码是在解释之前还是运行之后&#xff0c;或多或少总会出现一些问题。 在Python代码解释时遇到的问题称为错误&#xff0c;通常是语法和缩进问题导致的&#xff0c;这些错误会导致代码无法通过解释器的解…...

记录自己开发一款小程序中所遇到的问题(uniapp+uview)(持续更新)

每次开发小程序中&#xff0c;都会遇到各种各样的问题。但是有的问题已经遇到过了&#xff0c;但是遇到的时候还是要各种的问度娘。 特此出这篇文章&#xff0c;方便自己也是方便大家。 仅供参考 1. u-collapse的样式在h5中正常&#xff0c;但是运行到微信小程序中样式就乱了…...

华为机试 HJ43 迷宫问题

经典迷宫问题dfs 题目链接 描述 定义一个二维数组 N*M &#xff0c;如 5 5 数组下所示&#xff1a; int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走…...

数据结构|链表

概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。单链表的形式就像一条铁链环环相扣它与顺序表最大的不同是&#xff0c;单链表的数据存储是在不连续的空间&#xff0c;存储的数据里面含有…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...