CRD(Custom Resource Definition)。
「時々見かけるワードだけど、何となく使っていてよくわからない」「そもそもCRDって何?」という方もいらっしゃると思います。
これを紐解くキーワードは「拡張性」です。Kubernetesのメリットの一つである優れた拡張性を実現するのが、CRDによるリソースの拡張なのです。
もちろんリソースの拡張をせずとも、Kubernetesの標準リソースだけでもさまざまなことが実現できますし、それで十分というケースもあるでしょう。ですが、世の中にある膨大なITシステムで実現するアーキテクチャにはさまざまなものがあります。Observability(可観測性)やCI/CD(継続的インテグレーション/継続的デリバリー)など含めた運用性を考慮すると、標準リソースだけで実現できるとは限りません。
そのため、求められるアーキテクチャを実現するにあたっては、CRDが重要な役割を担います。CRDを理解し、より深く/新しい視点でKubernetesの世界を堪能していきましょう。
今回の説明は、次の3ステップで構成しています。もう知っているよ、という部分は読み飛ばしてください。
- そもそも、Kubernetesの標準リソースはどうやって動いているのか
- 実はCRDは知らぬ間に使っていた?! CRDの具体的な使い方
- 世の中のCRDにはどんなものがあるか
Kubernetesの標準リソースはどうやって動いているのか
Kuberenetesの標準リソースは、Controllerとの協調動作により成り立っています。以降では、標準リソースの一つである「ReplicaSet」を例にとって説明していきましょう。
ReplicaSet Controllerの動作
ReplicaSet Controllerは、以下の3ステップにより動作します。
①ReplicaSet ControllerがReplicaSetが作成されたことを検知、Podを作成(ノード未割り当て)
②SchedulerがPodをノードに割り当て
③自ノードに割り当てられたkubeletがコンテナを起動し、ステータスを更新
Podが停止したら同様に、同じステップを踏んで再生成されます。
なお、本連載の第4回~第9回で各標準リソースについて説明しています。標準リソースの理解に不安がある方は、この機会にぜひ、復習してみてください。
実はCRDは知らぬ間に使っていた?! CRDの具体的な使い方
普段Kubernetesのマニフェストを書いていて見慣れないkindのリソースを見かけたことはないでしょうか。実は、「Argo CD」などさまざまなKubernetesのツールはCRD(+Controller)を使って動作しているのです。
以下の2ステップを具体的なYAMLを活用して理解していきましょう。題材として、Argo CDを例にとって説明します。
- CRDを定義する
- CR(カスタムリソース)を定義する
まず、CRDを定義します。Argo CDの場合は、Argo CDのインストールスクリプトのなかで実行されるので、意識せずに実行していた方もいるかもしれません。
$kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
CRDを定義するYAML(install.yaml)のなかで、押さえておくべき点を説明します。次に示すコードでは、以下の2点を記述しています。
①CustomResourceDefinitionをkindに指定
②Application」というCR名を定義
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition # ① kindがCustomResourceDefinition
metadata:
labels:
app.kubernetes.io/name: applications.argoproj.io
app.kubernetes.io/part-of: argocd
name: applications.argoproj.io
spec:
group: argoproj.io
names:
kind: Application # ② CR名がApplication
~後略~
次に、CRを定義します。
Argo CDでは、GUIから定義することも可能です。そのため、こちらも普段意識せずに実施していた方もいると思います。
次のコードでは、kind名を「Applilcation」として、各specを定義しています。DevOps系のCRということで、以下の事項が記載されています。
①アプリケーションを管理しているリポジトリを指定する
②アプリケーションをデプロイするクラスタを指定する
$kubectl apply -n argocd -f https://argoproj.github.io/argo-cd/operator-manual/application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: guestbook
namespace: argocd
spec:
project: default
source: # ① アプリケーションを管理しているリポジトリ
repoURL: https://github.com/argoproj/argocd-example-apps.git
targetRevision: HEAD
path: guestbook
destination: # ② アプリケーションをデプロイするクラスタ
server: https://kubernetes.default.svc
namespace: guestbook
いかがでしたでしょうか? 「インストールスクリプトやGUIの裏側でこういったリソースが作成されているのだな」と理解しておくことで、Kubernetesのより深い理解につながります。
世の中のCRDにはどんなものがあるか
さて、世の中のCRDにはどんなものがあるのでしょうか。
以降では、Kubernetesの各ツールがどんなCRD(+Controller)を作っているのか紹介します。実は知らぬ間に使っていた、というものもあるかもしれません。
それぞれのツールがおおよそどういったCRD/CRで構成されているかについて、ざっくり押さえておくと良いでしょう。なお、どのCRDとControllerが協調動作してツールの機能を実装しているのかは、公式ドキュメントやソースをご確認ください。
ツール | CRD | Controller |
---|---|---|
Argo CD(DevOps) | - Application - ApplicationSet |
- Application Controller - ApplicationSet Controller |
Tekton(DevOps) | - ClusterTask - Condition - Pipeline - PipelineRun - PipelineResource - Run - Task - TaskRun |
- Pipeline Controller |
Flux2(DevOps) | - GitRepository - HelmRepository - HelmChart - Bucketv- Kustomization - HelmRelease - Provider - Alert - Receiver - ImageRepository - ImagePolicy - ImageUpdateAutomation |
- Source Controller - Kustomize Controller - Helm Controller - Notification Controller - Image Automation Controllers |
GateKeeper(Security) | - ConstraintTemplate - Constraint |
-(Admission Controller) |
Calico(Network) | - NetworkPolicy - TigeraStatus |
- Policy Controller - Namespace Controller - Serviceaccount Controller- Workloadendpoint Controller - Node Controller |
Kubeflow(機械学習) | - Notebook - PyTorchJob - TFJob |
- Notebook Controller - PyTorch Controller - Tensorflow Controller |
また、Kubernetesアプリケーションの運用ツールポータルである「OperatorHub.io」にも多くのCRDが登録されています。以下の多くは「Operator」と表記していますが、ここではざっくり「Operator = CRD+Controller」だと理解しておいてください。
分類 | 登録数 | 代表的なツール |
---|---|---|
AI/ML | 6 | - Kubeflow - Splunk Operator for Kubernetes |
Application Runtime | 15 | - Akka Cluster Operator |
BigData | 11 | - Spark Operator |
Cloud Provider | 14 | - Azure Service Operator - IBM Cloud Operator |
Database | 35 | - Cassandra - Elasticsearch Operator - TiDB Operator |
Developler Tools | 25 | - Nexus Operator - Knative Operator |
Integration & Delivery | 32 | - Argo CD - FluxJenkins Operator - Spinnaker Operator - Tektoncd Operator |
Logging & Tracing | 11 | - Istio - Kiali Operator - Splunk Operator - Datadog Operator |
Modernization & Migration | 1 | - Tackle Operator |
Monitoring | 24 | - Grafana Operator - Prometheus Operator |
Networking | 12 | - Kong Operator |
OpenShift Optional | 17 | - KubeVirt HyperConverged Cluster Operator - Metering |
Security | 23 | - Sealed Secrets Operator - cert-manager |
Storage | 24 | - AWS S3 Operator - Rook-Ceph |
Streaming & Messaging | 11 | - Kubemq Enterprise Operator |
※ 上表は2021年9月1日時点の情報に基づいて作成。
* * *
今回は、まず標準リソースとKubernetesのアーキテクチャを説明し、Operatorがどのように動作するのかを紹介しました。また、CRD/CRの具体的な利用方法や、世の中にどんなCRDがあるかを紹介しました。 Kubernetesの特徴の一つは拡張性の高さです。CRDはその中核に位置付けられます。CRDを理解し、その裏にあるアーキテクチャを理解することで、Kubernetesの理解を深めてみてください。著者紹介
正野 勇嗣 (SHONO Yuji ) -
NTTデータ
部長
2011年まで開発自動化技術のR&Dに従事。その後、開発プロジェクト支援やトラブルシューティング等に主戦場を移す。「ソースコード自動生成」に加えて、JenkinsやMaven等の「ビルド自動化」、JsTestDriverやSelenium等の「テスト自動化」を扱うようになり、多様化する開発自動化技術動向に興味。
最近は第四の自動化であるInfrastructure as Code等の「基盤自動化」の魅力に惹かれている。開発自動化技術に関する雑誌・記事執筆も行う。3児のパパ。