Operator作成について 連載第3回目 Operatorの開発環境について

はじめに

 本記事は、Ansibleでコントローラを作成して、Kuberntes Operatorとするまでの、開発環境構築方法について説明します。

Operatorについて

 前回でも記載しましたが、Kubernetes Operatorは運用を自動化するという概念です。それを実現するために、Kubernetesでは、制御部分をつかさどるカスタムコントローラと記録部分をつかさどるカスタムリソースという機能が存在します。

 カスタムコントローラというプログラムを作成するには、Go言語で作成する方法やAnsible PlayBookを作成して、Ansibleでコントローラを再現する方法があります。本記事は、AnsibleでOperatorを作成するための環境をつくる方法について説明します。

環境構築について

 Operatorの開発を行う場合は、以下図1の環境で作成します。

図1 Operatorの開発環境

 開発に使用したPCの性能や開発環境にインストールしたソフトのインストール方法について次に示します。

作業環境

 実際に開発で使用した環境は以下表1、表2の通りになります。

表1 開発環境使用PC

環境名使用環境備考
KuberentesクラスタOpenShift4.7CodeReady Containers(CRC)で開発PCとは別に構築詳細は表2を参照
開発PCCentOS8.3詳細は表2を参照
コンテナレジストリサーバquay.io

表2 開発環境PC

名称CPU数memoryHDDOS
OCP4.7環境824GB120GBCentOS 7.9
Operator開発環境28GB120GBCentOS 8.3

Operator環境構築

 OperatorでAnsibleを使用したコントローラを作成する場合は、開発環境に以下表3のソフトをインストールしてください。

表3 開発環境にインストールするソフト一覧

名称バージョン備考
OpenShift CLI(oc)4.7.0
operatorSDK 1.3.0-ocp
python3.6.8
ansible2.10.7
Ansible Runner1.4.7
Ansible Runner HTTP Event Emitter プラグイン1.0.0
OpenShift Python クライアント1.0.13
make4.2.1
podman2.2.1コンテナ化の際に使用

 各ソフトのインストール方法についてついては以下に記載します。なお、Operaorの動作テストで使用したOCP4.7環境の構築方法の説明は省略します。

OpenShift CLIツールのインストール

 OpenSHift CLIツール、通称OCコマンドのインストール方法について説明します。

以下のコマンドを実行します。

curl -OL https://mirror.openshift.com/pub/openshift-v4/clients/ocp/4.7.0/openshift-client-linux-4.7.0.tar.gz
tar -xvf openshift-client-linux-4.7.0.tar.gz
mv oc /usr/localbin
mv kubectl /usr/localbin

上記コマンド実行後、以下のコマンドで、ocコマンドが実行できることを確認します。

$ oc version
Client Version: 4.7.0
Server Version: 4.7.5
Kubernetes Version: v1.20.0+bafe72f

以上で、OpenShiftのCLIツールのインストールは完了です。なお、OpenShiftの接続方法は環境によって異なるため、説明は省略します。

OperatorSDKのインストール

 OperatorSDKのインストールとAnsibleベースのOperatorを開発するために必要なライブラリやツールのインストール方法について以下に記載します。

  • operatorSDK 

以下のコマンドを実行して、インストールします。

curl -OL https://mirror.openshift.com/pub/openshift-v4/x86_64/clients/operator-sdk/latest/operator-sdk-v1.3.0-ocp-linux-x86_64.tar.gz
tar -xvf operator-sdk-v1.3.0-ocp-linux-x86_64.tar.gz
chmod +x operator-sdk
mv ./operator-sdk /usr/local/bin/operator-sdk

インストール後、以下のコマンドでコマンドが実行できることを確認します。

$ operator-sdk version
operator-sdk version: "v1.3.0-ocp", commit: "4fd46d339305dfee2d67133fd43e055f89bde624", kubernetes version: "v1.19.4", go version: "go1.15.7", GOOS: "linux", GOARCH: "amd64"
  • python

以下のコマンドを実行して、インストールを行います。

yum install python3

インストール後、以下のコマンドでコマンドが実行できることを確認します。

$ python3 --version
Python 3.6.8
  • ansible

以下のコマンドを実行して、インストールを行います。

pip3 install --upgrade pip
pip3 install ansible

インストール後、以下のコマンドでコマンドが実行できることを確認します。

$ ansible --version
ansible 2.10.7
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python3.6/site-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 3.6.8 (default, Aug 24 2020, 17:57:11) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]
  • Ansible Runner

以下のコマンドを実行して、インストールを行います。

pip install ansible-runner

インストール後、以下のコマンドでコマンドが実行できることを確認します。

$ ansible-runner --version
1.4.7
  • Ansible Runner HTTP Event Emitter プラグイン

以下のコマンドを実行して、インストールを行います。

pip install ansible-runner-http

インストール後、以下のコマンドでインストールの状態を確認します。

$ pip freeze | grep http
ansible-runner-http==1.0.0
  • OpenShift Python クライアント

以下のコマンドを実行して、インストールを行います。

pip install openshift-client
pip install openshift

インストール後、以下のコマンドでインストールの状態を確認します。

$ pip freeze | grep openshift-client
openshift==0.12.1
openshift-client==1.0.13
  • make

以下のコマンドを実行して、インストールを行います。

yum install make

インストール後、以下のコマンドでコマンドが実行できることを確認します。

