メインコンテンツまでスキップ

第17章:HPAでオートスケール(負荷で増える)📈🔥

この章は「アクセスが増えたらPodが増える😆」「落ち着いたら減る😴」を、目で見て体験する回だよ〜!


1) HPAってなに?🤔(超ざっくり)

**HPA(HorizontalPodAutoscaler)**は、Deploymentなどの「Podの数」を、**メトリクス(例:CPU使用率)**を見て自動で増減してくれる仕組みだよ📈📉 コントローラは定期的にメトリクスを見て、必要なら .spec.replicas を書き換える感じ(デフォは 15秒周期)。(Kubernetes)


2) 今日の最重要ポイント🔑:「動く条件」が2つある

✅ 条件A:Metrics API が必要(だいたい metrics-server)

HPAがCPU/メモリなどのリソースメトリクスを見るには、クラスタに Metrics API(metrics.k8s.io が必要で、一般的には metrics-server を入れるよ。(Kubernetes)

✅ 条件B:CPUの「requests」を書かないと、CPU%でスケールできない

CPU使用率(%)は requests に対する比率で計算されるから、requests未設定だとHPAは動けない(メトリクスが取れない/計算できない)ことがあるよ。(Kubernetes)


3) ハンズオン🧪:公式サンプルで「増える瞬間」を見る(最短ルート)🚀

公式ドキュメントのウォークスルーは、registry.k8s.io/hpa-example を使って「CPU負荷→増える」を体験できるように作られてるよ。(Kubernetes)


3-0) metrics-server を有効化する🧰

A) minikube の場合(超ラク)😺

公式でもこの方法が案内されてるよ。(Kubernetes)

minikube addons enable metrics-server

B) それ以外(kindなど)📦

metrics-server の公式手順(マニフェスト適用)だよ。(GitHub)

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

入ったか確認👇(top が動けば勝ち)✨

kubectl top nodes
kubectl top pods -A

もし kubectl top が「Metrics API not available」系でコケたら、まず kube-system の metrics-server Pod を見よう👀

kubectl -n kube-system get pods | findstr metrics
kubectl -n kube-system logs deploy/metrics-server

3-1) サンプルアプリ(Deployment + Service)を立てる🍜

公式の例をそのまま使うのが一番早い!(Kubernetes)

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

このマニフェストは requests/limits が最初から入ってる(HPA向き)よ。(Kubernetes)


3-2) HPAを作る📈

CPU 50% を目標に、1〜10 Pod の範囲で増減させるよ。(Kubernetes)

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

状態を見る👇(watchで追いかけるの楽しい😆)

kubectl get hpa
kubectl get hpa php-apache --watch

3-3) 負荷をかける🔥(別ターミナル推奨)

公式の負荷生成コマンド(busyboxで無限アクセス)だよ。(Kubernetes)

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

別ターミナルで watch してると、こんな感じで TARGET が跳ねて → REPLICAS が増えるはず!(Kubernetes)

  • 例:305% / 50% みたいに上がる
  • その後、REPLICAS が 1 → 7 みたいに増える

3-4) 負荷を止めて、スケールインを見る😴

負荷生成ターミナルで Ctrl + C で止める → しばらくすると REPLICAS が減って戻るよ。(Kubernetes)


4) 「CPU%って何%?」の腹落ち🍞

--cpu-percent=50 は、ざっくり言うと **「requests に対して平均50%くらいに保て」**って意味だよ。 公式例だと、各Podが requests: cpu: 200m なので、50% は平均 100m くらいを狙う、みたいな説明になってる。(Kubernetes)


5) autoscaling/v2 で「暴れないHPA」にする🧘‍♀️(フラッピング対策)

負荷が細かく上下すると、Podが増えたり減ったりして落ち着かないことがある(フラッピング)😵 autoscaling/v2behavior で、

  • 安定化ウィンドウ(stabilizationWindowSeconds)
  • スケール速度の上限(policies)

を調整できるよ(v1.23で安定扱い)。(Kubernetes)

例:スケールダウンを“ゆっくり”にする(学習用の例)

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 10
periodSeconds: 60
  • 過去5分の“高い方”を採用して、急に減らしすぎない感じになるよ。(Kubernetes)

6) よくある詰まりポイント集😇➡️😇(ハマりどころ救急箱🧰)

kubectl top が動かない

  • ほぼ metrics-server 未導入 / 未稼働。まずここ!(Kubernetes) チェック👇
kubectl -n kube-system get pods | findstr metrics
kubectl -n kube-system logs deploy/metrics-server
kubectl get apiservice | findstr metrics

❌ HPAのTARGETが <unknown> のまま

  • Metrics API が取れてない or requests未設定のどちらかが多いよ。(Kubernetes) まず kubectl describe hpa php-apache の Events を見よう👀
kubectl describe hpa php-apache

❌ Podは増えたのに、Pending が出る

  • これは「スケジュールできる場所がない」現象😵(ノードの空きが足りない) kubectl describe pod で理由が出るよ👇
kubectl get pods
kubectl describe pod <PendingのPod名>

7) AIで楽するポイント🤖✨(ここ超効く)

  • kubectl describe hpa ... を貼って「今スケールしない理由を3つ」って聞く🕵️
  • HPAの behavior を「安全寄り(減らすの遅く、増やすの早く)」みたいな要件で提案させる🧠
  • requests/limits の値を「このAPIは軽い/重い」前提で相談して、まず雑に置く→動かしながら調整🎛️

8) ミニ課題🎓📝(手が動くやつ)

  1. --cpu-percent=30 にしたら、増え方はどう変わる?🤔
  2. max=3 にしたら、TARGETが高いままでも頭打ちになるのを確認👀
  3. behavior.scaleDown.stabilizationWindowSeconds を 0 / 300 で比較してみる🧪(体感できる)

9) お片付け🧹

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

次の章(Job/CronJob)に行く前に、もし「自分のNode/TS API(第7〜8章のアプリ)でもHPAしたい!」なら、**そのDeploymentのYAML(resources部分つき)**を貼ってくれたら、HPA化の最短ルートに整えて返すよ😆💪