首页 > 其他分享 >k8s HPA 示例

k8s HPA 示例

时间:2023-06-14 18:22:05浏览次数:38  
标签:10 示例 hpa demoapp Deployment HPA k8s demoappv10 度量

web服务

depoly-demoapp-v10.yaml

apiVersion: v1
kind: Namespace
metadata:
    name: hpa-demoapp
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: demoappv10
  name: demoappv10
  namespace: hpa-demoapp
spec:
  #replicas: 1
  selector:
    matchLabels:
      app: demoappv10
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: demoappv10
    spec:
      containers:
      - image: registry.k8s.io/hpa-example
        name: demoapp
        resources:
          limits:
            cpu: 500m
            memory: "256Mi"
          requests:
            cpu: 200m
            memory: "256Mi"

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: demoappv10-svc
  name: demoappv10-svc
  namespace: hpa-demoapp
spec:
  ports:
  - name: http-8080
    port: 8080
    protocol: TCP
    targetPort: 80
  selector:
    app: demoappv10
  type: ClusterIP

创建资源

# kubectl apply -f depoly-demoapp-v10.yaml
namespace/hpa-demoapp created
deployment.apps/demoappv10 created
service/demoappv10-svc created

查看资源

查看pod

# kubectl get pod -n hpa-demoapp
NAME                         READY   STATUS    RESTARTS   AGE
demoappv10-cdf9995cb-s54n8   1/1     Running   0          43s

查看svc

# kubectl get svc -n hpa-demoapp
NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
demoappv10-svc   ClusterIP   10.100.1.117   <none>        8080/TCP   10s

访问资源

# curl `kubectl get svc/demoappv10-svc -n hpa-demoapp -o jsonpath="{.spec.clusterIP}"`:8080
OK!

基于单指标自动扩缩

hpa-demoapp.yaml

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-demoapp
  namespace: hpa-demoapp
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: demoappv10
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

创建hpa资源

# kubectl apply -f hpa-demoapp.yaml
horizontalpodautoscaler.autoscaling/hpa-demoapp created

查看hpa资源

# kubectl get hpa -n hpa-demoapp
NAME          REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa-demoapp   Deployment/demoappv10   0%/50%    1         10        1          47s
请注意当前的 CPU 利用率是 0%

增加负载

访问服务

# while sleep 0.01; do curl `kubectl get svc/demoappv10-svc -n hpa-demoapp -o jsonpath="{.spec.clusterIP}"`:8080;done
OK!OK!OK!OK!OK!......

观察cpu使用情况

# kubectl get hpa/hpa-demoapp -n hpa-demoapp -w
NAME          REFERENCE               TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
hpa-demoapp   Deployment/demoappv10   2%/50%    1         10        1          3m12s
hpa-demoapp   Deployment/demoappv10   84%/50%   1         10        1          3m45s
hpa-demoapp   Deployment/demoappv10   198%/50%   1         10        2          4m
hpa-demoapp   Deployment/demoappv10   176%/50%   1         10        4          4m16s
hpa-demoapp   Deployment/demoappv10   93%/50%    1         10        4          4m31s
hpa-demoapp   Deployment/demoappv10   103%/50%   1         10        4          4m46s
hpa-demoapp   Deployment/demoappv10   98%/50%    1         10        4          5m1s
hpa-demoapp   Deployment/demoappv10   93%/50%    1         10        4          5m16s
hpa-demoapp   Deployment/demoappv10   70%/50%    1         10        4          5m31s
hpa-demoapp   Deployment/demoappv10   60%/50%    1         10        4          5m46s
hpa-demoapp   Deployment/demoappv10   54%/50%    1         10        4          6m1s
hpa-demoapp   Deployment/demoappv10   55%/50%    1         10        4          6m16s
hpa-demoapp   Deployment/demoappv10   53%/50%    1         10        5          6m31s
hpa-demoapp   Deployment/demoappv10   44%/50%    1         10        5          6m46s
hpa-demoapp   Deployment/demoappv10   43%/50%    1         10        5          7m1s
hpa-demoapp   Deployment/demoappv10   41%/50%    1         10        5          7m16s
hpa-demoapp   Deployment/demoappv10   43%/50%    1         10        5          7m31s
hpa-demoapp   Deployment/demoappv10   42%/50%    1         10        5          7m46s

查看pod数量

# kubectl get pod -n hpa-demoapp
NAME                          READY   STATUS    RESTARTS   AGE
demoappv10-57fc7f894c-8mzbf   1/1     Running   0          49s
demoappv10-57fc7f894c-8pmxr   1/1     Running   0          3m4s
demoappv10-57fc7f894c-drv9r   1/1     Running   0          7m5s
demoappv10-57fc7f894c-ls965   1/1     Running   0          3m5s
demoappv10-57fc7f894c-mhblr   1/1     Running   0          3m20s

查看HPA日志

