【クラウドネイティブ】Kubernetes CRD 詳細解説(カスタムリソース定義)

【クラウドネイティブ】Kubernetes CRD 詳細解説(カスタムリソース定義)

1. 概要

CRD (カスタム リソース定義) 自体は Kubernetes の組み込みリソース タイプ、つまりカスタム リソースの定義であり、ユーザー定義のリソースがどのようなものかを説明するために使用されます。 CRD 関連の概念:

  • CRD は、コードを変更せずに Kubernetes API を拡張し、カスタム オブジェクトを管理するために使用できる、v1.7 以降で追加されたメカニズムです。これは実際には、v1.8 で削除された ThirdPartyResources (TPR) のアップグレード バージョンです。
  • Kubernetes のユーザーの観点から見ると、Service、Deployment など、YAML の Kind フィールドの内容であるすべてがリソースと呼ばれます。
  • Kubernetes では、一般的な組み込みリソースに加えて、ユーザーがリソースをカスタマイズすることができ、CRD はカスタム リソースの定義を表します。
  • 新しい CustomResourceDefinition (CRD) を作成すると、Kubernetes API サーバーは指定したバージョンごとに新しい RESTful リソース パスを生成します。
  • CRD オブジェクトに基づいて作成されたカスタム リソースは、CRD オブジェクトの spec.scope フィールドの設定に応じて、名前空間スコープまたはクラスター スコープにすることができます。
  • CRD オブジェクトを定義すると、指定した名前とスキーマを持つ新しいカスタム リソースが作成されます。 Kubernetes API は、カスタム リソースのストレージおよびアクセス サービスを提供します。 CRD オブジェクトの名前は有効な DNS サブドメイン名である必要があります。

DNS サブドメイン

多くのリソース タイプでは、DNS サブドメインとして使用できる名前が必要です。名前は次の規則を満たす必要があります。

  • 253文字を超えることはできません
  • 小文字、数字、「-」、および「.」のみを含めることができます。
  • 英数字で始まる必要があります
  • 英数字で終わる必要があります

CRD 公式ドキュメント: https://kubernetes.io/zh-cn/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/

2. カスタマイズされたリソース

カスタム リソースは、Kubernetes API の拡張機能です。

1) カスタムリソースとカスタムコントローラ

  • リソースは、特定のカテゴリの API オブジェクトのコレクションを格納する Kubernetes API のエンドポイントです。たとえば、組み込みの Pod リソースには、一連の Pod オブジェクトが含まれています。
  • カスタム リソースは Kubernetes API の拡張です。カスタム リソースは、特定の Kubernetes インストールのカスタマイズを表します。ただし、Kubernetes のコア機能の多くはカスタム リソースを使用して実装されるようになり、Kubernetes はよりモジュール化されています。
  • カスタム リソースは、動的登録を通じて実行中のクラスターに表示および非表示になる可能性があり、クラスター管理者はクラスターとは独立してカスタム リソースを更新できます。
  • カスタム リソースがインストールされると、ユーザーは Pod などの組み込みリソースの場合と同様に、kubectl を使用してそのリソース内のオブジェクトを作成およびアクセスできるようになります。

2) カスタムコントローラ

  • カスタム リソース自体は、構造化データの保存とアクセスにのみ使用できます。カスタム リソースとカスタム コントローラーを組み合わせると、カスタム リソースは真に宣言的な API を提供できます。
  • Operator パターンは、カスタム リソースとカスタム コントローラーを組み合わせます。

3) オペレーター紹介

