Kubernetes完全ガイド 第9章 リソース管理とオートスケーリング
リソースの制限
CPU、memoryの他に、Device Plugin を利用することで GPU など
1 vCPU を 1000 milicores (m) で表現
requests: 使用するリソースの下限
ノードにrequestsで指定した量のリソースがなければスケジューリングされない
limits: 使用するリソースの上限
コンテナのリソース使用量がlimitsを超えない限り、ノードのリソース使用量が100%を超える場合でもオーバーコミットする
GPUなどのリソース制限
nvidia.cpu/gpu: 2 など
NVIDIAの場合はrequestsを指定してもGPUを専有しないので、競合を起こすことも
ClusterAutoscaler
Kubernetesクラスタ自体のオートスケーリング
需要に応じてノードを自動的に追加
Pending状態のPodができたタイミングで初めて発動
Requests を基準に
LimitRange
Namespaceにかける、CPUやメモリの最小値、最大値、デフォルト値の設定
既存のpodには影響せず、新規のpodのみに影響
default / defaultRequest / max / min / maxLimitRequestRatio
Pod / Container / PVC に設定可能
Requestsを全く指定しない環境では、無限にオーバーコミットしてしまう
いくつかの環境ではデフォルトのRequestsを設定するLimitRangeが作成される
LimitRangeがある状態でmax / min を超えるリソースを作ろうとするとエラーになる
QoS Class
Pod ではRequests/Limits に応じて自動的にQoS Classが設定される
BestEffort
Requests/Limits どちらも未指定。優先度3
LimitRangeが設定されていればこれにはならない
Guaranteed
Requests/Limits が同じでCPU,メモリの両方が指定されている 優先度1
ノイジーネイバーを回避できるが、集約率は低くなる
Burstable
Guaranteedを満たさず、1つ以上のRequests/Limits が指定されている 優先度2
OOM KillerによってPodが停止する場合は、BestEffort, Burstable, Guaranteed の順で停止する
ResourceQuota
Namespaceごとに利用可能なリソースを制限できる
作成可能なリソース数の制限
リソース使用量の制限
HorizontalPodAutoScaler HPA
Deployment, ReplicaSet, ReplicationControllerのレプリカ数をスケールさせる
PodにResource Requestが設定されていないと動作しない
利用可能なメトリクス
Resource: CPU/memory
Object: k8s object のメトリクス (ingressの hits/s など)
Pods: Podのメトリクス (podのコネクション数など)
External: k8s外のメトリクス (LBのQPS, Cloud Pub/Sub のメッセージ数など)
VerticalPodAutoscaler VPA
コンテナに割り当てるCPU/memoryのリソース割当を自動的スケールさせる