Operador para mongodb desarrollado en java, con javaoperatorsdk https://javaoperatorsdk.io/docs/getting-started/
Asegúrate de tener instalado:
- Java 17+
- Maven
- Docker
- Kind (
brew install kind
en macOS) kubectl
configurado
mvn io.javaoperatorsdk:bootstrapper:5.1.1:create \
-DprojectGroupId=org.acme \
-DprojectArtifactId=mongodb-operator
cd mongodb-operator
- Define tu
CustomResource
(MongodbCustomResource
,MongodbSpec
,MongodbStatus
) - Implementa tu
MongodbReconciler
- Agrega la clase
Runner
con:
public class Runner {
public static void main(String[] args) {
KubernetesClient client = new KubernetesClientBuilder().build
8000
();
Operator operator = Operator.create(client);
operator.register(new MongodbReconciler(client));
operator.start();
}
}
<dependencies>
<dependency>
<groupId>io.javaoperatorsdk</groupId>
<artifactId>operator-framework</artifactId>
<version>5.1.1</version>
</dependency>
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>kubernetes-client</artifactId>
<version>6.9.0</version>
</dependency>
</dependencies>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<mainClass>org.acme.Runner</mainClass>
</configuration>
</plugin>
mvn clean compile
El CRD se genera en:
target/classes/META-INF/fabric8/*.yaml
Aplica el CRD en Kind:
kubectl apply -f target/classes/META-INF/fabric8/<archivo_crd>.yml
kind create cluster --name java-operator
kubectl cluster-info --context kind-java-operator
- Crea el Dockerfile:
FROM eclipse-temurin:17-jdk
WORKDIR /app
COPY target/mongodb-*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
- Construye la imagen local:
mvn clean package -DskipTests
docker build -t mongodb-operator:latest .
- Carga la imagen en Kind:
kind load docker-image mongodb-operator:latest --name java-operator
Crea un manifiesto de Deployment
(por ejemplo, operator-deployment.yaml
):
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongodb-operator
spec:
replicas: 1
selector:
matchLabels:
app: mongodb-operator
template:
metadata:
labels:
app: mongodb-operator
spec:
containers:
- name: operator
image: mongodb-operator:latest
imagePullPolicy: IfNotPresent
Despliega:
kubectl apply -f operator-deployment.yaml
Ejemplo YAML mongodb-sample.yaml
:
apiVersion: org.acme/v1
kind: MongodbCustomResource
metadata:
name: test-mongo
spec:
database: mydb
Aplica:
kubectl apply -f test-resource.yaml
kubectl logs deployment/mongodb-operator
kubectl get pods
kubectl get mongodb
El proyecto incluye un Makefile
que simplifica la compilación, construcción de imágenes y despliegue del operador en Kubernetes.
Comando | Descripción |
---|---|
make build |
Compila el proyecto con Maven, omitiendo tests |
make image |
Construye la imagen Docker del operador |
make push |
Sube la imagen al registro configurado |
make kind-load |
Carga la imagen Docker al clúster Kind |
make deploy |
Aplica el Deployment en Kubernetes usando la imagen especificada |
make deploy-crd |
Aplica el CRD generado automáticamente |
make deploy-roles |
Aplica roles, bindings y permisos necesarios para ejecutar el operador |
make deploy-sample |
Aplica un ejemplo de recurso personalizado (Mongodb ) |
make logs |
Muestra los logs del operador desde Kubernetes |
make clean |
Elimina los recursos y archivos temporales generados |
make all |
Ejecuta build , image , push y deploy |
make all-local |
Ejecuta todo el flujo local: build, image, load en Kind, CRD, roles y despliegue |
📄 El archivo
k8s/operator-deployment.yaml
contiene el manifiesto base delDeployment
. Durantemake deploy
, se reemplaza dinámicamente__IMAGE__
por la imagen construida (mongodb-operator:0.1.0
por defecto).
make all-local
Esto compila, construye la imagen, la carga en Kind, aplica permisos, el CRD y despliega el operador en Kubernetes local.