こんにちは!クラウドインフラや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ライフを!