Oracle Cloud Hangout Cafe Season5 #1「Kubernetes Operator 超入門」(2022年1月19日開催)

2023年3月17日(金)
仁井田 拓也
連載第3回の今回は、2022年1月19日に開催された「Oracle Cloud Hangout Cafe Season5 #1『Kubernetes Operator 超入門』」の発表内容に基づいて紹介していきます。

●STEP5:Operatorのテスト

Operator SDKにより、プロジェクト作成時にcontrollers/suite_test.goにテストスイートが作成されています。テストスイートを見てみると、下図のようになっています。

ここで、envtestについて補足しておきます。envtestはcontroller-runtimeに含まれているテストユーティリティパッケージです。擬似的なkube-apiserverとetcdを起動してOperatorのテストを実行します。

使い方の概要は、以下の通りです。

  • envtest.Environment.Start()でAPI Serverとetcdの起動
    • 返却値としてAPI Serverにアクセスするためのrest.Config(kubeconfigにあたる)を取得
  • rest.Configからkubernetes.Clientsetを作成
  • kubernetes.Clientsetを利用して、CRや標準リソースを作成・削除したりすることが可能
  • envtest.Environment.Stop()でAPI Serverとetcdの停止

Operatorのテストは、このenvtestを利用して実施します。実際のテストケースはcontrollers/ochacafe_test.goに実装します。今回実装するOperatorに対するサンプルテストケースはのイメージは下図の通りです。

この例では、BeforeEach関数で環境のリセットや対象OperatorのReconcile関数を起動しています。また、It()がテストケースの1つ分になっており、このテストケースの中でCRを作成し、リソースが想定される状態になっているかどうかを確認します。例えば、今回の場合はCRで指定されたイメージやReplica数になっているかどうかという点です。

テストケースの実装が終わったら、makeコマンドを利用してテストを実行します。実行イメージは以下の通りです。

make test

実行結果は、以下のイメージです。

/ochacafe-operator-intro/bin/controller-gen rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases
/ochacafe-operator-intro/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
go fmt ./...
go vet ./...
KUBEBUILDER_ASSETS=”/Library/Application Support/io.kubebuilder.envtest/k8s/1.21.4-darwin-amd64" go test ./... -coverprofile cover.out
?       github.com/oracle-japan/ochacafe-operator-intro [no test files]
?       github.com/oracle-japan/ochacafe-operator-intro/api/v1alpha1    [no test files]
ok      github.com/oracle-japan/ochacafe-operator-intro/controllers      8.632s  coverage: 62.7% of statements

また、カバレッジレポートを出力したい場合は以下のように実行します。この場合は、HTML形式でレポートが出力されます。

go tool cover -html=cover.out -o cover.html

●STEP6:デプロイ

最後に、実装したOperatorをKubernetes環境にデプロイします。デプロイの方法は2つあります。

  • OLMを利用したデプロイ
  • makeコマンドでのデプロイ

それぞれについて説明する前に、まずは共通する手順としてOperatorをコンテナイメージとしてビルド/プッシュします。コンテナイメージのプッシュ先はMakefileに定義することになっているので、必要に応じて変更します。

make docker-build docker-push

ここから、2つのデプロイ方法に分けて見ていきます。

  • OLMを利用したデプロイの場合
    OLM(Operator Lifecycle Manager)を利用する場合は、まずOLMそのもののインストールから開始します。
    operator-sdk olm install
    次に、バンドルイメージのビルドとプッシュを行います。バンドルイメージとは、OLMとOperatorをパッケージ化したイメージです。
    make bundle bundle-build bundle-push
    最後にデプロイを行います。デプロイにはoperator-sdkコマンドを利用します。
    operator-sdk run bundle nrt.ocir.io/orasejapan/ochacafe_sample_operator-bundle:v0.0.1
    これでOperatorがデプロイされます。
  • makeコマンドでのデプロイ
    こちらは非常にシンプルで、以下のコマンドを実行するだけでOperatorがデプロイされます。
    make deploy
    補足ですが、いずれのデプロイ方法の場合も、kustomizeを利用してManifestをビルド(kustomizeコマンドはMakefileに記載)します。

以上がOperaror SDKを利用した開発プロセスです。当日のセッションでは、ここで開発したOperatorを実際に動作させているので、興味がある方は動画を確認してください。

metacontroller

最後に、参考情報としてmetacontrollerというアドオン機能を紹介します。

metacontrollerは、Google社が開発していたKubernetesアドオン機能の1つで、現在は別リポジトリでオープンソースとして開発が継続中です。最新バージョンはv4.7.4(2023/2現在)です。

metacontrollerはWebhookを利用してスクリプト形式で実装し、Operatorをデプロイできる仕組みです。仕組みの概要は“metacontroller server”が“CompositeController”と“DecoratorController”(合わせて“lambda controller”と呼ばれる)を呼び出し、必要な処理を実行します。

“lambda controller”の実体は対象のCRとWebhookのエンドポイントを定義したDeploymentです。Webhookのロジックとして実装に集中できるため、より簡易的にOperatorを実装できます。また、Webhookのエンドポイントを実装できれば良いので、言語的な制限もありません。今回紹介したシンプルなOperatorであれば、metacontrollerで十分に実装できます。

おわりに

ここまで、Kubernetesの拡張性から「Kubernetes Operatorパターン」を取り上げ、Operatorの仕組み、SDK、開発プロセスについて見てきました。Kubernetesがかなり普及してきた中で、ユーザ独自のワークロードやアプリケーションを運用する機会も増えてきていると思います。

また、Kubernetes上で動作するミドルウェアやデーターベースなども、今回紹介した「Operatorパターン」を利用しているものがほとんどです。従来の「職人技」と言われてきた作業や「手動運用」を「コード」に落とし込み、Operatorを利用して運用を自動化することでアプリケーションやワークロードの可能性を無限大に拡張できます。

本記事が、読者の皆さまが運用されているコンテナアプリケーションやその環境に対する何かしらのお役に立てれば幸いです。

日本オラクル株式会社

Oracle Groundbreaker Advocate
Senior Cloud Solution Engineer

日本オラクル株式会社所属。SIerにて様々なOSSを活用したシステム開発を経験し現職。現在は、SIer時代の知見を活かし、ソリューションアーキテクトとしてクラウドでのアプリケーション開発やクラウドネイティブ技術に関する技術/案件支援に従事。

Community:
Oracle Cloud Hangout Cafe メンバー(#ochacafe)

連載バックナンバー

仮想化/コンテナ技術解説
第6回

Oracle Cloud Hangout Cafe Season6 #1「Service Mesh がっつり入門!」(2022年9月7日開催)

2023/6/22
連載第6回の今回は、2022年9月7日に開催された「Oracle Cloud Hangout Cafe Season6 #1『Service Mesh がっつり入門!』」の発表内容に基づいて紹介していきます。
仮想化/コンテナ技術解説
第5回

Oracle Cloud Hangout Cafe Season5 #5「実験! カオスエンジニアリング」(2022年5月11日開催)

2023/5/18
連載第5回の今回は、2022年5月11日に開催された「Oracle Cloud Hangout Cafe Season5 #5『実験! カオスエンジニアリング』」の発表内容に基づいて紹介していきます。
仮想化/コンテナ技術解説
第4回

Oracle Cloud Hangout Cafe Season5 #3「Kubernetes のセキュリティ」(2022年3月9日開催)

2023/4/18
連載第4回の今回は、2022年3月9日に開催された「Oracle Cloud Hangout Cafe Season5 #3『Kubernetes のセキュリティ』」の発表内容に基づいて紹介していきます。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています