1. 소개
이 사용방법(예제)에서는 Kubernetes Java API를 사용하여 리소스를 필터링하는 다양한 방법을 살펴봅니다.
Kubernetes Java API를 다루는 이전 기사에서는 클러스터 리소스를 쿼리, 조작 및 모니터링하는 데 사용할 수 있는 방법에 중점을 두었습니다.
이러한 예에서는 특정 종류의 리소스를 찾거나 단일 리소스를 대상으로 한다고 가정했습니다. 그러나 실제로 대부분의 응용 프로그램에는 몇 가지 기준에 따라 리소스를 찾는 방법이 필요합니다.
Kubernetes의 API는 이러한 검색 범위를 제한하는 세 가지 방법을 지원합니다.
- 네임스페이스: 지정된 Kubernetes 네임스페이스 로 제한된 범위
- 필드 선택기: 필드 값이 일치하는 리소스로 범위가 제한됨
- 라벨 선택기: 일치하는 라벨이 있는 리소스로 범위가 제한됨
또한 이러한 메서드를 단일 쿼리로 결합할 수 있습니다 . 이것은 우리에게 복잡한 요구 사항을 처리할 수 있는 많은 유연성을 제공합니다.
이제 각 방법을 자세히 살펴보겠습니다.
2. 네임스페이스 사용
네임스페이스를 사용하는 것은 쿼리 범위를 제한하는 가장 기본적인 방법입니다. 이름에서 알 수 있듯이 네임스페이스 쿼리는 지정된 네임스페이스 내의 항목만 반환합니다.
Java API에서 네임스페이스 쿼리 메서드는 listNamespacedXXX() 패턴을 따릅니다. 예를 들어 특정 네임스페이스의 포드 를 나열하려면 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));
여기서 ApliClient 및 CoreV1Api 는 Kubernetes API 서버에 대한 실제 액세스를 수행하는 데 사용됩니다. ns1 을 네임스페이스로 사용 하여 리소스를 필터링합니다. 또한 네임스페이스가 지정되지 않은 메서드의 인수와 유사한 나머지 인수를 사용합니다.
예상대로 네임스페이스 쿼리에도 호출 변형이 있으므로 이전에 설명한 것과 동일한 기술을 사용하여 Watch 를 만들 수 있습니다 . 비동기 호출 및 페이징 도 네임스페이스가 없는 버전과 동일한 방식으로 작동합니다.
3. 필드 선택기 사용
네임스페이스 API 호출은 사용이 간편하지만 몇 가지 제한 사항이 있습니다.
- 모 아니면 도(all-or-nothing)입니다. 즉, 하나 이상의(전부는 아님) 네임스페이스를 선택할 수 없습니다.
- 리소스 속성을 기반으로 필터링할 방법이 없습니다.
- 시나리오마다 다른 방법을 사용하면 클라이언트 코드가 더 복잡하고 장황해집니다.
필드 선택기 는 해당 필드 중 하나의 값을 기반으로 리소스를 선택하는 방법을 제공 합니다 . Kubernetes 용어 의 필드 는 리소스의 YAML 또는 JSON 문서에 지정된 값과 연결된 JSON 경로입니다. 예를 들어 이것은 Apache HTTP 서버를 실행하는 포드에 대한 일반적인 Kubernetes YAML입니다.
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 와 함께 필드 선택기를 사용 하면 Pod가 종료될 때 알림을 받는 모니터링 애플리케이션을 쉽게 만들 수 있습니다.
4. 레이블 선택기 사용
레이블은 생성의 일부로 Kubernetes 리소스에 추가할 수 있는 랜덤의 키/값 쌍을 포함하는 특수 필드입니다. 레이블 선택기는 기본적으로 해당 값을 기반으로 리소스 List을 필터링할 수 있다는 점에서 필드 선택기와 유사하지만 더 많은 유연성을 제공합니다.
- 추가 연산자 지원: in/notin/exists/not exists
- 필드 선택기와 비교할 때 리소스 유형 전체에서 일관된 사용
Java API로 돌아가서 원하는 기준으로 문자열을 구성하고 원하는 리소스 API listXXX 호출에 대한 인수로 전달하여 레이블 선택기를 사용합니다. 같음 및/또는 같지 않음을 사용하여 특정 레이블 값에 대한 필터링은 필드 선택기에서 사용되는 것과 동일한 구문을 사용합니다.
값이 "httpd"인 "app" 레이블이 있는 모든 팟(Pod)을 찾는 코드를 살펴보겠습니다.
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 또는 ! 를 사용하여 필드의 존재 여부를 확인할 수 있습니다 . 레이블 이름 구문:
String ls = "app";
V1PodList items = api.listPodForAllNamespaces(null, null, null, ls, null, null, null, null, 10, false);
마지막으로 단일 API 호출에서 여러 식을 연결할 수 있습니다. 결과 항목 List에는 모든 표현식을 충족하는 리소스만 포함됩니다.
String ls = "app in ( httpd, test ),version=1,foo";
V1PodList items = api.listPodForAllNamespaces(null, null, null, ls, null, null, null, null, 10, false);
5. 결론
이 기사에서는 Java Kubernetes API 클라이언트를 사용하여 리소스를 필터링하는 다양한 방법을 다루었습니다. 늘 그렇듯이 예제의 전체 소스 코드는 GitHub 에서 찾을 수 있습니다 .