DUICUO

オペレーターの概要: Kubernetes をスケーリングする方法

[[397517]]

最近少し忙しくて更新が滞っています。また、Go Advanced Training Campのアップデートがしばらく続いているので、少しお休みしようと思っています。Kubernetesは結構触っているのですが、まだ関連コンテンツを更新できていないので、次のシリーズで更新します。

  • 追伸:筆者もこの分野の初心者ですので、誤りや抜け漏れがあるかもしれません。経験豊富な著者の皆様にはご指摘いただければ幸いです。どうぞよろしくお願いいたします。

Kubernetes拡張機能、特にOperatorに関するこのシリーズは、Kubernetesの概念を既に基礎的に理解しており、Kubernetes拡張機能を拡張または開発したい、あるいはその動作モードをより深く理解したいと考えている方(追記:私もその一人です)を主な対象としています。このシリーズは9~10記事で構成されます。今回は最初の記事で、「Operatorの概要:Kubernetesの拡張方法」について解説します。今後2週間、平日は毎日1記事ずつ更新していきます。最新情報をタイムリーに受け取るには、記事下部にあるWeChat登録アカウントをフォローしてください。

Kubernetes の拡張ポイントは何ですか?

Kubernetesは、コンテナ化されたワークロードとサービスを管理し、宣言的な構成と自動化を容易にする、移植性と拡張性に優れたオープンソースプラットフォームです。Kubernetesは、大規模かつ急速に成長を続けるエコシステムを誇ります。Kubernetesのサービス、サポート、ツールは広く利用可能です[^1]。

Kubernetesは現在、コンテナオーケストレーションの事実上の標準であり、非常に豊富で柔軟な機能を備えていますが、すべてのニーズを満たすことはできません。Kubernetesが提供する機能がニーズを満たせない場合は、その強力な拡張性を利用してカスタマイズすることができます。

そこで質問です。Kubernetesの拡張ポイントとは何でしょうか?

Kubernetes拡張機能

上の図に示されているように、Kubernetes はクライアントから基盤となるコンテナランタイムまで、ほとんどの場所で拡張ポイントを提供しています。上から下まで、一つずつ見ていきましょう。

1. kubectl

kubectlは、Kubernetesとのやり取りに最も頻繁に使用されるクライアントツールです。一般的な運用・保守タスクはすべてkubectlを通じて実行されます。kubectlは、拡張を容易にするためのプラグインメカニズムを提供しています。

kubectlプラグインとは、「kubectl-」というプレフィックスが付いた実行ファイルです。kubectlプラグインを実行する際は、kubectlプラグイン名パラメータを使用して実行できます。

Ubuntuがapt、Macがbrewを使ってソフトウェアを管理するのと同様に、kubectlにもkrew [^4]と呼ばれる同様のプラグイン管理ツールがあります。必要なプラグインが既に存在するかどうかは、https://krew.sigs.Kubernetes.io/plugins/ で確認することもできます。

2. APIサーバー

ポリマー層

Kubernetes v1.7以降、APIServerは集約レイヤー機能を導入しました。これにより、各開発者はKubernetesコードを再コンパイルすることなく、集約されたAPIサービスを実装して必要なインターフェースを公開できるようになりました[^3]。

次のリソースを Kubernetes に送信すると、パス /apis/metrics.Kubernetes.io/v1beta1 の API サーバーにアクセスするユーザーは、クラスター内の metrics-server.kube-system.svc サービスに転送されます。

  1. apiバージョン: apiregistration.Kubernetes.io/v1
  2. 種類: APIService
  3. メタデータ:
  4. 名前: v1beta1.metrics.Kubernetes.io
  5. 仕様:
  6. サービス:
  7. 名前: メトリクスサーバー
  8. 名前空間: kube-system
  9. グループ: metrics.Kubernetes.io
  10. バージョン: v1beta1
  11. 安全でないSkipTLSVerify: true  
  12. グループ優先度最小値: 100
  13. バージョン優先度: 100

アクセス制御

さらに、kubectl や client-go などの他のクライアントから開始されたすべてのリクエストは APIServer に送信され、認証 -> 認可 -> アドミッションコントロールの手順を経ます。これらの手順はそれぞれ拡張可能で、最も一般的に使用される拡張はアドミッションコントロールです。これについては、後の記事で詳しく説明します。

アドミッション制御プロセスは、まずMutatingAdmissionWebhookを経由し、次にValidatingAdmissionWebhookを経由します。どちらかのアドミッションコントローラがエラーを返した場合、リクエストは失敗します。例えば、これら2つのアドミッションコントローラを使用して、サイドカーの挿入、リソースの検証、ポッドのクォータ調整など、様々な処理を実行できます。

3. Kubernetesリソース

