|
最近少し忙しくて更新が滞っています。また、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. kubectlkubectlは、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 サービスに転送されます。
アクセス制御さらに、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]が挙げられます。
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/ |