Operator SDKをMacOSにインストールしてgolangでOperatorを作成します。長くなってしまうので、2回に分けます。
- Operator SDKのインストール
- Operatorを作成する
- プロジェクトを作成する
- CRDを作成する
- Controllerを追加する
Operator SDKのインストール
MacOSにインストールする方法は、以下の二通りあります。今回はGitHub releaseからのインストールを実施します。インストール方法は、こちらを参考にしています。
- GitHub releaseからのインストール
- brewコマンドからのインストール
以下のコマンドでOperator SDKコマンドをダウンロードします。
$ RELEASE_VERSION=v0.8.0 $ curl -OJL https://github.com/operator-framework/operator-sdk/releases/download/${RELEASE_VERSION}/operator-sdk-${RELEASE_VERSION}-x86_64-apple-darwin % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 652 100 652 0 0 860 0 --:--:-- --:--:-- --:--:-- 859 100 68.0M 100 68.0M 0 0 997k 0 0:01:09 0:01:09 --:--:-- 1196k curl: Saved to filename 'operator-sdk-v0.8.0-x86_64-apple-darwin'
Operator SDKのコマンドを/usr/local/bin配下にコピーします。
$ chmod +x operator-sdk-${RELEASE_VERSION}-x86_64-apple-darwin $ sudo cp operator-sdk-${RELEASE_VERSION}-x86_64-apple-darwin /usr/local/bin/operator-sdk
これでOperator SDKコマンドが利用できるようになりました。
$ operator-sdk version operator-sdk version: v0.8.0, commit: 78c472461e75e6c64589cfadf577a2004b8a26b3
Operatorを作成する
CRの値に応じてデプロイするイメージを切り替えるhello-operatorを作成します。helloconfigの値にhelloaもしくはhellobが指定されると、該当のイメージをデプロイするOperatorです。実用的ではないですが、まずは動くものを作っていきたいと思います。
helloaとhellobのコンテナイメージは、MicroK8sでIstioによるABテストを試してみる(1/2)で作成しています。よろしければご参照ください。
プロジェクトを作成する
以下のコマンドでプロジェクトを作成します。コマンドを実行すると、Operatorを作成するための雛形が作成されます。
$ operator-sdk new hello-operator ~~省略~~ INFO[0073] Project creation complete.
CRDを作成する
以下のコマンドを実行して、CRD用のAPIを作成します。
$ cd hello-operator/ $ operator-sdk add api --api-version=hello.example.com/v1alpha1 --kind=Hello
pkg/apis/hello/v1alpha1/hello_types.goが作成されるので、CRで設定できる設定項目を定義します。今回は、6行目にHelloConfig string `json:”helloconfig”`を加えただけになります。
~~省略~~ type HelloSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster // Important: Run "operator-sdk generate k8s" to regenerate code after modifying this file // Add custom validation using kubebuilder tags: https://book.kubebuilder.io/beyond_basics/generating_crd.html HelloConfig string `json:"helloconfig"` } ~~省略~~
変更を加えたら、以下のコマンドで必要なコードを再生成します。
$ operator-sdk generate k8s INFO[0001] Running deepcopy code-generation for Custom Resource group versions: [hello:[v1alpha1], ] INFO[0006] Code-generation complete.
Controllerを追加する
以下のコマンドを実行して、Controllerのテンプレートを作成します。作成が完了すると、pkg/controller/hello/hello_controller.go が作成されています。
$ operator-sdk add controller --api-version hello.example.com/v1alpha1 --kind Hello INFO[0000] Generating controller version hello.example.com/v1alpha1 for kind Hello. INFO[0000] Created pkg/controller/hello/hello_controller.go INFO[0000] Created pkg/controller/add_hello.go INFO[0000] Controller generation complete.
hello_controller.goは、定義したCRに対してどのような制御を行うか記述します。以下の部分を編集しました。HelloConfigの値を取得し、イメージ名に代入しているだけになります。
~~省略~~ func newPodForCR(cr *hellov1alpha1.Hello) *corev1.Pod { helloconfig := cr.Spec.HelloConfig labels := map[string]string{ "app": cr.Name, } return &corev1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: cr.Name + "-pod", Namespace: cr.Namespace, Labels: labels, }, Spec: corev1.PodSpec{ Containers: []corev1.Container{ { Name: "hello", Image: "localhost:32000/" + helloconfig, }, }, }, } } ~~省略~~
今日はここまでとして、続きのビルドとデプロイは明日実施します。
以上です!