1. 序章

このチュートリアルでは、KubernetesJavaAPIを使用してリソースをフィルタリングするさまざまな方法について説明します。

Kubernetes Java APIに関するこれまでの記事では、クラスターリソースのクエリ、操作、モニタリングに使用できるメソッドに焦点を当ててきました。

これらの例では、特定の種類のリソースを探しているか、単一のリソースをターゲットにしていることを前提としています。 ただし、実際には、ほとんどのアプリケーションには、いくつかの基準に基づいてリソースを見つける方法が必要です。

KubernetesのAPIは、これらの検索の範囲を制限する3つの方法をサポートしています。

  • 名前空間:スコープは特定のKubernetes名前空間に制限されます
  • フィールドセレクター:一致するフィールド値を持つリソースに限定されたスコープ
  • ラベルセレクター:一致するラベルを持つリソースに限定されたスコープ

さらに、これらのメソッドを1つのクエリに組み合わせることができます。 これにより、複雑な要件にも対応できる柔軟性が得られます。

それでは、それぞれの方法を詳しく見ていきましょう。

2. 名前空間の使用

名前名の使用は、クエリの範囲を制限するための最も基本的な方法です。 名前が示すように、名前空間クエリは指定された名前空間内のアイテムのみを返します。

Java APIでは、名前空間化されたクエリメソッドはパターン listNamespacedXXX()。に従います。たとえば、特定の名前空間で pods を一覧表示するには、 listNamespacedPod()を使用します。

ApiClient client  = Config.defaultClient();
CoreV1Api api = new CoreV1Api(client);
String ns = "ns1";
V1PodList items = api.listNamespacedPod(ns,null, null, null, null, null, null, null, null, 10, false);
items.getItems()
  .stream()
  .map((pod) -> pod.getMetadata().getName() )
  .forEach((name) -> System.out.println("name=" + name));

ここでは、ApliClientCoreV1Apiを使用して、KubernetesAPIサーバーへの実際のアクセスを実行します。 リソースをフィルタリングするための名前空間としてns1を使用します。 また、名前空間のないメソッドの引数と同様の残りの引数を使用します。

予想どおり、名前付きクエリには call バリアントも含まれているため、前述のと同じ手法を使用してウォッチを作成できます。 非同期呼び出しとページングも、名前のないバージョンと同じように機能します。

3. フィールドセレクターの使用

名前空間API呼び出しは簡単に使用できますが、いくつかの制限があります。

  • これはオールオアナッシングです。つまり、複数の(すべてではない)名前空間を選択することはできません。
  • リソースのプロパティに基づいてフィルタリングする方法はありません
  • シナリオごとに異なる方法を使用すると、より複雑で詳細なクライアントコードになります

フィールドセレクターは、そのフィールドの1つの値に基づいてリソースを選択する方法を提供します。 Kubernetes用語のフィールドは、リソースのYAMLまたはJSONドキュメントの特定の値に関連付けられたJSONパスです。 たとえば、これはApacheHTTPサーバーを実行しているポッドの典型的なKubernetesYAMLです。

apiVersion: v1
kind: Pod
metadata:
  labels:
    app: httpd
  name: httpd-6976bbc66c-4lbdp
  namespace: ns1
spec:
  ... fields omitted
status:
  ... fields omitted
  phase: Running

フィールド status.phase 既存のステータスが含まれていますポッド。 対応しますフィールドセレクター式は、単にフィールド名の後に演算子と値が続くものです。 次に、すべての名前空間で実行中のすべてのポッドを返すクエリをコーディングしましょう。

String fs = "status.phase=Running";        
V1PodList items = api.listPodForAllNamespaces(null, null, fs, null, null, null, null, null, 10, false);
// ... process items

フィールドセレクター式は、等式(’=’または’==’)および不等式(’!=’)演算子のみをサポートします。 また、同じ呼び出しで複数のコンマ区切りの式を渡すことができます。 この場合、正味の効果は、それらがAND演算されて、最終結果が生成されることです。

String fs = "metadata.namespace=ns1,status.phase=Running";        
V1PodList items = api.listPodForAllNamespaces(null, null, fs, null, null, null, null, null, 10, false);
// ... process items

注意:フィールド値では大文字と小文字が区別されます!前のクエリでは、「Running」(大文字の「R」)の代わりに「running」を使用すると、空の結果セットが生成されます。

フィールドセレクターの重要な制限は、リソースに依存することです。 metadata.nameおよびmetadata.namespaceフィールドのみが、すべてのリソースの種類でサポートされます。

それでも、フィールドセレクターは、動的フィールドで使用する場合に特に便利です。 例は、前の例のstatus.phaseです。 Watchと一緒にフィールドセレクターを使用すると、ポッドが終了したときに通知を受け取る監視アプリケーションを簡単に作成できます。

4. ラベルセレクターの使用

ラベルは、作成の一部として任意のKubernetesリソースに追加できる任意のキーと値のペアを含む特別なフィールドです。 ラベルセレクターは、基本的にその値に基づいてリソースリストをフィルタリングできるという点でフィールドセレクターに似ていますが、より柔軟性があります。

  • 追加の演算子のサポート: in / notin / does / notexists
  • フィールドセレクターと比較した場合のリソースタイプ間での一貫した使用

Java APIに戻ると、目的の条件で文字列を作成し、それを目的のリソースAPI listXXX 呼び出しへの引数として渡すことにより、ラベルセレクターを使用します。 等式および/または不等式を使用して特定のラベル値をフィルタリングするには、フィールドセレクターで使用されるのと同じ構文を使用します。

値が「httpd」のラベル「app」を持つすべてのポッドを検索するコードを見てみましょう。

String ls = "app=httpd";        
V1PodList items = api.listPodForAllNamespaces(null, null, null, ls, null, null, null, null, 10, false);
// ... process items

in 演算子は、対応するSQL演算子に似ており、クエリでORロジックを作成できます。

String ls = "app in ( httpd, test )";        
V1PodList items = api.listPodForAllNamespaces(null, null, null, ls, null, null, null, null, 10, false);

また、 labelname または labelname構文を使用して、フィールドの有無を確認できます。

String ls = "app";
V1PodList items = api.listPodForAllNamespaces(null, null, null, ls, null, null, null, null, 10, false);

最後に、1回のAPI呼び出しで複数の式をチェーンできます。 結果のアイテムリストには、すべての式を満たすリソースのみが含まれます。

String ls = "app in ( httpd, test ),version=1,foo";
V1PodList items = api.listPodForAllNamespaces(null, null, null, ls, null, null, null, null, 10, false);

5. 結論

この記事では、JavaKubernetesAPIクライアントを使用してリソースをフィルタリングするさまざまな方法について説明しました。 いつものように、例の完全なソースコードはGitHubにあります。