【k8s资源调度-HPA(自动扩缩容)】

1、HPA可以做什么?

  • 通过观察pod的cpu、内存使用率或自定义metrics指标进行自动的扩容或缩容pod的数量。
  • 通常用于Deployment,不适用于无法扩/缩容的对象,如DaemonSet。
  • 控制管理器每隔30s(可以通过-horizontal-pod-autoscaler--sync-period修改)查询metrics的资源使用情况

2、cpu、内存指标监控

  • 实现cpu或内存的监控,首先有个前提条件是该对象必须配置了resources.requests.cpu或resources.requests.memory才可以,可以配置当cpu/memory达刻上述配置的百分比后进行扩容或缩
    容。

2.1 创建一个deployment的配置文件

yaml 复制代码
apiVersion: apps/v1  # deployment api版本
kind: Deployment    # 资源类型为 Deployment
metadata:  # 原信息
  labels:  # 标签
    app: nginx-deploy  # 具体的标签信息:app=nginx-deploy   key: value 配置形式
  name: nginx-deploy   # deployment的名字
  namespace: default   # 所在的命名空间
spec:
  replicas: 1   # 期望副本数
  revisionHistoryLimit: 10   # 进行滚动更新后,保留的历史版本数量
  selector:  # 选择器,用于找到匹配的RS
    matchLabels:  # 按照标签匹配
      app: nginx-deploy   # 匹配的标签
  strategy:   #更新策略
    rollingUpdate:  # 滚动更新配置
      maxSurge: 25%  # 滚动更新时,更新的个数最多超过多少个期望副本数,或者比例
      maxUnavailable: 25%  # 进行滚动更新时,最大不可用比例更新比例,表示在所有副本数中,最多可以有多少个不更新成功
    type: RollingUpdate  # 更新类型,采用滚动更新
  template:   # pod 模板
    metadata:  # pod模板的元信息
      labels:   # pod模板的标签
        app: nginx-deploy   # pod模板的标签信息
    spec:      # pod 期望信息
      containers:    # pod 的容器信息
      - image: nginx:1.20    # 镜像信息
        imagePullPolicy: IfNotPresent   # 镜像拉取策略
        name: nginx        # 容器名字
      restartPolicy: Always   # pod的重启策略
      terminationGracePeriodSeconds: 30   # pod的过期时间

2.2 创建这个deployment资源

c 复制代码
[root@k8s-master ~]# kubectl create -f nginx-deploy.yaml
deployment.apps/nginx-deploy created
[root@k8s-master ~]# kubectl get deployments.apps  nginx-deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   1/1     1            1           15s
[root@k8s-master ~]# kubectl get po nginx-deploy-86b7d8c46d-7xwkw
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-86b7d8c46d-7xwkw   1/1     Running   0          29s

2.3 更新配置文件

刚才的配置文件中不包含resources.requests.cpu和resouces.limits.cpu

2.4 替换deployment

c 复制代码
[root@k8s-master ~]# kubectl replace -f nginx-deploy.yaml
deployment.apps/nginx-deploy replaced

2.5 执行hpa命令

kubectl autoscale deploy nginx-deploy --cpu-percent=20 --min=2 --max=5

c 复制代码
[root@k8s-master ~]# kubectl autoscale deploy nginx-deploy  --cpu-percent=20  --min=2  --max=5
horizontalpodautoscaler.autoscaling/nginx-deploy autoscaled

# 本来我们的replace副本是1个的,现在又帮我们创建了一个
[root@k8s-master ~]# kubectl get deployments.apps  nginx-deploy
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deploy   2/2     2            2           15m

2.6 开启指标服务

2.6.1 下载开启指标的yaml配置文件

c 复制代码
[root@k8s-master ~]# wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml

2.6.2 修改镜像地址为国内的地址

c 复制代码
[root@k8s-master ~]# sed -i 's/registry.k8s.io\/metrics-server/registry.cn-hangzhou.aliyuncs.com\/google_containers/g'  metrics-server-components.yaml


[root@k8s-master ~]# grep image metrics-server-components.yaml
        image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.7.0
        imagePullPolicy: IfNotPresent

2.6.3 修改metrics-server-components.yaml配置

修改容器的ts配置,不验证ts,在containers的args参数中增加 --kubelet-insecure-tls 参数

2.6.4 安装这个指标插件

c 复制代码
[root@k8s-master ~]# kubectl apply  -f metrics-server-components.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created

2.6.5 查看这个pod的资源

c 复制代码
[root@k8s-master ~]# kubectl get po --all-namespaces  | grep metrics
kube-system    metrics-server-7bb86dcf48-hfpb5      1/1     Running   0              99s

2.7 通过kubectl top pod 监控 融资所占用的资源

c 复制代码
[root@k8s-master ~]#  kubectl top pod
NAME                           CPU(cores)   MEMORY(bytes)
dns-test                       0m           0Mi
fluentd-59k8k                  2m           57Mi
fluentd-hhtls                  3m           57Mi
nginx-deploy-fdd948cf4-fgxjv   0m           1Mi
nginx-deploy-fdd948cf4-r8ktj   0m           1Mi

2.8 测试自动扩缩容

由于刚才创建的deploy资源还未包含service,所以需要创建一个service

2.8.1 创建一个service

yaml 复制代码
# service配置文件如下
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  labels:
    app: nginx
spec:
  selector:
    app: nginx-deploy
  ports:
  - port: 80
    targetPort: 80
    name: web
  type: NodePort
c 复制代码
[root@k8s-master ~]# kubectl create -f nginx-svc.yml
service/nginx-svc created
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.1.0.1       <none>        443/TCP        5d
nginx-svc    NodePort        <none>        80:31231/TCP   6s
[root@k8s-master ~]# curl 10.10.10.100:31231
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

2.8.1 进行压测

  • 方法:通过给service发送http请求,实现压测,看我们的hpa是否可以自动扩容
2.8.1.1 在node1上执行请求
2.8.1.2 在node2上执行请求
2.8.1.3 在master上查看hpa的状态
c 复制代码
[root@k8s-master ~]# kubectl get hpa
NAME           REFERENCE                 TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx-deploy   Deployment/nginx-deploy   52%/20%   2         5         3          120m
2.8.1.4 在master上查看pod的状态

我们的hpa设置的副本数量是5个,这时可以看到副本由2个变为了5个副本。可以自动扩容

c 复制代码
[root@k8s-master ~]# kubectl  top pod
NAME                           CPU(cores)   MEMORY(bytes)
dns-test                       0m           0Mi
fluentd-59k8k                  5m           57Mi
fluentd-hhtls                  7m           57Mi
nginx-deploy-fdd948cf4-fgxjv   39m          2Mi
nginx-deploy-fdd948cf4-r8ktj   38m          2Mi
nginx-deploy-fdd948cf4-td2vn   41m          2Mi
nginx-deploy-fdd948cf4-xckj5   37m          2Mi
nginx-deploy-fdd948cf4-zpvhc   37m          2Mi
2.8.1.5 取消掉两台node节点上的http请求,查看hpa状态

两台node节点的负载取消后,hpa的targets也下降下来,但是replicas的副本数量是5,不是立马就缩减为2的。这个需要一段时间后可以减少为2。

c 复制代码
[root@k8s-master ~]#  kubectl get hpa
NAME           REFERENCE                 TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx-deploy   Deployment/nginx-deploy   0%/20%    2         5         5          127m
2.8.1.6 查看pod的状态

两台node节点的负载取消后,pod的负载也降下来了。

c 复制代码
[root@k8s-master ~]#  kubectl top pod
NAME                           CPU(cores)   MEMORY(bytes)
dns-test                       0m           0Mi
fluentd-59k8k                  2m           57Mi
fluentd-hhtls                  2m           57Mi
nginx-deploy-fdd948cf4-fgxjv   0m           2Mi
nginx-deploy-fdd948cf4-r8ktj   0m           2Mi
nginx-deploy-fdd948cf4-td2vn   0m           2Mi
nginx-deploy-fdd948cf4-xckj5   0m           2Mi
nginx-deploy-fdd948cf4-zpvhc   0m           2Mi

过一段时间后,发现pod的数量减少为了2

c 复制代码
[root@k8s-master ~]#  kubectl top pod
NAME                           CPU(cores)   MEMORY(bytes)
dns-test                       0m           0Mi
fluentd-59k8k                  2m           57Mi
fluentd-hhtls                  2m           57Mi
nginx-deploy-fdd948cf4-r8ktj   0m           2Mi
nginx-deploy-fdd948cf4-td2vn   0m           2Mi
2.8.1.7 查看hpa的描述信息

3、自定义指标(metrics)

  • 控制管理器开启 -horiztal-pod-autoscaler-use-rest-clients
  • 控制管理器的-apiserver指向API Server Aggregator
  • 在API Server Aggregatore中注册自定义的metrics API
相关推荐
Kendra91917 小时前
Kubernetes 常用命令
云原生·容器·kubernetes
2501_939909051 天前
k8s基础与安装部署
云原生·容器·kubernetes
谷隐凡二1 天前
Kubernetes Route控制器简单介绍
java·容器·kubernetes
李少兄1 天前
Kubernetes 日志管理
docker·容器·kubernetes
秋饼1 天前
【K8S测试程序--git地址】
git·容器·kubernetes
oMcLin1 天前
如何在RHEL 9上配置并优化Kubernetes 1.23高可用集群,提升大规模容器化应用的自动化部署与管理?
kubernetes·自动化·php
ghostwritten1 天前
Kubernetes 网络模式深入解析?
网络·容器·kubernetes
原神启动11 天前
K8S(七)—— Kubernetes Pod 基础概念与实战配置
云原生·容器·kubernetes
不想画图1 天前
Kubernetes(五)——rancher部署和Pod详解
linux·kubernetes·rancher
大都督老师1 天前
配置 containerd 使用镜像加速器拉取 Docker Hub 镜像
容器·kubernetes·k8s