Operator作成について 連載第6回目 OLM管理可能のOperatorを作成する

はじめに

 前々回作成したコントローラをコンテナ化して、Operator Lifecycle Managerで管理できるパッケージを作るまでのことを説明いたします。なお、動作確認には、OpenShiftを使用しましたので、OCコマンドによる独自コマンドがあります。

テスト手順について

 作ったOperatorをOperator Lifecycle Manager(OLM)を使用して管理できるようにするまでに、いくつか段階を踏む必要があります。具体的には以下の手順があります。

  1. コントローラのコンテナ化とデプロイ方法の確立
  2. Operatorのインデックスコンテナ化
  3. カタログに登録

上記手順についての具体方法については以下に示します。

コントローラのコンテナ化

 前々回はコントローラを開発環境で動かして、Kubernetesの制御を行っていました。しかし、本記事はそのコントローラをコンテナ化してRBAC設定を行うことで、Kubernetes環境で動作するようにします。

コンテナ化

 まず、コンテナ化したコントローラをKubernetesで動かすためには、コンテナレジストリにコンテナをアップロードする必要があるため、以下の表1のようにコンテナ名に変更します。

表1 コントローラコンテナについて

名称コンテナレジストリサイトコンテナ名
コントローラコンテナquay.ioquay.io/k_nakajima/operator-nginx:0.0.1

 前々回記事で作成しましたプロジェクト状態から、コントローラコンテナのビルドとプッシュは、以下のコマンド行います。

make docker-build docker-push IMG_NAME=quay.io/k_nakajima/operator-nginx

RBACの設定

 コントローラのコンテナをKuberentesで動作させるためには適切な制御権限を付与する必要があります。Kubernetesは権限管理はRole Based Access Control(RBAC)で行っているため、本コントローラをコンテナを動かす場合は以下の表2に記載した権限を付与する必要があります。

表2 本記事コントローラが必要とするRBACについて

リソース名APIバージョン権限
Deploymentapps/v1createdeletegetlistpatchupdatewatch
Servicev1createdeletegetlistpatchupdatewatch
Startinstall.sios.nginx.testing/v1createdeletegetlistpatchupdatewatch

 OpertorSDKによるプロジェクト初期化実行後のRBACの設定は、Serviceリソースの制御許可がすべて無効になっているため、以下の通りに編集する櫃量があります。

  • config/rbac/role.yaml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: manager-role
rules:
  ##
  ## Base operator rules
  ##
  - apiGroups:
      - ""
    resources:
      - secrets
      - services
      - pods
      - pods/exec
      - pods/log
    verbs:
      - create
      - delete
      - get
      - list
      - patch
      - update
      - watch
  - apiGroups:
      - apps
    resources:
      - deployments
      - daemonsets
      - replicasets
      - statefulsets
    verbs:
      - create
      - delete
      - get
      - list
      - patch
      - update
      - watch
  ##
  ## Rules for install.sios.nginx.testing/v1, Kind: Start
  ##
  - apiGroups:
      - install.sios.nginx.testing
    resources:
      - starts
      - starts/status
      - starts/finalizers
    verbs:
      - create
      - delete
      - get
      - list
      - patch
      - update
      - watch
# +kubebuilder:scaffold:rules

動作テスト

 以下のコマンドを実行して、カスタムリソース定義をデプロイします。

make install

 カスタムリソース定義のデプロイ後、以下のコマンドを実行して、コントローラのDeploymentやRBACの設定などをKubernetesにデプロイします。

make deploy IMG_NAME=quay.io/k_nakajima/operator-nginx

 上記コマンドを実行すると、nginx-operator-systemという名前のネームスペースが作成され、そのスペース内で本記事で作成したコントローラコンテナのpodが起動します。なお、以下のコマンドを実行することでコントローラが動作していることを確認します。

$ oc get all -n nginx-operator-system
NAME                                                    READY   STATUS    RESTARTS   AGE
pod/nginx-operator-controller-manager-b657c98c6-vnngv   2/2     Running   0          22s
 
NAME                                                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/nginx-operator-controller-manager-metrics-service   ClusterIP   10.217.5.142   <none>        8443/TCP   22s
 
NAME                                                READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-operator-controller-manager   1/1     1            1           22s
 
NAME                                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-operator-controller-manager-b657c98c6   1         1         1       22s

 コントローラの動作確認として、以下のコマンドを実行しましますと、nginx-testというネームスペースを作成し、そのスペース内にStartのカスタムリソースが作成されます。

 そうしますと、本記事で導入したコントローラがそのカスタムリソースを検出し、コントローラが動作し始めます。

oc new-project nginx-test
oc apply -f config/samples/install_v1_start.yaml

 コントローラに適切なRBACが設定していると、Startのカスタムリソースが適用したネームスペース内に、DeploymentとServiceのリソースを生成されるので、以下のコマンドで存在を確認します。

