今回は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