$ make --version
GNU Make 4.2.1
Built for x86_64-redhat-linux-gnu
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
  • podman

以下のコマンドを実行して、インストールを行います。

dnf -y install podman

インストール後、以下のコマンドでコマンドが実行できることを確認します。

$ podman version
Version:      2.2.1
API Version:  2
Go Version:   go1.14.12
Built:        Sun Feb 21 23:51:35 2021
OS/Arch:      linux/amd64

OperatorSDKの使い方

 OperatorSDKを使用して、Ansibleベースのプロジェクトの作成やAPIテンプレート作成方法について説明します。

プロジェクト作成

 OperatorSDKを使用してプロジェクトを作成する場合は、適当なフォルダを作成しその配下で、以下のコマンドを実行します。

operator-sdk init  --plugins=ansible --domain=ドメイン名

 上記のドメイン名は、作成ユーザが自由に決めても問題ありませんので、「example.com」なでも、問題ありません。

一度、プロジェクトを作成しますと以下のフォルダ構成が自動的に作成されます。

./
├── config
│     ├── default
│     │     ├── kustomization.yaml
│     │     └── manager_auth_proxy_patch.yaml
│     ├── manager
│     │     ├── kustomization.yaml
│     │     └── manager.yaml
│     ├── prometheus
│     │     ├── kustomization.yaml
│     │     └── monitor.yaml
│     ├── rbac
│     │     ├── auth_proxy_client_clusterrole.yaml
│     │     ├── auth_proxy_role_binding.yaml
│     │     ├── auth_proxy_role.yaml
│     │     ├── auth_proxy_service.yaml
│     │     ├── kustomization.yaml
│     │     ├── leader_election_role_binding.yaml
│     │     ├── leader_election_role.yaml
│     │     ├── role_binding.yaml
│     │     └── role.yaml
│     ├── scorecard
│     │     ├── bases
│     │     │     └── config.yaml
│     │     ├── kustomization.yaml
│     │     └── patches
│     │            ├── basic.config.yaml
│     │            └── olm.config.yaml
│     └── testing
│           ├── debug_logs_patch.yaml
│           ├── kustomization.yaml
│           ├── manager_image.yaml
│           └── pull_policy
│                   ├── Always.yaml
│                   ├── IfNotPresent.yaml
│                   └── Never.yaml
├── Dockerfile
├── Makefile
├── molecule
│     ├── default
│     │     ├── converge.yml
│     │     ├── create.yml
│     │     ├── destroy.yml
│     │     ├── kustomize.yml
│     │     ├── molecule.yml
│     │     ├── prepare.yml
│     │     └── verify.yml
│     └── kind
│             ├── converge.yml
│             ├── create.yml
│             ├── destroy.yml
│             └── molecule.yml
├── playbooks
├── PROJECT
├── requirements.yml
├── roles
└── watches.yaml

なお、Podmanをコンテナビルドや制御ツールとして使用する場合は、Makefile内で記載されている「docker」コマンドをすべて「podman」と置き換えます。

APIテンプレート作成

 以下のコマンドを実行することで、APIのテンプレートを作成することができます。

operator-sdk create api --group グループ名 --version v1 --kind カスタムリソース名 --generate-role

実行するとプロジェクト内に以下のファイルが作成されます。

./
├── config
│     ├── crd
│     │     ├── bases
│     │     │     └── グループ名.ドメイン名_カスタムリソース名s.yaml
│     │     └── kustomization.yaml
│     ├── default
│     │     ├── kustomization.yaml
│     │     └── manager_auth_proxy_patch.yaml
│     ├── rbac
│     │     ├── カスタムリソース名_editor_role.yaml
│     │     └── カスタムリソース名_viewer_role.yaml
│     └── samples
│            ├── kustomization.yaml
│            └── グループ名_v1_カスタムリソース名.yaml
├── molecule
│     └── default
│            └── tasks
│                   └── カスタムリソース名_test.yml
└── roles
       └── カスタムリソース名
             ├── defaults
             │     └── main.yml
             ├── files
             ├── handlers
             │     └── main.yml
             ├── meta
             │     └── main.yml
             ├── README.md
             ├── tasks
             │     └── main.yml
             ├── templates
             └── vars
                   └── main.yml

動作テスト

以下のコマンドでコントローラのコンテナビルドとレジストリサーバにコントローラのコンテナのプッシュを行います。

make docker-build docker-push IMG=<registry>/<user>/<image_name>:<tag>

実際にコントローラコンテナをKubernetes環境でテストする場合は以下のコマンドで、カスタムリソース定義をKubernetes環境に適用します。

make install

カスタムリソース定義適用後、以下のコマンドで、Kubernetes環境上で、レジストリサーバからイメージをPullして実行します。

make deploy IMG=<registry>/<user>/<image_name>:<tag>

実行後は、カスタムリソースによる動作がカスタムコントローラのPodのlogとして出力されます。なお、動作テストで実行した、コントローラコンテナやカスタムリソース定義を削除する場合は、以下のコマンドを実行します。

make undeploy

まとめ

 以上で、Operatorの開発環境の構築が可能になったはずです。本記事は、OperatorSDKを使用した開発については、軽くでしか触れていません。実際に開発する方法については、nginxをKubernetes上に適用する方法をOperator化することの説明を次回以降で解説使用と思います。