Go言語

GoでKubernetesカスタムコントローラ構築:Kubebuilder v4 & k3dハンズオン

ⓘ本ページはプロモーションが含まれています

スポンサードリンク

共通前提条件とツール一覧

ツール 推奨バージョン (2026‑04) 主な機能
Go 1.22.5 Kubebuilder v4 が要求するコンパイラ
Docker Desktop / Docker Engine 24.0.x 系 k3d が内部で使用するコンテナランタイム
kubectl v1.30.x 系 Kubernetes クラスタ操作 CLI
k3d v5.6.0 Docker 上に軽量な K8s クラスタを構築

注記:上記バージョンは「2026‑04」時点の最新です。公式サイトや brew, apt, chocolatey などで提供されている最新版が利用できる場合は、そちらを優先してください。


macOS のインストール手順

ポイント:Homebrew 経由でインストールすると、brew upgrade により自動的に最新パッチが取得できます。


Ubuntu のインストール手順

ポイントdocker グループにユーザーを追加した後は、ターミナルを再起動してください。


Windows のインストール手順(PowerShell 推奨)

注意:Docker Desktop のインストール後は Windows を再起動し、PowerShell を管理者権限で実行してください。


その他 Linux ディストリビューション向けインストール例

ディストリビューション Go インストール方法 Docker Engine インストール k3d インストール
Fedora sudo dnf install golang(1.22 系) sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.reposudo dnf install docker-ce docker-ce-cli containerd.io curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash
Arch Linux pacman -S go(最新版) pacman -S dockersystemctl start docker && systemctl enable docker yay -S k3d(AUR)
openSUSE Leap zypper install golang zypper addrepo https://download.docker.com/linux/opensuse/docker-ce.repozypper install docker-ce 同上のシェルスクリプト

それぞれのパッケージマネージャが提供するバージョンは リポジトリ更新タイミング に依存します。必要に応じて公式バイナリを直接ダウンロードしてインストールしてください。


バージョン管理ツールで複数バージョンを安全に切り替える方法

開発環境や CI ランナーでは、プロジェクトごとに異なる Go のバージョンが必要になるケースがあります。代表的なマルチバージョン管理ツールは以下です。

ツール 主な特徴
asdf (プラグイン asdf-go) .tool-versions にプロジェクト単位でバージョンを書ける。Linux/macOS 両方に対応。
SDKMAN! 主に JVM 系だが、Go 用プラグインも提供。Unix 系のみ。
brew (macOS) brew install go@1.21 のように複数バージョンを同時に保持可能。brew link --overwrite go@1.22 で切替え。

asdf を使った例

メリット:CI のセットアップスクリプトでも同様に asdf installasdf global/local を呼び出すだけで、環境差異を最小化できます。


環境変数と動作確認

ポイントgo.modgo 1.22 指定は必須です。Docker Desktop の「Kubernetes を有効化」設定は不要で、k3d が独立したコンテナ上にクラスターを提供します。


トラブルシューティング / FAQ

質問 回答
k3d が failed to create network と出る Docker のネットワーク数が上限に達している可能性があります。docker network prune -f で不要なネットワークを削除してください。
kubectl が Unable to connect to the server: dial tcp ... k3d クラスタが正しく作成されていないか、KUBECONFIG 環境変数が古い可能性があります。k3d kubeconfig get test-cluster > ~/.kube/config で再取得してください。
Go のビルドが cannot find package "sigs.k8s.io/controller-runtime" モジュールキャッシュが壊れていることがあります。go clean -modcache && go mod tidy を実行し、依存関係を再解決します。
Docker Desktop が起動できない(Mac で Apple Silicon) M1/M2 チップ向けの Docker Desktop のバージョンが必要です。公式サイトから「Apple chip」版をダウンロードしてください。
Windows で k3d コマンドが認識されない PowerShell が管理者権限で実行されていない、または $Env:Path にインストール先が追加されていません。一度ターミナルを再起動し、scoop reset k3d でパスを更新してください。

Kubebuilder プロジェクトの雛形生成

生成される主要ディレクトリ構造(抜粋)

図解api/v1/ → CR のスキーマ、controllers/ → ビジネスロジック、config/ → デプロイ用マニフェスト。


CRD 設計例と Go 型へのマッピング

アノテーションのベストプラクティス

アノテーション 効果
+kubebuilder:validation:Minimum=1 replicas が 0 未満にならないことを保証
+kubebuilder:default=1 フィールド未指定時に自動で 1 を設定
+kubebuilder:validation:Pattern= イメージ名のフォーマットチェック(正規表現)

推奨:必須フィールドだけを required にし、拡張性を保つために残りは omitempty としておく。


Reconcile ロジックのサンプル実装

実装上のポイント

  • 冪等性controllerutil.CreateOrUpdate が差分のみ適用し、再実行時にリソースが破壊されません。
  • 構造化ロギングlog.FromContext により k8s.io/component-base/logs 互換の JSON ログが出力され、Grafana Loki 等で容易に検索可能です。
  • エラーハンドリングclient.IgnoreNotFound を使うことで削除イベント時の不要な再試行を防止します。

テスト・CI/CD フロー全体像

1. 単体テスト (envtest)

テストコード例(controllers/appdeployment_controller_test.go

2. E2E テスト (k3d)

3. Dockerfile(マルチステージ)

4. GitHub Actions ワークフロー例


まとめと次のステップ

項目 キーポイント
環境構築 Go 1.22、Docker Desktop/Engine、k3d、kubectl をインストールすればローカルで本番に近い K8s クラスタが作れる。Windows、macOS、Ubuntu だけでなく Fedora・Arch 等でも同様の手順が存在することを覚えておく。
バージョン管理 asdf / brew / chocolatey 等で複数バージョンを安全に切り替え、CI でも同一ツールチェーンを利用すると環境差異が減少する。
Kubebuilder 雛形 initcreate api が生成する標準ディレクトリ構造は保守性と拡張性の土台になる。
CRD 設計 Spec と Status を明確に分離し、+kubebuilder:validation アノテーションで API の安全性を担保。
Reconcile 実装 CreateOrUpdate + OwnerReference による冪等性、構造化ロギングでデバッグ容易性を確保。
テスト・CI/CD envtestk3d の二段階テストに加え、GitHub Actions で自動ビルド/デプロイを実装すれば、プッシュごとに信頼できるリリースパイプラインが完成する。

次のステップ
1. 本記事の手順でローカル環境を構築し、make test && make run が問題なく動くことを確認してください。
2. サンプル CR (AppDeployment) を実際に作成し、期待通り Deployment と Pod が生成されるか検証します。
3. CI の設定が完了したら、ブランチを切って機能追加やバグ修正を行い、プッシュ → GitHub Actions の結果で自動的にテスト・デプロイが走るフローを体感してください。

このハンズオンを足掛かりに、社内の業務アプリケーション向けカスタムコントローラやオペレーターを次々と作成していけば、Kubernetes 上で安全かつスピーディなサービス運用が実現できます。 Happy coding!

スポンサードリンク

-Go言語
-, , , , , ,