自分のKubernetesコントローラを開発するためにJavaを使用して、試してみたいですか?

著者|ニコラス・フランケル

翻訳| Infを、Zebian |徐ヴェイロン

カバー写真| CSDNは、視覚的な中国をダウンロード

この記事では、我々は独自のKubernetesコントローラの開発を開始します。 

テクノロジー・スタックは、Python、NodeJSやRubyことができます。このブログは、「Javaのオタク」と命名され、そのためのJavaが正常である選択されているので。 

ユースケースとして、私たちはサイドカーモードを実現します:ポッドが予定されているときはいつでも、サイドカーポッドもスケジュールされます。あなたは、元を削除した場合、後者必見も削除すること。

適切なツールを選択します

 

JavaでREST呼び出しを実行するためには、第一の結合生成する必要があります。これを行うには、いくつかの方法があります。この操作は手動で行われ、最も厄介な:慎重に可能な組み合わせJSONリクエストとレスポンスの全てを制御する必要性、それぞれのJavaオブジェクトのシリアル化フレームワークとJSONの開発は、HTTPクライアントを選択します。第二の最良のオプションは、例えば闊歩(https://swagger.io/)または養蜂場(https://apiary.io/)、独自のコードジェネレータを使用することです。これは、可能な形式を提供するために、APIのプロバイダモデルが必要です。欠点は、ツールを使用する必要があります。時々、フォーム多かれ少なかれオープン、例えばOpenAPIの仕様(https://swagger.io/specification/)。この場合、形式から選択したツールを達成することが可能です。最良の場合には、それが結合した可能性があります。

Kubernetesはケースです:プロジェクトは、さまざまな言語のために(https://kubernetes.io/docs/reference/using-api/client-libraries/)結合、独自のを提供します。問題は、その非常に近く、著者への言語のREST APIのラッパーとあまりにもよく知られています。例えば、これは、すべてのスペースポッドの方法のすべての名前をリストすることです:

ApiClient client = Config.defaultClient();
CoreV1Api core = new CoreV1Api(client);
V1PodList pods =
    core.listPodForAllNamespaces(null, null, null, null, null, null, null, null);  

注:すべてのヌルパラメータが渡される必要があります。

これは、「ラッパーのコードは非常に近いREST APIにある」です。幸いなことに、別のオプションがあります。Fabric8組織はGithubの上のスムーズなJava APIを提供します。同等のコード上記のコードです。

KubernetesClient client = new DefaultKubernetesClient();
PodList pods = client.pods().inAnyNamespace().list();    

注意:无需传递无用的null参数。

Fabric8組織はGithubの上のスムーズなJava APIを提供します。

https://github.com/fabric8io/kubernetes-client)

Fabric8概要

 

簡単に言えば、Fabric8にAPIを使用して、すべてのKubernetesリソースは、たとえば、KubernetesClientインスタンス上で使用することができます。

  • client.namespaces()

  • client.services()

  • client.nodes()

資源の性質に応じて、その範囲は、ネームスペースをすることができ、あなたがすることはできません。

  • client.pods()。inAnyNamespace()

  • client.pods()。inNamespace( "NS")

この時点で、あなたはこのアクションを呼び出すことができます。 

ポッドは、すべての領域のすべての名前をリストします。

client.pods().inAnyNamespace().list();

内のすべてのポッドの名前空間NSを削除します。

client.pods().delete(client.pods().inNamespace("ns").list().getItems());

创建一个名为ns的新名称空间:

client.namespaces()
  .createNew()
    .withApiVersion("v1")
    .withNewMetadata()
      .withName("ns")
    .endMetadata()
  .done();



制御ループを実現するために、

クラスタの状態を監視し、所望の状態で座標なお、一つの制御ループKubernetesコントローラ。スケジュール/削除イベントにできるようにするために、Observerパターンを使用します。彼らが発生した場合、アプリケーションがこのような事件に加入し、関連するコールバックがトリガされます。

以下は、非常にシンプルなAPIマップは次のとおりです。       

真に監視プログラムを実現するために、単純に次のコード行を実行します。

public class DummyWatcher implements Watcher<Pod> {

  @Override
  public void eventReceived(Action action, Pod pod) {
    switch (action) {
      case ADDED:    //注意1        
        break;
      case MODIFIED: //注意2       
        break;
      case DELETED:  //注意3
        break;
      case ERROR:    //注意4       
        break;
    }
  }

  @Override
  public void onClose(KubernetesClientException cause) {
           //注意5               
  }
}

client.pods()
  .inAnyNamespace()
  .watch(DummyWatcher());

注意:

  1. 新しいポッド作品を追加する場合

  2. 機能既存のポッドを変更します

  3. ときポッド作品を削除

  4. エラーが発生したときに動作します

  5. すべてのリソースをクリーンアップします。クライアントが正常に閉じた場合は、原因はnullになります

具体的な詳細

 

今、我々は必要なサイドカーモードを達成するためにすべてを持っています。ます。https:私はGitHubの上で見つけることができるすべてのコード、表示されません//github.com/nfrankel/jvm-controllerを、キーコンテンツの一部を強調することが重要です。

1)マークサイドカー

基本的に、あなたは新しいポッドを追加するときにサイドカーポッドを追加し、あなたがそれを削除するときにそれを除去するためのビューアが必要。この基本的なアプローチは動作しません:あなたはサイドカーポッドをスケジュールする場合、それはオブザーバーをトリガし、新しいサイドカーポッドサイドカーを追加します。そして、このような状況が継続されます。このように、ラベルサイドカーポッドが不可欠です。このようポッドを検出し、それが作成ロジックをトリガーするべきではありません。

マーキングサイドカーポッドのいくつかの方法があります。

  • サイドカーPODプラス特定の文字列の名前の後に、例えばサイドカー

  • 次の特定のタグを追加します。

client.pods()
  .inNamespace("ns")
  .createNew()
    .withNewMetadata()
      .addToLabels("sidecar", "true")
    .endMetadata()
  .done();

2)一緒にポッドと一緒にサイドカーを除去します

