k8s---pod的水平自动伸缩HPA

news/2024/6/3 18:49:14 标签: kubernetes, java, 容器

HPA:Horizontal Pod Autoscaling是pod的水平自动伸缩。是k8s自带的模块

pod占用CPU的比率到达一定的阈值会触发伸缩机制。

replication controller:副本控制器。控制pod的副本数

deployment controller:节点控制器。部署pod

hpa控制副本的数量以及控制如何部署pod

  1. hpa基于kube-controller-manager服务。周期性检测pod的cpu使用率,默认是30秒

  1. hpa和replication controller以及deployment controller都属于k8s的资源对象。通过跟踪分析副本控制器和deployment的pod负载变化。针对性的调整目标副本数。

阀值:正常情况下,pod的副本数,以及达到阀值之后,pod的扩容最大数量。

  1. metrics-server部署到集群中

实验部署

将metrics-server传入每个节点
docker load -i metrics-server.tar

master01---
kubectl apply -f components.yaml
vim hpa-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: centos-test
  labels:
    test: centos1
spec:
  replicas: 1
  selector:
    matchLabels:
      test: centos1
  template:
    metadata:
      labels:
        test: centos1
    spec:
      containers:
        - name: centos
          image: centos:7
          command: ["/bin/bash", "-c", "yum -y install epel-release;yum -y install stress;sleep 3600"]
          resources:
            limits:
              cpu: 1000m
              memory: 512Mi
#设置资源限制。使用hpa必须添加资源限制字段,否则无法判断

---

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-centos
spec:
  scaleTargetRef:
    apiVersion: apps/v1
#表示需要监控的类型是什么,基于什么控制器创建的
    kind: Deployment
    name: centos-test
#这里表示你需要监控谁
  minReplicas: 1
#表示最小有几个
  maxReplicas: 5
#超过副本最大有几个
  targetCPUUtilizationPercentage: 50
#设定cpu使用的阀值

kubectl apply -f hpa-test.yaml

进入容器使容器占满2个cpu测试

此时停止扩充测试缩容

HPA的规则

  1. 定义pod的时候必须要有资源限制,否则HPA无法进行监控

  2. 扩容是即时的,只要超过阀值就会立刻扩容,不是立刻扩容到最大副本数。他会在最小值和最大值波动,如果扩容数量满足了需求,则不会在扩容。

  3. 缩容是缓慢的。如果业务的峰值较高,回收的策略太积极的话,可能会产生业务的崩溃。

周期性的获取数据,缩容的机制问题。

如果业务的峰值较高,回收的策略太积极的话,可能会产生业务的崩溃。

pod的副本数扩缩容有两种方式:

1、 手动的方式修改控制器的副本数。

  1. 命令行可以通过 kubectl scale deployment pod名称 --replicas=5

  2. 修改yaml文件。通过apply -f部署更新

2、 自动扩缩容HPA

hpa监控的是cpu

资源限制

pod的资源限制:在部署pod的时候加入resources字段,通过limits/request来对pod进行限制。

除了pod的资源限制还有命名空间的资源限制

命名空间资源限制

如果你有一个lucky-cloud项目部署在test1的命名空间。如果lucky-cloud不做限制或者命名空间不做限制,他依然会占满所有集群资源。

k8s集群部署pod的最大数量:1万个

实验举例:

vim ns.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: centos-test2
  namespace: test1
  labels:
    test: centos2
spec:
  replicas: 11
  selector:
    matchLabels:
      test: centos2
  template:
    metadata:
      labels:
        test: centos2
    spec:
      containers:
        - name: centos
          image: centos:7
          command: ["/bin/bash", "-c", "yum -y install epel-release;yum -y install stress;sleep 3600"]
          resources:
            limits:
              cpu: 1000m
              memory: 512Mi

---

apiVersion: v1
kind: ResourceQuota
metadata:
  name: ns-resource
  namespace: test1
spec:
  hard:
#硬限制
    pods: "10"
#表示在这个命名空间内只能部署10个pod
    requests.cpu: "2"
#最多只能占用多个个cpu
    requests.memory: 1Gi
#最多只能占用多少内存
    limits.cpu: "4"
#最大需要多少cpu
    limits.memory: 2Gi
#最大需要多少内容
    configmaps: "10"
#当前命名空间内能创建最大的configmap的数量 10个
    persistentvolumeclaims: "4"
#当前命名空间只能使用4个pvc
    secrets: "9"
#创建加密的secrets。只能9个
    services: "5"
#创建service只能5个
    services.nodeports: "2"
#nodeport类型的svc只能2个

设置副本数为11个测试。当命名空间限制了之后,最多只能部署10个

kubectl describe ns test1
#查看命名空间的限制

通过命名空间的方式对容器进行限制

实验举例:

vim ns2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: centos-test
  namespace: test2
  labels:
    test: centos2
spec:
  replicas: 1
  selector:
    matchLabels:
      test: centos1
  template:
    metadata:
      labels:
        test: centos1
    spec:
      containers:
        - name: centos
          image: centos:7
          command: ["/bin/bash", "-c", "yum -y install epel-release;yum -y install stress;sleep 3600"]

---

apiVersion: v1
kind: LimitRange
#表示使用limitrange来进行资源控制的类型
metadata:
  name: test2-limit
  namespace: test2
spec:
  limits:
  - default:
      memory: 512Mi
      cpu: "1"
    defaultRequest:
      memory: 256Mi
      cpu: "0.5"
    type: Container
