TKE 标准集群指南

最佳实践

API 文档

有奖征文|投稿上云技术实践,赢取价值5000元大奖> HOT
文档中心 > 容器服务 > 最佳实践 > 监控 > 使用云原生监控指标进行弹性伸缩

操作场景

容器服务 TKE 基于 Custom Metrics API 支持许多用于弹性伸缩的指标,涵盖 CPU、内存、硬盘、网络、GPU 相关指标和绝大多数 HPA 弹性伸缩场景,详细列表请参见 自动伸缩指标说明

若用户需要针对自定义的监控指标或更低采样频率的监控数据来实现自动扩缩容,可以将云原生监控采集的指标数据用于弹性伸缩,云原生监控服务是腾讯云提供的适配容器场景的 Prometheus 监控服务,支持默认采集 K8S 相关指标、用户自定义的监控指标,指标默认采集频率为15s。

下文介绍如何将云原生监控采集的指标用于弹性伸缩。

前提条件

  • 已创建1.12或以上版本的集群,详情请参见 创建集群
  • 已创建云原生监控实例并完成集群关联,若还未开通云原生监控,请前往 云原生监控控制台 进行开通。
  • 已安装 Helm

操作步骤

通过云原生监控暴露监控指标

  1. 在业务程序中暴露自定义指标。
  2. 部署业务应用至集群。
  3. 在云原生监控控制台关联集群并配置数据采集规则,详情请参见 数据采集配置

安装 Prometheus-adapter

  1. 确认配置参数,创建 value.yaml。
    adapter 连接的 Prometheus 信息,主要是 URL 和端口,默认值分别是http://prometheus.default.svc和9090,当使用云原生监控时,对应的信息需要修改成 云原生监控控制台 基本信息中提供的 Prometheus 数据查询地址,如下图所示:

    自定义 rules 的配置主要是配置指标的发现规则,指标与 Kubernetes 资源对应,在 API 中指标对暴露名称以及对应的查询语句,详细配置可参见 prometheus-adapter,完整的 value.yaml 如下所示:
    rules:
    # this rule matches cumulative cAdvisor metrics measured in seconds
    - seriesQuery: '{__name__=~"^container_.*",container!="POD",namespace!="",pod!=""}'
      resources:
        # skip specifying generic resource<->label mappings, and just
        # attach only pod and namespace resources by mapping label names to group-resources
        overrides:
          namespace: {resource: "namespace"},
          pod: {resource: "pod"},
      # specify that the `container_` and `_seconds_total` suffixes should be removed.
      # this also introduces an implicit filter on metric family names
      name:
        # we use the value of the capture group implicitly as the API name
        # we could also explicitly write `as: "$1"`
        matches: "^container_(.*)_seconds_total$"
      # specify how to construct a query to fetch samples for a given series
      # This is a Go template where the `.Series` and `.LabelMatchers` string values
      # are available, and the delimiters are `<<` and `>>` to avoid conflicts with
      # the prometheus query language
      metricsQuery: "sum(rate(<<.Series>>{<<.LabelMatchers>>,container!="POD"}[2m])) by (<<.GroupBy>>)"
    prometheus:
      url: http://192.xx.x.x # 替换为上文中的数据接口地址 (不写端口)
      port: 9090
  2. 执行以下 Helm 命令安装 prometheus-adapter,示例如下:
    注意:

    安装前需要删除 TKE 已经注册的 Custom Metrics API,删除命令如下:

    kubectl delete apiservice v1beta1.custom.metrics.k8s.io
    helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
    helm repo update
    # Helm 3
    helm install prometheus-adapter prometheus-community/prometheus-adapter -f value.yaml
    # Helm 2
    # helm install --name prometheus-adapter prometheus-community/prometheus-adapter -f value.yaml

  3. 部署过程可能因为拉取 k8s.gcr.io 镜像超时,可以执行以下命令手动修改 Prometheus-adapter 的 image:
    kubectl edit deploy prometheus-adapter
    # 将 image 修改为 willdockerhub/prometheus-adapter:v0.9.0

测试验证

若安装正确,可用执行以下命令查询自定义指标:

kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1

测试 HPA

使用自定义指标测试 HPA 是否生效,如利用 httpserver_requests_qps 进行扩所容,假如设置每个业务 Pod 的平均 QPS 达到50时触发扩容,最小副本为1个,最大副本为1000个,配置示例如下:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: httpserver
  namespace: httpserver
spec:
  minReplicas: 1
  maxReplicas: 1000
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: httpserver
  metrics:
  - type: Pods
    pods:
      metric:
        name: httpserver_requests_qps
      target:
        averageValue: 50
        type: AverageValue

使用 Apache ab 进行压测,参考资源定义如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: abcontainer
  namespace: httpserver
spec:
  selector:
    matchLabels:
      app: abcontainer
  template:
    metadata:
      labels:
        app: abcontainer
    spec:
      containers:
      - name: abcontainer
        image: httpd
        ports:
        - containerPort: 80

执行以下命令对业务进行压测:

# 进入 ab 容器终端
kubectl exec -it abcontainer-xxx -n {namespace} /bin/sh
# 执行压测命令
ab -c 10000 -n 12000 http://xxx/xxx

执行以下命令观察是否自动扩容。示例如下:

$ kubectl get hpa
NAME         REFERENCE               TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
httpserver   Deployment/httpserver   83933m/50   1         1000      2          18h
$ kubectl get pods
NAME                          READY   STATUS              RESTARTS   AGE
httpserver-6f94475d45-47d5w   1/1     Running             0          3m41s
httpserver-6f94475d45-7rln9   1/1     Running             0          37h
httpserver-6f94475d45-6c5xm   0/1     ContainerCreating   0          1s
httpserver-6f94475d45-wl78d   0/1     ContainerCreating   0          1s

若扩容正常,则说明已实现 HPA 基于云原生监控的自定义指标进行弹性伸缩。

目录