Java 에서 Kubernetes API 를 지원하는 라이브러리로 Fabric8 과 Kubernetes 공식 Java Client 를 꼽을 수 있습니다.
둘다 Kubernetes 에서 제공하는 API 를 거의 다 지원하고 있어 어떤걸 써야할지 고민이 생길수가 있는데요, 두 라이브러리의 차이를 잘 정리한 글이 있어 공유드립니다.
🗓 History
Fabric8 Kubernetes Client 는 Kubernetes 출시 초기인 2015년에 Ioannis Cannelos 와 Jimmy Dyson 이 Java 어플리케이션이 Kubernetes 와 연동하기 위해 만들었다고 합니다.
Official Kubernetes Client 는 쿠버네티스 창시자인 Brendan Burns 가 2017년에 만든 Kubernetes 연동 라이브러리라고 합니다. Java 뿐만 아니라 PERL, Javascript, Python 언어에 대한 라이브러리도 만들었다고 합니다.
📊 사용 현황
사용자수(첨부한 게시글에서 주장하는 내용이지만 정확한 근거가 나오진 않습니다.)나 Github Dependents 가 Fabric8 Kubernetes Client 가 많은것으로 확인.
🏁 Official Kubernetes Client 특징
- Class 나 함수가 Kubernetes 에서 정의한 리소스와 API 와 비슷하고 파라미터를 받는 형태가 kubectl 과 비슷합니다.
- API 그룹마다 다른 진입점으로 접근하게 합니다.
- Spring Boot 에서 원활한 사용을 위해 지원되는 내용이 있습니다. 관련 내용은 https://github.com/kubernetes-client/java/blob/master/docs/java-controller-tutorial-rewrite-rs-controller.md 참고해주세요.
- DSL API 를 사용할 수 있는 extension 도 제공합니다. 다만, 이 경우 Config 설정을 static 변수로 할당하기 때문에 동시에 여러개의 Cluster 에 접근하게 되는 경우 문제가 발생할 수 있습니다. 자세한 내용은 https://github.com/kubernetes-client/java/blob/master/docs/kubectl-equivalence-in-java.md 에서 확인할 수 있습니다.
- 자체 컨트롤러를 작성하는 빌더 라이브러리를 제공합니다. 자세한 내용은 https://kubernetes.io/blog/2019/11/26/develop-a-kubernetes-controller-in-java/ 에서 확인할 수 있습니다.
🏁 Fabric8 Kubernetes Client 특징
- Kubernetes API 와 상호 작용하기 위한 풍부한 DSL API 를 제공합니다.
- OkHttp3, JDK HttpClient, Jetty 등 다양한 HTTP Client 라이브러리를 사용할 수 있습니다.(default: OkHttp3)
- watch 기능을 위해 WebSocket을 사용하고 Kubernetes 리소스 watch 의 안정성을 위해 재연결 기능을 지원합니다.
- 시스템 속성, 환경 변수 를 통해 kubeconfig 파일 및 ServiceAccount 토큰, 마운트된 CA 인증서와 같은 클러스터 연결 구성을 다양한 방법으로 할 수 있습니다.
- 자신의 필요에 맞게 확장 기능을 만들 수 있습니다. 현재 Knative, Tekton, Istio, CertManager, ServiceCatalog, VolumeSnapshot, ChaosMesh, OpenClusterManagement 및 Kudo 용 확장 기능이 존재합니다.
- Java 소스에서 CustomResourceDefinition YAML 매니페스트를 생성할 수 있습니다.
- CustomResourceDefinition YAML 매니페스트에서 Java POJO를 생성할 수 있습니다.
첨부드린 링크에 각 라이브러리별 API 사용에 대한 샘플 코드가 있으니 관심있으신 분들께서는 한번 읽어보시면 좋겠습니다.