Operatorについて
Operatorは、Custom Resource Definitionsのインスタンスの生成に応じて、Podの作成など特定の動作を行うプログラムです。KubernetesおよびOpenShiftで動作します。
KubernetesやOpenShift上で動作するステートフル・アーキテクチャーの製品のインストーラや、その製品の稼働を支援するサポート・プログラム等を、Operatorを使って実装することができます。
今回は、Operaotrのサンプル作成時の忘備録/メモとして、下記に記します。
Operatorの詳細については、What is an Operator?を参照ください。
試した環境は、OpenShift 4.6です。
サンプルのOperatorについて
この記事では、サンプルとして、製品の機能をチェックするオペレータを作成します。このサンプルのOperatorは、OpenShiftで、CRDのインスタンスが作成されると、Podが作成され、製品機能をチェックするプログラムを起動する、という振る舞いをします。
Operatorによって作成されるポッド上で動作するプログラム(前提)
製品の機能をチェックするコンテナイメージを作成して、レジストリーに登録しておきます。(例として、onelineVerify.jar)
FROM docker.io/ibmjava
COPY onelineVerify.jar /onelineVerify.jar
RUN chmod +x /onelineVerify.jar
ENTRYPOINT ["java","-jar", "/onelineVerify.jar"]
CMD ["RepositoryURL","AdminID","Password"]
docker build -t quay.io/name/online-verify .
docker push quay.io/name/online-verify
Operator SDKのインストール
Operator SDKをインストールします。
# Operator SDKのダウンロード
export ARCH=$(case $(uname -m) in x86_64) echo -n amd64 ;; aarch64) echo -n arm64 ;; *) echo -n $(uname -m) ;; esac)
export OS=$(uname | awk '{print tolower($0)}')
export OPERATOR_SDK_DL_URL=https://github.com/operator-framework/operator-sdk/releases/download/v1.11.0
curl -LO ${OPERATOR_SDK_DL_URL}/operator-sdk_${OS}_${ARCH}
chmod +x operator-sdk_${OS}_${ARCH} && sudo mv operator-sdk_${OS}_${ARCH} /usr/local/bin/operator-sdk
Ansible ベースのオペレータ・テンプレートの作成
初期化コマンドを使用して、オペレータのテンプレートを作成します。Anbisleベースが一番お手軽です。Ansibleベース以外に、Go言語ベース、Helmベースが選べます。
mkdir -p ${HOME}/projects/sample-operator
cd ${HOME}/projects/sample-operator
# Ansibleベースのオペレータ・テンプレートの作成
operator-sdk init --plugins=ansible --domain=example.com
APIの追加と編集
APIを作成し、チェックプログラムを実行するPodを作成する処理を記述します。APIに必要なパラメータを、CRDとして設定します。
# APIの作成
operator-sdk create api --group sample --version v1 --kind Myapiname --generate-playbook
CRDのインスタンスが作成されたときの振る舞いを記述します。
$home/projects/sample-operator/playbooks/myapiname.yml
---
- hosts: localhost
gather_facts: no
collections:
- community.kubernetes
- operator_sdk.util
vars:
- elmns: '{{ ansible_operator_meta.namespace }}'
tasks:
- name: Create pod for ibm java
community.kubernetes.k8s:
state: present
definition:
apiVersion: v1
kind: Pod
metadata:
name: '{{ ansible_operator_meta.name }}-ibmjava'
namespace: '{{ ansible_operator_meta.namespace }}'
labels:
app: ibmjava
spec:
containers:
- name: ibmjava
args:
- "{{ repository_url }}"
- "{{ admin_user_id }}"
- "{{ password }}"
image: quay.io/name/online-verify
API実行に必要なCRDを定義します。
$home/projects/sample-operator/config/crd/bases/sample.example.com_myapinames.yaml
metadata:
name: myapinames.sample.example.com
spec:
group: sample.example.com
names:
kind: Myapiname
listKind: MyapinameList
plural: myapinames
singular: myapiname
scope: Namespaced
versions:
- name: v1
schema:
openAPIV3Schema:
description: Myapiname is the Schema for the myapinames API
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: Spec defines the desired state of Myapiname
type: object
properties:
repository_url:
type: string
admin_user_id:
type: string
password:
type: string
x-kubernetes-preserve-unknown-fields: true
status:
description: Status defines the observed state of Myapiname
type: object
x-kubernetes-preserve-unknown-fields: true
type: object
served: true
storage: true
subresources:
status: {}
画面表示時のサンプル文字列を設定します。
$home/projects/sample-operator/config/samples/aiasupport_v1_myapiname.yaml
apiVersion: sample.example.com/v1
kind: Myapiname
metadata:
name: myapiname-sample
spec:
repository_url: https://elm.example.com/ccm
admin_user_id: elmadmin
password: password
ビルド・レポジトリーへのプッシュ
Operatorのコンテナ・イメージと、Operatorバンドルのイメージを作成し、レジストリーにプッシュします。
初回の make bundle
コマンド時は、バンドル情報の入力を求められます。
make docker-build IMG=quay.io/name/sample-operator:0.0.1
make docker-push IMG=quay.io/name/sample-operator:0.0.1
make bundle IMG=quay.io/name/sample-operator:0.0.1
make bundle-build BUNDLE_IMG=quay.io/name/sample-operator-bundle:0.0.1
make bundle-push BUNDLE_IMG=quay.io/name/sample-operator-bundle:0.0.1
OpenShiftへのOperatorのデプロイ(インストール)
以下のコマンドにより、レジストリーに登録されたOperatorバンドルイメージを、OpenShiftにデプロイします。
operator-sdk run bundle quay.io/name/sample-operatorbundle:0.0.1
デプロイが成功すると、OpenShiftのメニューのInstalled Operatorsに、作成したOperatorが表示されます。
CRDのインスタンス作成
Openshiftのメニューから、Operatorに追加したAPI用のCRDのインスタンスを作成します。(例として、Myapiname)
CRDのインスタンスが作成されると、記述された処理が実行され、Pod作成および、チェックツールの実行が行われます。
Operatorのアンデプロイ
以下のコマンドで、OperatorをOpenShiftからアンデプロイ/アンインストールできます。
operator-sdk cleanup sample-operator
まとめ
Operatorのサンプルの作成について、記述しました。自分の備忘録およびメモのために作成しましたが、誰かに役に立てば幸いです。