HPA

我們可以執(zhí)行kubectl scale命令和Dashboard上操作可以實(shí)現(xiàn)pod的擴(kuò)縮容灭衷,但是這樣畢竟需要每次手工操作一次次慢,而且指不定什么時(shí)候業(yè)務(wù)請(qǐng)求量就很大了,所以如果不能做到自動(dòng)化的去擴(kuò)縮容的話(huà),這也是一件麻煩的事迫像。如果kubernetes系統(tǒng)能夠根據(jù)Pod的當(dāng)前負(fù)載的變化情況來(lái)自動(dòng)的進(jìn)行擴(kuò)縮容就好了拭抬,因?yàn)檫@個(gè)過(guò)程本來(lái)就是不固定的,頻繁發(fā)生的侵蒙,所以純手工方式不是很現(xiàn)實(shí)造虎。

Kubernetes為我們提供了一個(gè)資源對(duì)象:Horizontal Pod Autoscaling(Pod水平自動(dòng)伸縮),簡(jiǎn)稱(chēng)HPA纷闺。HPA通過(guò)監(jiān)控分析RC或者Deployment控制所有Pod的負(fù)載變化情況來(lái)確定是否需要調(diào)整pod的副本數(shù)算凿,這是HPA最基本的原理。


image.png

HPA

HPA在kubernetes集群中被設(shè)計(jì)成一個(gè)controller犁功,我們可以簡(jiǎn)單通過(guò)kubectl autoscale 命令來(lái)創(chuàng)建一個(gè)HPA資源對(duì)象氓轰,HPA Controller默認(rèn)30秒輪詢(xún)一次(可通過(guò)kube-controller-manager的標(biāo)志 --horizontal-pod-autoscaler-sync-period進(jìn)行設(shè)置),查詢(xún)指定的資源(RC或者Deployment)中的pod的資源利用率浸卦,并且與創(chuàng)建時(shí)設(shè)定的值和指標(biāo)做對(duì)比署鸡,從而實(shí)現(xiàn)自動(dòng)伸縮的功能。

當(dāng)你創(chuàng)建HPA后限嫌,HPA會(huì)從Heapster或者用戶(hù)自定義的RESTClient端獲取每一個(gè)pod利用率或者原始值的平均值靴庆,然后和HPA中定義的指標(biāo)進(jìn)行對(duì)比,同時(shí)計(jì)算出需要伸縮的具體值并進(jìn)行相應(yīng)的操作怒医。目前炉抒,HPA可以從兩個(gè)地方獲取數(shù)據(jù):
* Heapster:僅支持獲取cpu使用率
* 自定義監(jiān)控:

Heapster

