如何爲Kubernetes配置Pod水平自動擴展

乾貨教程!教你如何在K8S上實現根據CPU等實際使用量與用戶的指望值進行比對,實現部署的自動擴展和縮減!git


介 紹github

Kubernetes有一個強大的功能,它能在運行的服務上進行編碼並配置彈性伸縮。若是沒有彈性伸縮功能,就很難適應部署的擴展和知足SLAs。這一功能稱爲Horizontal Pod Autoscaler (HPA)。api

爲何使用HPA服務器

使用HPA,您能夠根據資源的使用狀況或者自定義的指標,實現部署的自動擴展和縮減,讓部署的規模接近於實際服務的負載。工具

HPA能夠爲您的服務帶來兩個直接的幫助:性能

  1. 在須要計算和內存資源時提供資源,在不須要時釋放它們測試

  2. 按需增長/下降性能以實現SLA編碼

HPA工做原理url

HPA會根據監測到的CPU/內存利用率(資源指標),或基於第三方指標應用程序(如Prometheus、Datadog等)提供的自定義指標,自動調整副本控制器、部署或者副本集合的pods數量(定義最小和最大pods數)。HPA是一種控制迴路,它的週期由Kubernetes的controller manager –horizontal-pod-autoscaler-sync-period標誌控制(默認值是30s)。spa

HPA定義

HPA是Kubernetes中彈性伸縮API組下的一個API資源。當前穩定的版本是autoscaling/v1,它只提供了對CPU自動縮放的支持。若是您想額外得到對內存和自定義指標的支持,可使用Beta版本autoscaling/v2beta1。

您能夠在HPA API對象中看到更多信息:https://git.k8s.io/community/contributors/design-proposals/autoscaling/horizontal-pod-autoscaler.md#horizontalpodautoscaler-object

在通常狀況下HPA是由kubectl來提供支持的。可使用kubectl進行建立、管理和刪除:

建立HPA:

  • 帶有manifest: kubectl create -f <HPA_MANIFEST>

  • 沒有manifest(只支持CPU):kubectl autoscale deployment hello-world –min=2 --man=5 –-cpu-percent=50

獲取hpa信息:

  • 基本信息: kubectl get hpa hello-world

  • 細節描述: kubectl describe hpa hello-world

刪除hpa:

  • kubectl delete hpa hello-world

下面是一個HPA manifest定義的例子:

這裏使用了autoscaling/v2beta1版本,用到了cpu和內存指標

  • 控制hello-world項目部署的自動縮放

  • 定義了副本的最小值1

  • 定義了副本的最大值10

  • 當知足時調整大小:

    CPU使用率超過50%

    內存使用超過100Mi

安 裝

在HPA能夠在Kubernetes集羣上使用以前,有一些元素須要在系統中安裝和配置。

需 求

檢查肯定Kubernetes集羣服務正在運行而且至少包含了這些標誌:

  • kube-api: requestheader-client-ca-file

  • kubelet: read-only-port 在端口10255

  • kube-controller: 可選,只在須要和默認值不一樣時使用

  • horizontal-pod-autoscaler-downscale-delay:」5m0s」

  • horizontal-pod-autoscaler-upscale-delay:」3m0s」

  • horizontal-pod-autoscaler-sync-period: 「30s」

對於RKE,Kubernetes集羣定義,請肯定您已經在服務部分添加了這些行。若是要在Rancher v2.0.X UI中執行此操做,請打開」Cluster options」- 「Edit as YAML」並添加下面的定義:

要部署指標服務,您的Kubernetes集羣必需要正確配置和部署。

注意:在部署和測試示例時,本文使用的是Rancher v2.0.6以及k8s v1.10.1集羣

資源指標

若是HPA想要使用資源指標,那麼就須要用到metrics-server包了,它在Kubernetes集羣中的kube-system命名空間裏。

按照下面的步驟實現:

  1. 配置kubectl鏈接到正確的Kubernetes集羣

  2. 克隆metrics-server的Github倉庫:git clone https://github.com/kubernetes-incubator/metrics-server

  3. 安裝metrics-server包(假設Kubernetes升級到了1.8):kubectl create -f metrics-server/deply/1.8+/

  4. 檢查metrics-server是否運行正常。在命名空間kube-system能夠檢查服務pod以及日誌

  1. 檢查是否能夠從kubectl訪問指標API:若是您要直接訪問Kubernetes集羣,請使用kubectl config的服務器URL,好比‘https://:6443’

若是您想經過Rancher訪問Kubernetes集羣,那麼kubectl config的服務器URL就要像:https://<RANCHER_URL>/k8s/clusters/<CLUSTER_ID>,即你還要在本來的

API路徑後面加上/k8s/clusters/<CLUSTER_ID>

自定義指標(Prometheus)

自定義指標做爲一種資源,能夠由許多第三方應用程序提供。咱們準備在演示中使用Prometheus。假設Prometheus已經部署在您的Kubernetes集羣中了,它能夠從pods、節點、命名空間等等地方得到正確的指標,咱們將使用Prometheus url,http://prometheus.mycompany.io,它公開於端口80。

