LoginSignup
1
0

More than 1 year has passed since last update.

Operatorを作って、OpenShiftで動作させてみた

Posted at

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が表示されます。

image.png

CRDのインスタンス作成

Openshiftのメニューから、Operatorに追加したAPI用のCRDのインスタンスを作成します。(例として、Myapiname)

image.png

image.png

CRDのインスタンスが作成されると、記述された処理が実行され、Pod作成および、チェックツールの実行が行われます。

image.png

image.png

Operatorのアンデプロイ

以下のコマンドで、OperatorをOpenShiftからアンデプロイ/アンインストールできます。

operator-sdk cleanup sample-operator

まとめ

Operatorのサンプルの作成について、記述しました。自分の備忘録およびメモのために作成しましたが、誰かに役に立てば幸いです。

参照

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0