#对所有部署在这个命名空间内的容器统一进行资源限制
#default: limit
#defaultRequest: request
#type: Container、Pod、Pvc都可以

通过命名空间对pod进行统一限制:

好处是不需要对每个pod进行限制

缺点是不够灵活

HPA自动伸缩如果使用nodeName的方式将固定在一个node上观察扩容之后,阀值是否会下降?

实验举例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: centos-test
  labels:
    test: centos1
spec:
  replicas: 1
  selector:
    matchLabels:
      test: centos1
  template:
    metadata:
      labels:
        test: centos1
    spec:
      containers:
        - name: centos
          image: centos:7
          command: ["/bin/bash", "-c", "yum -y install epel-release;yum -y install stress;sleep 3600"]
          resources:
            limits:
              cpu: 1000m
              memory: 512Mi
      nodeName: node01
#设置资源限制。使用hpa必须添加资源限制字段,否则无法判断

---

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-centos
spec:
  scaleTargetRef:
    apiVersion: apps/v1
#表示需要监控的类型是什么,基于什么控制器创建的
    kind: Deployment
    name: centos-test
#这里表示你需要监控谁
  minReplicas: 1
#表示最小有几个
  maxReplicas: 5
#超过副本最大有几个
  targetCPUUtilizationPercentage: 50
#设定cpu使用的阀值

占满第二个pod测试

他们都处在同一个节点上

查看是阀值是否会下降

测试即使在同一个node节点上阀值还是会下降。实验完成

总结

HPA自动扩缩容

命名空间的两种方式:

  1. ResourceQuota:可以对命名空间进行资源限制

  2. LimitRange:直接声明在命名空间中创建的pod,容器的资源限制。这是一种统一限制。所有的pod都受这个条件的制约。

只要是在命名空间内不管创建多少,都需要使用我声明的资源限制。

pod的资源限制:resources、limit

  1. pod的资源限制是我们创建时候声明好的,这时必加选项。

  1. 对命名空间、使用cpu、内存一定会做限制

命名空间的资源限制:ResourceQuota

  1. 一般是对命名空间的cpu和内存做限制

命名空间统一资源限制:LimitRange

核心:pod一定要做资源限制否则会占用集群的全部资源,命名空间也需要做限制否则还是会占用集群的全部资源。防止整个集群的资源被一个服务或者一个命名空间占满。

HPA自动伸缩


http://www.niftyadmin.cn/n/5343277.html

相关文章

Android:registerForActivityResult

在《Android:FragmentActivity》中我们提到过Fragment中的onActivityResult已经废弃了,推荐使用registerForActivityResult去注册一个ActivityResultContract契约,从而启动一个forResult的Activity来达到目的,所以这里就看看这个流程是如何进行的。 场景:MainActivity中嵌…

又有Hindawi!剔除4本期刊!Scopus期刊更新(附下载)

2024年1月Scopus期刊目录更新 Scopus官网近日更新了11月期刊目录,此次更新与上次(2023年12月)相比,本次有4本期刊被剔除(Discontinued titles December 2023)。目前Scopus 来源出版物列表(Scop…

java集合ArrayList和HashSet的fail-fast与fail-safe以及ConcurrentModificationException

在 java 的集合工具类中&#xff0c;例如对 ArrayList 或者 HashSet 进行删除元素后再遍历元素时&#xff0c;会抛出 ConcurrentModificationException 异常。 fail-fast ArrayList public class TestList {public static void main(String[] args) {ArrayList<Integer>…

PostgreSQL 的对象层次

所有的数据库离开数据量来谈性能都是耍流氓。 就你那几万条的数据库&#xff0c;用啥都行&#xff0c;典型的就是怎么方便怎么来。 不过 PostgreSQL 上手确实比 MySQL 概念更多。 PostgreSQL 比 MySQL 多了一层。 PostgreSQL 是从PostgreSQL 是从 Database&#xff0c;到 S…

使用Go进行HTTP性能优化

Go语言&#xff0c;也被称为Golang&#xff0c;是一种高效且强大的编程语言&#xff0c;特别适合构建高性能的Web应用程序。在处理HTTP请求时&#xff0c;通过一些优化技巧&#xff0c;可以显著提高应用程序的性能。以下是一些使用Go进行HTTP性能优化的方法&#xff1a; 并发处…

网络中黑客攻击使用手段Top25漏洞常见参数,8个WAF绕过,一些用于查找敏感文件的语法

Top25漏洞常见参数,8个WAF绕过,一些用于查找敏感文件的语法,主要包括:执行URL重定向、SQL注入、LFI本地文件包含、SSRF服务端请求伪造、XSS跨站脚本攻击等等。 Top25漏洞常见参数 包含以下漏洞的常见参数: XSS跨站脚本攻击 SSRF服务端请求伪造 LFI本地文件包含 SQL注入 …

vue3之echarts3D环柱图

vue3之echarts3D环柱图 效果&#xff1a; 核心代码&#xff1a; <template><div class"container"><div ref"chartRef" class"charts"></div></div> </template><script lang"ts" setup&g…

excel(wps)之vlookup函数合并sheet数据

VLOOKUP函数是Excel中的一个纵向查找函数&#xff0c;它与LOOKUP函数和HLOOKUP函数属于一类函数&#xff0c;在工作中都有广泛应用&#xff0c;例如可以用来核对数据&#xff0c;多个表格之间快速导入数据等函数功能。功能是按列查找&#xff0c;最终返回该列所需查询列序所对应…