Kubernetes CRD オペレーター = kubernetes CRD + カスタム コントローラー

  • Operator は、データベース、キャッシュ、監視システムなどの複雑なステートフル アプリケーションの作成、構成、管理に使用される特定のアプリケーション コントローラーを使用して Kubernetes API を拡張するために CoreOS によって開発されました。
  • オペレーターは、Kubernetes のリソースとコントローラーの概念に基づいて構築されますが、アプリケーション固有のドメイン知識も組み込まれています。 Operator を作成するための鍵は、CRD (カスタム リソース) の設計です。
  • Operator は、カスタム リソースを使用してアプリケーションとそのコンポーネントを管理する Kubernetes 拡張ソフトウェアです。オペレーターは、特にコントローラーに関しては Kubernetes の哲学に従います。
  • Operator パターンは、(Kubernetes 自体が提供する機能を超えて)記述するタスク自動化コードをカプセル化します。
  • Kubernetes Operator パターンの概念により、Kubernetes コード自体を変更することなく、コントローラーを 1 つ以上のカスタム リソースに関連付けることで、クラスターの機能を拡張できます。
  • Operator は Kubernetes API のクライアントです。 Operator は、管理するリソースに対して強力な自動化機能を提供するように設計されているため、追加のサポート コードも必要です。

1. オペレータフレームワーク

Operator Framework は、CoreOS の Operator を迅速に開発するためのオープン ソース ツールキットでもあります。フレームワークは、次の 2 つの主要部分で構成されます。

  • Operator SDK - 複雑な Kubernetes API 機能を理解しなくても、独自の専門知識に基づいて Operator アプリケーションを構築できます。
  • Operator Lifecycle Manager OLM - クラスター全体で実行中のすべてのOperator(および関連するサービス)のインストール、更新、管理に役立ちます。

2. オペレータのインストール

Operator SDK は、新しい Operator を開発するための次のワークフローを提供します。

  • SDKを使用して新しいOperatorプロジェクトを作成する
  • カスタムリソース(CRD)を追加して新しいリソースAPIを定義する
  • SDK APIを使用して監視するリソースを指定します
  • オペレータの調整ロジックを定義する
  • Operator SDK を使用して Operator デプロイメント マニフェスト ファイルをビルドおよび生成します。

3. オペレーターSDKをインストールする

ダウンロードアドレス: https://github.com/operator-framework/operator-sdk/releasesoperator sdk 公式ドキュメント: https://sdk.operatorframework.io/docs/installation/

 https://github.com/operator-framework/operator-sdk/releases/download/v1.23.0/operator-sdk_linux_amd64を実行します。

# 実行権限を追加する

chmod + x 演算子- sdk_linux_amd64

# ソフトリンクを追加
ln -s / opt / k8s / crd /演算子/演算子- sdk_linux_amd64 / usr /ローカル/ bin /演算子- sdk

4. オペレーターは使いやすい

[例1] 素早く簡単に使える

オペレーター- sdk init --domain=example.com --repo=github.com/example-inc/memcached-operator
# ステップ 2 : API を作成する (演算子- sdk create api --group cache --version v1 --kind Memcached --resource=true --cnotallow=true)
演算子- SDK作成API --group キャッシュ --version v1 --kind Memcached --resource=true --cnotallow=true
# ステップ 3 :イメージをビルドします- docker 環境がローカルに存在する必要があります (make docker - build IMG = liumiaocn / memcache : v1)
docker -build img = liumiaocn / memcache : v1 を実行します。
# ステップ 4 : Operator を実行-環境には K8s / K3s が必要です (make install && make deploy IMG = liumiaocn / memcache : v1)
インストールしデプロイします IMG = liumiaocn / memcache : v1
# ステップ5: カスタムリソースを作成する
kubectl apply -f config /サンプル/ cache_v1_memcached .yaml
# ステップ 6: CR と関連リソースを削除する (kubectl delete - f config / samples / cache_v1_memcached .yaml )
kubectl delete -f config /サンプル/ cache_v1_memcached .yaml

これは単なる簡単なインストールと展開です。 Operator の詳細については後ほど別の記事で紹介したいと思います。

