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


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
12天前
|
Kubernetes 应用服务中间件 nginx
【赵渝强老师】K8s中Pod探针的TCPSocketAction
在K8s集群中,kubelet通过探针(如livenessProbe、readinessProbe和startupProbe)检查容器健康状态。探针支持HTTPGetAction、ExecAction和TCPSocketAction三种检查方法。本文重点介绍TCPSocketAction,它通过尝试建立TCP连接来检测容器的健康状况。示例中创建了一个Nginx Pod,并配置了两个探针(readinessProbe和livenessProbe),它们每隔5秒检查一次容器的8080端口,首次检查在启动后10秒进行。若连接失败,容器将重启。视频讲解和命令演示进一步详细说明了这一过程。
142 83
|
23天前
|
Kubernetes 容器 Perl
【赵渝强老师】Kubernetes中Pod的探针
在K8s集群中,kubelet通过三种探针(存活、就绪、启动)检查Pod容器的健康状态。存活探针确保容器运行,失败则重启;就绪探针确保容器准备好服务,失败则从Service中剔除;启动探针确保应用已启动,失败则重启容器。视频讲解和图片详细介绍了这三种探针及其检查方法(HTTPGet、Exec、TCPSocket)。
【赵渝强老师】Kubernetes中Pod的探针
|
15天前
|
Kubernetes 网络协议 Shell
【赵渝强老师】K8s中Pod探针的ExecAction
在K8s集群中,kubelet通过三种探针(存活、就绪、启动)检查容器健康状态,支持HTTPGet、Exec和TCP检查方式。本文重点介绍ExecAction探针,通过在容器内执行Shell命令返回码判断健康状态,并附带视频讲解和实例演示,展示如何配置和使用ExecAction探针进行健康检查。
49 10
|
20天前
|
Kubernetes 应用服务中间件 nginx
【赵渝强老师】K8s中Pod探针的HTTPGetAction
在K8s集群中,kubelet通过探针(如livenessProbe、readinessProbe和startupProbe)检查容器健康状态。HTTPGetAction通过HTTP请求检查容器健康,返回状态码在200-400区间视为成功。示例中创建了基于Nginx镜像的Pod,并配置存活探针,每5秒检测一次。通过命令操作验证探针功能,展示了Pod的健康检查机制。 视频讲解:[Bilibili](https://www.bilibili.com/video/BV1DTtueTEMM)
42 15
|
3月前
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
【赵渝强老师】Kubernetes中Pod的基础容器
|
3月前
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
3月前
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
|
弹性计算 调度 容器
Kubernetes 弹性伸缩全场景解析 (一)- 概念延伸与组件布局
### 传统弹性伸缩的困境 弹性伸缩是Kubernetes中被大家关注的一大亮点,在讨论相关的组件和实现方案之前。首先想先给大家扩充下弹性伸缩的边界与定义,传统意义上来讲,弹性伸缩主要解决的问题是容量规划与实际负载的矛盾。 如上图所示,蓝色的水位线表示集群的容量随着负载的提高不断的增长,红色的曲线表示集群的实际的负载真实的变化。而弹性伸缩要解决的就是当实际负载出现激增,而容量规
5865 0
|
弹性计算 Kubernetes 调度
Kubernetes 弹性伸缩全场景解析 (一):概念延伸与组件布局
传统弹性伸缩的困境 弹性伸缩是 Kubernetes 中被大家关注的一大亮点,在讨论相关的组件和实现方案之前。首先想先给大家扩充下弹性伸缩的边界与定义,传统意义上来讲,弹性伸缩主要解决的问题是容量规划与实际负载的矛盾。
|
1月前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。