【入門編】Kruise (OpenKruise) で解決するKubernetesの標準コントローラーの限界:Advanced StatefulSetとSidecarContainer管理の裏技 – インフラ構成管理(IaC)活用バイブル

こんにちは!クラウドインフラやSREの現場を渡り歩いている先輩エンジニアです。

日々のKubernetes(以下、K8s)運用、本当にお疲れ様です。
「データベースやステートフルなアプリを動かしたいのに、標準のStatefulSetだとスケールやアップデートの挙動が硬直的すぎる……」
「アプリのコンテナと一緒に動かしたいサイドカー(ログ転送やプロキシなど)のせいで、Pod全体の起動・停止順序がぐちゃぐちゃになる……」

そんな絶望を抱えた夜はありませんか?

今回は、そんなK8s運用の「あるあるな限界」を鮮やかに突破する、SRE界隈の秘密兵器「OpenKruise(オープンクルーズ)」について徹底解説します。これをマスターすれば、あなたのインフラ運用のストレスは劇的に軽減されますよ。さあ、一緒に深淵を覗いてみましょう!

—

1. なぜ標準のK8sコントローラーだけでは限界なのか?

K8sには、ステートフルなアプリケーションを管理するための `StatefulSet` や、ステートレスなアプリ用の `Deployment` が用意されています。これらは素晴らしい仕組みですが、実務の現場では次のような「壁」にぶつかります。

1. Podの再作成(Recreation)地獄
標準のコントローラーは、コンテナのイメージを書き換える(アップデートする)と、問答無用でPodを一度殺して(Delete)、新しいPodを作り直し(Create)ます。永続ボリューム(PV)の再アタッチに時間がかかるデータベースや、起動シーケンスが重いアプリの場合、これが原因でダウンタイムが延びたり、スプリットブレインの恐怖に怯えることになります。
2. サイドカーのライフサイクル問題
Service Meshのプロキシ(Envoyなど)や監視エージェントなどのサイドカーを同一Pod内に入れたとき、「メインアプリより先にサイドカーが起動してほしい」「メインアプリが終了した後にサイドカーを終了させたい」といった制御が、標準のK8sでは非常に困難でした。

こうした現場の叫びから生まれたのが、Alibaba Cloudなどが主導し、今やCNCFのインキュベーションプロジェクトとなっている「OpenKruise」です。

—

2. OpenKruiseとは?(ツールの役割)

OpenKruiseは、一言で言うと「K8sの標準コントローラーをスーパーcharge(超強化)する拡張アドオン」です。

K8sのカスタムリソース(CRD)を追加し、標準のワークロードでは絶対にできない高度なオーケストレーションを実現します。今回はその中から、実務で即効性がある「Advanced StatefulSet」と「SidecarContainer管理」の2大機能に絞って解説します。

—

3. インストールと基礎セットアップ

それでは、手元のK8sクラスター(MinikubeやKind、EKSなど何でもOKです)にOpenKruiseを導入しましょう。
Helmを使うのが最もモダンで確実です。

1. Helmリポジトリの追加
helm repo add openkruise https://charts.openkruise.io
helm repo update

2. Kruiseコントローラーのインストール(最新の安定版)
helm install kruise openkruise/kruise –namespace kruise-system –create-namespace

インストールが成功したか、Podの状態を確認してみましょう。

kubectl get pods -n kruise-system

`kruise-controller-manager-…` というPodが元気にRunningになっていれば、セットアップは完了です!

—

4. 【裏技①】Advanced StatefulSetによる「インプレース・アップデート」

まずは、一番感動が大きい「インプレース・アップデート(In-Place Update)」です。

何がすごいのか?

通常のStatefulSetやDeploymentでは、イメージタグを `v1` から `v2` に変えると Pod が再作成されます。しかし、OpenKruiseの `CloneSet` や `StatefulSet`(Advanced版)を使うと、PodのIPアドレスやホスト名、UIDを一切変えずに、内部のコンテナイメージだけを「その場で(In-Place)」書き換えることができます。