ポッドは唯一のサイドカーにする必要があります。上述したように、それはあなたがポッドを追加するときに作成され、それは後者を削除する必要が削除されなければなりません。

したがって、メインポッドへの参照がサイドカーに追加されるべきです。ポッドが取り除かれたとき、それはサイドカーない場合はこのように、、、我々はサイドカーの割り当てを見つけて、それを削除する必要があります。

メインポッドを削除するときに第一の方法は、明示的に削除サイドカーに簡単です。これは多くの作業です。しかし、それは多くの時間を要します。Kubernetesは、別のポッドポッドのライフサイクルにライフサイクルをバインドすることができます。その後、Kubernetes自身で論理的な処理を削除します。これはownerReferenceの概念をサポートしています。

APIを実装することが容易になります:

client.pods()
  .inNamespace("ns")
  .createNew()
    .withNewMetadata()
      .addNewOwnerReference()
        .withApiVersion("v1")
        .withKind("Pod")
        .withName(podName)
        .withUid(pod.getMetadata().getUid())
      .endOwnerReference()
    .endMetadata()
  .done();

3) 始终保持一个sidecar

サイドカーを追加すると、それは常にそのように滞在するという意味ではありません。たとえば、展開に属するポッドを削除することができます。展開の目標は、コピーの所望の数を達成するために、ポッドを再作成することです。

メインポッドを維持しながら、あなたがサイドカーを削除した場合も同様に、あなたは新しいサイドカーを生成するための正しい参照を使用する必要があります。

 

結論

 

この記事では、JVM上でJava言語Kubernetesコントローラを使用する方法について説明します。Fabric8 APIを使用すると、操作が実現するのは非常に簡単です極端な場合には、スケジューラ/削除ロジックからの主な問題。このシリーズ(最後の)記事の記事の下で、我々は最終的に展開し、コードを実行する方法について説明します。

この記事の完全なソースコードはGitHubの上でMavenの形式で見つけることができます:

https://github.com/nfrankel/jvm-controller

うまくいけば、このあなたに有用な製品、そして我々は議論するコメント欄を歓迎します。

オリジナルます。https://blog.frankel.ch/your-own-kubernetes-controller/2/

【終わり】

推奨読書 

千万規模分類技術をサポートし、Baiduは、パドルは、産業深い学習フレームワークを定義して飛びます

AIoTは、資金調達の数千万人を再作成する工業企業の清華サイエンスPaのグループは:プレイヤーは、エッジAIチップ上のアルゴリズムを実行するためにプッシュする必要があります

機械学習の生物学:PCAは、K平均して、ゲノム配列解析COVID-19どのように変異を使用していますか?

バイトはメーカーが短いこのJava乾燥の、あなたを提供から武漢は、2,000人を採用暴行します!|フォースプログラム

あなたが試してみたい、自分のKubernetesコントローラを開発するためにJavaを使うのか?

皆が「イーサネットスクエア2.0フラグメンテーションデザイン」を読むことができます

あなたは、私が好きなよう真剣に、すべてのポイントを見て

元のテキストを読むためにクリックして、すぐに参加しています!

リリース1887元の記事 ウォンの賞賛40000 + ビュー1718万+

おすすめ

転載: blog.csdn.net/csdnnews/article/details/105154339