$ oc get all -n nginx-test
NAME                                READY   STATUS    RESTARTS   AGE
pod/nginx-sample-798b644456-gvk2g   1/1     Running   0          56s
 
NAME                    TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
service/nginx-service   ClusterIP   10.217.4.31   <none>        8080/TCP   54s
 
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-sample   1/1     1            1           56s
 
NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-sample-798b644456   1         1         1       56s

 コントローラをKuberentesから削除する場合は以下のコマンドを実行します。

make undeploy
oc delete project nginx-test

インデックスコンテナを使用したテスト

 Operatorをデプロイする各リソースファイルはインデックスコンテナにまとめることができます。インデックスコンテナにまとめることで、Operatorのインストールが以下の図の通りになります。

図1 インデックスコンテナを使用したOperatorのインストール

インデックスコンテナ作成

 インデックスコンテナを作成するにはコンテナビルドツールとOperator-SDKを使用すれば作成することができます。

表3 インデックスコンテナについて

名称コンテナレジストリサイトコンテナ名
インデックスコンテナquay.ioquay.io/k_nakajima/operator-nginx-olm:0.0.1

 以下のコマンドを実行して、インデックス化するためのバンドルファイルを作成します。

なお、初回設定時に表に示す入力パラメータの入力する必要がありますので、入力例を示します。

make bundle IMG_NAME=quay.io/k_nakajima/operator-nginx

表4 バンドルイメージ作成入力パラメータ

入力パラメータ意味備考
Display name for the operatorOperatorの表示名称operator-nginx
Description for the operatorOperatorの説明文NginxをインストールするOperator
Provider’s name for the operatorOperatorの提供者名siosdx
Any relevant URL for the provider nameOperator提供者の関連するURLsios.jp
Comma-separated list of keywords for your operator本Operatorのキーワード(コンマ区切り)nginx,sios
Comma-separated list of maintainers and their emailsメンテナーのe-mailアドレスtest@example.jp

バンドルファイル作成後以下のコマンドで、ビルドを行います。

make bundle-build IMG_NAME=quay.io/k_nakajima/operator-nginx

ビルド後、以下のコマンドでコンテナレジストリサーバに登録します。

podman push quay.io/k_nakajima/operator-nginx-olm:0.0.1

インデックスコンテナの動作テスト

以下のコマンドで、「operator-nginx-system」というネームスペースを作成して、その場所にOperatorのコントローラのPodを立ち上げます。

oc new-project operator-nginx-system
operator-sdk run bundle -n operator-nginx-system quay.io/k_nakajima/operator-nginx-olm:0.0.1

上記の導入が成功しますと、OpenShiftではWeb画面から以下の図のようにインストールしたことを確認することができます。

図2 OpenShiftのインストール結果画面

もし停止する場合は以下のコマンドを実行します。

operator-sdk cleanup nginx-operator -n operator-nginx-system
oc delete namespace operator-nginx-system

OLMを使用したインストール

 OLMを使用して、Operatorを管理する場合は、以下図のカタログコンテナにインデックスコンテナを登録する必要があります。

図3 OLMを使用したOperatorのインストール

 OLMをインストールした際に、導入するカタログコンテナで登録してあるOperatorは、OperatorHubのサイトに登録してあるOperatorが登録されています。ただし、OperatorHubなどのOperatorカタログサイトに登録を行わないでOLMを使用してインストールする方法を紹介します。

OLMのインストール

 OpenShiftは、デフォルトでOLMが導入してあるため必要がありませんがKubernetesでOLMを導入する方法を説明します。

 Operator-sdkを使用すれば、以下のコマンドでKubernetesにインストールをすることができます。

operator-sdk olm install

カスタムカタログによるインストール

 Operatorカタログサイトに登録を行わないでOperatorをインストールする方法として独自のカタログ、つまりカスタムカタログを用意します。

 実際に作成する場合は、以下2つのツールが必要になります。

  • opm 
  • podman

  opmをインストールする際には、OpenShiftのミラーサイトからダウンロードし、解凍することでできた実行プログラムopmを/usr/local/binなどのファイルパスが通ったフォルダに保存するか、opmがあるフォルダに対してファイルパスを通す必要があります。一応方法として以下に示します。

wget https://mirror.openshift.com/pub/openshift-v4/x86_64/clients/ocp/latest-4.7/opm-linux-4.7.32.tar.gz
tar xzf opm-linux-4.7.32.tar.gz
chmod +x opm
sudo mv opm /usr/local/bin
rm -rf opm-linux-4.7.32.tar.gz

 opmのインストール後以下のコマンドを実行することで、カスタムカタログコンテナを作成することができます。