これにより、コンテナの再起動コストだけで済むため、アップデート速度が爆発的に向上します。

実践:Advanced StatefulSetのマニフェスト

実際に動かしてみましょう。以下のYAMLを `kruise-statefulset.yaml` として保存します。

apiVersion: apps.kruise.io/v1beta1
kind: StatefulSet
metadata:
name: my-advanced-sts
namespace: default
spec:
serviceName: “nginx”
replicas: 2
# Kruise特有のアップデート戦略
updateStrategy:
type: RollingUpdate
rollingUpdate:
# インプレースアップデートを有効化!
podUpdatePolicy: InPlaceIfPossible
inPlaceUpdateStrategy:
gracePeriodSeconds: 5
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:

  • name: main

image: nginx:1.21.0 # 最初は古いバージョン
ports:

  • containerPort: 80

name: web

適用します:

kubectl apply -f kruise-statefulset.yaml

アップデートしてみよう!

ここで、イメージを `nginx:1.25.0` に書き換えてみましょう。

kubectl patch sts my-advanced-sts –type=’json’ -p='[{“op”: “replace”, “path”: “/spec/template/spec/containers/0/image”, “value”: “nginx:1.25.0”}]’

ここでPodの状況をウォッチしてください。
標準のStatefulSetであれば `Terminating` から `Pending`、そして `Running`(Pod名やAGEが変わる)というライフサイクルを辿りますが、Advanced StatefulSetでは、PodのAGEや名前がそのままで、コンテナのイメージだけが書き換わります!

—

5. 【裏技②】SidecarContainer管理による完璧な順序制御

次に、サイドカーコンテナのライフサイクル問題です。
K8sの標準機能(Kubernetes 1.28以降でNative Sidecarsも導入されましたが、より柔軟な制御が可能です)では難しかった「サイドカーをメインより先に立ち上げ、メインが死んだら最後にサイドカーを安全に落とす」という要件をOpenKruiseは綺麗に解決します。

実践:SidecarContainer設定

Advanced StatefulSet、あるいは通常のDeploymentと組み合わせて使える `SidecarSet` というリソースを使います。

以下のYAML(`sidecarset.yaml`)を適用すると、特定のラベルを持つすべてのPodに対して、自動的に副作用なくサイドカーを注入できます。

apiVersion: apps.kruise.io/v1alpha1
kind: SidecarSet
metadata:
name: sidecar-injector
spec:
# app=nginx のラベルを持つPodすべてにこのサイドカーを相乗りさせる
selector:
matchLabels:
app: nginx
containers:

  • name: logger-sidecar

image: fluent/fluent-bit:latest
command: [“/fluent-bit/bin/fluent-bit”, “-i”, “dummy”, “-o”, “stdout”]
# 【重要】メインコンテナより先に起動する設定
lifecycle:
preStart:
exec:
command: [“echo”, “Starting sidecar first…”]
# アップデートや停止時の順序制御
namespace: default

これを適用すると、`app: nginx` を持つすべてのPodに自動的に `logger-sidecar` がインジェクションされます。
しかも、OpenKruiseは「メインコンテナが完全に起動した後にサイドカーを起動する」「サイドカーが終了してからメインが動く」といった制御を裏側で完璧にハンドリングしてくれます。開発者がPodのYAMLに複雑な順番制御を書く必要はもうありません。

—

6. おわりに:明日からのSREライフを変える第一歩

今回は、OpenKruiseが提供する機能のほんの一端をご紹介しました。
インプレース・アップデートによるダウンタイムの削減や、SidecarSetによるスマートな構成管理は、一度導入すると「もう標準のコントローラーだけには戻れない……」と感じるほどの破壊力があります。

「これをマスターすれば、毎日の作業が劇的に楽になりますよ。」

大規模なステートフルアプリの運用に疲弊しているなら、ぜひ次のスプリントでOpenKruiseの導入を検討してみてください。あなたのインフラ基盤を一段上のステージへ引き上げてくれる最高の相棒になるはずです。

それでは、素晴らしいK8sライフを!

タイトルとURLをコピーしました