详情页标题前

阿里云容器服务ACK通过Nginx Ingress对多个应用进行HPA-云淘科技

详情页1

多实例部署可以最大程度的保证应用的稳定性,但同时也会造成闲时资源的浪费和高额成本。手动调节方式工作量大还存在一定程度的滞后性。通过Nginx Ingress对多个应用进行HPA,可以保障部署在ACK集群上的应用的稳定性以及达到更好的成本控制。本文介绍通过Nginx Ingress对多个应用进行HPA的方法。

前提条件

通过Nginx Ingress对多个应用进行HPA前,需要将阿里云Prometheus指标转换成HPA可用的指标,您需要部署相关组件。

  • 已部署阿里云Prometheus监控组件。具体操作,请参见阿里云Prometheus监控。

  • 已部署alibaba-cloud-metrics-adapter组件。具体操作,请参见基于阿里云Prometheus指标的容器水平伸缩。

  • 已安装压力测试工具Apache Benchmark。更多信息,请参见Apache Benchmark。

背景信息

在实际的生产中,您使用请求量来自动扩缩容时,可以通过注册http_requests_total来透出请求量指标,同时推荐使用Ingress组件自带的指标来进行HPA。

Ingress是Kubernetes API中的标准资源类型之一。Ingress实现的功能是将客户端请求的Host名称或请求的URL路径,转发到指定的Service资源中,即将Kubernetes集群外部的请求转发至集群内部的Service中,再被Service转发至Pod,处理客户端的请求。

Nginx Ingress Controller是部署于集群内部的Ingress控制器,可以为您提供性能更好,且定制性更高的使用方式。ACK集群提供的Nginx Ingress Controller在社区版本的基础上,整合了阿里云产品的一系列功能,提供了更加便捷的使用体验。

操作步骤