Prometheus能夠在Rancher v2.0目錄中部署。若是在Kubernetes集羣上沒有運行,那麼就在Rancher目錄中部署它。

若是HPA想要使用Prometheus中的自定義指標,那麼Kubernetes集羣上的kube-system命名空間則須要用到k8s-prometheus-adapter。爲了方便k8s-prometheus-adapter的安裝,咱們將使用banzai-charts提供的Helm chart。

經過下面的步驟可使用這一chart:

  1. 在k8s集羣上初始化helm

  1. 從Github倉庫克隆banzai-charts:

  1. 安裝prometheus-adapter,指定具體的Prometheus URL和端口

  1. 檢查prometheus-adapter是否運行正常。檢查服務pod和日誌是在kube-system命名空間下

  1. 檢查指標API是否能夠從kubectl進行訪問:直接訪問Kubernetes集羣,那麼kubectl config的服務器URL就好比https://<K8s_URL>:6443

若是是從Rancher進行訪問,那麼kubectl config的服務器URL就是https://<RANCHER_URL>/k8s/clusters/<CLUSTER_ID>,須要加上後綴/k8s/clusters/<CLUSTER_ID>

ClusterRole和ClusterRoleBinding

默認狀況下,HPA將嘗試經過用戶的system:anonymous讀取(系統的和自定義的)指標。用戶須要定義view-resource-metrics以及view-custom-metrics,而ClusterRole和ClusterRoleBinding將它們分配給system:anonymous來打開對指標的讀取訪問。

要實現這一點,須要下面的步驟:

  1. 配置kubectl正確鏈接到k8s集羣

  2. 複製ClusterRole和ClusterRoleBinding文件:

在Kubernetes集羣上建立它們(若是你想使用自定義指標的話):

服務部署

爲了讓HPA正常工做,服務部署應該要有容器的資源請求定義。

咱們用一個hello-world的例子來測試一下HPA是否正常工做。

咱們根據下面步驟進行,第一步,正確配置kubectl鏈接到k8s集羣,第二步,複製hello-world的部署文件。

  1. 在k8s集羣上部署它

  1. 爲資源或者自定義指標複製HPA

  2. 資源指標:

``` apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: hello-world namespace: default spec: scaleTargetRef: apiVersion: extensions/v1beta1 kind: Deployment name: hello-world minReplicas: 1 maxReplicas: 10 metrics:

  • type: Resource resource:name: cpu targetAverageUtilization: 50

  • type: Resource resource: name: memory targetAverageValue: 1000Mi

  • 自定義指標(和資源指標同樣,不過須要添加自定義的cpu_system指標)

  1. 得到HPA信息和描述,而且檢查資源指標是否已經顯示出來:

資源指標:

自定義指標:

  1. 給咱們的服務產生負載,進行彈性伸縮的測試。這裏可使用各類各樣的工具(產生負載),不過這裏咱們使用https://github.com/rakyll/hey 向hello-world服務發出http請求,並觀察彈性伸縮是否正常工做

  2. 觀察自動的擴縮容

  • 資源指標:

  • 當cpu利用率達到目標比例時,自動擴展到2個pods

當cpu使用率達到目標值horizontal-pod-autoscaler-upscale-delay默認超過3分鐘時,擴展到3個pods:

當cpu使用率降到目標值horizontal-pod-autoscaler-downscale-delay默認超過5分鐘時,縮小到1個pods:

自定義指標:

  • 當cpu利用率達到目標時擴展到2個pods:

當cpu_system利用率限制達到目標值,擴展到3個pods:

當cpu利用率限制達到目標值horizontal-pod-autoscaler-upscale-delay超過3分鐘(默認),擴展到4個pods:

當全部的指標都低於目標值horizontal-pod-autoscaler-downscale-delay 超過5分鐘,自動縮小到1個pods:

總 結

咱們看到了如何在Rancher上使用Kubernetes HPA來進行部署的彈性擴縮容。這是一個很是出色好用的功能,可讓部署的規模適應於實際的服務負載而且實現服務SLA。

咱們還看到,如何在kube-controller上對horizontal-pod-autoscaler-downscale-delay (默認5分鐘)和 horizontal-pod-autoscaler-upscale-delay (默認3分鐘) 進行參數化,調整擴縮容的反應。

對於咱們的自定義指標,咱們在例子cpu_system中進行了展現,不過咱們還可使用全部導出給Prometheus的指標,並瞭解當前服務的性能,好比http_request_number、http_response_time等等。

爲了讓以後HPA更容易使用,咱們如今正努力將metric-server做爲插件集成到RKE集羣部署中。它如今已經包含在RKE v0.1.9-rc2中進行測試,目前還還沒有獲得官方的支持。它會在RKE v0.1.9版本中獲得支持。

相關文章
相關標籤/搜索