k8sのHPA(Horizontal Pod Autoscaler) 思ったより躓いた
k8sで水平スケーリングを学習
以下の記事を参考に作業していました。それまで割と順調に進んでいましたが、HPAのハンズオンで少し時間を要し、対応したこともいくつかあったので、まとめました。こういうやり方でやればいいのでは?などありましたら、コメントいただけると助かります。
環境
- 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も使えるので、便利かと思います。
またセットアップも非常に簡単です。
戻ります!
表示されていたエラーの内容です。
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つあります。
それを順番に実行するだけ、のはずでした。
- 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で見つけました。
以下コマンドを実行します。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-server
とphp-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