コンテナーのメモリ request 設定の確認

実際のメモリ要件に合わせ、request と適用される既定値を確認してください。

説明

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 と明示します。小さい値が常に適切とは限らないため、実際の要件を確認する必要があります。

参考資料