2020年11月28日(土) に Open Source Conference 2020 Online/Fukuoka でKubernetes 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 の学習をすることを強く勧めます