はじめに
本記事は、Ansibleでコントローラを作成して、Kuberntes Operatorとするまでの、開発環境構築方法について説明します。
Operatorについて
前回でも記載しましたが、Kubernetes Operatorは運用を自動化するという概念です。それを実現するために、Kubernetesでは、制御部分をつかさどるカスタムコントローラと記録部分をつかさどるカスタムリソースという機能が存在します。
カスタムコントローラというプログラムを作成するには、Go言語で作成する方法やAnsible PlayBookを作成して、Ansibleでコントローラを再現する方法があります。本記事は、AnsibleでOperatorを作成するための環境をつくる方法について説明します。
環境構築について
Operatorの開発を行う場合は、以下図1の環境で作成します。
図1 Operatorの開発環境
開発に使用したPCの性能や開発環境にインストールしたソフトのインストール方法について次に示します。
作業環境
実際に開発で使用した環境は以下表1、表2の通りになります。
表1 開発環境使用PC
環境名 | 使用環境 | 備考 |
Kuberentesクラスタ | OpenShift4.7 | CodeReady Containers(CRC)で開発PCとは別に構築詳細は表2を参照 |
開発PC | CentOS8.3 | 詳細は表2を参照 |
コンテナレジストリサーバ | quay.io |
表2 開発環境PC
名称 | CPU数 | memory | HDD | OS |
OCP4.7環境 | 8 | 24GB | 120GB | CentOS 7.9 |
Operator開発環境 | 2 | 8GB | 120GB | CentOS 8.3 |
Operator環境構築
OperatorでAnsibleを使用したコントローラを作成する場合は、開発環境に以下表3のソフトをインストールしてください。
表3 開発環境にインストールするソフト一覧
名称 | バージョン | 備考 |
OpenShift CLI(oc) | 4.7.0 | |
operatorSDK | 1.3.0-ocp | |
python | 3.6.8 | |
ansible | 2.10.7 | |
Ansible Runner | 1.4.7 | |
Ansible Runner HTTP Event Emitter プラグイン | 1.0.0 | |
OpenShift Python クライアント | 1.0.13 | |
make | 4.2.1 | |
podman | 2.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化することの説明を次回以降で解説使用と思います。