Kubernetes----HPA控制器实现动态弹性扩缩容

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: Kubernetes----HPA控制器实现动态弹性扩缩容

一、HPA控制器简介

HPA(Horizontal Pod Autoscaler)控制器可以获取pod利用率,然后和HPA中定义的指标进行对比,同时计算出需要伸缩的具体值,最后实现pod的数量的调整,其实HPA与之前的Deployment一样,也属于一种Kubernetes对象,它通过追踪分析目标pod的负载变化情况,类确定是否需要针对性地调整目标pod的副本数

在这里插入图片描述

二、HPA控制器环境准备

2.1 安装metric-server

(1)参照 Git----安装(CentOS) 首先安装git工具
(2)下载metric-server

git clone -b v0.3.6 https://github.com/kubernetes-incubator/metrics-server

(3)配置yaml文件

cd metrics-server/deploy/1.8+/
vi metrics-server-deployment.yaml

然后按照下图的位置编辑文件,内容如下:

hostNetwork: true
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalNDS,ExternalDNS,ExternalIP

在这里插入图片描述
(4)使用如下命令部署

[root@master 1.8+]# kubectl apply -f ./
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
Warning: rbac.authorization.k8s.io/v1beta1 RoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 RoleBinding
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
Warning: apiregistration.k8s.io/v1beta1 APIService is deprecated in v1.19+, unavailable in v1.22+; use apiregistration.k8s.io/v1 APIService
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
serviceaccount/metrics-server created
deployment.apps/metrics-server created
service/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
[root@master 1.8+]#

查询如下,有metrics-server-669dfc56ff-v6drv 即表示已经部署成功了

[root@master 1.8+]# kubectl get pod -n kube-system
NAME                              READY   STATUS    RESTARTS   AGE
coredns-558bd4d5db-7vbmq          1/1     Running   0          12d
coredns-558bd4d5db-sps22          1/1     Running   0          12d
etcd-master                       1/1     Running   0          12d
kube-apiserver-master             1/1     Running   0          12d
kube-controller-manager-master    1/1     Running   0          12d
kube-flannel-ds-cd9qk             1/1     Running   0          12d
kube-flannel-ds-gg4jq             1/1     Running   0          12d
kube-flannel-ds-n76xj             1/1     Running   0          12d
kube-proxy-g4j5g                  1/1     Running   0          12d
kube-proxy-h27ms                  1/1     Running   0          12d
kube-proxy-tqzjl                  1/1     Running   0          12d
kube-scheduler-master             1/1     Running   0          12d
metrics-server-669dfc56ff-v6drv   1/1     Running   0          56s
[root@master 1.8+]#

(5)此时通过如下命令,可以查询到节点的资源使用情况

[root@master 1.8+]# kubectl top node
W0327 11:53:58.289701    9379 top_node.go:119] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
master   71m          0%     1268Mi          3%
node1    24m          0%     687Mi           2%
node2    23m          0%     721Mi           2%
[root@master 1.8+]#

(6)通过如下命令,可以查看到pod的资源使用情况

[root@master 1.8+]# kubectl top  pod -n kube-system
W0327 11:55:35.833234   10195 top_pod.go:140] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag
NAME                              CPU(cores)   MEMORY(bytes)
coredns-558bd4d5db-7vbmq          1m           13Mi
coredns-558bd4d5db-sps22          1m           13Mi
etcd-master                       9m           26Mi
kube-apiserver-master             22m          297Mi
kube-controller-manager-master    6m           53Mi
kube-flannel-ds-cd9qk             2m           15Mi
kube-flannel-ds-gg4jq             2m           15Mi
kube-flannel-ds-n76xj             1m           16Mi
kube-proxy-g4j5g                  1m           19Mi
kube-proxy-h27ms                  1m           19Mi
kube-proxy-tqzjl                  1m           19Mi
kube-scheduler-master             2m           21Mi
metrics-server-669dfc56ff-v6drv   1m           15Mi
[root@master 1.8+]#

2.2 创建deployment和service

编辑service_deployment.yaml文件,内容如下:

apiVersion: v1
kind: Namespace
metadata:
  name: dev

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
  namespace: dev
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80
          protocol: TCP

---

apiVersion: v1
kind: Service
metadata:
  name: service-nginx
  namespace: dev
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30030
  selector:
    run: nginx
  type: NodePort

使用如下命令创建

[root@master pod_controller]# kubectl apply -f service_deployment.yaml
namespace/dev created
deployment.apps/deploy-nginx created
service/service-nginx created
[root@master pod_controller]#

查看创建的资源如下:

[root@master pod_controller]# kubectl get deployment,pod,service -n dev
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-nginx   3/3     3            3           5m6s

NAME                                READY   STATUS    RESTARTS   AGE
pod/deploy-nginx-66ffc897cf-jhc9w   1/1     Running   0          5m6s

NAME                    TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/service-nginx   NodePort   10.106.128.172   <none>        80:30030/TCP   5m6s
[root@master pod_controller]#

2.3 部署HPA

编辑pc_hpa.yaml文件,内容如下:注意这里把cpu使用率设置为1%是为了测试用。在实际部署中需要根据具体情况去定

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: pc-hpa
  namespace: dev
spec:
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: deploy-nginx

然后使用如下命令创建