4) Kubernetes API集約レイヤー

  • 集約レイヤーを使用すると、ユーザーは Kubernetes コア API によって提供される機能に制限されることなく、追加の API を通じて Kubernetes を拡張できます。ここでの追加 API は、メトリック サーバーなどの既成のソリューション、または独自に開発した API にすることができます。
  • 集約レイヤーはカスタム リソースとは異なります。後者の目的は、kube-apiserver が新しいオブジェクト カテゴリ (Kind) を認識できるようにすることです。
  • 集約レイヤーは kube-apiserver プロセス内で実行されます。拡張リソースが登録されるまで、集約レイヤーは何も実行しません。
  • API を登録するには、Kubernetes API で URL パスを「要求」するために使用する APIService オブジェクトを追加します。今後、集約レイヤーは、その API パス (例: /apis/myextension.mycompany.io/v1/…) に送信されたすべてのものを登録された APIService に転送します。

5) 宣言型API

通常、宣言型 API では次のようになります。

  • API は、比較的少数の小さなサイズのオブジェクト (リソース) で構成されています。
  • オブジェクトは、アプリケーションまたはインフラストラクチャの構成情報を定義します。
  • オブジェクトの更新操作の頻度は低くなります。
  • 通常、オブジェクトを読み取ったり書き込んだりするには人間が必要です。
  • オブジェクトに対する主な操作は CRUD スタイル (作成、読み取り、更新、削除) です。
  • オブジェクト間のトランザクション サポートは必要ありません。API オブジェクトは、実際の状態ではなく、望ましい状態を表します。

命令型 API は宣言型 API とは異なります。以下は、API が宣言的ではない可能性があることを示す兆候です。

  • クライアントは「この操作を実行する」という命令を発行し、操作が完了すると同期応答を受け取ります。
  • クライアントは「この操作を実行する」という命令を発行し、操作 ID を取得します。その後、Operation オブジェクトをチェックして、要求が正常に完了したかどうかを判断する必要があります。
  • API はリモート プロシージャ コール (RPC) に似ています。
  • 大量のデータを直接保存します。たとえば、オブジェクトごとに数キロバイト、または数千のオブジェクトを格納します。
  • 高いアクセス帯域幅が必要です (長時間にわたって 1 秒あたり数十件のリクエスト)。
  • エンドユーザー データ (画像、個人識別情報 (PII) など) や、アプリケーションによって処理されるその他の大規模データを保存します。
  • オブジェクトに対して実行される通常の操作は CRUD スタイルではありません。

6) カスタムリソースを追加する

Kubernetes では、クラスターにカスタム リソースを追加する方法が 2 つ用意されています。

  • CRD は比較的シンプルで、CRD を作成するためにプログラミングは必要ありません。
  • API 集約にはプログラミングが必要ですが、データの保存方法や異なる API バージョン間での変換方法など、API の動作をより細かく制御できます。

Kubernetes は、使いやすさや柔軟性を犠牲にすることなく、さまざまなユーザーのニーズを満たすために両方のオプションを提供します。

  • 集約 API は、メイン API サーバーの背後で実行されるいくつかの下位レベルの API サーバーを指します。メイン API サーバーはプロキシ方式で動作します。この形式の組織は API Aggregation (AA) と呼ばれます。ユーザーにとっては、Kubernetes API のみが拡張されたように見えます。
  • CRD を使用すると、ユーザーは新しい API サーバーを追加することなく、新しいリソース タイプを作成できます。 CRD を使用する場合、API 集約を理解する必要はありません。

CRDS

集約API

プログラミングは必要ありません。ユーザーは、CRD コントローラーを実装するために任意の言語を選択できます。

実行可能ファイルとイメージのプログラミングとビルドが必要です。

追加のサービスを実行する必要はありません。 CRD は API サーバーによって処理されます。

追加のサービスを作成する必要があり、無効になる可能性があります。

CRD が作成されると、継続的なサポートは必要ありません。バグ修正は、Kubernetes マスターのアップグレード中に自動的にロールインされます。

定期的にアップストリームからバグ修正を取得し、集約 API サーバーを更新する必要がある場合があります。

API の複数のバージョンを扱う必要はありません。たとえば、リソースのクライアントを制御する場合は、API との同期を維持するためにクライアントを更新できます。

API の複数のバージョンを処理する必要がある。たとえば、多くの人と共有することを目的とした拡張機能を開発する場合などです。

