シェルオペレーターを使用したKubernetesオペレーターの簡単な作成:1年でのプロジェクトの進捗状況





Kubernetesオペレーターは、このコンテナープラットフォームの機能を拡張するための便利なメカニズムであり、オペレーションエンジニアとその同調者の環境で広く認められています。すでに遠い2017年にそれらがどのように配置され、機能するについて話しました。そして昨年4月には、Kubernetesオペレーターの作成プロセスを大幅に簡略化するオープンソースのシェルオペレータープロジェクト発表しました このために、K8sクラスターで特定のイベントが発生した場合に任意のスクリプト(Bash、Pythonなど)を実行できるフレームワークが開発されました。 過去の間に、シェルオペレーターはユーザーベース(記事の最後にある詳細を参照)と、もちろん新しい機能を獲得しています。最近のリリースの際に







v1.0.0-beta.11 (ベータステータスについては、以下を参照)は、最初のパブリックバージョンの発表以来、プロジェクトの存在について話し合うことにしました。



デバイスと目的について



しかし、シェルオペレーターがどのように機能するか、そして原則として、それが必要な理由について簡単な説明から始めましょう。



シェルオペレーターは、Kubernetesクラスターのポッドで実行されます。そこで提示されます:



  • K8s APIのイベントをサブスクライブしてフックを起動するバイナリを実行します(何が起こったかの詳細を提供します)。
  • フックのセット。それぞれがBashスクリプト、Pythonスクリプト、またはその他の実行可能ファイルです。


フック:



  • それら自体が、どのイベントとどのオブジェクトに必要かを決定します。
  • K8sでこれらのイベントが発生した場合に必要なアクションを実行します。


したがって、シェルオペレーターは、Kubernetes APIのイベントとそれらを処理するスクリプトの間のレイヤーです。



画像



シェルオペレーターが作成されたのはなぜですか?演算子はKubernetes内で「正しいことを行う」ための標準ですが、(適切なSDKを使用してGoで演算子を完全に開発することは簡単ではありません。シェルオペレーターのような単純なフレームワークが存在することで、この領域に入るしきい値が大幅に下がり、クラスター内の小さな運用上の問題をすばやく効率的に解決できます。そして、同様に重要なこととして、それを正しい方法で行います。



どのようなタスクについて話しているのですか? shell-operatorの使用例は、プロジェクトリポジトリにあります。私たち、Flantでは、ライブラリとして使用しています(はい、それも可能でした!)これは、Kubernetesの追加コンポーネントを管理するaddon-operatorの基礎となりました



注意:このオープンソースプロジェクト(アドオンオペレーター)のアナウンスはこちらにありますまた、「Kubernetesの拡張と補足」のレポートでは、その出現理由、シェルオペレーターとの関係、動作原理について詳しく説明しました。



ここで、過去1年間にシェルオペレーターに導入された主な変更について説明します。



主なイノベーション



シェルオペレーターの最初のバージョンでは、フックで使用できるオブジェクトは1つだけでした。クラスターからのイベントに関連付けられたオブジェクトです。addon-operator内で使用されるフックの進化により、フックはオブジェクトの変更をサブスクライブしましたがkubectl他のオブジェクトの最新リストを取得するために呼び出しを行いました不要な呼び出しを削除してkubectlフックの処理を高速化するために、オブジェクトの現在のリストにアクセスするためのいくつかの可能性が実装されています。



  • 同期 +イベントモード、開始時のフックが実際のオブジェクトのリストを受け取り、1つのオブジェクトのみで機能する場合。このモードはデフォルトで有効になっています。結果は、operator-sdkの調整ループに類似していると言えます
  • snapshot', . (Snapshot’ Kubernetes, .)
  • snapshot'. , , , .
  • また、リソースを監視することも可能なりましたが、その変更には反応しません。「スナップショットを蓄積する」。たとえば、フックはCustomResourceの変更に反応し、追加の呼び出しなしで実際のConfigMapオブジェクトを受信できますkubectl(フラグexecuteHookOnSynchronization詳細を参照してくださいexecuteHookOnEvent。)


その他の重要な革新:



  • シェルオペレーターで動的 Kubernetes クライアントを使用するように移行したおかげで、kindカスタムリソースを含む既存の(Kubernetes APIのリソースタイプ)にサブスクライブすることが可能になりました。
  • (. queue). endpoints.
  • .
  • « », namespace’ .
  • scraping' Prometheus'. .
  • , shell.




  • YAML- ( JSON).
  • JSON logrus (. LOG_TYPE ).
  • listen-address hostNetwork: true.
  • rate limit (qps, burst) Kubernetes API.
  • kube-server Kubernetes API.
  • .
  • jqFilter libjq-go, jq.
  • zombie reaper, SIGCHLD -, Bash-. — tini.
  • シェルオペレーターをライブラリーとして接続するために、さまざまな簡略化が実装されています。
  • バージョンを更新しkubectl(1.13から1.17.4に)、alpine-3.11に基づいてアセンブリを作成しました。


状況と計画



シェルオペレータープロジェクトはまだ正式にベータ版です。これにもかかわらず、上記のように、アドオンオペレーター(多くの(100+)K8sクラスターで常に使用されるツール)のベースとして非常に集中的に使用しています



公開プロジェクトとしてのshell-operatorの安定したリリースのために、(少なくとも)以下を計画します。



  • e2eテストを追加(#63)、
  • マルチアーキテクチャビルドを実装する(#184)、
  • client-goを0.18.0に更新し、実装しcontext、最後にclient-goのオブジェクトキャッシュを処理します(#188)。


コミュニティの認識



長年にわたり、シェルオペレーターに対するコミュニティの明確な関心がありました。





また、8月に開催される仮想会議KubeCon + CloudNativeCon Europe 2020で、シェルオペレーターに関するレポートが発表されることをお知らせいたします。詳細はイベントウェブサイトをご覧ください



シェルオペレーターに関心をお寄せいただきありがとうございます。質問がある場合は、コメントまたはtg-channel @kubeoperatorで質問してください



PS



私たちのブログも読んでください:






All Articles