[root@master pod_controller]# kubectl apply -f pc_hpa.yaml
horizontalpodautoscaler.autoscaling/pc-hpa created
[root@master pod_controller]#

查看hpa如下

[root@master pod_controller]# kubectl get hpa -n dev
NAME     REFERENCE                 TARGETS        MINPODS   MAXPODS   REPLICAS   AGE
pc-hpa   Deployment/deploy-nginx   <unknown>/1%   1         10        1          5m18s
[root@master pod_controller]#

2.4 压力测试观测HPA控制器

开三个窗口分别对pod,deployment,hpa进行监视分别使用如下命令

kubectl get pod -n dev -w

kubectl get deploy -n dev -w

kubectl get hpa -n dev -w

编写测试脚本 test.sh,用于发送get请求

#! /bin/bash

for((i=1;i<1000000;i++));
do
curl http://192.168.16.40:30030;
done

执行测试脚本,然后观察pod数量变化

如下为deploy的观测结果:

[root@master ~]# kubectl get deploy -n dev -w
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
deploy-nginx   1/1     1            1           82m
deploy-nginx   1/3     1            1           84m
deploy-nginx   1/3     1            1           84m
deploy-nginx   1/3     1            1           84m
deploy-nginx   1/3     3            1           84m
deploy-nginx   2/3     3            2           84m
deploy-nginx   3/3     3            3           84m

如下为HPA的观测结果

[root@master ~]# kubectl get hpa -n dev -w
NAME     REFERENCE                 TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
pc-hpa   Deployment/deploy-nginx   0%/1%     1         10        1          63m
pc-hpa   Deployment/deploy-nginx   3%/1%     1         10        1          64m
pc-hpa   Deployment/deploy-nginx   3%/1%     1         10        3          64m
pc-hpa   Deployment/deploy-nginx   1%/1%     1         10        3          65m
pc-hpa   Deployment/deploy-nginx   1%/1%     1         10        3          66m

可以看到,HPA确实可以做到动态扩缩容

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
7天前
|
Kubernetes 监控 调度
【赵渝强老师】K8s的DaemonSet控制器
DaemonSet控制器确保每个节点上运行一个Pod副本,适用于监控、日志收集等场景。通过示例创建DaemonSet并查看Pod信息,展示了其自动扩展和回收的能力。视频讲解和代码示例详细说明了DaemonSet的使用方法和调度机制。
|
7天前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Job控制器单工作队列的串行方式
Kubernetes中的Job控制器用于管理一次性任务,确保任务完成后不再重启。本文介绍了Job的工作原理、运行方式及示例,包括创建Job、查看Job和Pod信息等步骤,并附有视频讲解。
|
7天前
|
Kubernetes 双11 容器
【赵渝强老师】Kubernetes中的控制器
Kubernetes通过控制器管理Pod的生命周期,以应对不同场景需求,如Deployment、DaemonSet、Job等。控制器可自动调整Pod数量和重启故障Pod,确保系统稳定运行。视频讲解和详细内容见下文。
|
3月前
|
Kubernetes 算法 测试技术
Kubernetes的垂直和水平扩缩容的性能评估
Kubernetes的垂直和水平扩缩容的性能评估
53 6
|
7天前
|
Kubernetes 应用服务中间件 nginx
【赵渝强老师】K8s中的Deployment控制器
Kubernetes中的Deployment用于部署无状态应用程序,管理Pod的数量、更新方式和资源限制。通过创建和管理ReplicaSet,Deployment可以实现Pod的自动扩缩容、滚动更新和回滚。本文介绍了Deployment的基本概念,并通过一个具体的示例演示了如何使用Deployment创建、更新和管理Pod。
|
7天前
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。
|
7天前
|
存储 Kubernetes 调度
【赵渝强老师】K8s的有状态控制器StatefulSet
在Kubernetes中,StatefulSets用于部署有状态应用程序,提供持久存储和唯一标识符。与Deployment不同,StatefulSets确保Pod的标识符在重新调度后保持不变,适用于需要稳定网络标识符和持久存储的场景。本文介绍了StatefulSets的创建、扩容与缩容、更新与回滚等操作,并提供了具体示例和视频讲解。
|
7天前
|
Kubernetes Linux 调度
【赵渝强老师】K8s的周期性任务控制器CronJob
本文介绍了K8s中的CronJob控制器,它类似于Linux的crontab命令,用于管理和调度定时作业。CronJob可以设置在未来某一时间运行作业一次或在指定时间点重复运行作业。文章通过一个示例展示了如何创建和使用CronJob控制器,包括创建配置文件、应用配置、查看Pod信息和日志等步骤。同时,还解释了CronJob的时间表示方式及其限制。
|
7天前
|
Kubernetes 调度 容器
【赵渝强老师】K8s的Job控制器多工作队列的并行方式
Kubernetes Job 是一次性任务控制器,用于控制 Pod 中的容器执行特定任务。本文介绍了 Job 控制器的工作原理、运行方式及多工作队列并行执行的示例。示例中创建了 5 个作业,以 3 个队列并行执行,整个过程需 2 分钟。文中还提供了详细的 YAML 文件配置和执行命令。
|
6月前
|
运维 Kubernetes 监控
Kubernetes详解(十九)——Kubernetes Pod控制器
Kubernetes详解(十九)——Kubernetes Pod控制器
100 3