ポイント: Kubernetesオペレーターパターンは、カスタムコントローラーを通じてステートフルアプリケーションの管理を自動化し、Kubernetes環境における効率を向上させます。オペレーターはドメイン知識をカプセル化し、バックアップや更新などの自動タスクを可能にします。
- オペレーターはKubernetesにおけるステートフルアプリケーション管理を自動化します。
- オペレーターを作成するための主要なツールにはClientGo、Kubebuilder、Operator SDKがあります。
Kubernetesに対するソフトウェア拡張であるオペレーターは、人間のオペレーターの知識をキャプチャすることによって機能します。Kubernetesを使用するエンジニアは、アプリやサービスがどのように振る舞うべきか、問題が発生したときにどのように反応すべきかについて独自の視点を持っています。同じエンジニアは、繰り返し可能なタスクを自動化することを好みます—そしてオペレーターパターンはこの自動化に不可欠です。この記事では、オペレーターパターンについて、Kubernetesにどのように適用されるか、いつ使用するか、そして作成を始めるためのいくつかのツールについて説明します。
K8Sオペレーターの理解
Kubernetesのオペレーターを使用すると、ドメイン固有の知識が組み込まれたカスタムコントローラーを書くことで、ステートフルアプリケーションを操作できます。Kubernetesに不慣れな場合、オペレーターのアイデアは混乱を招くかもしれませんので、シンプルな例を見てみましょう。Javaアプリがデータベースに接続する場合を考えます。それをK8Sクラスタにデプロイしたいとします。理想的には、サービスで公開されたJavaアプリの「デプロイメント」を実行し、バックエンドではデータベースアプリケーションの「ステートフルセット」を実行したいでしょう。このセットアップには2つの部分があります:
- ステートレスな部分、Javaアプリ
- ステートフルな部分、データベース
オペレーターを理解するには、セットアップのステートフルな部分、つまりデータを保存するアプリケーション、例えばetcdを考えてください。したがって、私たちの例では、アプリケーションがデータベースにどのように関連しているかを理解し、アプリケーションが特定の方法で振る舞ったときに特定のことを行うコントローラーを作成できます。サイト信頼性エンジニアや運用エンジニアは、バックアップ、更新、データの復元などの自動化に関心を持たされることがよくあります。これらのタスクがどのように達成されるかは、アプリケーション自体やビジネスユースケース(ドメイン知識)によって異なります。これがまさにK8Sオペレーターが行うことです:SRE/Opsエンジニアが通常実行しなければならない特定のタスクを実行するためにユーザーの代理として行動します。
オペレーターはK8Sパターンに従う
オペレーターはKubernetesの2つの重要な原則に基づいています:カスタムリソースとカスタムコントローラーです。
カスタムリソース
Kubernetesにおけるリソースは、特定の種類のAPIオブジェクトを格納するK8S APIのエンドポイントです。これにより、K8Sに追加のオブジェクトをクラスタに追加することでK8Sを拡張できます。その後、kubectlを使用して、ビルトインオブジェクトと同様に自分のオブジェクトにアクセスできます。例えば、ポッドやデプロイメントなどです。マニフェストを書くときは、yamlファイルに種類(ポッドまたはデプロイメント)を指定する必要があります。カスタムリソースは、K8Sにバンドルされていないリソースです。
カスタムコントローラー
コントローラーは、特定のリソース(カスタムリソース)の変更を監視し、現在の状態が望ましい状態と一致することを確認する制御ループです。実際、私たちはすでにK8Sに組み込まれた何らかの形式のコントローラーを使用しています。良い例は、ポッドを殺して別のポッドが立ち上がるデプロイメントです。コントローラーは、望ましいポッドの数が現在の状態と一致しないことを認識し、望ましい状態に一致させるために別のポッドを立ち上げます。では、なぜそれらの組み込みコントローラーはオペレーターとは呼ばれないのでしょうか?それは、これらのコントローラーが特定のアプリケーションに特化していないからです。それらは、デプロイメント、ジョブなどのビルトインリソースで使用されるアップストリームコントローラーです。
オペレーターを使用するタイミング
すべてのオペレーターはコントローラーですが、すべてのコントローラーがオペレーターであるわけではないことを知っておくことが重要です。コントローラーがオペレーターと見なされるためには、ユーザー(SRE/Opsエンジニア)を代行して自動タスクを実行するためのアプリケーションドメイン知識を持っている必要があります。
- ステートフルアプリケーションのビジネスロジックをカプセル化し、Kubernetes APIで制御する必要があるときは、オペレーターを使用します。これにより、K8Sエコシステムに組み込まれたアプリケーションの周りで自動化が可能になります。
- 特定のことが起こったときにアプリケーションの変更を監視し、特定のSRE/Opsタスクを実行するツールを構築する必要があるときは、オペレーターを使用します。
オペレーターの構築方法
オペレーターを構築する方法はいくつかあります:
- ClientGoはKubernetes APIに接続します。
- 利点:ビルトインリソースと同じリソースを使用するため、K8S標準に従ってテストされ、バージョン管理されたコードを安心して使用できます。
- 欠点:Goプログラミング言語を理解していないと、学習曲線が急になります。
- KubebuilderはK8S sigs組織の一部で、Goで書かれており、controller-runtimeを使用します。
- Operator SDKは、元々Core OSによって書かれ、現在はRedHatによって運営されているフレームワークで、Go、HEML、またはAnsibleでオペレーターを作成するためのヘルパー関数が付属しています。
オペレーターをデプロイする方法
オペレーターをデプロイする方法は2つあります:
- 他のKubernetesマニフェストと同様にyamlを使用します。
- CRDとコントローラーをパッケージとしてデプロイするためにHelmチャートを使用します。
オペレーターを作成するためのベストプラクティス
K8Sコントローラーはクラスタ自体のためのものであり、オペレーターはデプロイされたステートフルアプリケーションのためのコントローラーです。オペレーターを作成するときは、以下のベストパターンプラクティスに従ってください:
- ビルトイン型を利用してカスタム型を作成します。これにより、すでにテストされ、実績のある型を活用できます。
- コントローラーが機能するために他の外部コードが必要ないことを確認します。したがって、kubectl installを実行すれば、コントローラーをデプロイするために必要なすべてのことが完了します。
- オペレーターが停止した場合でも、アプリケーションが期待どおりに機能できることを確認します。
- コントローラーコードに十分なテストを実施します。
自分のアプリケーション特有のカスタムリソースを作成し、それをカスタムコントローラーと調整できるようにすることで、Kubernetesの通常の動作を拡張する準備が整ったら、オペレーターを使用する準備が整ったことになります。
追加リソース
Kubernetesに関する詳細は、以下のリソースを参照してください:
DevOpsガイド
- DevOpsとは?包括的な紹介
- DevOpsの簡単な歴史
- DevOpsアーキテクチャの紹介
- DevOpsにおける自動化:なぜ自動化するのか、そしてどうやって自動化するのか
- CI/CDとは?継続的インテグレーションと継続的デリバリーの説明
- Jenkinsを使用したCI/CDパイプラインの構築方法
- CI/CDパイプラインを最適化するためのDevOpsメトリクス
- 継続的デリバリーメトリクス
- 継続的インテグレーションから継続的デプロイメントへの進行は進行なのか、それともそうではないのか?
- 継続的インテグレーション(CI)、デリバリー(CD)、およびデプロイメントの違い
- DevOpsにおけるソースおよびバージョン管理
- 継続的テストとは何か?
- テスト自動化フレームワーク:究極のガイド
- DevOpsにおけるリリース管理
- 説明:DevOpsにおけるモニタリングとテレメトリー
- DevOpsにおけるアプリケーションパフォーマンス管理
- SDLCにおけるDevOpsオーケストレーション
- データベースDevOpsの紹介
- DevOpsにおけるマイクロサービスの役割
- DevOpsにおける仮想化の役割
- コンテナとDevOps:コンテナがDevOpsデリバリーパイプラインにどのように適合するか
- コンテナパイプラインとは何か?
- DevOpsツールチェーンとは何か?
- DevOpsのためのコンテナとコードの管理
- DevOpsにおけるアジャイルの役割
- DevOpsにおけるクラウドの役割
- FinDevOpsとは何か?
- 2022年のDevOpsのトレンド
- DevOpsの価値と原則
- DevOpsメトリクスとKPI
- 小規模、中規模、大規模組織向けのDevOpsアドバイス
- DevOpsチーム構造
- 今日読むべきDevOpsの本
- 『The Phoenix Project: DevOps For Everyone』の書評
- DevOpsインフルエンサー:Twitterでフォローすべき11人のDevOps専門家
- GitHub、GitLab、Bitbucket、Azure DevOps:違いは何か?
- ベストプラクティス:Kubernetes用にアプリケーションを設計する方法
- DevOpsにおける構成管理
- DevOpsブランチ戦略の説明
- DevOpsの職務名、役割、および責任
- DevOpsにおけるテスト:概念、ベストプラクティスなど
- 2022年のDevOps認定ガイド
- Kubernetesオペレーターパターンとは?
これらの投稿は私自身の意見であり、必ずしもBMCの立場、戦略、または意見を代表するものではありません。