Motivation
コンテナ管理基盤であるKubernetesには、Kubernetes Operatorという概念があり
任意のオブジェクトをKubernetes上で管理することができる。
このKubernetes Operatorを用いると和牛も管理することができるので給付してみる。
ここで、Kubernetes Operatorを開発するツールは、下記の通りいくつか存在しているが
エコシステムが充実しているOperator SDKを採用した。
Operator SDK
Kubebuilder
Metacontroller
QuickStart
環境
- kind
- Docker
- Mac
和牛の配り方
Quay.ioのアカウント登録
operator-sdkを用いて和牛Operatorの雛形を作成
TMPDIR=`mktemp -d` && cd $TMPDIR
mkdir $TMPDIR && cd $TMPDIR
operator-sdk new wagyu-operator --repo github.com/delicious/wagyu
cd wagyu-operator
operator-sdk add api --api-version=app.example.com/v1alpha1 --kind=Wagyu
operator-sdk add controller --api-version=app.example.com/v1alpha1 --kind=Wagyu
和牛コントローラの処理を一部書き換え
実際にはデプロイされるPodのImageを差し替えている
sed 's|Image: "busybox"|Image: "quay.io/iaoiui727/wagyu:latest"|g' -i pkg/controller/wagyu/wagyu_controller.go
和牛OperatorのDockerイメージ作成
export USER=<quay.ioで作成したユーザ名>
operator-sdk build quay.io/$USER/wagyu-operator
docker login quay.io
DockerイメージのPush
docker push quay.io/$USER/wagyu-operator
Quay.ioでリポジトリをpublicにする
Kubernetesクラスタの構築
kind create cluster
和牛Operatorのマニフェスト内で、先ほどquayにアップロードしたDockerイメージを使うよう変更
sed -i "/Command/d" pkg/controller/wagyu/wagyu_controller.go
sed -i "s|REPLACE_IMAGE|quay.io/$USER/wagyu-operator|g" deploy/operator.yaml
Operator用のサービスアカウント、ロールを用意
kubectl create -f deploy/service_account.yaml
kubectl create -f deploy/role.yaml
kubectl create -f deploy/role_binding.yaml
和牛のCRD(Custom Resource Definition)を生成
和牛というCRDリソースがKubernetesに登録される
kubectl create -f deploy/crds/app.example.com_wagyus_crd.yaml
和牛というCRDリソースの定義を確認できるようになる
k get wagyu
NAME AGE
example-wagyu 1m
和牛Operatorを起動
kubectl create -f deploy/operator.yaml
和牛Operatorの起動を確認
kubectl get po
NAME READY STATUS RESTARTS AGE
wagyu-operator-7d87f94966-c7rbt 1/1 Running 0 18s
和牛インスタンスを起動
kubectl create -f deploy/crds/app.example.com_v1alpha1_wagyu_cr.yaml
正常に起動していることを確認
kubectl get pod -l app=example-wagyu
kubectl describe appservice example-appservice
給付された和牛を確認
kubectl logs example-wagyu-pod
🐄
Clean up
kind delete cluster
まとめ
Operator SDKを用いてKubernetes上で和牛を給付できた
今回はGo言語で検証したが、Operator SDKではAnsible, Helmも対応しているので利用してみたい。