# kubectl describe hpa/hpa-demoapp -n hpa-demoapp
....
  Normal   SuccessfulRescale             6m38s               horizontal-pod-autoscaler  New size: 2; reason: cpu resource utilization (percentage of request) above target
  Normal   SuccessfulRescale             6m23s               horizontal-pod-autoscaler  New size: 4; reason: cpu resource utilization (percentage of request) above target
  Normal   SuccessfulRescale             4m7s                horizontal-pod-autoscaler  New size: 5; reason: cpu resource utilization (percentage of request) above target

停止产生负载

停止访问服务

输入 <Ctrl> + C 来终止负载的产生。

观察cpu使用情况

# kubectl get hpa/hpa-demoapp -n hpa-demoapp -w
...
hpa-demoapp   Deployment/demoappv10   4%/50%     1         10        5          14m
hpa-demoapp   Deployment/demoappv10   2%/50%     1         10        5          15m

查看pod数量

自动扩缩完成副本数量的改变可能需要几分钟的时间。
# kubectl get pod -n hpa-demoapp
NAME                          READY   STATUS    RESTARTS   AGE
demoappv10-57fc7f894c-drv9r   1/1     Running   0          20m

查看HPA日志

# kubectl describe hpa/hpa-demoapp -n hpa-demoapp
....
  Normal   SuccessfulRescale             6m38s               horizontal-pod-autoscaler  New size: 2; reason: cpu resource utilization (percentage of request) above target
  Normal   SuccessfulRescale             6m23s               horizontal-pod-autoscaler  New size: 4; reason: cpu resource utilization (percentage of request) above target
  Normal   SuccessfulRescale             4m7s                horizontal-pod-autoscaler  New size: 5; reason: cpu resource utilization (percentage of request) above target
  Normal   SuccessfulRescale             2m18s               horizontal-pod-autoscaler  New size: 4; reason: All metrics below target
  Normal   SuccessfulRescale             2m2s                horizontal-pod-autoscaler  New size: 1; reason: All metrics below target

基于多项度量指标自动扩缩

CPU 利用率这个度量指标是一个 resource metric(资源度量指标),因为它表示容器上指定资源的百分比。 除 CPU 外,你还可以指定其他资源度量指标。默认情况下,目前唯一支持的其他资源度量指标为内存。 只要 metrics.k8s.io API 存在,这些资源度量指标就是可用的,并且他们不会在不同的 Kubernetes 集群中改变名称。

hpa-v2.yaml

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  - type: Resource
    resource:
      name: memory
      target:
        type: AverageValue
        averageValue: 30Mi
HorizontalPodAutoscaler 将会尝试确保每个 Pod 的 CPU 利用率在 50% 以内,可用内存保持在30Mi以上。

基于自定义度量指标自动扩缩

你还可以指定资源度量指标使用绝对数值,而不是百分比,你需要将 target.type 从 Utilization 替换成 AverageValue,同时设置 target.averageValue 而非 target.averageUtilization 的值。
还有两种其他类型的度量指标,他们被认为是 custom metrics(自定义度量指标): 即 Pod 度量指标和 Object 度量指标。 这些度量指标可能具有特定于集群的名称,并且需要更高级的集群监控设置。

hpa-v2.yaml

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  - type: Pods
    pods:
      metric:
        name: packets-per-second
      target:
        type: AverageValue
        averageValue: 1k
  - type: Object
    object:
      metric:
        name: requests-per-second
      describedObject:
        apiVersion: networking.k8s.io/v1
        kind: Ingress
        name: main-route
      target:
        type: Value
        value: 10k

  - type: External
    external:
      metric:
        name: queue_messages_ready
        selector:
          matchLabels:
            queue: "worker_tasks"
      target:
        type: AverageValue
        averageValue: 30
 HorizontalPodAutoscaler 将会尝试确保每个 Pod 的 CPU 利用率在 50% 以内, 每秒能够服务 1000 个数据包请求, 并确保所有在 Ingress 后的 Pod 每秒能够服务的请求总数达到 10000 个。

基于更特别的度量值来扩缩

许多度量流水线允许你通过名称或附加的 标签 来描述度量指标。 对于所有非资源类型度量指标(Pod、Object 和后面将介绍的 External), 可以额外指定一个标签选择算符。例如,如果你希望收集包含 verb 标签的 http_requests 度量指标,可以按如下所示设置度量指标块,使得扩缩操作仅针对 GET 请求执行:
  - type: Object
    object:
      metric:
        name: http_requests
        selector: {matchLabels: {verb: GET}}
这个选择算符使用与 Kubernetes 标签选择算符相同的语法。 如果名称和标签选择算符匹配到多个系列,监测管道会决定如何将多个系列合并成单个值。 选择算符是可以累加的,它不会选择目标以外的对象(类型为 Pods 的目标 Pod 或者类型为 Object 的目标对象)。

基于与 Kubernetes 对象无关的度量指标执行扩缩

