フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【手順あり】KubernetesのHPA(Horizontal Pod Autoscaler)をためしてみる

Kubernetes

今回はHPA(Horizontal Pod Autoscaler)を実際に触ってみる検証をしていきたいと思います。

この書籍を参考にしています。

環境

名前 バージョン
OS CentOS Linux release 7.6.1810 (Core)
kubelet v1.18.1
kubeadm v1.18.1
docker v1.13.1
metrics-server v0.3.6

Metrics-Serverを導入する

コードはこちら( k8s-sample/metrics-server at master · lirlia/k8s-sample · GitHub)

git clone https://github.com/lirlia/k8s-sample
kubectl apply -f k8s-sample/metrics-server

kubectl top pods -Aで確認して出力されればOKです。しばらくかかります。

[root@master k8s-sample]# kubectl top pods -A
NAMESPACE              NAME                                             CPU(cores)   MEMORY(bytes)   
argocd                 argocd-application-controller-74b8d7b888-kvsfl   3m           31Mi            
argocd                 argocd-dex-server-5654f7fc98-wklsr               1m           11Mi            
argocd                 argocd-redis-6d7f9df848-6sv9q                    3m           9Mi  

NginxとHPAを導入する

コードはこちら( k8s-sample/nginx at master · lirlia/k8s-sample · GitHub)

kubectl apply -f k8s-sample/nginx

中身はこんな感じです。

Nginx

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: "0.3"
          requests:
            cpu: "0.1"
---

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - name: http
      port: 80
      targetPort: 80
      nodePort: 30092

HPA

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  maxReplicas: 5
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  targetCPUUtilizationPercentage: 5

正しく入るとこのようになります。

root@master k8s-sample]# kubectl get svc nginx
NAME    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx   NodePort   10.101.154.51   <none>        80:30092/TCP   30h
[root@master k8s-sample]# 
[root@master k8s-sample]# kubectl get pods 
NAME                     READY   STATUS    RESTARTS   AGE
nginx-845fb76cb6-mdlrg   1/1     Running   0          18m
[root@master k8s-sample]# 
[root@master k8s-sample]# kubectl get hpa 
NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   0%/5%     1         5         1          64m

負荷をかけてみる

負荷掛け前

まずpodが一個しかないことを確認します。

[root@master k8s-sample]# kubectl get pods --watch  --selector="app=nginx"
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5ddc966547-g5gmz   1/1     Running   0          10m

ではNginxコンテナに入って悪さをしてみましょう。

kubectl exec -it nginx-845fb76cb6-mdlrg bas

ログインしたらyesコマンドで負荷を上げます。

root@nginx-845fb76cb6-mdlrg:/# yes > /dev/null &

HPAはデフォルトでは5分で状態をチェックしていますのでpodが増えるまでしばらく待ちましょう。

負荷掛け中

[root@master vagrant]# kubectl get pods --watch  --selector="app=nginx"
NAME                     READY   STATUS    RESTARTS   AGE
nginx-845fb76cb6-mdlrg   1/1     Running   0          4m34s
nginx-845fb76cb6-4zxx5   0/1     Pending   0          0s
nginx-845fb76cb6-jpqb5   0/1     Pending   0          0s
nginx-845fb76cb6-4zxx5   0/1     Pending   0          0s
nginx-845fb76cb6-ftnbt   0/1     Pending   0          0s
nginx-845fb76cb6-jpqb5   0/1     Pending   0          0s
nginx-845fb76cb6-ftnbt   0/1     Pending   0          0s
nginx-845fb76cb6-4zxx5   0/1     ContainerCreating   0          0s
nginx-845fb76cb6-jpqb5   0/1     ContainerCreating   0          0s
nginx-845fb76cb6-ftnbt   0/1     ContainerCreating   0          0s
nginx-845fb76cb6-jpqb5   0/1     ContainerCreating   0          2s
nginx-845fb76cb6-4zxx5   0/1     ContainerCreating   0          3s
nginx-845fb76cb6-ftnbt   0/1     ContainerCreating   0          3s
nginx-845fb76cb6-jpqb5   1/1     Running             0          7s
nginx-845fb76cb6-4zxx5   1/1     Running             0          11s
nginx-845fb76cb6-ftnbt   1/1     Running             0          14s
nginx-845fb76cb6-mgfrl   0/1     Pending             0          0s
nginx-845fb76cb6-mgfrl   0/1     Pending             0          0s
nginx-845fb76cb6-mgfrl   0/1     ContainerCreating   0          0s
nginx-845fb76cb6-mgfrl   0/1     ContainerCreating   0          1s
nginx-845fb76cb6-mgfrl   1/1     Running             0          6s

どんどん作られていますね。


そして落ち着くとすべてがRunningになります。

[root@master vagrant]# kubectl get pods --watch  --selector="app=nginx"
NAME                     READY   STATUS    RESTARTS   AGE
nginx-845fb76cb6-4zxx5   1/1     Running   0          66s
nginx-845fb76cb6-ftnbt   1/1     Running   0          66s
nginx-845fb76cb6-jpqb5   1/1     Running   0          66s
nginx-845fb76cb6-mdlrg   1/1     Running   0          5m42s
nginx-845fb76cb6-mgfrl   1/1     Running   0          51s

kubectl describe hpaを叩くとこんなメッセージが出てるかと思います。

  Normal   SuccessfulRescale             7m24s              horizontal-pod-autoscaler  New size: 4; reason: cpu resource utilization (percentage of request) above target
  
  Normal   SuccessfulRescale             7m9s               horizontal-pod-autoscaler  New size: 5; reason: cpu resource utilization (percentage of request) above target

負荷掛けの停止

先ほどのyesコマンドを終了しましょう。

こんな表示があったと思います。

root@nginx-845fb76cb6-mdlrg:/# yes > /dev/null &
[1] 17

yesがPID 17で起動していますので殺します。

kill 17

HPAはデフォルトでは5分でチェックしていますので、podが減るまでしばらく待ちましょう。

しばらく経つと削除されていきます。

nginx-845fb76cb6-4zxx5   1/1     Terminating   0          8m40s
nginx-845fb76cb6-jpqb5   1/1     Terminating   0          8m40s
nginx-845fb76cb6-ftnbt   1/1     Terminating   0          8m40s
nginx-845fb76cb6-mgfrl   1/1     Terminating   0          8m26s
nginx-845fb76cb6-ftnbt   0/1     Terminating   0          8m46s
nginx-845fb76cb6-4zxx5   0/1     Terminating   0          8m46s
nginx-845fb76cb6-jpqb5   0/1     Terminating   0          8m47s
nginx-845fb76cb6-mgfrl   0/1     Terminating   0          8m33s
nginx-845fb76cb6-mgfrl   0/1     Terminating   0          8m35s
nginx-845fb76cb6-mgfrl   0/1     Terminating   0          8m36s
nginx-845fb76cb6-ftnbt   0/1     Terminating   0          8m51s
nginx-845fb76cb6-ftnbt   0/1     Terminating   0          8m52s
nginx-845fb76cb6-4zxx5   0/1     Terminating   0          8m52s
nginx-845fb76cb6-4zxx5   0/1     Terminating   0          8m52s
nginx-845fb76cb6-jpqb5   0/1     Terminating   0          8m52s
nginx-845fb76cb6-jpqb5   0/1     Terminating   0          8m52s

はい。なくなりました。

[root@master vagrant]# kubectl get pods --watch  --selector="app=nginx"
NAME                     READY   STATUS    RESTARTS   AGE
nginx-845fb76cb6-mdlrg   1/1     Running   0          14m

参考情報