Chuyển đến nội dung chính

レッスン6:コンテナオーケストレーションパターン

スケジューリング、オートスケーリング(HPA、VPA、Cluster Autoscaler)、リソース requestsとlimits、Namespace、マルチテナンシーとKubernetesアップグレード戦略。

Kubernetesスケジューリングパイプラインとオートスケーリング(HPA、VPA、Cluster Autoscaler)

1. Kubernetesスケジューリング

Podが作成されると、kube-schedulerが2つのステップで適切なノードを選択します:

Scheduling Pipeline:
  New Pod
    │
    ▼
  1. FILTERING: 条件を満たさないノードを除外
     - CPU/メモリ不足
     - TaintにTolerationが一致しない
     - Node Affinityが一致しない
     │
    ▼
  2. SCORING: 残ったノードにスコアリング
     - リソースバランス
     - Affinityの優先度
     │
    ▼
  Bind Pod → 最高スコアのNode
メカニズム目的例
NodeSelectorラベルを持つノードにPodをスケジュールdisktype: ssd
Affinity/Anti-affinity優先/必須のノードルールzone-aを優先、別のpodと同じノードを避ける
Taints & TolerationsPodにTolerationがない限りPodを排除GPUワークロード専用ノード
Resource requestsスケジュールに必要な最小CPU/メモリrequests.cpu: 500m

試験のポイント: TaintsはNode側(Podを排除)。TolerationsはPod側(Taintを受け入れ)。Taintのeffect:NoSchedule(新しいPodをスケジュールしない)、PreferNoSchedule(できれば避ける)、NoExecute(実行中のPodも退去させる)。

2. Resource RequestsとLimits

設定影響対象超過した場合
requests.cpuスケジューリング(schedulerがノード選択に使用)スロットリング(killされない)
limits.cpuCgroups CPUクォータCPUスロットリング
requests.memoryスケジューリングlimitを超えるとOOM Kill
limits.memoryCgroups メモリリミットコンテナがOOM Killされる
QoS Classes:
  Guaranteed: requests == limits (最高品質、最後に退去)
  Burstable:  requests < limits (中間)
  BestEffort: requestsもlimitsもなし (最初に退去)

3. オートスケーリング

スケーラースケール対象メトリクス
HPA(Horizontal Pod Autoscaler)Podレプリカ数CPU%、Memory%、カスタムメトリクス
VPA(Vertical Pod Autoscaler)PodのCPU/Memory requests実際の使用履歴
Cluster Autoscalerクラスター内のノード数Pending Pods(スケジュール不可)
KEDAレプリカ数(0まで)イベント駆動(キュー深度、Kafka)
HPA integration:
  metrics-server → kubelet → Node/Pod metrics
       ↓
  HPA controller (checks every 15s)
       ↓
  Scale up: replicas++  (traffic spike)
  Scale down: replicas-- (traffic drops, 5 min cooldown)

試験のポイント: HPAが機能するにはmetrics-serverが必要です。VPAとHPAは同じDeploymentを管理する場合に競合する可能性があります。同じリソースに対して同時に使用すべきではありません(KEDAのマルチディメンションを除く)。

4. Namespaceとマルチテナンシー

Namespaceは仮想クラスター分離を提供します:RBACのスコープ、ResourceQuota、NetworkPolicy、DNS解決。

Namespace目的備考
defaultnamespaceを指定しないオブジェクト開発で使用、本番では使用しない
kube-systemKubernetesシステムコンポーネントCoreDNS、kube-proxy、metrics-server
kube-publicパブリック、全ユーザー読み取り可能クラスター情報ConfigMap
kube-node-leaseノードのハートビートリースKubeletハートビートのパフォーマンス

5. チートシート

試験の質問回答
CPUに基づいてPod数をスケールするには?HPA
クラスター内のノード数をスケールするには?Cluster Autoscaler
GPU専用ノード、何を使う?Taint + PodのToleration
コンテナがOOM Killされる原因は?limits.memoryを超過
最初に退去されるQoSクラスは?BestEffort

6. 練習問題

Q1: ノードにkey=gpu:NoScheduleのTaintが設定されています。このノードにスケジュールできるPodはどれですか?

  • A) クラスター内のすべてのPod
  • B) そのTaintに一致するTolerationを持つPod ✓
  • C) kube-system namespaceのPodのみ
  • D) クラスター管理者が作成したPodのみ

解説:NoSchedule Taintは、Podが一致するtolerationを指定しない限り、新しいPodがそのノードにスケジュールされることを防ぎます。既存のPodは退去されません(それにはNoExecuteを使用します)。

Q2: アプリケーションのPodがトラフィックスパイク時にOOM-killされ続けています。最も適切な解決策は何ですか?

  • A) PodのCPU requestsを増やす
  • B) メモリ使用量に基づいてスケールするようにHPAを構成する ✓
  • C) アプリを新しいnamespaceに移動する
  • D) DeploymentをStatefulSetに変更する

解説:OOM killはメモリ需要がlimitsを超えていることを意味します。HPAでスケールアウト(より多くのPodレプリカ)すると負荷が分散され、Pod当たりのメモリプレッシャーが軽減されます。または、メモリlimitsを増やすかVPAを使用します。

Q3: HPAがスケーリングの判断に使用するCPUとメモリのメトリクスを提供するKubernetesコンポーネントはどれですか?

  • A) kube-proxy
  • B) kube-scheduler
  • C) metrics-server ✓
  • D) etcd

解説:metrics-serverはkubeletからリソースメトリクス(CPU、メモリ)を収集するオプションのクラスターアドオンです。HPAコントローラーはmetrics-serverが公開するメトリクスAPIをクエリしてスケーリングの判断を行います。