핵심요약
이 포스트는 Golang 기반의 쿠버네티스 오퍼레이터 개발 경험을 확장하여, Java Operator SDK를 활용해 쿠버네티스 오퍼레이터를 구현하고 로컬 환경에서 테스트 및 배포하는 방법을 상세히 다룹니다.
Java Operator SDK를 활용한 Kubernetes Operator 구현
Java Operator SDK 아키텍처 및 핵심 구현 요소
- Java Operator SDK는 fabric8io Kubernetes Client Java API 기반으로, 개발자 친화적인 Java API를 통해 Kubernetes Operator 구현을 간소화합니다.
- 아키텍처: Operator 내 Controller는 단일 리소스를 조정하며, EventSourceManager가 EventSource의 수명 주기를 관리합니다. Event 발생 시 EventProcessor를 거쳐 ReconcilerDispatcher가 Reconciler 메소드를 호출하여 리소스 상태를 업데이트합니다.
- 필수 구현: 개발자는 Primary Resource(CRD), Spec 및 Status, Reconciler, 그리고 KubernetesDependentResource(Deployment, Service, Ingress 등)를 Java 클래스로 정의해야 합니다.
Kubernetes Operator 구현 과정
- 프로젝트 설정: Spring Boot 프로젝트를 생성하고,
build.gradle에io.fabric8:crd-generator-apt및io.javaoperatorsdk:operator-framework-spring-boot-starter의존성을 추가합니다. - Custom Resource (CRD) 정의:
PetclinicSpec,PetclinicStatus클래스를 생성하고, 이를 참조하는PetclinicPrimary Resource Class를@Group,@Version어노테이션과 함께CustomResource를 확장하여 구현합니다. - Dependent Resource 정의: Deployment, Service, Ingress 등의 Kubernetes 리소스들을
CRUDKubernetesDependentResource를 확장하고@KubernetesDependent어노테이션을 사용하여 구현하며,desired()메소드에서 CR 상태 기반으로 K8s 리소스 manifest를 생성합니다. - Reconciler 및 Config:
PetclinicReconciler는Reconciler,ErrorStatusHandler,Cleaner인터페이스를 구현하며,@ControllerConfiguration을 통해 Dependent Resources를 연결합니다.PetclinicOperatorConfig에서Reconciler와Operator를 Spring Bean으로 등록하여 Operator 라이프사이클을 관리합니다.
배포 및 동작 검증
- CRD 적용: 컴파일 시 자동으로 생성되는 CRD YAML(
petclinics.spring.my.domain-v1.yml)을kubectl apply명령어로 로컬 Kind 클러스터에 등록합니다. - 로컬 및 통합 테스트: PetclinicOperatorJavaApplication 실행 후 Petclinic CR을 배포하여 Deployment, Service, Ingress 생성을 확인하고 Petclinic 웹 페이지 접속을 검증합니다.
@EnableMockOperator를 활용하여 Kubernetes 클러스터 모킹을 통한 통합 테스트를 수행합니다. - Operator 배포: Gradle Build로 생성된
jar파일로 Docker 이미지를 빌드 및 푸시한 뒤, Kubernetes 매니페스트를 통해 ServiceAccount, Deployment, ClusterRoleBinding, ClusterRole을 배포하여 Operator를 구동하고 최종 동작을 확인합니다.