Upgrade to Pro — share decks privately, control downloads, hide ads and more …

"Kubernetes Pattern“ で学ぶ 設計の「定石」

Avatar for oracle4engineer oracle4engineer PRO
April 16, 2026
17

"Kubernetes Pattern“ で学ぶ 設計の「定石」

Oracle Cloud Hangout Café Season 11 #3

Avatar for oracle4engineer

oracle4engineer PRO

April 16, 2026

More Decks by oracle4engineer

Transcript

  1. 2 Copyright © 2026, Oracle and/or its affiliates @cyberblack28 Community

    Oracle Cloud Hangout Café (#ochacafe) Publications Yutaka Ichikawa (市川 豊) クラウド事業統括 クラウド・エンジニアリング COE 統括 ソリューションズ・アーキテクト部 プリンシパル・クラウド・エンジニア
  2. 新刊 3 Copyright © 2026, Oracle and/or its affiliates 第1部:クラウドネイティブの基本概念を丁寧に解説

    第2部:OCI のクラウドネイティブサービスを機能ごとに解説 第3部:Oracle Cloud Free Tier を活用して、環境構築(IaC) アプリケーションリリース(CI/CD)、運用監視(Observability)までを ハンズオンで体得!! https://bit.ly/oci-cloud-native-journey https://bit.ly/ochacafe-premium-book Event Movie 電子書籍版も あります
  3. Agenda title 4 Copyright © 2026, Oracle and/or its affiliates

    1 2 3 4 5 本日の趣旨 定義されているパターン 基本パターン 振る舞いパターン Appendix
  4. 本日の趣旨 6 Copyright © 2026, Oracle and/or its affiliates 2023.6.7

    We learned Container & Kubernetes !! https://bit.ly/k8s-introduction-movie https://bit.ly/k8s-introduction-slide
  5. 本日の趣旨 9 Copyright © 2026, Oracle and/or its affiliates Kubernetes

    Patterns 2nd Edition • Kubernetes 上でクラウドネイティブアプリを設計・実装 するための再利用可能なパターン集。 • 基本原理からセキュリティ・プラットフォーム拡張まで、実 証済みの知識を体系的に解説。
  6. 本日の趣旨 10 Copyright © 2026, Oracle and/or its affiliates 書籍の方針として、K8s

    リソースを説明するのではく、パターンとして証明された考え方に焦点を当てる!
  7. 本日の趣旨 11 Copyright © 2026, Oracle and/or its affiliates •

    Kubernetes はリソース名ではなく設計パターンで捉えると理解しやすい • 配置・更新・停止・状態管理には再利用可能な定石がある • パターンを知るとマニフェストの意図を理解できる デモ専用リポジトリ https://github.com/cyberblack28/demo
  8. 定義されているパターン概要 13 Copyright © 2026, Oracle and/or its affiliates パターン名

    概要 (焦点) キーコンセプト 基本パターン アプリケーションが良きクラウドネイティブ市民である ための設計原則。 自動化への適合、ガイドラインの遵守。 振る舞いパターン Pod と管理プラットフォーム間の通信と実行メカニ ズム。 ワークロード種別(バッチ、デーモンなど)、 管理構成要素の選択。 構造化パターン Pod 内でのコンテナの構成と連携。 コンテナの再利用、複数のコンテナを組み 合わせて Pod を構築。 設定パターン クラウド環境でアプリケーションをカスタマイズ・適応 させる方法。 設定ニーズへの対応、柔軟な設定戦略。 セキュリティパターン Kubernetes と連携したアプリケーションへの制約 とセキュリティ要件の設定。 Node/Pod/API サーバ間のやり取りの 保護、セキュアな設定。 高度なパターン 他のカテゴリに属さない複雑で発展的なトピック。 コントローラー、クラウドネイティブ開発の基 礎となる考え方。 時間内には収まらない内容のため、付録として資料公開
  9. 定義されているパターン概要 14 Copyright © 2026, Oracle and/or its affiliates https://bit.ly/ochacafe-k8s-operator

    https://bit.ly/ochacafe-k8s-security セキュリティパターンと高度なパターンについては、過去のテーマと同等のためアーカイブをご参照
  10. 基本パターン(Foundational Patterns) 16 Copyright © 2026, Oracle and/or its affiliates

    アプリケーションが良きクラウドネイティブ市民であるための設計原則。 パターン名 概要 (焦点) 予想できるリソースの使い方(Predictable Demand) マニフェストにコンテナが使う CPU・メモリを事前に宣言 し、その範囲で動かす必要がある理由。 宣言的デプロイ(Declarative Deployment) マニフェストで“どうしたいか”を宣言すると、 Kubernetes が自動でデプロイや更新を行う仕組み。 ヘルスチェック(Health Probe) Kubernetes がアプリケーションの状態を判断できるよ う、コンテナがチェック用 API を用意する必要性。 管理されたライフサイクル(Managed Lifecycle) Kubernetes からの「終了」「再起動」などの通知にア プリケーションが適切に対応する必要がある理由。 自動的配置(Automated Placement) Kubernetes がコンテナの配置を決める仕組みと、そ の配置に影響を与える方法。 アプリケーションが Kubernetes 上において自動化しやすいものになる。
  11. 概要 18 Copyright © 2026, Oracle and/or its affiliates アプリケーションが良きクラウドネイティブ市民であるための設計原則。

    リソース要求を明示することは、Kubernetes に信頼され、正しく扱われるための 「良きクラウドネイティブ市民」の基本条件 アプリケーションは、 自分のリソース要求を明示する 適切なノードに配置し、 安定した管理を行う マニフェストで宣言 マニフェストで宣言しない Kubernetesにとって アプリケーション(コンテナ) は中身の分からない箱 Kubernetes は、 必要なリソースを持つノードに コンテナ(Pod)を配置
  12. 予想できるリソースの使い方(Predictable Demand)とは? 19 Copyright © 2026, Oracle and/or its affiliates

    「予想できるリソースの使い方(Predictable Demand)」とは、アプリケーションが必要とするリソースや依 存関係を“明確に宣言しておくことが重要”という考え方。 アプリケーションがどのくらいの CPU・メモリを使うか? どんな設定やストレージが必要なのか? どんな依存コンポーネントが必要なのか? アプリケーションが必要とするリソース、 依存関係を明確にマニフェストで宣言する Kubernetes がアプリケーションを 最適なノードに配置できる アプリケーションの安定稼働 こうした情報を元に、 クラスタ内のどこに Pod を配置すべきかを判断
  13. 問題: なぜアプリケーションの要求を知る必要があるのか? 20 Copyright © 2026, Oracle and/or its affiliates

    1. アプリケーションによって必要なリソースが違う 2. リソース以外にも必要なものがある Kubernetes は、「依存関係」も含めて、 アプリケーションの「要求」全体を 把握する必要がある。 コンパイル言語 アプリケーション インタプリタ言語 アプリケーション メモリを少なく使う傾向 メモリを多く使う傾向 Kubernetes は、 「アプリケーションがどの程度 CPU とメモリが必要か」 を知らないと、適切な場所に配置できない。 データ保存場所 (データストレージ) アプリケーション設定 (設定ファイル) Kubernetes の機能に依存
  14. 解決策: 要求を明確に宣言することのメリット 21 Copyright © 2026, Oracle and/or its affiliates

    アプリケーションの要求(リソース量と依存関係)を Kubernetes に教えておくことは、主に以下の2つの大 きなメリットがある。 1. 効率的な配置と共存の実現 a. 最適な場所に配置できる Kubernetes は、アプリケーションの要求を知っていると、「このアプリケーションを動かすのに一番効率の良い ノードはどこか」という合理的な判断ができる。 b. 安定した共存ができる アプリケーションが事前に「私はこれくらいのリソースを使います」と宣言することで、Kubernetes はリソースを 適切に割り振り、全てのアプリケーションが安定して共存できる。
  15. 解決策: 要求を明確に宣言することのメリット 22 Copyright © 2026, Oracle and/or its affiliates

    2. 将来の計画(キャパシティプランニング)が可能になる サービス全体でどのくらいのアプリケーションがどのくらいのリソースを要求しているのかを把握できる • 「全体でこれくらいの需要があるから、これくらいのノードを準備おく」といった、長期的な計画(キャパシ ティプランニング)が立てやすくなる。 • 最適なコストでクラスタ全体を運営できるようになる。
  16. 解決への導きを考える 23 Copyright © 2026, Oracle and/or its affiliates 1.

    実行時の依存関係 2. リソースプロファイル(requests/limits, QoS, Pod Priority) 3. Namespace ごとのリソース(ResourceQuota, LimitRange)
  17. 実行時の依存関係 24 Copyright © 2026, Oracle and/or its affiliates 「実行時の依存関係」とは、アプリケーションが実際に動くときに、「これがないと動けない!」という必須の外部

    要素のこと。 1. ストレージ(データを保存する場所) 2. hostPort(ホストのポート番号の予約) 3. 設定情報(ConfigMap と Secret)
  18. 実行時の依存関係 25 Copyright © 2026, Oracle and/or its affiliates 1.

    ストレージ(データを保存する場所) コンテナ内のデータは停止すると消えるため、アプリケーションのログやユーザーデータを保存できないため、 Kubernetes では、データを永続的に保持するための「ボリューム」がある。 ボリュームの種類 特徴 用途 PersistentVolume Pod が削除されても中身が維持される、長寿命の ストレージ データベースファイル、ログ、アップロード された画像など、重要なデータ。 PersistentVolumeClaim(PVC)に対する依存関係が設定され、紐付けられる。
  19. 実行時の依存関係 26 Copyright © 2026, Oracle and/or its affiliates 対応ボリュームを提供できないノードには

    配置できない Node 1 SSD 無 SSD 無 SSD 有 Node 2 Node 3 Kubernetes は、マニフェストに従い、 「このアプリケーションは特定の種類のストレージがあるノードでないと動けない」と判断する。
  20. 実行時の依存関係 27 Copyright © 2026, Oracle and/or its affiliates 2.

    hostPort(ホストのポート番号の予約) Node 1 :8080 使用中 Node 2 :8080 使用中 Node 3 :8080 使用中 hostPort: 8080 を指定した場合 hostPort: 8080 同じポートは 1 ノードに 1 つしか使えないため、ポートの取り合いで配置が失敗する。 ノード数(3台)を超えて Pod を増やせない → スケール上限 = ノード台数 同じ hostPort を使う Pod のスケジューリングを制限するという依存関係が発生。 通常は hostPort よりも Service を優先して設計する。
  21. 実行時の依存関係 28 Copyright © 2026, Oracle and/or its affiliates 3.

    設定情報(ConfigMap と Secret) Kubernetes では、アプリケーションが依存する「設定」も “実行時の依存関係” になる。 アプリケーションは動くために設定が必要 Kubernetesは、その設定を ConfigMap / Secret として扱う ConfigMap / Secret が無いとノード にスケジュールされてもコンテナを起動で きない 設定もアプリケーションにとって必要な 実行時の依存関係
  22. リソースプロファイル 29 Copyright © 2026, Oracle and/or its affiliates Requests

    & Limits Kubernetes における計算リソースは、コンテナからリクエストされ、コンテナに割り当てられ、コンテナによって 消費されるものとして定義される。 圧縮可能 圧縮不可能 CPUのように 割当量の調整が可能なもの メモリのように 割当量の調整が不可能なもの 制限超過 → 絞られるが停止しない 制限超過 → OOMKill で強制停止 リソースの最小量と 最大量を設定する 必要がある requests & limits
  23. リソースプロファイル 30 Copyright © 2026, Oracle and/or its affiliates Requests

    & Limits スケジューラーは requests の量を見て Pod の置き場所を決める。limits は Pod が動き出してから使える 量の上限で、その差は LimitRange で管理できる。 requests が設定 されたマニフェスト スケジューラーは、Pod 内の全てのコンテナ が要求するリソース量を合計し、その合計 を収容できるノードだけを配置候補として 選ぶ。 Kubernetes Cluster
  24. リソースプロファイル 31 Copyright © 2026, Oracle and/or its affiliates Requests

    & Limits CPUとメモリに対する初期リソース要求 アプリケーションを最大限大きくする上限値 リソースタイプ 概要 特性/注意点 memory アプリケーションが必要とする メモリ量 圧縮不可、limit 超過 で Pod 強制停止 cpu 必要な CPU サイクル量 圧縮可能(オーバーコ ミット可) リソースタイプ
  25. リソースプロファイル 32 Copyright © 2026, Oracle and/or its affiliates QoS

    クラス 条件 特性/注意点 Best-Effort CPU/Memory の requests と limits が未設定 • 最低優先度 • リソース不足時に最初に Pod が強制終了される可能性が高い • 開発、テスト環境向け Burstable CPU/Memory の requests と limits が異なる • 最低限のリソース保証 • 空きがあれば limits まで使用可 • Best-Effort の次に Pod が強制終了される可能性がある • CPU の request のみ設定した Pod はここに分類される Guaranteed CPU/Memory の requests と limits が同じ • 最優先で Pod が保護される • Best-Effort、Burstable より先に Pod が停止されることがない • メモリ要求が明確なアプリケーションに最適 • 本番環境向け QoS クラスとは、Pod に設定された requests と limits の内容に基づき、リソース不足時の退避優先度 を Kubernetes が自動的に決める仕組み。 QoS(Quality of Service)クラス
  26. リソースプロファイル 33 Copyright © 2026, Oracle and/or its affiliates QoS(Quality

    of Service)クラス CPU とメモリリソースの設定(※書籍での推奨) メモリに対しては、常に requests と limits を同じに設定する。 メモリは圧縮不可なので、requests = limits (Guaranteed)として、予期せぬ OOM を防ぐ。 CPUに対しては、requests は設定するが limits は設定しない。 CPU は圧縮可能なので、limits を付けずに余剰 CPU を自由に使わせたほうがパフォーマンスが高くなる。 QoS は CPU 用、Memory 用に別々に付くのではなく、Pod 全体に 1 つの QoS クラスが付与されるので、 上記の設定をした場合は、Burstable となる。
  27. リソースプロファイル 34 Copyright © 2026, Oracle and/or its affiliates Pod

    Priority 「どの Pod をより大事に扱うか」を数値で決める仕組み。優先度が高い Pod ほど、スケジューラーにとって “重要な Pod ” として扱われる。 1. PriorityClass という「優先度クラス」を作り、数値で優先度を決める。 2. Pod のマニフェストで priorityClassName を指定すると、その Pod に優先度がつく。 3. 数値が大きい Pod ほど優先されてスケジュールされる。 スケジューラーは、この優先度で Pod の配置を決める。
  28. リソースプロファイル 35 Copyright © 2026, Oracle and/or its affiliates Pod

    Priority 1. 複数の Pod がスケジュール待ちの場合、優先度が高い Pod から順番にスケジュールされる。 2. もしノードに空きがない場合、優先度の高い Pod を入れるために、優先度の低い Pod が強制停止 (preemption)される。 重要な処理を行う Pod を確実に優先して配置できる。 Pod に優先度をつけつつ、他の Pod を強制停止したくない 場合は、preemptionPolicy: Never で回避もできる。 低優先度の Pod を停止せず、空きが出るまで高優 先度の Pod を Pending で待たさせることができる。
  29. リソースプロファイル 36 Copyright © 2026, Oracle and/or its affiliates QoS

    と Pod Priority の違い QoS と Pod Priority は別の機能で、Kubernetes 内で使われる場面が異なる。 ※ PodDisruptionBudget(PDB)は、停止中でも最低限動かしておきたい Pod 数を決める仕組み。 ただし preemption では常に守られるとは限らず、高優先度 Pod のために停止される場合がある。 QoS PodPriority 何を決めるか 退避されやすさ スケジューリングの重要度 誰が決めるか Kubernetes が自動付与 ユーザーが PriorityClass で指定 使われる場面 kubelet によるノード内調整 スケジューラーの preemption
  30. Namespace ごとのリソース 37 Copyright © 2026, Oracle and/or its affiliates

    Kubernetes は複数のチームやアプリケーションが同じクラスタを共有して使う場合において、一部の利用者がリソースを 使い切ってしまわない仕組みとして、ResourceQuota と LimitRange がある。 1. ResourceQuota:Namespace ごとに使えるリソースの合計上限を制限 「この Namespace は、ここまでしか使えない」というルールを決める仕組み。 • CPU、メモリ、ストレージの合計使用量の制限 • Pod、ConfigMap、Secret などオブジェクト数の制限 Namespace 内ではアクティブな Pod が4つまで許される Namespace 内の全 Pod のメモリ制限の合計は 5GB まで
  31. Namespace ごとのリソース 38 Copyright © 2026, Oracle and/or its affiliates

    2. LimitRange:Pod やコンテナ単位のリソース量の範囲を制限 「1 つの Pod が大きすぎる/小さすぎる設定にならないようにする」仕組み。 • requests / limits の 最小値・最大値の設定 • 未指定時の デフォルト値の自動設定 • requests と limits の 比率(オーバーコミットの抑制) を制御 requests と limits に対する最小値 requests と limits に対する最大値 limits が設定されていない場合の limits のデフォルト値 requests が設定されていない場合の requests のデフォルト値 許されるオーバコミットレベルを指定する、limits と requests の 最大比率。 LimitRange の type には Container、 Pod、PersistentVolumeClaim があり、 それぞれコンテナ単位、Pod 全体、PVC の範 囲を制御する。
  32. キャパシティプランニング 39 Copyright © 2026, Oracle and/or its affiliates 「クラスタにどれくらいの

    CPU やメモリが必要か」を事前に見積もること。 開発・検証環境 • Best-Effort や Burstable の Pod が中心 • Pod が止まっても致命的ではないリソース効率を重視 どうやって見積もる? • 各 Pod の CPU / メモリの requests を確認する • Pod 数を掛け合わせる • 全ての Pod を合計して、必要なリソース量を算出する 注意点 • 環境ごとに Pod 数は異なる • HPA/VPA/Cluster Autoscaler を視野に入れる • ビルドジョブや運用 Pod の分も確保する • 将来増えるサービスも考慮する 本番環境 • Guaranteed の Pod が中心 • 安定性と予測可能性が重要 • Pod が止まる場合は、キャパシティ不足のサイン
  33. 概要 41 Copyright © 2026, Oracle and/or its affiliates Deployment

    のデプロイ戦略 • RollingUpdate • Recreate • ブルーグリーン • カナリア Namespace とスケジューラによりアプリケーションの配置は自動化できるが、マイクロサービスが増えると、更新・再配置 は大きな運用負荷 Kubernetes は Deployment によって更新戦略や手順を宣言的に定義し、新旧 Pod の切り替えやロールバック を自動化することで、この負担を大きく軽減 Deployment 標準戦略 運用・拡張パターン
  34. RollingUpdate & Recreate 42 Copyright © 2026, Oracle and/or its

    affiliates Kubernetes における宣言的アップデート(Deployment) • Kubernetes のアプリケーション更新は Deployment で行う • Deployment は内部で ReplicaSet を使い Pod を管理 • 更新方法(振る舞い)は 戦略として宣言的に定義できる RollingUpdate(デフォルト) Recreate • 新しい Pod を少しずつ起動し、Ready を確認して から古い Pod を停止 • ダウンタイムなしで安全に更新 • 既存の Pod をすべて停止してから、新しい Pod を起動 • 更新中は一時的に停止(ダウンタイムあり)
  35. RollingUpdate & Recreate 43 Copyright © 2026, Oracle and/or its

    affiliates RollingUpdate(デフォルト) replicas : 稼働させたい Pod の数 maxSurge : 更新中に一時的に増やせる Pod 数 maxUnavailable : 更新中に同時に使えなくなる Pod 数 minReadySeconds : Pod が安定したと判断するまでの待ち時間 readinessProbe : ダウンタイムなし更新の必須条件 • 新しい Pod を少しずつ起動し、Ready を確認して から古い Pod を停止 • ダウンタイムなしで安全に更新 ReplicaSet ReplicaSet Service V 1.1 V 1.1 V 1.0 V 1.0 V 1.0 RollingUpdate では 1. 新 Pod 起動 2. readinessProbe 成功 3. 古い Pod 停止 readinessProbe により、新しい Pod の準備完了を確認してから切り替え るため、ダウンタイムなしでアップデートできる。 起動中の Pod 実行中の Pod 停止した Pod
  36. RollingUpdate & Recreate 44 Copyright © 2026, Oracle and/or its

    affiliates Recreate • 既存の Pod をすべて停止してから、新しい Pod を起動 • 更新中は一時的に停止(ダウンタイムあり) ReplicaSet ReplicaSet Service V 1.1 V 1.1 V 1.0 V 1.0 V 1.0 V 1.1 Recreate では「全 Pod 停止→新 Pod 起動」となるため、 readinessProbe は起動後にトラフィックを受けてよい状態かを判断する 起動中の Pod 実行中の Pod 停止した Pod
  37. ブルーグリーンとカナリア 45 Copyright © 2026, Oracle and/or its affiliates ブルーグリーン

    仕組み 2つの環境を用意 • Blue:現在の本番バージョン • Green:新バージョン(待機中) 検証後、Service の selector を切り替えて一気にトラフィック変更 特徴 • 常に1つのバージョンのみがリクエストを処理 • 切り替えは瞬時・明確 • ロールバックも簡単(selector を戻すだけ) 注意点 • 一時的に2倍のリソースが必要 • Kubernetes 標準機能で行うブルーグリーン ReplicaSet ReplicaSet Service V 1.1 V 1.1 V 1.0 V 1.0 V 1.0 V 1.1 起動中の Pod 実行中の Pod 停止した Pod 手動の手順 1. Blue(v1)Deployment を稼働 2. Green(v2)Deployment を新規作成(まだトラフィックなし) 3. Green Pod の動作確認(Ready / ログ / 監視) 4. Service の selector を v2 に変更 5. 問題なければ Blue Deployment を削除 👉 切り替え操作は Service マニフェストの変更 Green Blue
  38. ブルーグリーンとカナリア 46 Copyright © 2026, Oracle and/or its affiliates カナリア

    仕組み • 新バージョンを 少数の Pod(カナリア)で先行リリース • 一部ユーザーのみ新バージョンに到達 • 問題なければ段階的にスケールアップ 特徴 • 本番トラフィックで安全に検証 • 影響範囲を最小限に抑えられる • replicas 調整で段階的切り替え 注意点 • 一時的に複数バージョンが共存 • Kubernetes 標準機能で行うカナリア ReplicaSet ReplicaSet Service V 1.1 V 1.0 V 1.0 V 1.0 起動中の Pod 実行中の Pod 停止した Pod 手動の手順 1. v1 Deployment を稼働 2. v2 Deployment を少数 replicas で作成 3. Service は v1 / v2 共通ラベルを参照 4. 監視しながら v2 をスケールアップ 5. v1 を段階的にスケールダウン 6. 最終的に v1 を削除 👉 切り替え操作は Deployment の replicas 調整
  39. 高度な Deployment 47 Copyright © 2026, Oracle and/or its affiliates

    • Deployment は ReplicaSet / Pod を使った宣言的デプロイを提供 • RollingUpdate / Recreate など基本的な更新には十分 • Kubernetes を拡張リソース(CRD)で拡張、Operator パターンを用い希望するデプロイ動作を独自リソースと して宣言的に記述 • 高度な Deployment をサポートするプラットフォームの利用 Argo Rollouts https://bit.ly/ochacafe-cicd 過去のテーマでも取り扱っています!
  40. 概要 49 Copyright © 2026, Oracle and/or its affiliates Health

    Probe を用いてアプリケーションの状態を Kubernetes に伝える プロセスが生きていても、アプリケーションは正常とは限らない アプリケーションコンテナが稼働する Pod を Kubernetes が「再起動すべきか/切り離すべき か」 を判断できない Health Probe パターンを利用して、アプリケーションが「今どういう状態か」を Kubernetes に伝え、その情報を元 に Kubernetes が再起動、トラフィック制御、デプロイ判断を行う 3種類の Probe Liveness / Readiness / Startup
  41. Liveness Probe 50 Copyright © 2026, Oracle and/or its affiliates

    Liveness Probe は、アプリケーションが動き続けられる状態かを確認し、異常時にコンテナを再起動するための仕組 み。 Liveness Probe の特徴 kubelet が定期的にチェックを実行 Probe 概要 HTTP コンテナの IP アドレスに対して HTTP GET リクエストを実行し、200から399の間の成功を表す HTTP レスポンスを期待。 TCP ポート接続可否(TCP コネクション) Exec コンテナのユーザ名前空間とカーネル名前空間で任意のコマンドを実行し、成功を示す返り値0を期待。 (コマンドの終了コード) gRPC gRPCヘルスチェック
  42. Liveness Probe 51 Copyright © 2026, Oracle and/or its affiliates

    パラメータ 概要 initialDelaySeconds 最初の Liveness Probe が実行されるまでの秒数を指定。 periodSeconds Liveness Probe のチェック間隔の秒数。 timeoutSeconds 失敗と認識されるまでに Probe のチェックに応答しなければなら ない最大の時間。 failureThreshold コンテナが正常でなく再起動の必要があると認識されるまでに Probe のチェックが連続で失敗する回数を指定。 ヘルスチェックエンドポイントに対するHTTP Probe
  43. Readiness Probe 52 Copyright © 2026, Oracle and/or its affiliates

    Readiness Probe は、コンテナが「今リクエストを受けてよいか」を判断し、再起動せずにトラフィック制御でアプリケー ションを守る仕組み。 Readiness Probe の特徴 • kubelet が定期的にチェックを実行 • チェック方法は、Liveness Probe と同じ(HTTP、TCP、Exec、gRPC) • チェックに失敗した場合 1. コンテナは Service のエンドポイントから除外 2. 新しいトラフィックを受け取らない • チェックに成功した場合 1. コンテナは トラフィック受信を開始 再起動ではなく「切り離し」で守る
  44. Readiness Probe 53 Copyright © 2026, Oracle and/or its affiliates

    リクエストを処理できることを表すためにアプリ ケーションが作成するファイルの存在をチェック。 stat はファイルが存在しない時にエラーを返し、 Readiness チェックが失敗。
  45. Startup Probe 54 Copyright © 2026, Oracle and/or its affiliates

    Startup Probe は、起動に時間を要するアプリケーションを誤再起動から守り、起動後は Liveness / Readiness に安全に引き継ぐための仕組み。 Startup Probe の特徴 • 起動に時間がかかるアプリケーションでは、Liveness Probe だけだと起動途中で再起動されることがある • Liveness Probe の待ち時間を長くすると、起動後の障害検知が遅くなる • 「起動が完了したか」だけを判定する専用 Probe • 起動中は Liveness / Readiness を無効化 • 起動完了後は、Liveness Probe と Readiness Probe による通常の監視に切り替わる 起動中の誤再起動を防ぎ、起動後は素早く異常を 検知できる
  46. Startup Probe 55 Copyright © 2026, Oracle and/or its affiliates

    起動に時間がかかる WildFly Jakarta EE サーバ 起動処理に成功した後に WildFly が作成するマーカファイル Startup Probe が15分以内(最初のチェックまでに60秒の待ち、その後60秒 間隔で最大15回のチェック)に成功しなかった時にコンテナを再起動する設定 Liveness Probe のタイミングに関するパラメータ。これにより、その後実行される Liveness Probe が20秒以内(10秒間隔で3回のリトライ)に成功しないと 再起動。
  47. 概要 57 Copyright © 2026, Oracle and/or its affiliates Kubernetes

    上のコンテナアプリケーションは、自身で起動や停止を決定せず、 Kubernetes からのイベントに従って起動、停止、復旧処理をする Health Probe は状態を “読む” 仕組み、 プロセスモデルだけでは不十分。 アプリケーションには起動支援やグレースフルシャットダウンなど、 より細かなライフサイクル制御が必要。 • ライフサイクルイベント(SIGTERM/SIGKILL) • フック(PostStart/PreStop) Kubernetes の自動化の恩恵を得るには、ライフサイクルイベントとフック/Init コンテナを理解し、アプリケーションがそ れに従って動けるように設計することが重要。 コンテナ SIGTERM SIGKILL API API PostStart PreStop
  48. SIGTERM シグナル & SIGKILL シグナル 58 Copyright © 2026, Oracle

    and/or its affiliates Kubernetes がコンテナを停止すると決めたら原因に 関係なく最初に SIGTERM が送られる。 SIGTERM によるコンテナの終了 ⇒ 「すぐ止める」ではなく「安全に終了してください」という合図 アプリケーションが実行すること • 速やかに終了処理を開始する • 処理中のリクエスト完了 • コネクション解放/一時データ削除など Graceful Shutdown SIGTERM 後も停止しない場合、Kubernetes は SIGKILL で強制終了。 迅速な起動・終了を前提に、短命なコンテナ設計を促 す仕組み。 • 猶予時間はデフォルト30秒 • 猶予時間は Pod の terminationGracePeriodSeconds で設定可能 SIGTERM SIGKILL
  49. SIGTERM シグナル & SIGKILL シグナル 59 Copyright © 2026, Oracle

    and/or its affiliates SIGTERM SIGKILL 正常終了 強制終了 ① 停止指示 ② 猶予期間(デフォルト30秒) • リクエスト終了 • コネクション解放 • 後処理 正常終了 しない場合
  50. postStart フック 60 Copyright © 2026, Oracle and/or its affiliates

    コンテナが起動した直後に実行される、追加の処理。 何のために使う? • アプリケーション起動直後に少し待たせたい • 初期化処理や準備完了までの猶予時間を作りたい • 条件が満たされない場合は起動させたくない どう動く? • コンテナ起動直後に補助処理を実行される • メインのアプリケーションとは別に実行される 失敗すると? • postStart がエラーで終わると ⇒ メインアプリケーションは起動しない 注意点 • 実行は保証されない(失敗することもある) • 複数回実行されても問題ない処理にする • 重要すぎる処理は入れない(初期化はアプリケーション 側で)
  51. postStart フック 61 Copyright © 2026, Oracle and/or its affiliates

    • postStart では 30 秒待機し、 起動に時間がかかる処理を疑似的 に表現 • トリガファイルは、メインアプリケーショ ンとの起動同期に使用
  52. preStop フック 62 Copyright © 2026, Oracle and/or its affiliates

    preStop は、アプリケーションが SIGTERM を受けて安全に停止できるように、その前に追加の準備を行うための仕組 み。 何のために使う? コンテナ停止前に補助的な終了処理を実行し、アプリケーションを安全 に停止しやすくするため どう動く? • preStop は SIGTERM の前に呼ばれる • preStop は終了猶予時間の範囲内で実行される • preStop は ブロッキング処理(一定時間待つ) • preStop は失敗しても停止処理は続行される • 新しいリクエストを受けない状態にする • ロードバランサから外れるまで少し待つ • 補助的な後片付けをする など 1. Kubernetes がコンテナ停止を決定 2. preStop フック実行(設定されている場合) 3. Kubernetes が SIGTERM を送信 4. terminationGracePeriodSeconds の範囲で 終了を待つ 5. まだ生きていたら SIGKILL(強制終了)
  53. preStop フック 63 Copyright © 2026, Oracle and/or its affiliates

    アプリケーション内で動作している/shutdownエンドポイントを呼び出す。
  54. Init コンテナ 64 Copyright © 2026, Oracle and/or its affiliates

    • Init コンテナは、アプリケーション本体が起動する前に実行される、準備専用のコンテナ。 • アプリケーション本体は、Init コンテナの処理が成功してから起動 何のために使う? アプリケーション起動前の “下ごしらえ” 担当 アプリケーション本体に初期化処理を入れずに分離できる • 設定ファイルやバイナリの配置 • 秘密情報の取得/展開 • DB / 外部サービスが起きるまで待つ • 依存ツールのダウンロード どう動く? • 順番に1つずつ実行(直列) • 失敗すると Pod 全体が起動しない • すべて成功 → アプリ本体コンテナが起動
  55. ライフサイクル制御の役割整理 65 Copyright © 2026, Oracle and/or its affiliates 仕組み

    いつ動くか 何のために使うか(役割) レベル Init コンテナ アプリケーション 起動前 (Pod作成時) アプリケーション起動前の下 ごしらえ(前処理) Pod postStart コンテナ起動直後 起動直後の補助処理・初期化 トリガ コンテナ SIGTERM コンテナ終了要求時 アプリケーション自身が行う 正規の終了通知 プロセス preStop コンテナ終了直前 SIGTERM に対応できない場 合の代替シャットダウン通知 コンテナ
  56. 概要 67 Copyright © 2026, Oracle and/or its affiliates Pod

    をどのノードで動かすかを、Kubernetes のスケジューラが自動で決める仕組みについて理解する 配置を少し誘導したい場合 • nodeSelector(単純) • Node Affinity(条件指定) • Pod Affinity / Anti-Affinity(Pod 間の関係) • Topology Spread(均等配置) • Taint / Toleration(専用ノード) 自動配置させるための前提 Node 側 • Pod を置ける十分なリソースがある Pod 側 • requests / limits を宣言している • 必要に応じて配置ルール(Affinity / Spread / Taint 対応) スケジューラの基本フロー (3ステップ) • 候補ノードの絞り込み • 優先順位付け • 配置決定
  57. 利用可能なノードリソース(Allocatable)の考え方 68 Copyright © 2026, Oracle and/or its affiliates Pod

    は「ノードの空きリソース」にしか配置できない Allocatable [Pod に使える量] = Node Capacity [物理/仮想マシンの総リソース] - Kube-Reserved [kubelet やコンテナランタイムなどの Kubernetes デーモン] - System-Reserved [ sshd、udev などの OS デーモン] - Eviction Thresholds [システム OOM を防ぐための予約メモリ] Podが使える空き容量
  58. 利用可能なノードリソース(Allocatable)の考え方 69 Copyright © 2026, Oracle and/or its affiliates 必要なリソースと依存関係を宣言しないと、ノード上の

    Pod が正しく配置されず予期せぬ稼働につながる requests / limits を必ず設定 ⇒ CPU・メモリの必要量を宣言 実行に必要な依存関係も宣言 ⇒ ストレージ・ポートなど • スケジューラが最適なノードに配置 • 高負荷時でもリソース不足・干渉を防止 スケジューラーは、どのように Pod をスケジュールするのか?
  59. スケジューリングのプロセス 70 Copyright © 2026, Oracle and/or its affiliates スケジューリングの流れ

    1.候補ノード抽出(Filter)→ Pod の条件 (リソース・制約)に合わないノードを除外 2.スコアリング(Score)→ 残ったノードに点 数を付け、最適なノードを決定 3.割り当て(Bind)→ 選ばれたノードに Pod を配置 スケジューリング 配置および ノード割り当て バインディング 候補ノードを絞り、評価するプロセス全体 最適なノードを「選ぶ」 & このPodはこの Node と決定する API Server に登録して確定
  60. スケジューリングのプロセス 71 Copyright © 2026, Oracle and/or its affiliates ノードへのPodの割り当てはスケジューラに任せ、配置のロジックをマイクロマネジメントしない方がよい

    なぜスケジューラに任せるべきか? • クラスタの状態は常に変わる • スケジューラは “今の最適配置” を自動で計算 • 手動配置は可用性・スケーラビリティを下げる • Kubernetesの強み(自動化)を活かせなくなる とはいえ、特定のノードやノード のグループに Pod を強制的に 割り当てたいこともある…
  61. スケジューリングプロセスを設定できる方法 72 機能 何を基準に置くか 概要 nodeSelector(単純) ノードラベル ラベル一致したノードだけに配置 Node Affinity(条件指定)

    ノードラベル+条件(必須/推奨) 条件式でノードを選ぶ(必須/推奨) Pod Affinity / Anti-Affinity(Pod 間の関係) 他の Pod 他の Pod との「近接配置/分散配置」 を制御 Topology Spread(均等配置) 偏り ノード間に均等分散 Taint / Toleration(専用ノード) ノード側の受入制御 許可された Pod だけ配置可能 Copyright © 2026, Oracle and/or its affiliates Kubernetes には、スケジューリングプロセスを設定できる柔軟な方法がある。
  62. スケジューリングプロセスを設定できる方法 73 Copyright © 2026, Oracle and/or its affiliates nodeSelector

    • nodeSelector は ノードのラベル(key: value)で配置先を制限する仕組み • ノードにはデフォルトラベル(OS/アーキテクチャ/ホスト名など)とカスタムラベルがある 事前に付与したラベルを指定する。 ノードにラベルを付与(カスタムラベル) $ kubectl label node node1 disktype=ssd 主なデフォルトラベル kubernetes.io/hostname kubernetes.io/os=linux kubernetes.io/arch=amd64
  63. スケジューリングプロセスを設定できる方法 74 Copyright © 2026, Oracle and/or its affiliates nodeSelector

    Demo • 「disktype=ssd」ラベルを持つノードにのみ配置 • worker と worker3 に配置 • worker2 には1つも配置されない
  64. スケジューリングプロセスを設定できる方法 75 Copyright © 2026, Oracle and/or its affiliates Node

    Affinity • Pod を配置したいノード条件を “ルール” で指定する仕組み • nodeSelector より柔軟で表現力が高い 条件 概要 requiredDuringSchedulingIgnoredDuringExecution 条件を満たさないノードには配置されない preferredDuringSchedulingIgnoredDuringExecution できればこの条件のノードを優先して選ぶ 2種類の条件
  65. スケジューリングプロセスを設定できる方法 76 Copyright © 2026, Oracle and/or its affiliates Node

    Affinity 演算子 意味(何を判定するか) 例 説明(初心者向 け) In 指定した値のいずれかに一致 disktype In [ssd, nvme] SSDまたはNVMe ノードのみ NotIn 指定した値に一致しない zone NotIn [zone-a] zone-a 以外の ノード Exists ラベルが存在すればOK gpu Exists GPUラベルがあれば OK DoesNotExist ラベルが存在しない spot DoesNotExist スポットノードを避け る Gt 値が指定より大きい numberCores Gt 3 CPUコア数が3より 多い Lt 値が指定より小さい latency Lt 10 レイテンシが10未 満 ※ nodeSelector と nodeAffinity の両方を指定した場合、両方 の条件を満たさないと Pod はノードにスケジュールされない
  66. スケジューリングプロセスを設定できる方法 77 Copyright © 2026, Oracle and/or its affiliates Node

    Affinity weight(重み)とは? • 各ノードに 点数(スコア) をつける時の「加点の強さ」 • 数値が大きいほど その条件が効きやすくなる • 範囲:1 ~ 100 preferredDuringSchedulingIgnoredDuringExecution の「重みづけ(weight)」は、 “どのノードをより優先するか” をスコアで決める仕組み。 ノード disktype=ssd zone=zone-a 合計スコア Node-A ✔ ✔ 80 + 20 = 100 Node-B ✔ ✘ 80 Node-C ✘ ✔ 20 Node-A が最優先で選ばれる例
  67. スケジューリングプロセスを設定できる方法 78 Copyright © 2026, Oracle and/or its affiliates Node

    Affinity Demo • worker3(zone-c) には1つも配置されない(required 条件で除外) • worker(zone-a/ssd) と worker2(zone-b/hdd) に配置される • worker に多めに配置される傾向がある(preferred weight=20)
  68. スケジューリングプロセスを設定できる方法 79 Copyright © 2026, Oracle and/or its affiliates Pod

    Affinity / Anti-Affinity • Pod アフィニティ:特定の Pod が動いている近く(同一ノード/ゾーン等)に配置したい場合に使う • Pod アンチアフィニティ:特定の Pod が動いている場所から分散して配置したい場合に使う(高可用性・単一障 害点回避) • ノード条件ではなく、他の Pod との関係で配置を制御できる • topologyKey で配置範囲(ノード、ラック、クラウドプロバイダのゾーン、リージョン)を指定 • ルールは 必須(required) と 推奨(preferred) を使い分け • 既存 Pod の配置は、実行中に条件が変わっても基本は移動しない(再スケジュール時に反映)
  69. スケジューリングプロセスを設定できる方法 80 Copyright © 2026, Oracle and/or its affiliates 既に動いている他の

    Pod を見て、「この Pod をどこに置くか」を決める必 須ルール。 「一緒に置きたい Pod」を見つけるためのラベル条件。 「confidential=high」の Pod が動いている ”特定のゾーン (security-zone)” と同じ場所に、この Pod も配置するルール。 「この Pod はここには置かないで」という配置しない場所のルール。 「confidential=none」 の Pod がいるノードには、できれば置かない (ただし、どうしても空きがなければ置かれることもある)というルール。
  70. スケジューリングプロセスを設定できる方法 81 Copyright © 2026, Oracle and/or its affiliates Pod

    Affinity / Anti-Affinity Demo1 • cache は worker / worker2 に1つずつ(Anti-Affinity で分散) • app は cache がいる worker / worker2 に同居(Pod Affinity) • app 同士は同じノードにいない(Pod Anti-Affinity)
  71. スケジューリングプロセスを設定できる方法 82 Copyright © 2026, Oracle and/or its affiliates Pod

    Affinity / Anti-Affinity Demo2 • 3つ目の app は置ける場所がなく Pending になる • cache がいない worker3 には Affinity が満たせず配置 不可
  72. スケジューリングプロセスを設定できる方法 83 Copyright © 2026, Oracle and/or its affiliates Topology

    Spread Constraint • Pod をゾーン/ノードなどにできるだけ均等に分散 • 可用性向上(単一障害点の回避)+ リソース効率の改善 ローリングアップデート時に新 Pod の置き場がなくなる場合があり、Spread Constraint を利用して多少の偏りを許 容して配置 • Pod Affinity は、 Pod を「同じ場所(トポロジー)に無制限に置く」 • Pod Anti-Affinity は、Pod を「同じ場所(トポロジー)に置かない」
  73. スケジューリングプロセスを設定できる方法 84 Copyright © 2026, Oracle and/or its affiliates •

    2 Pod、2 Node を構成する Kubernetes クラスタ • アンチアフィニティで Pod を別ノードに分散 (冗長化・単一障害点の回避) • Pod アンチアフィニティにより、ローリングアップデート時の 追加 Pod を配置できず失敗 • 対策:Node 追加 or Recreate 戦略に変更 Pod アンチアフィニティにより 新しい Pod を配置できない
  74. スケジューリングプロセスを設定できる方法 85 Copyright © 2026, Oracle and/or its affiliates Pod

    の設定で「分散ルール」を定義する。 Pod の配置の “偏り” をどこまで許容するか。 どの単位(ノード、ゾーンなど)で分散するか。 ルールを守れない場合 • 置かない(DoNotSchedule) • なるべく守る(ScheduleAnyway) 分散対象にする Pod のグループ指定 更新中に+1 Podまで増やす(=3つ目が出る) 既存2つを落とさずに入れ替える • 通常時:2 Pod を 別ノードに できるだけ分散しようとする • 更新時:一時的に 3 Pod に なっても、「均等にならないなら 止める」ではなく「置ける所に置 く」ので、アンチアフィニティのよう に詰まりにくい
  75. スケジューリングプロセスを設定できる方法 86 Copyright © 2026, Oracle and/or its affiliates Topology

    Spread Demo • Anti-Affinity: replicas > ノード数 になると Pending で詰まる • Topology Spread(ScheduleAnyway): 偏りを許容して全 Pod 配置できる • replicas=6 → 各ノードに2つずつ均等配置 • replicas=9 → 各ノードに3つずつ均等配置 • replicas=7 → 1ノードだけ3つ、残り2つ (maxSkew=1 の範囲内)
  76. スケジューリングプロセスを設定できる方法 87 Copyright © 2026, Oracle and/or its affiliates Taint

    / Toleration • Taint:このノードには原則 Pod を配置しない • Toleration:その制限を許可する Pod だけ配置する ノード側が「どの Pod を受け入れるか」を制御する仕組み。 • Affinity:Pod が「載りたいノード」を選ぶ(オプトアウト型) • Taint / Toleration:ノードが「載せてよい Pod」を選ぶ(オプトイン型) Affinity との違い
  77. スケジューリングプロセスを設定できる方法 88 Copyright © 2026, Oracle and/or its affiliates node-1

    node-2 taint $ kubectl taint nodes node-1 dedicated=high-performance:NoSchedule Toleration を持つ Pod だけ node-1 に配置される Toleration Pod Non- Toleration Pod Toleration を持たない Pod は、node-1 に配置されない
  78. スケジューリングプロセスを設定できる方法 89 Copyright © 2026, Oracle and/or its affiliates Taint

    / Toleration Demo • demo-no-toleration : worker / worker2 のみ(worker3 は Taint で弾かれる) • demo-with-toleration: worker / worker2 / worker3 すべてに 配置可能(Toleration が許可証)
  79. スケジューリングの考え方 90 Copyright © 2026, Oracle and/or its affiliates •

    基本はスケジューラに任せる ⇒ リソース(requests/limits)を正しく設定すれば、自動で最適配置される • 要件がある場合のみ制御する ⇒ 高可用性、データ局所性、専用ノード、均等配置など • Node と Pod の関係 ✓ nodeSelector:単純にノードを絞る ✓ Node Affinity:条件付きでノードを選ぶ(必須 / 推奨) ✓ Taint / Toleration:ノード側からPodを制限(専用ノード向け) • Pod 同士の関係 ✓ Pod Affinity:一緒に置く ✓ Pod Anti-Affinity:分散させる(冗長化) ✓ Topology Spread:できるだけ均等に分散 高度な方法 • スケジューラのチューニング 既存スケジューラの挙動を調整 • カスタムスケジューラ 特殊要件がある場合のみ
  80. 振る舞いパターン( Behavioral Patterns ) 92 Copyright © 2026, Oracle and/or

    its affiliates 「 Pod をどう動かし、どう管理するか」 ⇒ そのアプリケーションをどう動かしたいか(振る舞い)によって決まる パターン名 概要 (焦点) バッチジョブ(Batch Job) 一度だけ実行して、終わったら終了する処理。 定期ジョブ(Periodic Job) 決まった時間ごとに実行する処理。 デーモンサービス(Daemon Service) 全てのノードで Pod を動かす仕組み(監視やログ収集など)。 シングルトンサービス(Singleton Service) 常に1つの Pod だけ動かすサービス(ただし障害時は自動復 旧)。 ステートレスサービス(Stateless Service) 同じアプリケーション持つ Pod を管理するのに使用する構成要 素。 ステートフルサービス(Stateful Service) ステートフルな分散アプリケーションを作成し管理する方法。 サービスディスカバリー(Service Discovery) Service 同士がどうやってお互いを見つけるか。 セルフアウェアネス(Self Awareness) アプリケーションの自己分析とメタデータの注入の仕組み。 Kubernetes では「 Pod をどう動かしたいか」を考えて、それに合った管理方法を選ぶことが大切
  81. 概要 94 Copyright © 2026, Oracle and/or its affiliates ステートレスサービス

    • 同じプログラムを複数動かせる • インスタンス(Pod)同士が状態を持たない • どれが処理しても同じ結果になる • 簡単に増やす(スケールアウト) • 簡単に減らす(スケールイン) • 壊れたらすぐ置き換える Kubernetes における、ステートレスアプリを管理するための仕組み これらを自身のワークロードに合わせて組み合わせる
  82. インスタンス(Pod/ReplicaSet/Deployment/) 95 Copyright © 2026, Oracle and/or its affiliates コンテナを動かす基本単位

    指定した数の Pod を常に維持 設定 replicas:管理する Pod の数 selector :管理する Pod を識別するラベル template: Pod の設計図 • ReplicaSet を自動で作る • ローリングアップデート • ロールバック Kubernetes が、 ステートレスアプリケーションを 自動で管理する仕組み 管理 管理
  83. ネットワーク(Service) 96 Copyright © 2026, Oracle and/or its affiliates •

    停止することがある • 新しく作り直される • 名前 • ホスト名 • IP アドレス ※ ReplicaSet 配下の Pod Pod 再作成時に変わる • 固定 IP(ClusterIP)を持つ • Pod が変わっても IP は変わらない • 複数の Pod へ自動で負荷分散する クライアント Service は、 通信を Pod に 振り分ける
  84. ストレージ(PVC) 97 Copyright © 2026, Oracle and/or its affiliates ステートレスでもデータを使用する

    • ログ • 一時データ • キャッシュ • ファイル アプリケーション本体はステートレスでも、 補助データを外部保持することはある アプリケーションが 「このくらいのストレージが欲しい」と要求 する仕組み 実際のストレージと 連携する仕組み なぜPVCを使うのか? • ストレージ管理とアプリケーションを分離するため • Pod が消えてもデータを残すため ReadWriteOnce、ReadOnlyMany ReadWriteMany、ReadWriteOncePod と いったアクセスモードがある
  85. ステートレスとステートフルの整理 99 Copyright © 2026, Oracle and/or its affiliates ステートレス寄りな構成

    ReadWriteMany NFS/CephFS/GlusterFS など 複数ノードの Pod から Datastore に対して読み書き可能 ReadOnlyMany 複数ノードの Pod から Datastore に対して読みのみ可能 複数ノード
  86. ステートレスとステートフルの整理 100 Copyright © 2026, Oracle and/or its affiliates ステートフルな構成

    Block Storage/Database など ReadWriteOnce 単一ノードの Pod から Datastore に対して読み書き可能 単一ノード
  87. ステートレスとステートフルの整理 101 Copyright © 2026, Oracle and/or its affiliates ステートフルな構成

    Block Storage/Database など ReadWriteOncePod クラスタ上の単一 Pod から Datastore に対して読み書き可能 ノード制限でなく Pod 制限 主に次のようなケース • シングルトンアプリ • 排他アクセスが必要なDB • 1つのPodだけが書き込むログ (例) • Leaderノード • バッチ処理 • 単一インスタンスDB
  88. 概要 103 Copyright © 2026, Oracle and/or its affiliates ステートフルサービス

    ステートフルサービスは、各 Pod が固有のデータ、 役割を持つアプリケーションを扱うための仕組み。 Pod が入れ替わると問題が起きる。 ステートフルアプリの主な要件 要件 内容 専用ストレージ 各 Pod が自分専用のディスクを持つ 安定したネットワーク Pod に固定の名前でアクセスできる 永続 ID Pod 名が固定(例:rg-0, rg-1) 起動・停止順序 Pod を順番に起動・停止できる StatefulSet
  89. ステートフルサービスにおける問題 104 Copyright © 2026, Oracle and/or its affiliates ストレージ

    ステートフルアプリケーションにおいては、各 Pod が専用ディ スク(データ)を持つ必要がある。 Deployment/ReplicaSet は 同じ Pod テンプレートか ら Pod を作成する。(同じ PVC を参照する設定となる) 結果として複数 Pod が同じ PVC を共有する構成になる。 データ競合・データ破損のリスクとなる。 ReadWriteOnce 単一ノードの Pod から Datastore に対して読み書き可能 単一ノード 複数ノード ReadWriteMany 複数ノードの Pod から Datastore に対して読み書き可能 ReadOnlyMany 複数ノードの Pod から Datastore に対して読みのみ可能 アプリケーション側で排他制御をさせることも可能だが、性能が落ちる可能性は高まる...
  90. ステートフルサービスにおける問題 105 Copyright © 2026, Oracle and/or its affiliates ネットワーク

    ステートフルアプリケーションでは、各 Pod が固有のネットワークID(名前) を持つ必要がある。 Deployment/ReplicaSet の Pod は名前がランダムで、再作成されると変わる。 Pod の IP アドレスも再作成時に変更される。 特定の Pod に接続できなくなり、クラスタ構成やノード間通信に問題が発生する。 Pod 毎に専用のPVC、固定のPod名を持つ仕組みが必要となる
  91. ステートフルサービスにおける問題 106 Copyright © 2026, Oracle and/or its affiliates アイデンティティ

    ステートフルアプリケーションでは、各 Pod が 固定の識別子(ID) を持つ必要がある。 Deployment / ReplicaSet の Pod は再作成されると名前やインスタンスが入れ替わる。 Pod が入れ替わるとどの Pod がどの役割・データを持つのか識別できなくなる。 クラスタ構成・レプリケーション・ノード管理が破綻する可能性がある。 Pod に識別できる ID を付与する仕組みが必要
  92. ステートフルサービスにおける問題 107 Copyright © 2026, Oracle and/or its affiliates 順序

    ステートフルアプリケーションでは、Pod の 起動・停止の順序が重要な場合がある。 Deployment / ReplicaSet は Pod を並列に作成・削除する。 クラスタ初期化やデータ同期の順序が保証されない。 クラスタ構築やノード参加処理に問題が発生する可能性がある。 Pod を順番に起動・停止できる仕組みが必要
  93. StatefulSet 108 Copyright © 2026, Oracle and/or its affiliates StatefulSet

    は、ストレージ・ネットワーク・アイデンティティ・起動順序を安定化することで、ステートフルアプリケーションを Kubernetes 上で安全に運用できるようにするコントローラ。 Pod に固定の名前で アクセスできる Pod を順番に 起動・停止 各 Pod が自分専用のディスクを持つ Pod 名が固定 スケールアウト時は Pod と PVC が作成さ れ、Pod 名とPVC 名 は固定される スケールイン時は Pod は削除されるが、PVC は残り Pod 再作成 時にバインドされる スケールの柔軟性を高め るために StorageClass で動的プロビジョニング
  94. StatefulSet 109 Copyright © 2026, Oracle and/or its affiliates Service

    StatefulSet PersistentVolume PVC を作るテンプレート、StorageClass により PV も動的にプロビジョニングされる。
  95. StatefulSet 110 Copyright © 2026, Oracle and/or its affiliates Demo

    1. Pod 名が固定(mysql-0, mysql-1, mysql-2) 2. 各 Pod が専用PVCを持つ(data-mysql-0 など) 3. 起動が順番(0→1→2)、停止が逆順(2→1→0) 4. Pod 削除後も同じ名前・同じ PVC で復活 5. 固定 DNS で Pod に直接アクセスできる
  96. 構造化パターン( Structural Patterns ) 113 Copyright © 2026, Oracle and/or

    its affiliates コンテナと Pod の関係 ⇒ Pod の中でコンテナをどう組み合わせるか? パターン名 概要 (焦点) Init コンテナ(Init Container) アプリケーションが動く前に、準備作業だけを行うコンテナ。 サイドカー(Sidecar) メインアプリケーションの横で動いて、機能を追加するコンテナ。 アダプタ(Adapter) アプリケーションの出力を整えて、外部とやり取りしやすくするコンテナ。 アンバサダ(Ambassador) 外部サービスとの通信を担当する代理プロキシコンテナ。 アプリケーションをより良く動かすための構成パターンを学ぶ
  97. 概要 115 Copyright © 2026, Oracle and/or its affiliates サイドカー(Sidecar)

    サイドカーは、メインアプリケーションの横で動き、アプリケーションを変更せずに補助機能を追加するパターン。 メインアプリケーション コンテナ サイドカー コンテナ • ログ収集 • 設定同期 • プロキシ • 監視 • 証明書更新 • データ変換 メインアプリケーションに組み込むと再 利用性や保守性が下がるため、別コ ンテナとして同じ Pod 内で稼働させる。 • 役割分担しやすい • メインアプリケーションを変更しなくてよい • コンテナを再利用/保守しやすい • 補助機能を後付けできる
  98. サイドカー(Sidecar) 116 Copyright © 2026, Oracle and/or its affiliates サイドカーにすることで、HTTP

    配信機能と Git 同期機能を分離し、メインアプリケーションを変更せずに拡張できる。 • 役割分担しやすい • メインアプリケーションを変更しなくてよい • コンテナを再利用/保守しやすい • 補助機能を後付けできる
  99. 概要 118 Copyright © 2026, Oracle and/or its affiliates アダプタ(Adapter)

    アダプタは、メインアプリケーションの出力やインタフェースを、外部ツールが扱いやすい共通形式に変換するた めのパターン。 メインアプリケーション コンテナ アダプタ コンテナ • ログ形式 • メトリクス形式 • 公開プロトコル 1. アプリ独自のログやメトリクスを読み取る 2. それを標準化された形式に変換する 3. 外部ツールが利用できるインタフェースで公開する バラバラな出力を共通フォーマットに 変換 アプリケーション内部の独自形式と、外部基盤が期待する 標準形式の間をつなぐ役割
  100. アダプタ(Adapter) 119 Copyright © 2026, Oracle and/or its affiliates アプリケーション内部の独自形式と、外部基盤が期待する標準形式の間をつなぐ役割。

    1. アプリ独自のログやメトリクスを読み取る 2. それを標準化された形式に変換する 3. 外部ツールが利用できるインタフェースで公開する ログを出力 Prometheus が読めるメトリクス 形式に変換して HTTP で公開 する。 ログから数値を取り出して メトリクス化する役割
  101. 概要 121 Copyright © 2026, Oracle and/or its affiliates アンバサダ(Ambassador)

    アンバサダは、メインアプリケーションの代わりに、外部サービスとのやり取りを担当する補助コンテナ。 メインアプリケーション コンテナ アンバサダ コンテナ • 外部サービスへの接続 • プロキシ • リトライ • ロードバランス • 接続先の切り替え メインアプリケーションは、 外部サービスの情報を 持つ必要が無い。 外部サービスとの難しい通信をアンバサダが肩代わりする。
  102. アンバサダ(Ambassador) 122 Copyright © 2026, Oracle and/or its affiliates メインアプリは

    localhost に接続するだけで、外部 etcd への接続は アンバサダコンテナが肩代わりする。 • ETCD_ENDPOINT=http://localhost:2379 を使う • 外部の etcd の場所を知らない • アンバサダコンテナにだけ接続する • Pod 内で 2379 番ポートを待ち受ける • 受けた通信を etcd.example.internal:2379 に転送する • 外部サービスへの接続ロジックを担当する
  103. 設定パターン( Configuration Patterns ) 124 Copyright © 2026, Oracle and/or

    its affiliates 「アプリケーション」と「設定」は、分けることが基本 ⇒ ビルド時にコードを固定し、実行時に設定を注入する パターン名 概要 (焦点) 環境変数による設定(EnvVar Configuration) 環境変数で設定を渡す方法。 設定リソース(Configuration Resource) Kubernetes の専用リソース ( ConfigMap/Secret )に設定を保存する方法。 イミュータブル設定(Immutable Configuration) 実行時に設定を注入し、変更できない設定として扱う 方法。 設定テンプレート(Configuration Template) 複数環境で大規模設定を扱う方法。 イメージを不変に保ちつつ、環境差分を安全に注入するパターンを学ぶ
  104. 概要 126 Copyright © 2026, Oracle and/or its affiliates 容量が大きい、または項目数が多く、そのまま

    ConfigMap に入れると管理しにくい設定ファイルをテンプレー トから作るようにして効率を計る設定ファイルパターン。 ConfigMap、Secret で 定義するパターン • 容量が大きい ConfigMap のサイズ制限 1MB を超える • 内容量が多い 設定項目が多い、階層が深い • 環境差分の発生 環境差分の設定の増大 • 共通部分をテンプレートファイル • 環境ごとに違う値を ConfigMap や環境変数として 分ける テンプレート + 値(ConfigMap) 完成した設定ファイル Initコンテナ + アプリケーションコンテナ でどう実現するか
  105. 設定テンプレート(Configuration Template) 127 Copyright © 2026, Oracle and/or its affiliates

    容量が大きい、または項目数が多く、そのまま ConfigMap に入れると管理しにくい設定ファイルをテンプレー トから作るようにして効率を計る設定ファイルパターン。 環境差異分のパラメータを事前にConfigMapとして作成 しておく 共通部分の設定パラメータを 持つテンプレート Init コンテナから出力された環境差異分と共通部分を 含んだ設定ファイル Init コンテナ処理完了後に 起動し、設定ファイルをロード メリット • 設定の重複削減 • メンテナンス性向上 • 設定ドリフト防止 • 大きな設定ファイルの扱いや すさ • 環境差分管理のしやすさ