説明
Kubernetes はコンテナーのメモリ request を使ってノードへの配置を決定します。実際に必要な量より小さいと、ワークロードが過密に配置され、メモリ不足のリスクが高まる場合があります。
明示的な request がなくても LimitRange が既定値を設定する場合があります。他の request 既定値がなく memory limit だけを指定した場合、Kubernetes はその limit を request として使います。宣言の省略と実際の request の欠如は異なります。
想定される影響
- 実際の使用量より小さい request は、ノード上のメモリ競合や性能低下につながる場合があります。
- メモリ不足により Pod が退避させられたり、プロセスが終了したりする場合があります。
対処方法
- 実際の使用量、起動時の要件、ピーク負荷を考慮して
resources.requests.memoryを決め、limit と併せて調整してください。 - LimitRange の既定値と ResourceQuota を確認し、デプロイ済み Pod の実際の request を調べてください。例の値をすべてのワークロードにそのまま適用しないでください。
例
既存の値は説明用です。実際のデプロイには保守されているイメージを使ってください。別の request 既定値がなければ、変更前の memory limit 512Mi は request にも使われます。
変更前
hcl
resource "kubernetes_pod" "pod" {
metadata {
name = "terraform-example"
}
spec {
container {
image = "nginx:1.7.9"
name = "example"
resources {
limits = {
cpu = "0.5"
memory = "512Mi"
}
}
}
}
}
変更後
hcl
resource "kubernetes_pod" "pod" {
metadata {
name = "terraform-example"
}
spec {
container {
image = "nginx:1.7.9"
name = "example"
resources {
limits = {
cpu = "0.5"
memory = "512Mi"
}
requests = {
cpu = "250m"
memory = "50Mi"
}
}
}
}
}
補足:
- 変更前: 明示的な request はありませんが、memory limit の 512Mi が使われる場合があります。
- 変更後: memory request を 50Mi と明示します。小さい値が常に適切とは限らないため、実際の要件を確認する必要があります。