はじめに
前々回作成したコントローラをコンテナ化して、Operator Lifecycle Managerで管理できるパッケージを作るまでのことを説明いたします。なお、動作確認には、OpenShiftを使用しましたので、OCコマンドによる独自コマンドがあります。
テスト手順について
作ったOperatorをOperator Lifecycle Manager(OLM)を使用して管理できるようにするまでに、いくつか段階を踏む必要があります。具体的には以下の手順があります。
- コントローラのコンテナ化とデプロイ方法の確立
- Operatorのインデックスコンテナ化
- カタログに登録
上記手順についての具体方法については以下に示します。
コントローラのコンテナ化
前々回はコントローラを開発環境で動かして、Kubernetesの制御を行っていました。しかし、本記事はそのコントローラをコンテナ化してRBAC設定を行うことで、Kubernetes環境で動作するようにします。
コンテナ化
まず、コンテナ化したコントローラをKubernetesで動かすためには、コンテナレジストリにコンテナをアップロードする必要があるため、以下の表1のようにコンテナ名に変更します。
表1 コントローラコンテナについて
| 名称 | コンテナレジストリサイト | コンテナ名 |
| コントローラコンテナ | quay.io | quay.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バージョン | 権限 |
| Deployment | apps/v1 | createdeletegetlistpatchupdatewatch |
| Service | v1 | createdeletegetlistpatchupdatewatch |
| Start | install.sios.nginx.testing/v1 | createdeletegetlistpatchupdatewatch |
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.io | quay.io/k_nakajima/operator-nginx-olm:0.0.1 |
以下のコマンドを実行して、インデックス化するためのバンドルファイルを作成します。
なお、初回設定時に表に示す入力パラメータの入力する必要がありますので、入力例を示します。
make bundle IMG_NAME=quay.io/k_nakajima/operator-nginx
表4 バンドルイメージ作成入力パラメータ
| 入力パラメータ | 意味 | 値 | 備考 |
| Display name for the operator | Operatorの表示名称 | operator-nginx | |
| Description for the operator | Operatorの説明文 | NginxをインストールするOperator | |
| Provider’s name for the operator | Operatorの提供者名 | siosdx | |
| Any relevant URL for the provider name | Operator提供者の関連するURL | sios.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.io | quay.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 Channel | alpha |
| Catalog Source Publisher | nginx-operator |
| Catalog Source | my-operator-catalog-nginx |
| Catalog Source Namespace | openshift-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画面からの操作ができないため、確認したりすることが複雑になります。
