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

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部署到集群中

实验部署

bash 复制代码
将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万个

实验举例:

bash 复制代码
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个

bash 复制代码
kubectl describe ns test1
#查看命名空间的限制

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

实验举例:

bash 复制代码
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上观察扩容之后,阀值是否会下降?

实验举例:

bash 复制代码
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自动伸缩

相关推荐
缺点内向3 小时前
Java:创建、读取或更新 Excel 文档
java·excel
带刺的坐椅4 小时前
Solon v3.4.7, v3.5.6, v3.6.1 发布(国产优秀应用开发框架)
java·spring·solon
四谎真好看5 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程5 小时前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t5 小时前
ZIP工具类
java·zip
lang201509286 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
pengzhuofan7 小时前
第10章 Maven
java·maven
百锦再7 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说7 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多7 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring