k8s-对Pod自动弹性伸缩(HPA)

简介: HPA介绍部署metrics-server案例自动缩容

HAP介绍


Horizontal Pod Autoscaler 根据观察到的 CPU 利用率(或者,在自定义指标 支持下,根据 其他一些应用程序提供的指标)自动扩展复制控制器、部署、副本集或有状态集中的 Pod  数量。


请注意,Horizontal Pod Autoscaling 不适用于无法缩放的对象,例如 DaemonSet。


Horizontal Pod Autoscaler 实现为 Kubernetes API 资源和控制器。


资源决定了控制器的行 为。


控制器会定期调整复制控制器或部署中的副本数量,以将观察到的指标(例如平均 CPU  利用率、平均内存利用率或任何其他自定义指标)与用户指定的目标相匹配。



K8s通过HPA,基于获取到的metrics(CPU utilization, custom metrics) value,对rc, deployment 管理的 pods 进行自动伸缩



HPA Controller 周期性(默认每 30s 一次,可通过 kube-controller-manager 的 flag-- horizontal-pod-autoscaler-sync-period 进行设置)的调整对应的 rc, Deployment 中的 replicas 数量,使得指定的 metrics value 能匹配用户指定的 target  utilization value。


•在每个 HPA Controller 的处理周期中,kube-controller-manager 都去查询 HPA 中 定义的 metrics 的 utilization。查询方式根据 metric 类型不同而不同:


•如果 metric type 是 resource metrics,则通过 resource metrics API 查询。


•如果 metric type 属于 custom metrics,则通过 custom metrics API 查询。



image.png



部署metrics-server


Project Add: https://github.com/kubernetes-sigs/metrics-server



下载部署清单文件:

wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml



components.yaml 文件的修改:



修改镜像:


image.png




修改镜像参数:args



image.png


完整的 components.yaml 文件配置




---apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:  name: system:aggregated-metrics-reader
  labels:    rbac.authorization.k8s.io/aggregate-to-view: "true"    rbac.authorization.k8s.io/aggregate-to-edit: "true"    rbac.authorization.k8s.io/aggregate-to-admin: "true"rules:- apiGroups: ["metrics.k8s.io"]  resources: ["pods","nodes"]  verbs: ["get","list","watch"]---apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:  name: metrics-server:system:auth-delegator
roleRef:  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---apiVersion: apiregistration.k8s.io/v1beta1
kind: APIService
metadata:  name: v1beta1.metrics.k8s.io
spec:  service:    name: metrics-server
    namespace: kube-system
  group: metrics.k8s.io
  version: v1beta1
  insecureSkipTLSVerify: true  groupPriorityMinimum: 100  versionPriority: 100---apiVersion: v1
kind: ServiceAccount
metadata:  name: metrics-server
  namespace: kube-system
---apiVersion: apps/v1
kind: Deployment
metadata:  name: metrics-server
  namespace: kube-system
  labels:    k8s-app: metrics-server
spec:  selector:    matchLabels:      k8s-app: metrics-server
  template:    metadata:      name: metrics-server
      labels:        k8s-app: metrics-server
    spec:      serviceAccountName: metrics-server
      volumes:# mount in tmp so we can safely use from-scratch images and/or read-only containers      - name: tmp-dir
        emptyDir: {}      containers:      - name: metrics-server
        image: liuyi71sinacom/metrics-server-amd64:v0.3.6
        imagePullPolicy: IfNotPresent
        args:          - --cert-dir=/tmp
          - --secure-port=4443
          - --kubelet-insecure-tls      
          - --kubelet-preferred-address-types=InternalIP
        ports:        - name: main-port
          containerPort: 4443          protocol: TCP
        securityContext:          readOnlyRootFilesystem: true          runAsNonRoot: true          runAsUser: 1000        volumeMounts:        - name: tmp-dir
          mountPath: /tmp
      nodeSelector:        kubernetes.io/os: linux
        kubernetes.io/arch: "amd64"---apiVersion: v1
kind: Service
metadata:  name: metrics-server
  namespace: kube-system
  labels:    kubernetes.io/name: "Metrics-server"    kubernetes.io/cluster-service: "true"spec:  selector:    k8s-app: metrics-server
  ports:  - port: 443    protocol: TCP
    targetPort: main-port
---apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:  name: system:metrics-server
rules:- apiGroups:  - ""  resources:  - pods
  - nodes
  - nodes/stats
  - namespaces
  - configmaps
  verbs:  - get
  - list
  - watch
---apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:  name: system:metrics-server
roleRef:  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system


安装metrics-server