opm index add --bundles quay.io/k_nakajima/operator-nginx-olm:0.0.1 --tag quay.io/k_nakajima/operator-nginx-catalog:0.0.1
podman push quay.io/k_nakajima/operator-nginx-catalog:0.0.1

表5 カスタムカタログコンテナについて

名称コンテナレジストリサイトコンテナ名
カスタムカタログquay.ioquay.io/k_nakajima/operator-nginx-catalog:0.0.1

 作成したカスタムカタログコンテナをコンテナレジストリサーバに登録することで使用できるようになります。また、登録したカスタムカタログコンテナを導入する場合は以下のYAMLファイルを作成してデプロイします。

apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
  name: my-operator-catalog-nginx
  namespace: openshift-marketplace
spec:
  sourceType: grpc
  image: quay.io/k_nakajima/operator-nginx-catalog:0.0.1
  displayName: My Operator Catalog Nginx
  publisher: nginx-operator
  updateStrategy:
    registryPoll: 
      interval: 30m

以下のコマンドで、導入可能なOperatorのパッケージを確認することができます。

$ oc get packagemanifests -n openshift-marketplace|grep nginx
nginx-ingress-operator                               Certified Operators         27d
nginx-operator                                       My Operator Catalog Nginx   40s

上記の結果で、今回導入したカスタムカタログ内のOperatorのパッケージ「」がありますので、以下のコマンドで詳細を確認します。

$ oc describe packagemanifests nginx-operator -n openshift-marketplace
Name:         nginx-operator
Namespace:    openshift-marketplace
Labels:       catalog=my-operator-catalog-nginx
              catalog-namespace=openshift-marketplace
              operatorframework.io/arch.amd64=supported
              operatorframework.io/os.linux=supported
              provider=siosdx
              provider-url=sios.jp
Annotations:  <none>
API Version:  packages.operators.coreos.com/v1
Kind:         PackageManifest
Metadata:
  Creation Timestamp:  2021-09-30T08:51:11Z
Spec:
Status:
  Catalog Source:               my-operator-catalog-nginx
  Catalog Source Display Name:  My Operator Catalog Nginx
  Catalog Source Namespace:     openshift-marketplace
  Catalog Source Publisher:     nginx-operator
  Channels:
    Current CSV:  nginx-operator.v0.0.1
    Current CSV Desc:
      Annotations:
        Alm - Examples:  [
  {
    "apiVersion": "install.sios.nginx.testing/v1",
    "kind": "Start",
    "metadata": {
      "name": "start-sample"
    },
    "spec": {
      "foo": "bar"
    }
  }
]
        Capabilities:                                   Basic Install
        operators.operatorframework.io/builder:         operator-sdk-v1.3.0-ocp
        operators.operatorframework.io/project_layout:  ansible.sdk.operatorframework.io/v1
      Apiservicedefinitions:
      Customresourcedefinitions:
        Owned:
          Kind:      Start
          Name:      starts.install.sios.nginx.testing
          Version:   v1
      Description:   NginxをインストールするOperator
      Display Name:  operator-nginx
      Install Modes:
        Supported:  false
        Type:       OwnNamespace
        Supported:  false
        Type:       SingleNamespace
        Supported:  false
        Type:       MultiNamespace
        Supported:  true
        Type:       AllNamespaces
      Keywords:
        nginx
        sios
      Links:
        Name:    Nginx Operator
        URL:     https://nginx-operator.domain
      Maturity:  alpha
      Provider:
        Name:  siosdx
        URL:   sios.jp
      Related Images:
        gcr.io/kubebuilder/kube-rbac-proxy:v0.5.0
        quay.io/k_nakajima/operator-nginx:0.0.1
      Version:      0.0.1
    Name:           alpha
  Default Channel:  alpha
  Package Name:     nginx-operator
  Provider:
    Name:  siosdx
    URL:   sios.jp
Events:    <none>

上記の情報よりインストールするために以下のパラメータがわかります。

表6 Nginx Operatorインストールパラメータ

名称
Default Channelalpha
Catalog Source Publishernginx-operator
Catalog Sourcemy-operator-catalog-nginx
Catalog Source Namespaceopenshift-marketplace

よってインストール用のYAMLファイルを作成すると以下の通りになります。

apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: nginx-operator
  namespace: openshift-operators
spec:
  channel: alpha
  name: nginx-operator
  source: my-operator-catalog-nginx
  sourceNamespace: openshift-marketplace

 openshift-operatorsスペースにコントローラのpodが立ち上がることを確認することができましたら、後はインデックスコンテナを使用した時のテストと同じ方法でOperatorの動作確認ができます。

まとめ

 以上で、OpenShift上で、作成したOperatorの導入方法について説明しました。OpenShift上で開発しましたが、この方法はKubernetesでも同様に行うことができますが、OpenShiftのようにWeb画面からの操作ができないため、確認したりすることが複雑になります。