↔️

k8sのHPA(Horizontal Pod Autoscaler) 思ったより躓いた

2023/04/13に公開

k8sで水平スケーリングを学習

以下の記事を参考に作業していました。それまで割と順調に進んでいましたが、HPAのハンズオンで少し時間を要し、対応したこともいくつかあったので、まとめました。こういうやり方でやればいいのでは?などありましたら、コメントいただけると助かります。
https://kubernetes.io/ja/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

環境

  • OS:Windows 11 Home
  • k8sのバージョン:v1.25.4(Docker Desktopの画面)

作業開始

ハンズオン内の以下コマンドを実行して、Deployment・Serviceを立ち上げます。

kubectl apply -f https://k8s.io/examples/application/php-apache.yaml

Horizontal Pod Autoscaler作成

以下コマンドでautoscalerを作成します。記事の中に記載されている通りですが、Podレプリカ数を1から10の間に維持するHorizontal Pod Autoscalerとなります。

kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10

horizontalpodautoscaler.autoscaling/php-apache autoscaled

AutoScalerの状況を確認するため、以下コマンドを実行しました。

kubectl get hpa

ハンズオンのページと異なる結果に

ハンズオンが期待する状態

NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache/scale 0% / 50% 1 10 1 18s

実行結果

TARGETにunknownが表示されています。

Lensの画面を見ると、エラーが表示されていました。(赤字部分)

Lensの詳細説明は省きますが、k8s用のIDEです。Terminalも使えるので、便利かと思います。
またセットアップも非常に簡単です。
https://k8slens.dev/
https://medium.com/dictcp/kubernetes-gui-clients-in-2020-kube-dashboard-lens-octant-and-kubenav-ce28df9bb0f0
戻ります!
表示されていたエラーの内容です。

failed to get cpu utilization: unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server could not find the requested resource (get pods.metrics.k8s.io)

invalid metrics (1 invalid out of 1), first error is: failed to get cpu resource metric value: failed to get cpu utilization: unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server could not find the requested resource (get pods.metrics.k8s.io)

metrics API: the server could not find the requested resourceあたりが肝ですが、
clusterにmetrics-serverがないため、このエラーがでていると判断しました。

自分の環境にあるのかないのか、以下コマンドで確認してみます。

kubectl top pod

以下のように出力される場合は、metrics-serverがない状態です。

error: Metrics API not available

Podの削除

状況をややこしくしたくないので、一度削除します。

kubectl delete -f https://k8s.io/examples/application/php-apache.yaml

Metrics Server導入

AWSのEKSのユーザガイドに手順が記載されていました。ページを開くとコマンドが2つあります。
それを順番に実行するだけ、のはずでした。
https://docs.aws.amazon.com/eks/latest/userguide/metrics-server.html

  1. Deploy the Metrics Server with the following command:

500エラー発生

コマンドを実行して、30秒くらい待ちました。
Lensの画面で500エラーを確認しました。
kubectl describe podコマンドでも確認できます)

Readiness probe failed: HTTP probe failed with statuscode: 500

認証関連のエラーが発生してしまっていました。
回避する方法として、 --kubelet-insecure-tlsを用いる方法があります。

ローカルにないファイルの更新

github上のあるissueで見つけました。
https://github.com/kubernetes-sigs/metrics-server/issues/131#issuecomment-618671827
以下コマンドを実行します。

kubectl edit deploy metrics-server -n kube-system

メモ帳のようなものが立ち上がるはずです。

真ん中あたりに、以下の記述がありますので、修正してください。

  - args:
    - --cert-dir=/tmp
    - --secure-port=4443
    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
    - --kubelet-use-node-status-port
    - --metric-resolution=15s

以下のように更新して保存し、閉じます。

  - args:
    - --cert-dir=/tmp
    - --secure-port=4443
    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
    - --kubelet-use-node-status-port
    - --kubelet-insecure-tls
    - --metric-resolution=15s

30秒かからずに、先ほどエラーとなっていたPodがRunning状態になります。

コマンド:kubectl get po -n kube-system | grep metrics-server

再度php-apacheの起動

再度php-apacheの起動をします。

kubectl apply -f https://k8s.io/examples/application/php-apache.yaml

Horizontal Pod Autoscalerは既に作成済かと思いますので、再度実行する必要はないです。
※既に作成した状態で再作成を行うと以下のようにエラーがでます。

TARGETにunknownではなく、数値になりました!

負荷増加実施

ハンズオンの資料にある通りに、コマンドを実行します。(別のターミナルで実行

kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"

以下の文言を含むエラーがでてしまった場合

OCI runtime create failed: runc create failed: unable to start container process

/bin/shの部分を各自の環境に適したものに変更してください。
実行して少し(~1分)すると、負荷がかかっていることを確認できます。

オートスケール確認


Pod数の増加を確認できます。


確認ができたら、負荷をかけるのやめます。
私の場合は、3,4分でしょうか、待ったところ初期の状態(Pod1つの状態)に戻りました。

片付け

metrics-serverphp-apacheのリソースを削除します。deleteコマンドだけで片付けが済むので、楽に済みますね!

kubectl delete -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
ubectl delete -f https://k8s.io/examples/application/php-apache.yaml

応用部分への取り組み

今回取り組んだのはここまででしたが、ハンズオンの以下内容については、今後でてくるタイミングで再確認したいと思います。

複数のメトリクスやカスタムメトリクスを基にオートスケーリングする

まとめ

今後もこういった躓くこともありますが、一つひとつ向き合いつつ、適宜文字おこししていきたいとおもいます。

Discussion