Operator SDK をインストールしてOperatorを作成する(1/2)

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,
                },
            },
        },
    }
}
~~省略~~

今日はここまでとして、続きのビルドとデプロイは明日実施します。

以上です!