CRUD 操作のみがサポートされており、「logs」や「exec」などの操作はサポートされていません。

CRUD 以外の操作もサポートします。

7) カスタムリソースにアクセスする

Kubernetes クライアント ライブラリを使用してカスタム リソースにアクセスできます。すべてのクライアント ライブラリがカスタム リソースをサポートしているわけではありません。 Go および Python クライアント ライブラリがサポートされています。

新しいカスタム リソースを追加したら、次のいずれかの方法でアクセスできます。

  • kubectl
  • Kubernetes DynamicClient は、CRD カスタム リソースを含む任意の Kubernetes リソースに対して RESTful 操作を実行できます。
  • あなたが書いたRESTクライアント
  • Kubernetes クライアント ジェネレーターによって生成されたクライアントを使用します。クライアントの生成は少し難しいですが、一部のプロジェクトではCRDまたは集約APIとともにクライアントが提供される場合があります。

3. CRDの例のデモンストレーション

1) CRD(カスタムリソース)を作成する

新しい CustomResourceDefinition (CRD) を作成すると、Kubernetes API サーバーは指定したバージョンごとに新しい RESTful リソース パスを生成します。 CRD オブジェクトに基づいて作成されたカスタム リソースは、CRD オブジェクトの spec.scope フィールドの設定に応じて、名前空間スコープまたはクラスター スコープにすることができます。

 cat >リソース定義.yaml << EOF
apiバージョン: apiextensions .k8s .io / v1
種類:カスタムリソース定義
メタデータ:
# 名前は以下の仕様フィールドと一致している必要があり、形式は'<名前の複数形>.<グループ名>' です。
名前: crontabs.stable.example.com
仕様:
# REST API で使用されるグループ名: / apis /<group> / <version>
グループ: stable .example .com
# この CustomResourceDefinition でサポートされているバージョンを一覧表示します
バージョン:
-名前: v1
# 各バージョンは、servedフラグを使用して個別に有効化または無効化できます
提供 true
# ストレージバージョンとしてマークできるバージョンは 1 つだけです
ストレージ: true
スキーマ:
オープンAPIV3スキーマ:
タイプ:オブジェクト
プロパティ:
仕様:
タイプ:オブジェクト
プロパティ:
cronスペック:
タイプ:文字列
画像
タイプ:文字列
レプリカ:
タイプ:整数
# 名前空間またはクラスター化可能
スコープ:名前空間
名前:
# URL で使用される名前の複数形: / apis /<group> /<version> /<名前の複数形>
複数形: crontabs
# コマンドラインで使用したり、表示したりするときに別名として使用される名前の単数形
単数形: crontab
# kind は通常、単数形の CamelCase です。リソース リストではこの形式が使用されます。
種類: CronTab
# shortNamesを使用すると、コマンドラインでリソースを一致させるために短い文字列を使用できます
短縮名:
-ct
終了

実行 作成

 kubectl apply -fリソース定義.yaml

新しい名前空間 RESTful API エンドポイントが次の場所に作成されます:

 /apis/stable.example.com/v1/namespaces/

オブジェクトの種類は、上記で作成した仕様の CronTab になります。

Kubernetes (k8s) APIの操作については、前回の記事「Kubernetes (k8s) API Server 詳細説明」を参照してください。

 kubectl get --raw /apis/stable.example.com/v1/
kubectl get --raw /apis/stable.example.com/v1/|python -m json.tool

2) カスタムオブジェクト(カスタムコントローラ)を作成する

CustomResourceDefinition オブジェクトを作成した後、カスタム オブジェクト (​カスタム オブジェクト) を作成できます。カスタム オブジェクトにはカスタム フィールドを含めることができます。これらのフィールドには任意の JSON データを含めることができます。次の例では、cronSpec および image カスタム フィールドが、CronTab クラスのカスタム オブジェクトに設定されています。 CronTab クラスは、上記で作成した CRD の仕様から取得されます。

 cat > my - crontab .yaml << EOF
