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


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
206 25
|
10月前
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
6月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
214 12
|
10月前
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
173 1
【赵渝强老师】Kubernetes中Pod的基础容器
|
10月前
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
177 1
|
10月前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 &quot;busybox-container&quot; 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
137 1
|
10月前
|
Kubernetes 容器 Perl
【赵渝强老师】K8s中Pod中的初始化容器
Kubernetes的Pod包含业务容器、基础容器、初始化容器和临时容器。初始化容器在业务容器前运行,用于执行必要的初始化任务。本文介绍了初始化容器的作用、配置方法及优势,并提供了一个示例。
169 1
|
10月前
|
弹性计算 人工智能 Serverless
阿里云ACK One:注册集群云上节点池(CPU/GPU)自动弹性伸缩,助力企业业务高效扩展
在当今数字化时代,企业业务的快速增长对IT基础设施提出了更高要求。然而,传统IDC数据中心却在业务存在扩容慢、缩容难等问题。为此,阿里云推出ACK One注册集群架构,通过云上节点池(CPU/GPU)自动弹性伸缩等特性,为企业带来全新突破。
|
8月前
|
SQL 弹性计算 分布式计算
阿里云 EMR 发布托管弹性伸缩功能,支持自动调整集群大小,最高降本60%
阿里云开源大数据平台 E-MapReduce 重磅推出托管弹性伸缩功能,基于 EMR 托管弹性伸缩功能,您可以指定集群的最小和最大计算限制,EMR 会持续对与集群上运行的工作负载相关的关键指标进行采样,自动调整集群大小,以获得最佳性能和资源利用率。
359 15
|
弹性计算 缓存 运维
【运维知识进阶篇】用阿里云部署kod可道云网盘(DNS解析+CDN缓存+Web应用防火墙+弹性伸缩)(三)
【运维知识进阶篇】用阿里云部署kod可道云网盘(DNS解析+CDN缓存+Web应用防火墙+弹性伸缩)(三)
392 0

推荐镜像

更多