首先安裝Heapster,前面我們?cè)趉ubeadm搭建集群的課程中稚叹,實(shí)際上我們已經(jīng)默認(rèn)把Heapster相關(guān)的鏡像都已經(jīng)拉取到節(jié)點(diǎn)上了焰薄,所以接下來(lái)我們只需要部署即可,我們這里使用的是Heapster 1.4.2版本的扒袖,前往Heapster的githup頁(yè)面:
[https://github.com/kubernetes/heapster](https://github.com/kubernetes/heapster/tree/v1.4.2/deploy/kube-config/influxdb)

[root@app-139-42 HPA]# vim heapster.yaml 

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: heapster
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: heapster-admin
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: heapster
  namespace: kube-system

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: heapster
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      task: monitoring
      k8s-app: heapster
  template:
    metadata:
      labels:
        task: monitoring
        k8s-app: heapster
    spec:
      serviceAccountName: heapster
      containers:
      - name: heapster
        image: 172.20.139.17:5000/heapster-amd64:v1.3.0
        imagePullPolicy: IfNotPresent
        command:
        - /heapster
        - --source=kubernetes:kubernetes:https://kubernetes.default?useServiceAccount=true&kubeletHttps=true&kubeletPort=10250&insecure=true    # 10255端口不通塞茅,k8s默認(rèn)使用10250
        - --sink=influxdb:http://monitoring-influxdb.kube-system.svc:8086
---
apiVersion: v1
kind: Service
metadata:
  labels:
    task: monitoring
    # For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)
    # If you are NOT using this as an addon, you should comment out this line.
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: Heapster
  name: heapster
  namespace: kube-system
spec:
  ports:
  - port: 80
    targetPort: 8082
  selector:
    k8s-app: heapster


[root@app-139-42 HPA]# vim grafana.yaml 

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: monitoring-grafana
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
        task: monitoring
        k8s-app: grafana
  template:
    metadata:
      labels:
        task: monitoring
        k8s-app: grafana
    spec:
      containers:
      - name: grafana
        image: 172.20.139.17:5000/heapster-grafana-amd64:v4.2.0
        ports:
        - containerPort: 3000
          protocol: TCP
        volumeMounts:
        - mountPath: /var
          name: grafana-storage
        env:
        - name: INFLUXDB_HOST
          value: monitoring-influxdb
        - name: GF_SERVER_HTTP_PORT
          value: "3000"
          # The following env variables are required to make Grafana accessible via
          # the kubernetes api-server proxy. On production clusters, we recommend
          # removing these env variables, setup auth for grafana, and expose the grafana
          # service using a LoadBalancer or a public IP.
        - name: GF_AUTH_BASIC_ENABLED
          value: "false"
        - name: GF_AUTH_ANONYMOUS_ENABLED
          value: "true"
        - name: GF_AUTH_ANONYMOUS_ORG_ROLE
          value: Admin
        - name: GF_SERVER_ROOT_URL
          # If you're only using the API Server proxy, set this value instead:
          # value: /api/v1/proxy/namespaces/kube-system/services/monitoring-grafana/
          value: /
      volumes:
      - name: grafana-storage
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  labels:
    # For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)
    # If you are NOT using this as an addon, you should comment out this line.
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: monitoring-grafana
  name: monitoring-grafana
  namespace: kube-system
spec:
  # In a production setup, we recommend accessing Grafana through an external Loadbalancer
  # or through a public IP.
  # type: LoadBalancer
  # You could also use NodePort to expose the service at a randomly-generated port
  # type: NodePort
  ports:
  - port: 80
    targetPort: 3000
  selector:
    k8s-app: grafana

[root@app-139-42 HPA]# vim influxdb.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: monitoring-influxdb
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      task: monitoring
      k8s-app: influxdb
  template:
    metadata:
      labels:
        task: monitoring
        k8s-app: influxdb
    spec:
      containers:
      - name: influxdb
        image: 172.20.139.17:5000/heapster-influxdb-amd64:v1.1.1
        volumeMounts:
        - mountPath: /data
          name: influxdb-storage
      volumes:
      - name: influxdb-storage
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  labels:
    task: monitoring
    # For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)
    # If you are NOT using this as an addon, you should comment out this line.
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: monitoring-influxdb
  name: monitoring-influxdb
  namespace: kube-system
spec:
  ports:
  - port: 8086
    targetPort: 8086
  selector:
    k8s-app: influxdb

我們可以把該頁(yè)面的下的yaml文件拷貝到我們的集群中,使用kubectl創(chuàng)建即可季率,另外創(chuàng)建完野瘦,如果需要在dashboard當(dāng)中看到監(jiān)控圖表,我們還需要在Dashboard中配置上我們的heapster-host蚀同。

同樣的缅刽,我們來(lái)創(chuàng)建一個(gè)Deployment管理pod啊掏,然后利用HPA來(lái)進(jìn)行自動(dòng)擴(kuò)縮容蠢络,定義Deployment的yaml文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hap-nginx-deploy
  labels:
    app: nginx-demo
spec:
  replicas: 3
  revisionHistoryLimit: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: web
        image: nginx
        ports:
        - containerPort: 80  
# 然后創(chuàng)建Deployment:
$ kubectl create -f hpa-deploy-demo.yaml

# 現(xiàn)在我們來(lái)創(chuàng)建一個(gè)HPA,可以使用kubectl autoscale命令來(lái)創(chuàng)建:
$ kubectl autoscale deployment hpa-nginx-deploy --cpu-percent=10 --min=1 --max=10
deployment "hpa-nginx-deploy" autoscaled
···
$ kubectl get hpa                                                         
NAME        REFERENCE              TARGET    CURRENT   MINPODS   MAXPODS   AGE
hpa-nginx-deploy   Deployment/hpa-nginx-deploy   10%       0%        1         10        13s
此命令創(chuàng)建了一個(gè)關(guān)聯(lián)資源 hpa-nginx-deploy 的HPA迟蜜,最小的 pod 副本數(shù)為1刹孔,最大為10。HPA會(huì)根據(jù)設(shè)定的 cpu使用率(10%)動(dòng)態(tài)的增加或者減少pod數(shù)量。

使用kubectl autoscale命令來(lái)創(chuàng)建外髓霞,我們依然可以通過(guò)yaml形式來(lái)創(chuàng)建HPA資源對(duì)象卦睹。如果不知道怎么編寫(xiě),可以查看上面命令行創(chuàng)建的HPA的YAML文件

$ kubectl get hpa hpa-nginx-deploy -o yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  creationTimestamp: 2017-06-29T08:04:08Z
  name: nginxtest
  namespace: default
  resourceVersion: "951016361"
  selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginxtest
  uid: 86febb63-5ca1-11e7-aaef-5254004e79a3
spec:
  maxReplicas: 5 //資源最大副本數(shù)
  minReplicas: 1 //資源最小副本數(shù)
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment //需要伸縮的資源類(lèi)型
    name: nginxtest  //需要伸縮的資源名稱(chēng)
  targetCPUUtilizationPercentage: 50 //觸發(fā)伸縮的cpu使用率
status:
  currentCPUUtilizationPercentage: 48 //當(dāng)前資源下pod的cpu使用率
  currentReplicas: 1 //當(dāng)前的副本數(shù)
  desiredReplicas: 2 //期望的副本數(shù)
  lastScaleTime: 2017-07-03T06:32:19Z

現(xiàn)在可以根據(jù)上面的yaml文件可以自己創(chuàng)建一個(gè)基于YAML的HPA描述文件了方库。

現(xiàn)在我們來(lái)增大負(fù)載進(jìn)行測(cè)試结序,我們來(lái)創(chuàng)建一個(gè)busybox,并且循環(huán)訪(fǎng)問(wèn)上面創(chuàng)建的服務(wù)

$ kubectl run -i --tty load-generator --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.
/ # while true; do wget -q -O- http://172.16.255.60:4000; done

下圖可以看到纵潦,HPA已經(jīng)開(kāi)始工作徐鹤。

$ kubectl get hpa
NAME        REFERENCE              TARGET    CURRENT   MINPODS   MAXPODS   AGE
hpa-nginx-deploy   Deployment/hpa-nginx-deploy   10%       29%        1         10  

同時(shí)我們查看相關(guān)資源hpa-nginx-deploy的副本數(shù)量,副本數(shù)量已經(jīng)從原來(lái)的1變成了3邀层。

$ kubectl get deployment hpa-nginx-deploy
NAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hpa-nginx-deploy   3         3         3            3           4d

同時(shí)再次查看HPA返敬,由于副本數(shù)量的增加,使用率也保持在了10%左右寥院。

$ kubectl get hpa
NAME        REFERENCE              TARGET    CURRENT   MINPODS   MAXPODS   AGE
hpa-nginx-deploy   Deployment/hpa-nginx-deploy   10%       9%        1         10        35m

同樣的這個(gè)時(shí)候我們來(lái)關(guān)掉busybox來(lái)減少負(fù)載劲赠,然后等待一段時(shí)間觀察下HPA和Deployment對(duì)象

$ kubectl get hpa     
NAME        REFERENCE              TARGET    CURRENT   MINPODS   MAXPODS   AGE
hpa-nginx-deploy   Deployment/hpa-nginx-deploy   10%       0%        1         10        48m
$ kubectl get deployment hpa-nginx-deploy
NAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hpa-nginx-deploy   1         1         1            1           4d

可以看到副本數(shù)量已經(jīng)由3變?yōu)?。

