将来の学習のために Horizontal Pod Autoscaler (HPA) を簡単に紹介する
このステップでは、Horizontal Pod Autoscaler (HPA) という強力な Kubernetes の機能について紹介します。HPA は、リソースの使用率に基づいてアプリケーションを自動的にスケーリングすることができます。HPA を使用すると、CPU 使用率、メモリ使用量、またはカスタムメトリクスなどの指標に基づいてスケーリングルールを定義することができます。
HPA の理解:
HPA は、観測された CPU またはメモリの使用量、あるいはアプリケーションが提供するカスタムメトリクスに基づいて、Deployment、ReplicaSet、または StatefulSet で実行中のポッドレプリカの数を自動的に調整します。これにより、アプリケーションはトラフィック負荷の変化に自動的に対応してスケーリングし、パフォーマンスと可用性を向上させることができます。
Minikube でメトリクスサーバーアドオンを有効にする:
minikube addons enable metrics-server
出力例:
* The 'metrics-server' addon is enabled
メトリクスサーバーは、Kubernetes にリソースの使用状況データを提供し、HPA が機能するために不可欠です。
リソース要求を持つデプロイメントを作成する:
nano ~/project/k8s-manifests/hpa-example.yaml
以下の内容を追加します:
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: k8s.gcr.io/hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
デプロイメントを適用する:
kubectl apply -f ~/project/k8s-manifests/hpa-example.yaml
YAML 構成の説明:
- この YAML ファイルは、PHP アプリケーションの Deployment と対応する Service を定義しています。
- Deployment の構成は、NGINX のものと非常に似ていますが、以下の点が異なります。
name: php-apache
: デプロイメントとポッドコンテナの名前。
image: k8s.gcr.io/hpa-example
: コンテナの Docker イメージ。
resources
: このセクションは、コンテナのリソース要件を指定します。
limits.cpu: 500m
: コンテナが使用できる最大 CPU 量。
requests.cpu: 200m
: コンテナに割り当てられる保証された CPU 量。
- サービスは標準的なサービス構成で、デプロイメントを内部で公開します。
HPA 構成を作成する:
nano ~/project/k8s-manifests/php-apache-hpa.yaml
以下の HPA マニフェストを追加します:
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
HPA 構成を適用する:
kubectl apply -f ~/project/k8s-manifests/php-apache-hpa.yaml
YAML 構成の説明:
apiVersion: autoscaling/v2
: HorizontalPodAutoscaler の API バージョンを指定します。
kind: HorizontalPodAutoscaler
: これが HPA オブジェクトであることを示します。
metadata
: HPA に関するメタデータを含みます。
name: php-apache
: HPA の名前。
spec
: HPA の仕様を含みます。
scaleTargetRef
: スケーリング対象の Deployment を定義します。
apiVersion: apps/v1
: 対象リソースの API バージョン。
kind: Deployment
: 対象リソースのタイプは Deployment です。
name: php-apache
: スケーリング対象の Deployment の名前。
minReplicas: 1
: 実行中に維持する最小レプリカ数。
maxReplicas: 10
: スケーリングする最大レプリカ数。
metrics
: スケーリングメトリクスの決定方法を定義します。
type: Resource
: リソースメトリクスに基づいてスケーリングします。
resource.name: cpu
: CPU 使用量に基づいてスケーリングします。
resource.target.type: Utilization
: ポッドが要求した CPU の割合に基づいてスケーリングします。
resource.target.averageUtilization: 50
: すべてのポッドの平均 CPU 使用量が要求量の 50% を超えたときにスケーリングします。
HPA 構成を検証する:
kubectl get hpa
出力例:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 30s
負荷をシミュレートし、リアルタイムで自動スケーリングを観察する
高負荷をシミュレートして自動スケーラーをトリガーするには、1 つのターミナルで負荷ジェネレーターを実行し、別のターミナルでスケーリングアクティビティを監視します。
まず、負荷ジェネレーター用のターミナルを開きます:
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"
負荷ジェネレーターを実行しているターミナルを閉じないでください。別のターミナルを開いて、スケーリングアクティビティを監視します。
2 番目のターミナルでは、いくつかのコマンドを使用して、リアルタイムで自動スケーリングを観察することができます:
- HPA の状態を監視する (数秒ごとに更新):
kubectl get hpa -w
- HPA がスケールアップする際にポッドが作成されるのを監視する:
kubectl get pods -w
- スケーリングアクティビティに関連するイベントを追跡する:
kubectl get events --sort-by='.lastTimestamp' -w
これらのコマンドのいずれかを実行して、自動スケーリングプロセスのさまざまな側面を観察することができます。たとえば、-w
フラグを使用してポッドを監視すると、システムがスケーリングする際にポッドがリアルタイムで作成されるのを確認できます:
kubectl get pods -w
の出力例:
NAME READY STATUS RESTARTS AGE
php-apache-xxxxxxxxx-xxxxx 1/1 Running 0 2m
load-generator 1/1 Running 0 30s
php-apache-xxxxxxxxx-yyyyy 0/1 Pending 0 0s
php-apache-xxxxxxxxx-yyyyy 0/1 ContainerCreating 0 0s
php-apache-xxxxxxxxx-yyyyy 1/1 Running 0 3s
php-apache-xxxxxxxxx-zzzzz 0/1 Pending 0 0s
php-apache-xxxxxxxxx-zzzzz 0/1 ContainerCreating 0 0s
php-apache-xxxxxxxxx-zzzzz 1/1 Running 0 2s
HPA が負荷の増加に応じてポッドの数をスケールアップするのを確認できます。メトリクスの更新には 1 分以上かかる場合があります:
kubectl get hpa -w
の出力例:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 30s
php-apache Deployment/php-apache 68%/50% 1 10 1 90s
php-apache Deployment/php-apache 68%/50% 1 10 2 90s
php-apache Deployment/php-apache 79%/50% 1 10 2 2m
php-apache Deployment/php-apache 79%/50% 1 10 4 2m15s
観察が終了したら、Ctrl+C
を押して監視コマンドを停止し、最初のターミナルに戻って Ctrl+C
を押して負荷ジェネレーターを停止します。
HPA に関する要点:
- リソース使用率に基づいてポッドを自動的にスケーリングすることで、アプリケーションの回復力を向上させます。
- CPU、メモリ、またはカスタムメトリクスに基づいてスケーリングすることができます。
- 最小および最大レプリカ数を定義することで、バランスの取れた効率的なスケーリングを保証します。
- HPA は、さまざまな負荷下でアプリケーションのパフォーマンスと可用性を維持するための重要なコンポーネントです。
- kubectl コマンドに
-w
(watch) フラグを使用すると、クラスターの変更をリアルタイムで監視することができます。