私たちがよく使用するデプロイメント、ポッド、ノードはすべてKubernetesが提供する組み込みリソースです。しかし、これらの組み込みリソースではニーズを満たせない場合があり、そのような場合はCustomResourcesを使用できます。カスタムリソースは、多くの場合、コントローラーと組み合わせて使用​​されます。ただし、カスタムリソースを使用する場合は、構成によってはConfigMapの方が適しているかどうかを検討し、この機能の過度な使用は避けることが重要です。

4. コントローラー

Kubernetesでは、リソースの状態管理はコントローラーによって処理されます。コントローラーは、リソースを指定された状態に継続的に調整しようとします。これは基本的に宣言型APIと呼ばれます。実際の処理はコントローラーによって実行されます。コントローラーは通常、CRD(Critical Request Descriptor)と組み合わせて使用​​されます。

5. スケジューラ

スケジューラは、Podの変更を監視し、Podをノードに分配する役割を担う特殊なタイプのコントローラです。スケジューラは直接置き換えたり、複数のスケジューラを併用したりすることができます。さらに、公式のデフォルトスケジューラはWebHooksもサポートしています。[^5]

6. CNIネットワークプラグイン

CNI(Container Network Interface)は、Linuxコンテナ内のネットワークカードを設定するプラグインを開発するためのインターフェースとフレームワークのセットです。通常、私たちはネットワークプラグインをカスタム開発することはなく、FlannelやCiliumなどのオープンソースコンポーネントを使用しています。Kubernetesなどのクラウドサービスを利用している場合は、Alibaba CloudのTerwayなどのカスタムネットワークプラグインに遭遇するかもしれません。

7. CSIストレージプラグ

CSI ストレージ プラグイン (Container Storage Interface の略) を使用すると、CSI インターフェイスを通じてさまざまなストレージ タイプをサポートできます。

8. CRIコンテナランタイム

CRI(Container Runtime Interface)は、コンテナランタイムとイメージの管理に使用されるgRPCインターフェースのセットです。このインターフェースは、Dockerやcontainerdなどのさまざまなコンテナランタイムをサポートしています。

オペレーター

Kubernetesは非常にスケーラブルなシステムです。多くの拡張ポイントがありますが、一般的にはカスタムリソース、コントローラー、アドミッションコントロールを扱います。kubectlやスケジューラーを拡張するものもあります。その他のほとんどの側面は、成熟したオープンソースコンポーネントで処理できます。このシリーズでは、カスタムリソース、コントローラー、アドミッションコントロールを含むOperatorに焦点を当てます。

Operator パターンは、Kubernetes の原則に従って、カスタム リソース管理アプリケーションとそのコンポーネントを活用し、作成したタスク自動化コードをカプセル化します。

演算子の一般的な用途としては[^6]が挙げられます。

  • オンデマンドでアプリケーションを展開
  • アプリケーション状態のバックアップを取得/復元する
  • アプリケーションコードのアップグレードと関連する変更に対応します。例えば、データベーススキーマの変更や追加の構成設定などです。
  • Kubernetes API をサポートしていないアプリケーションによって検出できるサービスを公開します。
  • クラスターの全体または一部の障害をシミュレートして、その安定性をテストします。
  • 内部メンバー選出プロセスなしで分散アプリケーションのリーダー役割を選択します。

Operatorコンセプトの導入以来、迅速かつコスト効率の高い開発を支援するツールが数多く登場しています。中でも最もよく使われているのは、CoreOSオープンソースのoperator-sdkと、k8s SIGチームがメンテナンスするkubebuilderです。このシリーズではkubebuilderを使用します。

独自に開発するだけでなく、https://operatorhub.io/ で他の人が開発した既製のオペレーターを見つけて使用することもできます。

要約

Kubernetesは2014年のリリース以来、7年が経ちました。私は卒業後、約3年間チームに所属し、関連業務に携わってきました。Kubernetesの基礎知識はありますが、Kubernetes自体の拡張機能開発は経験していません。この記事を執筆したことで、Kubernetes拡張機能開発の基礎知識が身に付きました。皆さんのお役に立てれば幸いです。

参考文献

[^1]: Kubernetesとは何ですか?

https://kubernetes.io/zh/docs/concepts/overview/kubernetes とは/

[^2]: Kubernetesの拡張

https://kubernetes.io/zh/docs/concepts/extend-kubernetes/

[^3]: Kubernetes の機能をどのようにカスタマイズできますか?

https://draveness.me/cloud-native-kubernetes-extension/

[^4]: kubectlプラグイン管理ツール krew

https://github.com/kubernetes-sigs/krew

[^5]: スケジューラエクステンダー

https://github.com/kubernetes/community/blob/master/contributors/design-proposals/scheduling/scheduler_extender.md

[^6]: オペレータモード

https://kubernetes.io/zh/docs/concepts/extend-kubernetes/operator/