5.5.2. Operator SDK を使用した Helm ベースの Operator のビルド

以下の手順では、Operator SDK が提供するツールおよびライブラリーを使用して Helm チャートがサポートする単純な Nginx Operator のビルドの例について説明します。

ヒント

各チャートについて新規 Operator をビルドすることは最も効果的な方法と言えます。これにより、Hem ベースの Operator から移行して Go で完全装備の Operator を作成する場合などに、さらに多くのネイティブ動作をする Kubernetes API (例: oc get Nginx) の使用および柔軟性が可能になります。

前提条件

  • 開発ワークステーションにインストールされる Operator SDK v0.19.4 CLI
  • cluster-admin パーミッションを持つアカウントを使用した Kubernetes ベースのクラスター r v1.11.3+ (OpenShift Container Platform 4.6 など) へのアクセス
  • OpenShift CLI (oc) v4.6+ (インストール済み)

手順

  1. 新規 Operator プロジェクトを作成します。namespace スコープの Operator は単一 namespace でリソースを監視し、管理します。namespace スコープの Operator は柔軟性があるために優先して使用されます。これらの Operator は切り離されたアップグレード、障害対応およびモニタリングのための namespace の分離、および API 定義の差異化を可能にします。

    新規の Helm ベース、namespace スコープの nginx-operator プロジェクトを作成するには、以下のコマンドを使用します。

    $ operator-sdk new nginx-operator \
      --api-version=example.com/v1alpha1 \
      --kind=Nginx \
      --type=helm
    $ cd nginx-operator

    これにより、とりわけ API バージョン example.com/v1apha1 および Kind Nginx の Nginx リソースを監視する目的で nginx-operator プロジェクトが作成されます。

  2. Operator ロジックをカスタマイズします

    この例では、nginx-operator はそれぞれの Nginx カスタムリソース (CR) について以下の調整 (reconciliation) ロジックを実行します。

    • Nginx デプロイメントを作成します (ない場合)。
    • Nginx サービスを作成します (ない場合)。
    • Nginx Ingress を作成します (有効にされているが存在しない場合)。
    • デプロイメント、サービス、およびオプションの Ingress が Nginx CR で指定される必要な設定 (レプリカ数、イメージ、サービスタイプなど) に一致することを確認します。

    デフォルトで、nginx-operatorwatches.yaml ファイルに示されるように Nginx リソースイベントを監視し、指定されたチャートを使用して Helm リリースを実行します。

    - version: v1alpha1
      group: example.com
      kind: Nginx
      chart: /opt/helm/helm-charts/nginx
    1. Nginx Helm チャートを確認します

      Helm Operator プロジェクトの作成時に、Operator SDK は、単純な Nginx リリース用のテンプレートセットが含まれる Helm チャートのサンプルを作成します。

      この例では、Helm チャート開発者がリリースについての役立つ情報を伝えるために使用する NOTES.txt テンプレートと共に、デプロイメント、サービス、および Ingress リソース用にテンプレートを利用できます。

      Helm チャートの使用に慣れていない場合は、Helm Chart 開発者用のドキュメント を参照してください。

    2. Nginx CR 仕様を確認します

      Helm は 値 (value) という概念を使用して、Helm チャートの values.yaml ファイルに定義される Helm チャートのデフォルトをカスタマイズします。

      CR 仕様に必要な値を設定し、これらのデフォルトを上書きします。例としてレプリカ数を使用することができます。

      1. まず、helm-charts/nginx/values.yaml ファイルで、チャートに replicaCount という値が含まれ、これがデフォルトで 1 に設定されていることを検査します。デプロイメントに 2 つの Nginx インスタンスを設定するには、CR 仕様に replicaCount: 2 が含まれる必要があります。

        deploy/crds/example.com_v1alpha1_nginx_cr.yaml ファイルを以下のように更新します。

        apiVersion: example.com/v1alpha1
        kind: Nginx
        metadata:
          name: example-nginx
        spec:
          replicaCount: 2
      2. 同様に、デフォルトのサービスポートは 80 に設定されます。8080 を代わりに使用するには、サービスポートの上書きを追加して deploy/crds/example.com_v1alpha1_nginx_cr.yaml ファイルを再度更新します。

        apiVersion: example.com/v1alpha1
        kind: Nginx
        metadata:
          name: example-nginx
        spec:
          replicaCount: 2
          service:
            port: 8080

        Helm Operator は、helm install -f ./overrides.yaml コマンドが機能するように、仕様全体を values ファイルの内容のように適用します。

  3. CRD をデプロイします

    Operator の実行前に、Kubernetes は Operator が監視する新規カスタムリソース定義 (CRD) について把握している必要があります。以下の CRD をデプロイします。

    $ oc create -f deploy/crds/example_v1alpha1_nginx_crd.yaml
  4. Operator をビルドし、実行します

    Operator をビルドし、実行する方法として 2 つの方法を使用できます。

    • Kubernetes クラスター内の Pod を使用
    • operator-sdk up コマンドを使用してクラスター外で Go プログラムを使用

    以下の方法のいずれかを選択します。

    1. Kubernetes クラスター内で Pod として実行 します。これは実稼働環境での優先される方法です。

      1. nginx-operator イメージをビルドし、これをレジストリーにプッシュします。

        $ operator-sdk build quay.io/example/nginx-operator:v0.0.1
        $ podman push quay.io/example/nginx-operator:v0.0.1
      2. Deployment マニフェストは deploy/operator.yaml ファイルに生成されます。このファイルの Deployment イメージは、プレースホルダー REPLACE_IMAGE から直前にビルドされたイメージに変更される必要があります。これを実行するには、以下を実行します。

        $ sed -i 's|REPLACE_IMAGE|quay.io/example/nginx-operator:v0.0.1|g' deploy/operator.yaml
      3. nginx-operator マニフェストをデプロイします。

        $ oc create -f deploy/service_account.yaml
        $ oc create -f deploy/role.yaml
        $ oc create -f deploy/role_binding.yaml
        $ oc create -f deploy/operator.yaml
      4. nginx-operator デプロイメントが稼働していることを確認します。

        $ oc get deployment

        出力例

        NAME                 DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
        nginx-operator       1         1         1            1           1m

    2. クラスター外で実行します。この方法は、デプロイメントおよびテストの速度を上げるために開発サイクル時に優先される方法です。

      watches.yaml ファイルで参照されるチャートパスがマシン上に存在している必要があります。デフォルトで、 watches.yaml ファイルは operator-sdk build コマンドでビルドされる Operator イメージを使用できるようにスキャフォールディングされます。Operator を operator-sdk run --local コマンドで開発し、テストする場合、SDK はローカルファイルシステムでこのパスを検索します。

      1. この場所に、Helm チャートのパスを参照するシンボリックリンクを作成します。

        $ sudo mkdir -p /opt/helm/helm-charts
        $ sudo ln -s $PWD/helm-charts/nginx /opt/helm/helm-charts/nginx
      2. $HOME/.kube/config にあるデフォルトの Kubernetes 設定ファイルを使って Operator をローカルに実行するには、以下を実行します。

        $ operator-sdk run --local

        提供された Kubernetes 設定ファイルを使って Operator をローカルに実行するには、以下を実行します。

        $ operator-sdk run --local --kubeconfig=<path_to_config>
  5. Nginx CR をデプロイします

    これまでに変更した Nginx CR を適用します。

    $ oc apply -f deploy/crds/example.com_v1alpha1_nginx_cr.yaml

    nginx-operator が CR のデプロイメントを作成することを確認します。

    $ oc get deployment

    出力例

    NAME                                           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    example-nginx-b9phnoz9spckcrua7ihrbkrt1        2         2         2            2           1m

    Pod で 2 つのレプリカが作成されていることを確認します。

    $ oc get pods

    出力例

    NAME                                                      READY     STATUS    RESTARTS   AGE
    example-nginx-b9phnoz9spckcrua7ihrbkrt1-f8f9c875d-fjcr9   1/1       Running   0          1m
    example-nginx-b9phnoz9spckcrua7ihrbkrt1-f8f9c875d-ljbzl   1/1       Running   0          1m

    サービスポートが 8080 に設定されていることを確認します。

    $ oc get service

    出力例

    NAME                                      TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
    example-nginx-b9phnoz9spckcrua7ihrbkrt1   ClusterIP   10.96.26.3   <none>        8080/TCP   1m

  6. replicaCount を更新し、ポートを削除します

    spec.replicaCount フィールドを 2 から 3 に変更し、spec.service フィールドを削除して、変更を適用します。

    $ cat deploy/crds/example.com_v1alpha1_nginx_cr.yaml

    出力例

    apiVersion: "example.com/v1alpha1"
    kind: "Nginx"
    metadata:
      name: "example-nginx"
    spec:
      replicaCount: 3

    $ oc apply -f deploy/crds/example.com_v1alpha1_nginx_cr.yaml

    Operator がデプロイメントサイズを変更することを確認します。

    $ oc get deployment

    出力例

    NAME                                           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    example-nginx-b9phnoz9spckcrua7ihrbkrt1        3         3         3            3           1m

    サービスポートがデフォルトの 80 に設定されていることを確認します。

    $ oc get service

    出力例

    NAME                                      TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)  AGE
    example-nginx-b9phnoz9spckcrua7ihrbkrt1   ClusterIP   10.96.26.3   <none>        80/TCP   1m

  7. リソースをクリーンアップします

    $ oc delete -f deploy/crds/example.com_v1alpha1_nginx_cr.yaml
    $ oc delete -f deploy/operator.yaml
    $ oc delete -f deploy/role_binding.yaml
    $ oc delete -f deploy/role.yaml
    $ oc delete -f deploy/service_account.yaml
    $ oc delete -f deploy/crds/example_v1alpha1_nginx_crd.yaml