じゃあ、おうちで学べる

思考を呼び覚ます このコードに、君は抗えるか。

Kubebuilder の前にCRDへ入門する #osc20fk Kubernetes Operator の直観 予稿 (2)

2020年11月28日(土) に Open Source Conference 2020 Online/FukuokaKubernetes Operator の直観 というタイトルでセッションを行うための予稿である。前回、大切な考え方や説明や概念をすっ飛ばしていろいろ進めてきました。今回も特段説明する予定がないのでこの辺の知識が必要な場合には 実践入門 Kubernetesカスタムコントローラーへの道Programming Kubernetes: Developing Cloud-Native Applications などを読むとよいです。

はじめに

リソースとは何らかのオブジェクトを概念です。皆さんがよく知る概念としてDeploymentやPodsがリソースです。リソースはKubernetes APIを持ち、実際に配備されているオブジェクトとしてのPodsがリソースとしてのPodsに格納されます。もう一つの大切な概念としてオブジェクトというものがあります。オブジェクトとは持続的なエンティティのことで、Kubernetesクラスターの状態を定義します。オブジェクトとはデプロイされた実際のPodsやServiceのことです。

Custom Resources は、Kubernetesの特別なリソースです。Kubernetesを通常の方法で使用する場合、そのようなリソースを作成する必要はありません。したがって、これは多くのユーザーにとってそれほど重要ではありませんがKubebuilder への入門に関しては重要です。Custom Resources は、特別なリソースではありますが特殊なことはできません。CRD (CustomResourceDefinitions) はテーブル CR (CustomResource) はオブジェクトで「リンゴ」のような各レコードのような関係になっていきます。ちなみにKubebuilderではcontroller-genというツールを利用して、Goで記述したstructからCRDを生成する方式を採用しています。controller-toolsはコントローラーを構築するためのgoライブラリのセットで controller-runtime は、コントローラーをビルドするためのgoライブラリのセットです。

やっていく

Kind でcluster を作成する

Cluster を作成するために

$ kind create cluster --name crd
Creating cluster "crd" ...
 ✓ Ensuring node image (kindest/node:v1.18.2) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-crd"
You can now use your cluster with:

kubectl cluster-info --context kind-crd

Thanks for using kind! 😊
## clusters の確認
$ kind get clusters
crd
# コンフィグの生成
$ kind get kubeconfig --name crd  > kubeconfig.yaml

CRD をデプロイする

sample-controller/artifacts/examples at master · kubernetes/sample-controller · GitHub に出てきた最も単純なサンプルがこちらです。

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: foos.samplecontroller.k8s.io
spec:
  group: samplecontroller.k8s.io
  version: v1alpha1
  names:
    kind: Foo
    plural: foos
  scope: Namespaced

それに対応するリソースがこちらです。

apiVersion: samplecontroller.k8s.io/v1alpha1
kind: Foo
metadata:
  name: example-foo
spec:
  deploymentName: example-foo
  replicas: 1

実際にデプロイしてみましょう

kubectl apply -f foo_crd.yaml
customresourcedefinition.apiextensions.k8s.io/foos.samplecontroller.k8s.io created
kubectl apply -f foo_example.yaml 
foo.samplecontroller.k8s.io/example-foo created

確認してみる

$ kubectl get foo
NAME          AGE
example-foo   10s

最後に

最小でデプロイして確認できることが分かりましたがAPIもなければ特に設定も行っていないのでetcd に情報が保存されているだけの状態になります。その他にもさまざまな機能がある。Advanced topics で いくつか説明している。詳しいことは公式ドキュメントを読んで欲しいです。なぜなら、これはKubebuilder の為のCRD入門なので!!!!! Finalizer はカスタムオブジェクト削除前の処理を定義します。Finalizerを定義することで、カスタムオブジェクトをkubectl deleteした時、実際に削除される前に実行すべき処理を定義できます。Validationはカスタムオブジェクトの設定値が要件を満たしているか、妥当性を確認することバリデーションをかけてチェックを行えます。Printerはkubectl get する際に表示するパラメータを定義することが可能です。SubresourceはCRDのAPIエンドポイントのサブリソースとして機能します。この辺は流石に知っておくと良いと思います。kubebuilder create apiコマンドで生成されたapi/v1/<**>_types.goを見てみると、XxSpec, XxStatus, Xx, XxListというような構造体が定義されており、// +kubebuilder:から始まるマーカーコメントが付与されています。 make manifestsを実行するとcontroller-genなどのツールによりこれらの構造体とマーカーを頼りにCRDの生成をおこないます。make manifests で生成されたcontroller-genなどから生成された CRD を読んでもマジでなんのことか意味分からないので先にCRD の学習をすることを強く勧めます