运行在 Kubernetes 上的应用程序可能需要基于与 Kubernetes 集群中的任何对象没有明显关系的度量指标进行自动扩缩, 例如那些描述与任何 Kubernetes 名字空间中的服务都无直接关联的度量指标。
使用外部度量指标时,需要了解你所使用的监控系统,相关的设置与使用自定义指标时类似。 外部度量指标使得你可以使用你的监控系统的任何指标来自动扩缩你的集群。 你需要在 metric 块中提供 name 和 selector,同时将类型由 Object 改为 External。 如果 metricSelector 匹配到多个度量指标,HorizontalPodAutoscaler 将会把它们加和。 外部度量指标同时支持 Value 和 AverageValue 类型,这与 Object 类型的度量指标相同。
例如,如果你的应用程序处理来自主机上消息队列的任务, 为了让每 30 个任务有 1 个工作者实例,你可以将下面的内容添加到 HorizontalPodAutoscaler 的配置中。
- type: External
  external:
    metric:
      name: queue_messages_ready
      selector:
        matchLabels:
          queue: "worker_tasks"
    target:
      type: AverageValue
      averageValue: 30
如果可能,还是推荐定制度量指标而不是外部度量指标,因为这便于让系统管理员加固定制度量指标 API。 而外部度量指标 API 可以允许访问所有的度量指标。 当暴露这些服务时,系统管理员需要仔细考虑这个问题。

标签:10,示例,hpa,demoapp,Deployment,HPA,k8s,demoappv10,度量
From: https://www.cnblogs.com/wangguishe/p/17480541.html

相关文章

  • k8s-IPV6升级(3)
    1.逐节点手动升级步骤21.1master节点升级到1.21.5步骤#备份apiserver、kube-scheduler和controller-managercp-r/apps/conf/kubernetes/manifests//tmp/1.1.1更新管理平面组件至1.21.5逐节点更新master节点的kube-apiserver修改如下参数vi/apps/conf/kubernetes......
  • pytorch 使用示例
    记录通过pytorch编写cnn模型示例,包括训练、模型、预测全流程代码结构,数据采集公共调制方式识别数据集,编写代码简单,以便进行pytorch学习。train.pyimportosimportnumpyasnpimporttorchimporttorch.nnasnnimporttorch.optimasoptimfromtqdmimporttqdmfrom......
  • k8s pod dns 策略
    Pod的DNS策略DNS策略可以逐个Pod来设定。目前Kubernetes支持以下特定Pod的DNS策略。这些策略可以在Pod规约中的dnsPolicy字段设置:"Default":Pod从运行所在的节点继承名称解析配置。"ClusterFirst":与配置的集群域后缀不匹配的任何DNS查询(例如"www.kub......
  • k8s相关部署文件
    1.控制器1.生成后改改kubectlcreatedeploymentcoreqi-api--image=docker.io/fanqi/coreqi_api:latest--dry-run=client-oyaml>/home/coreqi_dm.yaml2.手撸apiVersion:apps/v1kind:Deploymentmetadata:creationTimestamp:nullgeneration:1labels:......
  • 当SRS遇到K8s:如何构建海量推流源站?
    Photoby OscarIvanEsquivelArteaga on Unsplash文/杨成立本章描述了基于K8s,如何构建OriginCluster支持超多推流场景。OriginCluster通过配置其他源站的信息,在本源站没有流时查询到流的位置,通过RTMP302定向到指定源站,具体原理可以参考#464。主要应用场景如下:源站灾备:即使......
  • 当SRS遇到K8s:如何实现高可用、回滚与灰度发布?
    Photoby LuisQuintero from Pexels文/杨成立服务的更新、回滚和灰度,是个简单的问题,如果加上一个条件"不中断服务的前提下",那么就是一个难题,如果再加上"大规模",那么就是K8S要解决的核心问题之一。坏消息是这个难搞的问题还真是流媒体服务的核心的、关键的、不可忽视的关键能......
  • 基于k8s构建持续集成
    一、实施准备登录OpenStack平台,使用提供的CentOS_7.5_x86_64_XD.qcow2镜像创建两台云主机,并使用提供的软件包部署好双节点Kubernetes集群。项目目标:jenkins的离线安装步骤、gitlab的使用和管理、CICD的配置步骤和方法。二、案例实施1、安装Jenkins环境#查看k8s集群状......
  • HTTP Proxy Demo 代码示例
    以下是一个简单的HTTPProxyDemo代码,使用Python3编写: ```pythonimportsocket defhandle_request(client_socket):#接收客户端请求request_data=client_socket.recv(1024)print(request_data.decode()) #解析请求,获取目标主机和端口号first_line=reque......
  • java 代理(静态代理、动态代理的不同实现)详解及示例
    (文章目录)本文简单的介绍了java的代理概念,针对静态和动态代理的不同定义与实现方式,并给出了详细的示例,最后给出一个综合的应用,展示动态代理的使用。一、代理构成1、代理介绍代理模式上,基本上有Subject角色,RealSubject角色,Proxy角色。Subject角色负责定义RealSubject和Proxy......
  • K8S集群中开启firewalld 防火墙,防火墙策略配置
    在所有节点上执行#确保开启防火墙服务systemctlrestartfirewalld#将集群内所有的节点IP配置到防火墙可信区中firewall-cmd--permanent--zone=trusted--add-source=172.17.185.91firewall-cmd--permanent--zone=trusted--add-source=172.17.185.92firewall-cmd-......