apiバージョン: "stable.example.com/v1"
種類: CronTab
メタデータ:
名前:の新しいcronオブジェクト
仕様:
cronSpec : "* * * * * /5"
画像:私の-素晴らしい- cron -画像
終了

そして、create コマンドを実行します。

 kubectl apply -f my - crontab .yaml

kubectl を使用して CronTab オブジェクトを管理できます。例えば:

 kubectl crontab を取得する
kubectl get ct -o yaml

3) CustomResourceDefinitionを削除する

CustomResourceDefinition を削除すると、サーバーは RESTful API エンドポイントをアンインストールし、サーバーに保存されているすべてのカスタム オブジェクトを削除します。

 kubectl delete -fリソース定義.yaml
kubectl crontab を取得する

<<:  2023 年のクラウド コンピューティング インフラストラクチャのトレンド

>>:  Kubernetes に基づく CICD の実践

推薦する

サーバーレスの時代が到来しました。準備はできたか?

[51CTO.comより引用] クラウドコンピューティングの発展の歴史をみると、4つの段階に分けるこ...

5つのオープンソース仮想化ツールで仮想マシンを管理する

仮想化ツール (Virt Tools) を使用すると、仮想マシンの使用がより便利になります。今日は ...

百度の技術的欠陥は、元の識別において改善する必要がある

確かに、Baiduには多くの技術的な欠陥があります。ここでは、Baiduの技術的な欠陥であると私が個...

VPS.NETは10ドルで世界中の18のオプションデータセンターを提供します

UK2グループ傘下の有名なVPSブランドであるvps.netは、割引コードGIVEME10で小規模な...

Baidu における信頼性がウェブサイトのパフォーマンスに影響を与える理由の分析

Baidu アルゴリズムの継続的なアップグレードにより、新しいサイトが Baidu で順位を獲得する...

マレーシアのVPSの推奨、いくつかの人気のあるマレーシアのVPS業者の推奨

マレーシア VPS、マレーシア VPS 推奨、マレーシア VPS レンタル...マレーシアは東南アジ...

Oracle Marketing Cloud が Royal FrieslandCampina の精密マーケティングの成功を支援

消費の高度化と新小売時代の到来により、中国は世界第2位の乳幼児消費市場となった。乳児用調製粉乳業界に...

アリババクラウドは利益を上げ、アマゾンはリーダーを交代: クラウドコンピューティングは転換点に向かっている

2月に入り、米国株の新たな決算シーズンが最高潮を迎えています。火曜日、アリババ、アマゾン、グーグルな...

さらにパワフルなパフォーマンス! Nehalem サーバー プラットフォームがテストされました。

45nm Xeon プロセッサ (コード名 Penryn) については、皆さんすでにご存知だと思いま...

WeChatの運用とプロモーション、新規顧客獲得、アクティブ化、有料化についてまとめた3つのポイント!

まず最初に、私がこの要約を書いた理由を紹介したいと思います。 1年前、私はAlibabaやVipsh...

中国人エンジニア、数千万ドル相当の米銀行ソースコードを盗んだことを認める

北京時間12月4日朝のニュースによると、中国のコンピューターエンジニアである張波(Zhang Bo)...

訪問者体験の​​指針: 訪問者を「初心者」として扱うように努める

サイト設計の基本原則は、優れた訪問者エクスペリエンス、つまり訪問者中心の設計であることはわかっていま...

電子商取引ウェブサイトはどのようにしてバイラルマーケティングを実現し、利益を上げることができるのでしょうか?

ほとんどのウェブマスターはバイラル マーケティングに精通しているはずです。近年、バイラル マーケティ...

Duowanゲームユーザー800万人分のデータが漏洩し、多くのゲームサイトが攻撃を受けたと報じられている

写真はDuowan.comの漏洩したユーザー名とパスワードですネットユーザーはデータパケットのスクリ...

必見です! 2021 年のクラウド コンピューティング業界の 5 つの主要トレンド

この記事はLeiphone.comから転載したものです。再印刷が必要な場合は、Leiphone.co...