kubectl apply -f deployment.yaml



查看metric-server是否可用


╰─# kubectl top node --use-protocol-buffers
NAME   CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%     
k201   290m         3%     1874Mi          24%
k202   <unknown>                           <unknown>               <unknown>               <unknown>
╭─root@k201 ~/k8s/hpa 
╰─#


image.png



自动伸缩




通过 CPU、内存监控指标实现应用自动弹性的先决条件



在 rs/rc/deployment 配置下必须有下面的配置,与 image 相同位置 ,需要配置如下内容:



resources:     requests:         cpu: 1



案例:


以myngx 为例,创建deployment

apiVersion: v1
kind: Service
metadata:   name: myngx
spec:   ports:   - name: myngx
     port: 3080     targetPort: 80   selector:     app: myngx
---apiVersion: apps/v1
kind: Deployment
metadata:  name: myngx
spec:  replicas: 10  strategy:    rollingUpdate:      maxSurge: 40%
      maxUnavailable: 40%
    type: RollingUpdate
  selector:    matchLabels:      app: myngx
  template:     metadata:       labels:         app: myngx
     spec:      containers:      - image: nginx:1.7.9        name: myngx
        ports:        - containerPort: 80        resources:          requests:            cpu: 3m



创建deployment

╰─# kubectl create ns hpa  
╰─# kubectl apply -f app-nginx.yaml -n hpa


查看pod状态

image.png


自动缩容:


手动配置缩容

╭─root@k201 ~/k8s/hpa 
╰─# kubectl autoscale deployment myngx --min=1 --max=20 --cpu-percent=5 -n hpa
horizontalpodautoscaler.autoscaling/myngx autoscaled
╭─root@k201 ~/k8s/hpa 
╰─#


--min=1 : 最小一个pod数量

--max=20  : 最大20个pod的数量

--cpu-percent=5 : 当cup的使用百分比大于5%,自动扩容pod的数量



查看hpa状态


╰─# kubectl get hpa -n hpa
NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
myngx   Deployment/myngx   0%/5%     1         20        10         2m2s
╭─root@k201 ~/k8s/hpa 
╰─#


image.png



测试



ab 是 apache 自带的一款功能强大的测试工具,安装了 apache 一般就自带了


yum install httpd-tools -y



一般我们用到的是-n,-t 和-c  例如:


ab -c 1000 -n 50000 http://10.20.4.161:3080/


这个表示一共处理 10000 个请求,每次并发运行 1000 次 index.php 文件.


压力测试

image.png


监控pod的缩容过程

image.png


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
24天前
|
前端开发 编解码 数据格式
浅谈响应式编程在企业级前端应用 UI 开发中的实践
浅谈响应式编程在企业级前端应用 UI 开发中的实践
20 0
浅谈响应式编程在企业级前端应用 UI 开发中的实践
|
1月前
|
Prometheus Kubernetes 监控
容器服务ACK常见问题之pod设置securityContext调整参数失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
3月前
|
Kubernetes 监控 调度
Kubernetes Pod调度:从基础到高级实战技巧
Kubernetes Pod调度:从基础到高级实战技巧
191 0
|
4月前
|
Kubernetes 安全 Cloud Native
云原生|kubernetes|pod或容器的安全上下文配置解析
云原生|kubernetes|pod或容器的安全上下文配置解析
112 0
|
3月前
|
Kubernetes 监控 调度
|
15天前
|
存储 Kubernetes 调度
Kubernetes Pod生命周期
Kubernetes Pod生命周期
25 0
Kubernetes Pod生命周期
|
15天前
|
存储 Kubernetes 应用服务中间件
Kubernetes Pod
Kubernetes Pod
47 0
Kubernetes Pod
|
26天前
|
存储 Kubernetes 调度
K8s Pod亲和性、污点、容忍度、生命周期与健康探测详解(下)
本文全面探讨了Kubernetes集群中Pod的四种关键机制——Pod亲和性、污点(Taints)、容忍度(Tolerations)、生命周期以及健康探测,为读者提供了深入理解并有效应用这些特性的指南。
|
26天前
|
Kubernetes 网络协议 Perl
k8s Failed to create pod sandbox: open /run/systemd/resolve/resolv.conf: no such file or directory
k8s Failed to create pod sandbox: open /run/systemd/resolve/resolv.conf: no such file or directory
25 0
|
1月前
|
Kubernetes Nacos 微服务
nacos常见问题之v2.2.3 k8s 微服务注册nacos强制删除 pod不消失如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
24 1
nacos常见问题之v2.2.3 k8s 微服务注册nacos强制删除 pod不消失如何解决