Contents
Kubernetes Operator開発の概要と目的
Kubernetes Operatorは、カスタムリソースを監視し、所望の状態に維持する仕組みです。Go言語で実装されるOperatorは、複雑なアプリケーション運用自動化において重要ですが、CRDやKubernetes APIとの連携といった知識が必要です。本記事では、operator-sdkを用いてGo製Operatorを開発する手順を解説し、独自の実装に向けた基礎を固めます。
operator-sdkによるプロジェクト構築手順
Kubernetes Operator開発は、初期設定とテンプレート生成が第一歩です。operator-sdkはGo言語での開発を効率化するため、自動生成されたファイルを基にカスタマイズします。
開発環境の準備
以下が前提条件となります。
| 項目 | 必要バージョン | 備考 |
|---|---|---|
| Go言語 | v1.20以降 | go versionで確認可能 |
| kubectl | v1.25以降 | Kubernetesクラスター操作に必要 |
| operator-sdk | v1.30以降 | operator-sdk versionで確認可能 |
blockquote:
開発環境のセットアップは、公式ドキュメントに従って実施することを推奨します。
プロジェクト生成手順
以下のコマンドによりプロジェクトを初期化します。
-
operator-sdk initを実行して基本構造を作成
bash
operator-sdk init --domain example.com --group app --version v1alpha1 -
生成されるディレクトリ構造の概要
controllers/: コントローラロジックの実装場所api/: CRD定義やAPI関連コードmain.go: Operatorのエントリポイント
blockquote:
生成されるファイルはテンプレートであり、カスタムリソースに応じて修正が必要です。
Custom Resource Definition(CRD)の作成
CRDはKubernetesクラスター内で独自リソースを定義する仕組みです。YAML形式で記述し、kubectl applyで適用します。
CRD設計と自動生成
例:MemcachedOperatorのCRD定義(抜粋)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: memcacheds.app.example.com spec: group: app.example.com versions: - name: v1alpha1 served: true storage: true scope: Namespaced names: plural: memcacheds singular: memcached |
CRDファイルの自動生成
operator-sdkを使用すると、以下のコマンドでCRDを自動生成できます。
|
1 2 |
operator-sdk create api --group app --version v1alpha1 --kind Memcached --resource --controller |
blockquote:
自動生成されたCRDはapi/ディレクトリに格納され、必要に応じて修正が必要です。
Kubernetes APIとの連携(client-go活用)
Go製Operatorではclient-goライブラリを用いてKubernetes APIと連携します。これによりクラスター内のリソース操作が可能になります。
client-goの導入とクライアント設定
依存関係とクライアント作成手順は以下の通りです。
-
Configの取得
go
config, err := rest.InClusterConfig()
if err != nil {
panic(err)
} -
Clientsetの生成
go
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err)
}
blockquote:
InClusterConfig()はクラスター内で実行する場合に使用し、ローカル環境ではkubeconfigファイルを指定します(例:rest.LoadConfigFromFile("/path/to/kubeconfig"))。
コントローラロジックの実装
コントローラはカスタムリソース変更時にクラスター状態と同期する役割を持ちます。特にReconcileメソッドが中心です。
Reconcileメソッドの設計
以下のような処理を行う必要があります。
- リクエストされたリソースを取得
- 状態に応じてPod作成・更新などの操作を実施
- 所望状態と一致するか確認し、再評価が必要な場合は再スケジュール
イベント処理フロー
Kubernetesはリソース変更を監視し、Operatorにイベントを通知します。以下のような処理が行われます。
- Createイベント: リソース新規作成時
- Updateイベント: リソース更新時
- Deleteイベント: リソース削除時
blockquote:
イベント処理はReconcile()メソッド内で行われ、ステートの同期を実現します。
Operatorのデプロイ・テスト方法
開発したOperatorはDockerイメージを作成し、Kubernetesクラスターに展開することで利用できます。
Dockerイメージのビルド手順
以下のようにoperator-sdk buildコマンドで構築します。
|
1 2 |
operator-sdk build quay.io/example/memcached-operator:v0.1.0 |
blockquote:
ビルド後のイメージは、Docker HubやQuayにプッシュすることも可能です。
Helmチャートによるクラスター展開
以下の手順でHelmチャートを用いてOperatorをインストールします。
-
Helmリポジトリの初期化
bash
helm repo add operator-framework https://operatorframework.github.io/helm-charts -
Operatorパッケージのインストール
bash
helm install memcached-operator operator-framework/memcached-operator --namespace default
blockquote:
Helmチャートは、Operatorのバージョン管理やスケーリングを容易にします。
Sample CRによる動作検証
以下のようにSample CRを作成し、Operatorが正しく動作するか確認します。
|
1 2 3 4 5 6 7 8 |
apiVersion: app.example.com/v1alpha1 kind: Memcached metadata: name: example-memcached namespace: default spec: size: 3 |
blockquote:
kubectl apply -f sample-cr.yamlでクラスターに適用し、Podが正しく作成されるか確認してください。
要点まとめ
- operator-sdkでプロジェクト構築し、CRDを定義することでカスタムリソースを実装
- client-goライブラリを使用してKubernetes APIと連携
- Reconcileメソッド内でステート同期ロジックを記述
- Dockerイメージ作成後、Helmチャートでクラスターに展開
公式ドキュメントと併せて本記事で解説した手順を試し、独自のKubernetes Operator開発を開始してください。