不過(guò)當(dāng)前的HPA只有CPU使用率這一個(gè)指標(biāo)秸谢,還不是很靈活的凛澎,在后面的課程中我們來(lái)根據(jù)我們自定義的監(jiān)控來(lái)自動(dòng)對(duì)Pod進(jìn)行擴(kuò)縮容。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末估蹄,一起剝皮案震驚了整個(gè)濱河市预厌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌元媚,老刑警劉巖轧叽,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異刊棕,居然都是意外死亡炭晒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)甥角,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)网严,“玉大人,你說(shuō)我怎么就攤上這事⊙Γ” “怎么了乔夯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)垢村。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嚎卫,這世上最難降的妖魔是什么嘉栓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上侵佃,老公的妹妹穿的比我還像新娘麻昼。我一直安慰自己,他們只是感情好馋辈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布抚芦。 她就那樣靜靜地躺著,像睡著了一般迈螟。 火紅的嫁衣襯著肌膚如雪燕垃。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天井联,我揣著相機(jī)與錄音卜壕,去河邊找鬼。 笑死烙常,一個(gè)胖子當(dāng)著我的面吹牛轴捎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蚕脏,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼侦副,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了驼鞭?” 一聲冷哼從身側(cè)響起秦驯,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挣棕,沒(méi)想到半個(gè)月后译隘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洛心,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年固耘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片词身。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厅目,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出法严,到底是詐尸還是另有隱情损敷,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布深啤,位于F島的核電站拗馒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏墓塌。R本人自食惡果不足惜瘟忱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苫幢。 院中可真熱鬧访诱,春花似錦、人聲如沸韩肝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哀峻。三九已至涡相,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剩蟀,已是汗流浹背催蝗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留育特,地道東北人丙号。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像缰冤,于是被迫代替她去往敵國(guó)和親犬缨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容