應用場景
云容器引擎提供Pod 水平自動擴縮(HPA)能力,水平自動擴縮能夠根據指標自動更新工作負載資源 (例如 Deployment 或者StatefulSet)的副本數, 目的是自動擴縮工作負載以滿足需求。在云容器引擎控制臺支持配置基礎資源(CPU、內存)和自定義指標(網絡、磁盤等)作為Pod擴縮容的觸發條件。
前提條件
已創建專有版集群,具體操作請參見 用戶指南 > 集群管理 > 新建集群 章節。若已有集群,無需重復操作。
通過基礎指標(CPU、內存)進行Pod的水平自動伸縮
步驟一 安裝cube-metrics-server 插件
云容器引擎在插件市場提供了cube-metrics-server插件,cube-metrics-server是k8s原生提供的插件,支持通過CPU、內存進行HPA的能力;
登陸云容器引擎控制臺,進入需要操作的集群,在左側菜單選擇 插件 > 插件市場,選擇cube-metrics-server進行安裝
步驟二 配置HPA策略
登陸云容器引擎控制臺,進入需要操作的集群,在左側菜單選擇 工作負載 并選擇進入對應的工作負載頁面,以下以無狀態工作負載為例,點擊需要伸縮的工作負載右側的更多按鈕,選擇彈性伸縮,開啟指標伸縮按鈕
點擊啟用策略,指標名稱可選CPU和內存,計值方式為百分比;填寫伸縮的指標閾值及副本數的伸縮范圍,點擊確定創建HPA策略
通過預置的高階指標(網絡、磁盤等)進行 Pod的水平自動伸縮
步驟一 安裝cube-prometheus和cube-metrics-adapter插件
通過預置的高階指標(如網絡、磁盤等)依賴監控cube-prometheus和cube-metrics-adapter插件
登陸云容器引擎控制臺,進入需要操作的集群,在左側菜單選擇 插件 > 插件市場,選擇cube-metrics-adapter插件進行安裝
需要注意的是如果集群的監控插件為ccse-monitor,需要修改values中metricsProvider.mode參數為ccse-monitor
步驟二 配置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) |