Kubernetesノート(十二)-Pod自動拡張(HPA)


Pod自動拡張容量
前述のレッスンでは、クbectl scaleコマンドを手動で実行したり、Dashboardで操作したりすることでPodの拡張容量を実現することができますが、これはやはり手動で操作するたびに必要であり、いつ業務要求量が大きくなるか分からないので、自動化された拡張容量を実現できないと、これも面倒なことです.KubernetesシステムがPodの現在の負荷の変化状況に応じて自動的に拡縮容量を行うことができればよいが,この過程はもともと固定されず頻繁に発生するため,純粋な手作業の方式は現実的ではない.
幸いなことに、KubernetesはHPAと略称するHorizontal Pod Autoscaling(Pod水平自動伸縮)というリソースオブジェクトを提供してくれました.HPAは、RCまたはDeployment制御のすべてのPodの負荷変化を監視分析することによって、Podのコピー数を調整する必要があるかどうかを決定する.これはHPAの最も基本的な原理である.
HPAはkubernetesクラスタでコントローラとして設計されており、kubectl autoscaleコマンドによりHPAリソースオブジェクトを簡単に作成できます.HPA Controllerのデフォルト30 sは1回ポーリングし(kube-controller-managerのフラグ-horizontal-pod-autoscaler-sync-periodで設定できます)、指定されたリソース(RCまたはDeployment)のPodのリソース使用率を問い合せます.また、作成時に設定した値や指標と比較して、自動伸縮機能を実現します.
HPAを作成すると、HPAはHeapsterまたはユーザー定義のRESTClient側から各Pod使用率または元の値の平均値を取得し、HPAで定義した指標と比較しながら、伸縮が必要な具体的な値を計算し、対応する操作を行います.現在、HPAは2つの場所からデータを取得できます.
Heapster:   CPU   
     :                          

私たちのこの授業では、Heapsterから監視データを取得して自動拡張を行う方法を紹介します.まず、Heapsterをインストールしなければなりません.前にkubeadmでクラスタを構築する授業で、実際にはHeapster関連のミラーをノードにデフォルトで引き出しました.だから、次は配置するだけです.ここではHeapster 1.4.2バージョンを使用しています.Heapsterのgithubページに行きます.
https://github.com/kubernetes/heapster
このディレクトリの下にあるyamlファイルをクラスタに保存し、kubectlコマンドラインツールを使用して作成します.また、作成が完了したら、Dashboardでモニタグラフを表示する必要がある場合は、Dashboardでheapster-hostを構成する必要があります.
同様に、Deployment管理のNginx Podを作成し、HPAを使用して自動拡張容量を作成します.Deploymentを定義するYAMLファイルは以下の通りです.(hap-deploy-demo.yaml)
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: hpa-nginx-deploy
  labels:
    app: nginx-demo
spec:
  revisionHistoryLimit: 15
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

次にDeploymentを作成します.
$ kubectl create -f hpa-deploy-demo.yaml

次に、kubectl autoscaleコマンドを使用してHPAを作成します.
$ 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

このコマンドは、最小podコピー数1、最大10の関連リソースhpa-nginx-deployのHPAを作成します.HPAは、設定したcpu使用率(10%)に応じてpod数を動的に増加または減少させる.
もちろん、kubectl autoscaleコマンドを使用して作成する以外に、YAMLファイルを作成する形式でHPAリソースオブジェクトを作成することもできます.どのように書くか分からない場合は、上のコマンドラインで作成した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 //       
  minReplicas: 1 //       
  scaleTargetRef:
    apiVersion: extensions/v1beta1
    kind: Deployment //         
    name: nginxtest  //         
  targetCPUUtilizationPercentage: 50 //     cpu   
status:
  currentCPUUtilizationPercentage: 48 //     pod cpu   
  currentReplicas: 1 //      
  desiredReplicas: 2 //      
  lastScaleTime: 2017-07-03T06:32:19Z

では、上記のYAMLファイルに基づいて、YAMLベースのHPA記述ファイルを作成することができます.
次に、負荷を増大させてテストし、busyboxを作成し、上で作成したサービスにループアクセスします.
$ 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が動作していることを示しています.
$ kubectl get hpa
NAME        REFERENCE              TARGET    CURRENT   MINPODS   MAXPODS   AGE
hpa-nginx-deploy   Deployment/hpa-nginx-deploy   10%       29%        1         10        27m

同時に、関連リソースhpa-nginx-deployのコピー数を確認し、コピー数は元の1から3に変わりました.
$ kubectl get deployment hpa-nginx-deploy
NAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hpa-nginx-deploy   3         3         3            3           4d

同時にHPAを再確認したところ、コピー数の増加により使用率も10%程度に維持された.
$ kubectl get hpa
NAME        REFERENCE              TARGET    CURRENT   MINPODS   MAXPODS   AGE
hpa-nginx-deploy   Deployment/hpa-nginx-deploy   10%       9%        1         10        35m

同じタイミングでbusyboxをオフにして負荷を減らし、しばらく待ってHPAとDeploymentオブジェクトを観察します.
$ 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

コピー数が3から1に変わったことがわかります.
しかし、現在のHPAはCPUの使用率という指標しかなく、まだ柔軟ではありません.後の授業では、カスタマイズした監視に基づいてPodを自動的に拡張します.