Kubernetes Operatorとは|CRDの仕組みと自作の判断基準
最終更新日:2026/09/23
Kubernetes Operatorとは、CRDで定義した独自リソースとカスタムコントローラーを組み合わせ、アプリケーション固有の運用手順をクラスター内で自動実行させる拡張の仕組みです。自作すべきか既製Operatorで足りるかの線引きに迷うエンジニアに向けて、CRD設計の勘所と判断基準を整理します。
先に結論
Operatorは「CRD(独自リソースの型定義)+カスタムコントローラー(調整ループ)」の組み合わせで、運用ノウハウをコードに落とし込む拡張方式です
自作の判断軸はシンプルで、同じ運用手順を人間が繰り返しているか、そしてその手順に状態に応じた分岐があるかの2点に集約されます
分岐がなく「一度入れて終わり」ならHelmやKustomizeで十分です。Operator化すると保守対象が1つ増えます
既製Operatorを選ぶときは、Operator Framework公式のCapability Levels(Level 1〜5)を共通言語にすると、機能の期待値をチーム内で揃えられます
自作した後の負荷はKubernetes本体の更新に連動します。公式のパッチサポート期間はマイナーバージョンごとにおよそ14か月で、追従の締切はここから逆算します
この記事でわかること
OperatorとCRD、カスタムコントローラーの正確な関係
調整ループ(Reconcile)が何をしているか
CRDを設計するときに最初に決めるべき3点
Operatorを自作すべきか、既製品を使うべきかの判断フロー
自作した場合に後から効いてくる維持コストの中身
フリーランスエンジニアがOperator周辺の案件にどう関わるか
対象読者は、Kubernetesの基本リソース(Pod・Deployment・Service)を業務で扱った経験があり、次の一段として拡張機構に踏み込みたいエンジニアです。Kubernetes自体の基礎から確認したい場合はKubernetesとは?仕組み・Dockerとの違い・フリーランス案件の単価をエンジニア視点で解説を先に読んでおくと、この記事の前提がつながります。
目次
Kubernetes Operatorとは|CRDとカスタムコントローラーの関係
Operatorが動く仕組み|調整ループ(Reconcile)
CRD設計で最初に決める3点
Operatorを自作すべきか|判断基準と既製Operatorの見極め
開発ツールの選び方|Kubebuilder・Operator SDK・Helm/Ansible
自作した後に効いてくる維持コスト
ケース別|フリーランスがOperatorに関わる3パターン
よくある失敗と対策
Operator導入判断チェックリスト
まとめ
よくある質問
Kubernetes Operatorとは|CRDとカスタムコントローラーの関係
結論として、Operatorは単一の製品名ではなく、Kubernetesを拡張して運用を自動化する実装パターンを指します。Kubernetes公式ドキュメントも「カスタムリソースを使用するKubernetesへのソフトウェア拡張」と定義しています(Kubernetes公式:オペレーターパターン)。
実務上は、Operatorは少なくとも次の2つの部品で説明されることが一般的です。
CRDは「独自リソースの型」を定義する
CRD(CustomResourceDefinition)は、クラスターに新しいリソース種別を登録する仕組みです。これを適用すると、kubectlで独自リソースを作れるようになります。
注意したいのは、CRDを入れただけでは何も起こらないという点です。型が増えただけで、そのリソースを見て動く主体がいません。ここを取り違えると「CRDを適用したのに動かない」という詰まり方をします。CRDそのものの位置づけはKubernetes公式のカスタムリソース解説が一次情報になります。
カスタムコントローラーが実際に手を動かす
カスタムコントローラーは、独自リソースを監視して、望ましい状態に近づけるための操作を実行するプログラムです。Podを作る、Secretを更新する、外部APIを叩く。こうした副作用を担当します。
Operator=CRD+カスタムコントローラー
この2つをセットで配布したものがOperatorです。利用者が実際に書くCR(カスタムリソース)まで含めると、「CRDで型を定義し、CRを受け取り、コントローラーが処理する仕組み」として整理すると理解がぶれません。標準のDeploymentコントローラーが「レプリカ数を合わせる」ことしか知らないのに対して、Operatorは「このデータベースはフェイルオーバー時にまずレプリカを昇格させ、その後に接続先を切り替える」といったアプリ固有の順序まで知っています。
構成要素 | 役割 | これだけだと何が起きないか |
|---|---|---|
CRD | 独自リソースの型とスキーマを登録 | 監視する主体がいないため、リソースを作っても放置される |
カスタムリソース(CR) | 利用者が書く設定の実体 | 型が未登録だと適用時に拒否される |
カスタムコントローラー | 状態差分を埋める処理の実行 | 対象の型がなければ監視対象を持てない |
Operator | 上記をまとめて配布する形態 | ― |
Operatorが動く仕組み|調整ループ(Reconcile)
Operatorの中心にあるのは調整ループです。現在の状態を取得し、望ましい状態と比べ、差分を埋める。これを繰り返すだけの単純な構造をしています。
望ましい状態と現在の状態の差分を埋める
利用者が書くのはspec、つまり「こうあってほしい」の宣言です。コントローラーはそれを読み、クラスターの実態を調べ、足りないものを作り、余っているものを消します。処理結果はstatusに書き戻し、利用者が進捗を読めるようにします。
命令的なスクリプトとの違いはここです。スクリプトは「実行した瞬間」だけ正しい。調整ループは、実際の状態がspecからずれたときに、望ましい状態へ繰り返し再収束させます。
冪等性が前提になる
調整ループは何度でも呼ばれます。ノードの再起動でも、無関係なイベントでも呼ばれることがあります。そのため処理は冪等、つまり何回実行しても同じ結果に落ち着くように書く必要があります。
「2回目の実行で重複リソースが増える」実装は、ここを外しているサインです。
削除時の後始末はfinalizerが担う
外部リソース(クラウド上のバケットやDNSレコードなど)を作るOperatorでは、CRが消されたときの後始末が問題になります。Kubernetesはfinalizerという仕組みを用意していて、後始末が終わるまで削除を保留できます。finalizerを付けたまま処理が失敗し続けると、リソースが消せなくなる詰まり方をするため、実装では解除条件を先に決めておきます。
ミニFAQ
Q. Reconcileは何をきっかけに呼ばれますか。
A. 対象のカスタムリソースの作成・更新・削除に加えて、コントローラーが監視対象に指定した関連リソース(Pod、Secret等)の変化でも呼ばれます。定期的な再同期が設定されることも多く、「イベントが来たときだけ」とは限りません。
Q. 調整が失敗し続けるとどうなりますか。
A. 多くのフレームワークでは指数バックオフで再キューされ、間隔を空けながら再試行が続きます。無限に叩き続けるわけではありませんが、失敗理由をstatusのconditionsに出しておかないと、利用者からは「何も起きていない」ようにしか見えません。
CRD設計で最初に決める3点
CRDの設計は、後から変更するコストが高い箇所です。着手前に次の3点を決めておくと、やり直しが減ります。
1. specにどこまで露出させるか
抽象度の決定です。内部実装をそのままspecに並べると、利用者は結局Kubernetesの詳細を理解しなければならず、Operatorを入れた意味が薄れます。逆に絞りすぎると、例外的な要件に応えられず、後から場当たり的なフィールドが増えます。
判断の目安は「利用者が意思決定したい項目だけをspecに出す」です。バージョン、サイズ、バックアップ保持期間あたりは出す。内部のラベル命名規則は出さない。
2. statusとconditionsの持たせ方
statusは利用者への唯一の報告経路です。ここが薄いOperatorは運用時に非常に扱いづらくなります。準備完了かどうか、失敗しているなら何が原因か、最後に成功したのはいつか。この3つは最低限持たせます。
3. バージョニングと移行の方針
CRDにはAPIバージョンがあります。最初はv1alpha1で始めることが多いのですが、実運用に載せた後でフィールド構造を変えたくなった時に、既存のリソースをどう移行するかが問題になります。複数バージョンを併存させる場合はconversion webhookが必要で、これは実装・運用ともに重い部類です。
社内利用の段階で構造を十分に固めておく方が、後の移行コストを抑えやすくなります。
Operatorを自作すべきか|判断基準と既製Operatorの見極め
ここが本記事の中心です。結論を先に書くと、自作が正当化されるのは「繰り返し」と「分岐」の両方がある場合だけです。
自作しなくていいケース
次に当てはまるなら、Operatorを作る必要はありません。
インストールして設定を流し込めば終わる。運用中に人間の判断が入らない
環境ごとの差分がテンプレートの値の差し替えで表現できる
障害時の対応が「Podを再起動する」で済む
この範囲はHelmやKustomizeの担当領域です。デプロイの継続的な適用まで含めたいなら、GitOpsツールを組み合わせる方が保守対象が増えません。ArgoCDとは|GitOpsの仕組み・Kubernetes運用と案件動向で扱っている構成が、この層でよく採られる選択肢です。
自作を検討していいケース
逆に、次の条件が揃うとOperator化の価値が出ます。
同じ運用手順を月に何度も実行していて、手順書がすでに存在する
その手順に「状態を見て分岐する」判断が含まれる(レプリカの健全性を確認してから昇格する、等)
失敗時のリカバリ手順が決まっており、人間がやると事故る
複数チームが同じ基盤を使っており、操作を安全に委譲したい
4つ目は見落とされがちですが、実務では効きます。CRDは権限委譲の境界としても機能するためです。利用者にはCRの作成権限だけを渡し、危険な操作はコントローラー側に閉じ込められます。
判断フロー(この記事の整理)
状況 | 推奨手段 | 理由 |
|---|---|---|
一度入れたら基本触らない | マニフェスト/Kustomize | 自動化の対象になる運用がない |
環境差分はあるが手順は固定 | Helm | 値の差し替えで表現できる |
継続的に宣言状態へ収束させたい | GitOpsツール | クラスター内に独自コードを持ち込まずに済む |
状態依存の分岐を含む運用が反復する | 既製Operatorを探す | 主要ミドルウェアは既に存在する場合が多い |
既製品がない、または自社固有の業務手順 | 自作Operator | 運用知識をコード化する価値が保守コストを上回る |
既製Operatorを選ぶときの見極め方
自作の前に、まず既製品を探します。データベース、メッセージキュー、監視系の主要プロダクトは、ベンダーやコミュニティがOperatorを配布していることが多いためです。OperatorHub.ioがカタログとして使えます。
選定時に見る観点は次のとおりです。
Capability Level:公式の5段階モデル。Level 1は導入と設定、Level 2はアップグレード、Level 3はバックアップ/リストアや複雑な再構成、Level 4はメトリクスとアラート、Level 5は自動スケールや自己修復まで踏み込みます。レベルは累積的で、上位は下位を含みます
配布元:プロダクト本家が出しているか、第三者か
対応Kubernetesバージョン:どのマイナーバージョンまでを検証・サポート対象として明示しているか
直近の更新:新しいマイナーバージョンへの追従が止まっていないか
削除時の挙動:finalizerの実装があるか、アンインストール手順が文書化されているか
Level 4以上を求めるのか、Level 1で十分なのか。ここをチームで合意しておくと、「思っていたより何もしてくれない」という導入後のギャップを避けられます。
開発ツールの選び方|Kubebuilder・Operator SDK・Helm/Ansible
自作すると決めた場合、Goで書くのが最も一般的です。Kubernetes本体とエコシステムがGoで書かれており、型定義やクライアントライブラリをそのまま使えるためです。Go自体の位置づけはGo言語(Golang)とは? 特徴・用途から年収・将来性まで解説で整理しています。
KubebuilderとOperator SDKの関係
この2つは競合というより階層関係にあります。
ツール | 位置づけ | 向いている場面 |
|---|---|---|
controller-runtime | 調整ループの共通ライブラリ | 直接使うより、上位ツール経由が一般的 |
Goでのプロジェクト雛形生成 | Goで書き、Kubernetes標準の作法に寄せたい | |
Kubebuilderの機能を包含し、Go以外の方式やライフサイクル管理系の機能も提供 | Helm/Ansibleベースでも作りたい、Operator Frameworkのエコシステムに乗りたい |
Goで書くことが決まっていてエコシステム要件が特にないなら、Kubebuilderから入るのが素直です。Helmチャートをそのまま土台にしたい、あるいはAnsibleの既存Playbookを活かしたいという事情があるなら、Operator SDKの選択肢が効いてきます。
実装前に確認しておくこと
RBACの設計。コントローラーに何の権限を与えるか。cluster-adminを渡して済ませると、後からスコープを絞れなくなります
対象namespaceの範囲。クラスター全体を見るのか、特定namespaceに限定するのか
webhookを使うか。バリデーションやデフォルト値の注入に便利ですが、証明書管理が必要になります
ミニFAQ
Q. Helmベースで作ったOperatorでも、状態に応じた分岐は書けますか。
A. チャートのテンプレート機能の範囲を超える分岐は苦手です。CRの値を反映してチャートを適用し直す用途には向きますが、「レプリカの健全性を確認してから次の操作に進む」といった手続き的な判断が必要なら、GoやAnsibleベースを検討する方が無理がありません。
自作した後に効いてくる維持コスト
Operatorは作った時点ではなく、作った後にコストが出ます。案件で導入を提案するなら、ここまで含めて話す必要があります。
Kubernetesバージョンへの追従
自作Operatorは、Kubernetes APIに依存したソフトウェアです。本体が更新されれば、依存ライブラリの更新と動作確認が発生します。
Kubernetes本体のパッチリリース方針では、各マイナーバージョンはおよそ14か月メンテナンスされます。うち最初の12か月が標準期間、残り2か月はCVE対応などに限定されたメンテナンスモードです(Kubernetes公式:Patch Releases)。ただしこれは本体プロジェクトの方針であり、実際に使える期間は利用中のディストリビューションやマネージドサービスの提供方針で変わります。そちらも併せて確認したうえで、年1回以上は追従作業の枠を確保しておくのが現実的な計画です。
権限とマルチテナンシー
コントローラーは強い権限を持ちがちです。1つのクラスターを複数チームで使っている場合、Operatorの権限設計がそのままセキュリティ境界になります。namespace単位のスコープに絞れるか、他チームのリソースを誤って操作しない作りになっているか。レビュー時に必ず見られる箇所です。
引き継ぎのしやすさ
フリーランスとして関わる場合、ここが最も重要かもしれません。自作Operatorは「その人しか触れないブラックボックス」になりやすい資産です。CRDのフィールド仕様、statusの読み方、想定する障害シナリオと復旧手順。この3点をドキュメントに残しておかないと、契約終了後に社内で塩漬けになります。
ミニFAQ
Q. Kubernetesのバージョンを上げるとき、自作Operatorで最初に確認すべきことは何ですか。
A. 使用しているAPIグループ・バージョンに非推奨や削除が入っていないかを最初に見ます。次にcontroller-runtimeなど依存ライブラリの対応バージョン、最後にwebhookの証明書まわりです。この順で潰すと手戻りが少なくなります。
ケース別|フリーランスがOperatorに関わる3パターン
実務での関わり方は、大きく3つに分かれます。
ケース1:内製プラットフォームチームの一員として開発する
事業会社が自社基盤の抽象化を進めている場合、CRDの設計とコントローラー実装を担当します。求められるのはGoの実装力に加えて、利用者である開発チームのニーズを聞いてspecの抽象度を決める力です。役割の全体像はプラットフォームエンジニアとは|仕事内容・年収・SRE/DevOpsとの違いが近い内容を扱っています。
ケース2:既製Operatorを前提とした運用・保守
実務では、既製Operatorの運用・保守に関わる形で募集要件に含まれるケースが比較的よく見られます。データベースや監視基盤のOperatorが既に入っていて、その運用とトラブル対応を担当する形です。実装より、statusの読み解きとイベントの追跡、アップグレード計画の立案が中心になります。SREとは?仕事内容・年収・必要スキルとDevOpsとの違いをエンジニア視点で解説で整理している業務範囲と重なります。
ケース3:スポットでの設計レビュー
すでに自作Operatorがあり、設計の妥当性を短期で見てほしいという依頼です。CRDのバージョニング方針、RBACのスコープ、finalizerの解除条件。この3点の指摘だけでも価値が出ます。
案件を探すときの視点
Operator関連の募集は「Operator開発」という名前では出てこないことが多く、Kubernetes基盤構築、プラットフォームエンジニアリング、SREといった括りの中に含まれています。案件を確認する際はフリコンの案件一覧でKubernetes関連の募集要件を読み、CRDや内製基盤への言及があるかを見るのが実務的です。
Kubernetes案件そのものの単価レンジはKubernetesとは?仕組み・Dockerとの違い・フリーランス案件の単価をエンジニア視点で解説、SRE/DevOps領域の水準はSREフリーランスの単価相場|DevOps案件の月額レンジと参入目安で扱っています。自分の経験でどのあたりを狙えるか把握したい場合は、無料のフリーランスエンジニア単価診断で市場単価の目安を確認できます。
よくある失敗と対策
何でもCRDにしてしまう
設定ファイルで済む内容をCRDにすると、APIサーバーへの負荷とスキーマ管理の手間だけが増えます。調整ループが必要かどうかを基準に切り分けます。監視して動く主体がいらないなら、ConfigMapで足ります。
Reconcileに副作用を積み上げる
1回のReconcileで何十もの外部操作を行う実装は、途中で失敗したときの復旧が困難になります。処理を小さく分け、statusで進捗段階を持たせ、次回の呼び出しで続きから再開できる形にします。
statusを書かない
実装者は動いているかどうかをログで判断できますが、利用者にはstatusしか見えません。conditionsに理由まで書いておくと、問い合わせ対応の量が目に見えて減ります。
削除できないリソースを作る
finalizerの解除条件に外部システムの応答を含めると、その外部システムが落ちている間はCRを消せなくなります。タイムアウトと強制解除の手順を最初から用意しておきます。
Operator導入判断チェックリスト
提案や設計レビューの場でそのまま使える形にまとめました。
# | 確認項目 | Noが多いなら |
|---|---|---|
1 | その運用手順は月に複数回発生しているか | Operator化は時期尚早 |
2 | 手順に状態を見た分岐が含まれるか | Helm/GitOpsで足りる |
3 | 同じ目的の既製Operatorが存在しないか | まず既製品を評価する |
4 | 必要なCapability Levelをチームで合意したか | 導入後に期待値がずれる |
5 | CRDのAPIバージョン移行方針を決めたか | 後から移行コストが跳ねる |
6 | statusで報告する項目を定義したか | 運用時に状況が読めない |
7 | コントローラーのRBACスコープを最小化したか | セキュリティレビューで差し戻される |
8 | finalizerの解除条件とタイムアウトを決めたか | 削除不能のリソースが残る |
9 | Kubernetes更新への追従担当と頻度を決めたか | 塩漬け化する |
10 | 引き継ぎ用のドキュメントを作る前提になっているか | 属人化する |
まとめ
Kubernetes Operatorは、CRDで独自リソースの型を定義し、カスタムコントローラーがその状態を監視して望ましい状態へ収束させる拡張パターンです。自作の是非は「運用の繰り返し」と「状態に応じた分岐」の2軸で判断できます。
OperatorはCRDとカスタムコントローラーの組み合わせ。CRD単体では何も動かない
調整ループは冪等に書く。削除時の後始末はfinalizerで扱う
CRD設計では、specの抽象度・statusの設計・バージョン移行方針を着手前に決める
分岐のない運用ならHelmやGitOpsで足りる。Operator化は保守対象を1つ増やす選択
既製Operatorを探すのが先。Capability Levelを共通言語にして期待値を揃える
Kubernetesのパッチサポートはマイナーバージョンごとにおよそ14か月。追従の枠を年次で確保する
フリーランスの関わり方は、内製基盤の開発/既製Operatorの運用保守/スポットの設計レビューの3方向
次のステップとしては、既に使っているミドルウェアのOperatorが配布されていないかをOperatorHubで確認し、そのCRDのspecとstatusの設計を読んでみることをおすすめします。他人の設計を読むのが、自作の判断基準を持つ最短ルートです。
参照した一次情報は次のとおりです。
よくある質問
Operatorを導入するとクラスターの負荷は増えますか
コントローラーは常駐プロセスとしてAPIサーバーを監視するため、Pod1つ分のリソースとAPIサーバーへのwatch接続が増えます。単体の影響は小さいものの、Operatorを何十種類も入れている環境ではAPIサーバー側の負荷として積み上がります。再同期の間隔設定と監視対象の絞り込みが効きどころです。
Operator本体と管理対象アプリは、どちらを先にアップグレードしますか
一般的にはOperatorを先に上げます。新しい管理対象バージョンを扱うロジックがOperator側に入っているためです。ただしOperatorのリリースノートで対応バージョンの組み合わせを確認するのが前提で、順序を明記している製品も多くあります。検証環境で組み合わせを試してから本番に適用する手順を挟むと安全です。
マネージドKubernetes(EKS・GKE・AKS)でもOperatorは使えますか
使えます。Operatorはクラスター内で動く通常のワークロードなので、マネージドサービスでも同様に動作します。ただしコントロールプレーンの更新タイミングは提供側の管理になるため、自作Operatorの追従スケジュールはサービス側のバージョンサポート期限に合わせて組む必要があります。
OperatorとGitOps(ArgoCD等)は競合しますか
競合しません。役割が違います。GitOpsツールは「Gitに書いた状態をクラスターに適用する」層を担当し、Operatorは「適用された独自リソースを見てアプリ固有の運用を実行する」層を担当します。実際には、GitOpsツールでCRを配り、Operatorがその中身を処理する構成がよく採られます。
既製Operatorの品質はどこを見て判断しますか
配布元がプロダクト本家かどうか、直近のリリース日、対応を表明しているKubernetesバージョンの範囲、アンインストール手順の記載有無。この4点を見ると大きく外しません。Capability Levelの表示がある場合は、自分たちが必要とする水準に届いているかを確認します。
CRDのバージョンを変更したら、既存のリソースはどうなりますか
複数バージョンを併存させる場合、どれをストレージバージョンにするかを指定し、バージョン間の変換方法を定義する必要があります。フィールドの追加だけなら比較的単純ですが、構造そのものを変える場合はconversion webhookの実装が要ります。実運用に載せる前に構造を固めるのが最も安全です。
Operatorが意図しないリソースを作り続けたとき、どう止めますか
まずコントローラーのDeploymentをスケール0にして調整ループを停止させます。その状態で作られたリソースを整理し、原因を修正してから再開します。CRを先に消そうとするとfinalizerで止まることがあるため、コントローラーの停止を先に行う順序が安全です。
Operator開発の経験は案件でどう評価されますか
Kubernetesの利用経験と拡張の開発経験は、評価のされ方が分かれます。募集要件に内製基盤やプラットフォームチームという語がある場合、CRD設計やコントローラー実装の経験は差別化要素になります。Go実務経験と併せて提示できると、対象になる案件の幅が広がります。
Operatorを学ぶ前に押さえておくべき前提知識は何ですか
Deployment・StatefulSet・Serviceといった標準リソースの挙動、ラベルセレクタの考え方、RBACの基本構造です。ここが曖昧なままコントローラーを書くと、調整ループの中で何を監視すべきかの判断ができません。体系的に固めたい場合はCKA資格とは|Kubernetes認定の合格ライン・費用・出題範囲と勉強法で扱っている範囲が土台になります。
サービスメッシュのCRDとOperatorのCRDは何が違いますか
仕組みとしては同じCRDです。違いは用途で、サービスメッシュのCRDは通信制御のルールを宣言するために使われ、OperatorのCRDはアプリケーションのライフサイクル管理のために使われます。Istioとは|サービスメッシュの仕組み・Kubernetes運用での役割を解説で扱っているリソース群は前者の代表例です。
学習用に自作するなら、どんな題材が適していますか
社内の定型作業を1つだけ選ぶのが向いています。例えば「特定のラベルが付いたnamespaceに、決まったSecretとNetworkPolicyを自動で配置する」程度の範囲です。外部システムに依存しないため、finalizerや冪等性の練習に集中できます。