本教程包含两个ClusterIP型服务,通过Nginx Ingress实现对外的流量路由。基于nginx_ingress_controller_requests指标,为应用配置HPA,以实现随着流量的变化为Pod扩缩容的功能。

  1. 使用以下YAML文件创建业务Deployment和对应的Service。

    1. 创建nginx1.yaml文件。然后执行命令kubectl apply -f nginx1.yaml,创建应用test-app和对应的Service。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: test-app
        labels:
          app: test-app
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: test-app
        template:
          metadata:
            labels:
              app: test-app
          spec:
            containers:
            - image: skto/sample-app:v2
              name: metrics-provider
              ports:
              - name: http
                containerPort: 8080
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: test-app
        namespace: default
        labels:
          app: test-app
      spec:
        ports:
          - port: 8080
            name: http
            protocol: TCP
            targetPort: 8080
        selector:
          app: test-app
        type: ClusterIP
    2. 创建nginx2.yaml文件。然后执行命令kubectl apply -f nginx2.yaml,创建应用sample-app和对应的Service。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: sample-app
        labels:
          app: sample-app
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: sample-app
        template:
          metadata:
            labels:
              app: sample-app
          spec:
            containers:
            - image: skto/sample-app:v2
              name: metrics-provider
              ports:
              - name: http
                containerPort: 8080
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: sample-app
        namespace: default
        labels:
          app: sample-app
      spec:
        ports:
          - port: 80
            name: http
            protocol: TCP
            targetPort: 8080
        selector:
          app: sample-app
        type: ClusterIP
  2. 创建ingress.yaml文件。然后执行kubectl apply -f ingress.yaml命令,部署Ingress资源。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: test-ingress
      namespace: default
    spec:
      ingressClassName: nginx
      rules:
        - host: test.example.com
          http:
            paths:
              - backend:
                  service:
                    name: sample-app
                    port:
                      number: 80
                path: /
                pathType: ImplementationSpecific
              - backend:
                  service:
                    name: test-app
                    port:
                      number: 8080
                path: /home
                pathType: ImplementationSpecific
    • host:指定服务访问域名。本示例使用test.example.com

    • path:指定访问的URL路径。请求到来之后会根据路由规则匹配相应的Service,然后通过Service访问相应的Pod。

    • backend:由Service名称和Service端口组成,指定当前path转发的Service。

  3. 执行以下命令,获取Ingress资源。

    kubectl get ingress -o wide

    预期输出:

    NAME           CLASS   HOSTS              ADDRESS       PORTS   AGE                                                  
    test-ingress   nginx   test.example.com   10.10.10.10   80      55s
  4. 部署成功后,可以通过//home两个路径分别访问Host地址。Nginx Ingress Controller会根据上方配置分别访问sample-app和test-app。通过阿里云Prometheus查询指标nginx_ingress_controller_requests,可以获取各应用的请求情况。

  5. 修改组件alibaba-cloud-metrics-adapter中的adapter.config文件,将Prometheus中的指标转换成HPA可用的指标。

    说明

    在进行本步骤前,请确保已完成了组件alibaba-cloud-metrics-adapter的部署和prometheus.url的配置。

    1. 登录容器服务管理控制台。

    2. 在控制台左侧导航栏,单击集群

    3. 集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情

    4. 在左侧导航栏中,单击应用 > Helm

    5. 单击ack-alibaba-cloud-metrics-adapter

    6. 资源区域,单击adapter-config

    7. adapter-config页面,单击页面右上角的编辑

    8. 用以下代码替换中的代码,单击确定

      关于以下配置项详解,请参考基于阿里云Prometheus指标的容器水平伸缩。

      rules:
      - metricsQuery: sum(rate(<>{<>}[2m]))
        name:
          as: ${1}_per_second
          matches: ^(.*)_requests
        resources:
          namespaced: false
          overrides:
            controller_namespace:
              resource: namespace
        seriesQuery: nginx_ingress_controller_requests
  6. 执行以下命令,查看指标输出。

    kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/*/nginx_ingress_controller_per_second" | jq .

    查询指标结果如下:

    {
      "kind": "ExternalMetricValueList",
      "apiVersion": "external.metrics.k8s.io/v1beta1",
      "metadata": {},
      "items": [
        {
          "metricName": "nginx_ingress_controller_per_second",
          "metricLabels": {},
          "timestamp": "2022-03-31T10:11:37Z",
          "value": "0"
        }
      ]
    }
  7. 创建hpa.yaml文件。然后执行kubectl apply -f hpa.yaml命令,对业务应用sample-app和test-app分别部署HPA。

    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    metadata:
      name: sample-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: sample-app
      minReplicas: 1
      maxReplicas: 10
      metrics:
        - type: External
          external:
            metric:
              name: nginx_ingress_controller_per_second
              selector:
                matchLabels:
    #可以通过这个字段对指标进行过滤,这里设置的字段会传入adapter.config中的<>标签。
                  service: sample-app
    #External指标类型下只支持Value和AverageValue类型的目标值。
            target:
              type: AverageValue
              averageValue: 30
    ----------
    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    metadata:
      name: test-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: test-app
      minReplicas: 1
      maxReplicas: 10
      metrics:
        - type: External
          external:
            metric:
              name: nginx_ingress_controller_per_second
              selector:
                matchLabels:
    #可以通过这个字段对指标进行过滤,这里设置的字段会传入adapter.config中的<>标签。
                  service: test-app
    #External指标类型下只支持Value和AverageValue类型的目标值。
            target:
              type: AverageValue
              averageValue: 30
  8. 执行以下命令,查看HPA部署情况。

    kubectl get hpa

    预期输出:

    NAME         REFERENCE               TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
    sample-hpa   Deployment/sample-app   0/30 (avg)   1         10        1          74s
    test-hpa     Deployment/test-app     0/30 (avg)   1         10        1          59m
  9. HPA部署成功后,进行压测实验,观察业务应用是否会随着请求增大而扩容。

    1. 执行以下命令,对Host下的/home路径进行压测。

      ab -c 50 -n 5000 test.example.com/home
    2. 执行以下命令,查看HPA情况。

      kubectl get hpa

      预期输出:

      NAME         REFERENCE               TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
      sample-hpa   Deployment/sample-app   0/30 (avg)        1         10        1          22m
      test-hpa     Deployment/test-app     22096m/30 (avg)   1         10        3          80m
    3. 执行以下命令,对Host的根路径进行压测。

      ab -c 50 -n 5000 test.example.com/
    4. 执行以下命令,查看HPA情况。

      kubectl get hpa

      预期输出:

      NAME         REFERENCE               TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
      sample-hpa   Deployment/sample-app   27778m/30 (avg)   1         10        2          38m
      test-hpa     Deployment/test-app     0/30 (avg)        1         10        1          96m

      从上述结果可以看到,业务应用在请求量增大超过阈值的情况下成功扩容。

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家

阿里云企业补贴进行中: 马上申请

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心。

购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠

转转请注明出处:http://www.yunxiaoer.com/171280.html

(0)
上一篇 2023年12月10日
下一篇 2023年12月10日
详情页2

相关推荐

  • 阿里云日志服务SLS请求签名-云淘科技

    为保证用户日志数据的安全,日志服务API的所有HTTP请求都必须经过安全验证。验证流程基于阿里云的访问密钥安全验证,使用非对称加密算法完成。 使用说明 日志服务SDK封装了日志服务的所有API接口,您可以通过日志服务SDK方便地调用日志服务的所有API接口。日志服务SDK支持自动签名,并支持多语言版本。推荐使用日志服务SDK访问日志服务,更多信息,请参见日志…

    阿里云日志服务SLS 2023年12月10日
  • 阿里云日志服务SLS日志字段详情-云淘科技

    本文介绍网站域名的访问日志和攻防日志的字段详情。 字段 说明 __topic__ 日志主题,固定为waf_access_log。 account_action 客户端请求命中的账户安全规则对应的防护动作。取值仅有block,表示拦截。更多信息,请参见WAF防护动作(action)说明。 account_rule_id 客户端请求命中的账户安全规则的ID。 a…

    阿里云日志服务SLS 2023年12月10日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 阿里云容器服务ACKACK-TEE机密计算介绍-云淘科技

    本文介绍ACK-TEE(ACK-Trusted Execution Environment)机密计算的概念、核心功能、适用场景、产品方案,以及ACK-TEE和ACK安全沙箱的配合作用等。 基础概念 为有强安全诉求的用户提供了基于硬件加密技术的云原生一站式机密计算容器平台 ,它可以帮助您保护数据使用(计算)过程中的安全性、完整性和机密性,同时简化了可信或机密应…

    2023年12月10日
  • 阿里云负载均衡CreateListener – 创建监听-云淘科技

    在网络型负载均衡实例中创建TCP、UDP或TCPSSL监听。 调试 您可以在OpenAPI Explorer中直接运行该接口,免去您计算签名的困扰。运行成功后,OpenAPI Explorer可以自动生成SDK代码示例。 调试调试授权信息下表是API对应的授权信息,可以在RAM权限策略语句的Action元素中使用,用来给RAM用户或RAM角色授予调用此API…

    阿里云负载均衡 2023年12月10日
  • 阿里云大数据开发治理平台 DataWorksGetDeployment-云淘科技

    获取发布包的详情。 调试 您可以在OpenAPI Explorer中直接运行该接口,免去您计算签名的困扰。运行成功后,OpenAPI Explorer可以自动生成SDK代码示例。 请求参数 名称 类型 是否必选 示例值 描述 Action String 是 GetDeployment 系统规定参数。取值:GetDeployment。 ProjectId Lo…

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。