应用场景
云容器引擎提供Pod 水平自动扩缩(HPA)能力,水平自动扩缩能够根据指标自动更新工作负载资源 (例如 Deployment 或者StatefulSet)的副本数, 目的是自动扩缩工作负载以满足需求。在云容器引擎控制台支持配置基础资源(CPU、内存)和自定义指标(网络、磁盘等)作为Pod扩缩容的触发条件。
前提条件
已创建专有版集群,具体操作请参见 用户指南 > 集群管理 > 新建集群 章节。若已有集群,无需重复操作。
通过基础指标(CPU、内存)进行Pod的水平自动伸缩
步骤一 安装cube-metrics-server 插件或ccse-monitor插件
云容器引擎在插件市场提供了cube-metrics-server插件 和ccse-monitor插件,这两个插件均支持通过CPU、内存进行HPA的能力,用户可以按需安装;其中ccse-monitor安装时需要修改values启用prometheus及prometheus-adapter组件。
登陆云容器引擎控制台,进入需要操作的集群,在左侧菜单选择 插件 > 插件市场,选择cube-metrics-server或ccse-monitor插件进行安装,其中ccse-monitor插件版本需要 >=0.1.9 且需要设置prometheus.enbaled 和prometheusAdapter.enabled为true。
步骤二 配置HPA策略
登陆CCSE控制台,进入需要操作的集群,在左侧菜单选择 工作负载 并选择进入对应的工作负载页面,以下以无状态工作负载为例,点击需要伸缩的工作负载右侧的更多按钮,选择水平伸缩,开启指标伸缩按钮.。
点击新增Resource规则,指标名称可选cpu和memory,计值方式可选择平均值和百分比;填写伸缩的指标阈值及副本数的伸缩范围,点击确定创建HPA策略,如下图所示:配置cpu平均值阈值0.5核,伸缩范围为1-3;当Pod的cpu平均使用量达到0.5核且副本数小于3的时候Pod会自动进行扩容,直到Pod的平均值低于0.5核或副本数等于3。
通过预置的高阶指标(网络、磁盘等)进行 Pod的水平自动伸缩
步骤一 安装ccse-monitor插件
通过预置的高阶指标(网络磁盘等)依赖ccse-monitor插件中的prometheus及prometheus-adapter组件,因此安装ccse-monitor插件时需要修改values启用组件。
登陆CCSE控制台,进入需要操作的集群,在左侧菜单选择 插件 > 插件市场,选择ccse-monitor插件进行安装:注意ccse-monitor插件版本需要 >=0.1.9 ,安装时需要设置prometheus.enbaled 和prometheusAdapter.enabled为true。
步骤二 配置HPA策略
登陆云容器引擎控制台,进入需要操作的集群,在左侧菜单选择 工作负载 并选择进入对应的工作负载页面,以下以无状态工作负载为例,点击需要伸缩的工作负载右侧的更多按钮,选择水平伸缩,开启指标伸缩按钮。
点击新增Pod规则,在指标名称中输入预置的指标名并设置伸缩的预置及副本数伸缩范围,点击确定创建HPA策略。
云容器引擎提供的预置指标
cpu预警指标
指标名称 | 指标对象 | 指标含义 | 指标单位 | 计算公式 |
k8s_pod_cpu_core_used | Pod | CPU使用量 | 核 | sum(rate(container_cpu_usage_seconds_total{image=~".+",pod=~"$Pod",namespace="$namespace"}[5m])) by (pod) |
k8s_pod_rate_cpu_core_used_node | Pod | CPU利用率(占节点) | % | (label_replace(sum(rate(container_cpu_usage_seconds_total{name =~ ".+",pod=~"$Pod",namespace="$namespace"}[5m])) by (pod,instance,namespace), "node", "$1", "instance", "(.*)")) / on(node) group_left sum(kube_node_status_allocatable{resource="cpu"}) by (node) * 100 |
k8s_pod_rate_cpu_core_used_request | Pod | CPU利用率(占request) | % | sum(rate(container_cpu_usage_seconds_total{image=~".+",pod=~"$Pod",namespace="$namespace"}[5m])) by (pod) / (sum (kube_pod_container_resource_requests{resource="cpu",pod=~"$Pod",namespace="$namespace"}) by (pod))*100 |
k8s_pod_rate_cpu_core_used_limit | Pod | CPU利用率(占limit) | % | sum(rate(container_cpu_usage_seconds_total{image=~".+",pod=~"$Pod",namespace="$namespace"}[5m])) by (pod) / (sum (kube_pod_container_resource_limits{resource="cpu",pod=~"$Pod",namespace="$namespace"}) by (pod))*100 |
内存预置指标
指标名称 | 指标对象 | 指标含义 | 指标单位 | 计算公式 |
k8s_pod_mem_usage_bytes | Pod | 内存使用量 | Byte | sum (container_memory_usage_bytes{image=~".+",pod=~"$Pod",namespace="$namespace"}) by (pod) |
k8s_pod_mem_no_cache_bytes | Pod | 内存使用量(不含Cache) | Byte | sum (container_memory_working_set_bytes{image=~".+",pod=~"$Pod",namespace="$namespace"}) by (pod) |
k8s_pod_rate_mem_usage_node | Pod | 内存利用率(占节点) | % | (label_replace(sum(container_memory_usage_bytes{name =~ ".+",pod=~"$Pod",namespace="$namespace") by (pod,instance,namespace), "node", "$1", "instance", "(.*)")) / on(node) group_left sum(kube_node_status_allocatable{resource="memory"}) by (node) * 100 |
k8s_pod_rate_mem_no_cache_node | Pod | 内存利用率(占节点,不含Cache) | % | (label_replace(sum(container_memory_working_set_bytes{name =~ ".+",pod=~"$Pod",namespace="$namespace"}) by (pod,instance,namespace), "node", "$1", "instance", "(.*)")) / on(node) group_left sum(kube_node_status_allocatable{resource="memory"}) by (node) * 100 |
k8s_pod_rate_mem_usage_request | Pod | 内存利用率(占request) | % | sum (container_memory_usage_bytes{image=~".+",pod=~"$Pod",namespace="$namespace"}) by (pod) / (sum (kube_pod_container_resource_requests{resource="memory",pod=~"$Pod",namespace="$namespace"}) by (pod))*100 |
k8s_pod_rate_mem_no_cache_request | Pod | 内存利用率(占request,不含Cache) | % | sum (container_memory_working_set_bytes{image=~".+",pod=~"$Pod",namespace="$namespace"}) by (pod) / (sum (kube_pod_container_resource_requests{resource="memory",pod=~"$Pod",namespace="$namespace"}) by (pod))*100 |
k8s_pod_rate_mem_usage_limit | Pod | 内存利用率(占limit) | % | sum (container_memory_usage_bytes{image=~".+",pod=~"$Pod",namespace="$namespace"}) by (pod) / (sum (kube_pod_container_resource_limits{resource="memory",pod=~"$Pod",namespace="$namespace"}) by (pod))*100 |
k8s_pod_rate_mem_no_cache_limit | Pod | 内存利用率(占limit,不含Cache) | % | sum (container_memory_working_set_bytes{image=~".+",pod=~"$Pod",namespace="$namespace"}) by (pod) / (sum (kube_pod_container_resource_limits{resource="memory",pod=~"$Pod",namespace="$namespace"}) by (pod))*100 |
网络预置指标
指标名称 | 指标对象 | 指标含义 | 指标单位 | 计算公式 |
k8s_pod_network_receive_bytes_bw | Pod | 网络入带宽 | Byte/s | sum(rate(container_cpu_usage_seconds_total{image=~".+",pod=~"$Pod",namespace="$namespace"}[5m])) by (pod) |
k8s_pod_network_transmit_bytes_bw | Pod | 网络出带宽 | Byte/s | sum(irate(container_network_transmit_bytes_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m])) by (pod) |
k8s_pod_network_receive_bytes | Pod | 网络入流量 | Byte/s | sum(rate(container_network_receive_bytes_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m])) by (pod) |
k8s_pod_network_transmit_bytes | Pod | 网络出流量 | Byte/s | sum(rate(container_network_transmit_bytes_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m])) by (pod) |
k8s_pod_network_receive_packets | Pod | 网络入包量 | 个/s | sum(irate(container_network_receive_packets_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m])) by (pod) |
k8s_pod_network_transmit_packets | Pod | 网络出包量 | 个/s | sum(irate(container_network_transmit_packets_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m])) by (pod) |
硬盘预置指标
指标名称 | 指标对象 | 指标含义 | 指标单位 | 计算公式 |
k8s_pod_fs_read_times | Pod | 硬盘读IOPS | 次/s | sum (irate(container_fs_reads_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m])) by (pod) |
k8s_pod_fs_write_times | Pod | 硬盘写IOPS | 次/s | sum (irate(container_fs_writes_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m])) by (pod) |
k8s_pod_fs_read_bytes | Pod | 硬盘读流量 | Byte/s | sum (rate(container_fs_reads_bytes_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m]))by (pod) |
k8s_pod_fs_write_bytes | Pod | 硬盘写流量 | Byte/s | sum (rate(container_fs_writes_bytes_total{image=~".+", namespace=~"$namespace", pod=~"$pod"}[5m])) by (pod) |