Coherence. Instalar Coherence Operator en OKE y configurar un cluster de Coherence.

Esta entrada pretende proporcionar una pequeña guía sobre como crear un cluster de Oracle Coherence en Kubernetes haciendo uso del Coherence Operator. La implementación elegida es el Oracle Kubernetes Engine que está incluido dentro de la infraestructura cloud de Oracle (OCI).

Toda la información sobre el Operator está disponible en https://github.com/oracle/coherence-operator donde es mas que recomendable la lectura del Quick Start (https://oracle.github.io/coherence-operator/docs/2.1.0/#/about/01_overview)

Bien, para comenzar a configurar el Coherence Operator hay que asumir algunas cosas:

  • Tenemos acceso a un cluster de oke (Oracle Kubernetes Engine)
  • Tenemos acceso al container registry de Oracle.
  • Disponemos de un cliente kubectl debidamente configurado.

Antes de nada, lo primero que debemos hacer es crear un secreto con las credenciales de acceso a https://container-registry.oracle.com. Que usaremos para la funccionalidad imagePullSecrets, que permitirá directamente a kubernetes acceder al repositorio de Oracle para descargarse las imágenes de Coherence.

$ kubectl create secret docker-registry my-coherence-secret \
      --namespace coherencetest \
      --docker-server=https://container-registry.oracle.com \
      --docker-username=my@email.com \
      --docker-email=my@email.com \
      --docker-password=mypassword

La instalación del Operator la haremos con HELM, y es así de sencilla:

$ helm repo add coherence https://oracle.github.io/coherence-operator/charts 
$ helm repo update
$ helm install  
--namespace coherencetest 
--set imagePullSecrets[0].name=ig-coherence-secret 
--name coherence-operator coherence/coherence-operator

$ kubectl get deployments -n coherencetest
 NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
 coherence-operator   1/1     1            1           15s

Una vez creado el Operator, sería bastante sencillo crear un cluster genérico, únicamente ejecutando la opción create con un yaml de tipo CoherenceCluster, pero no es lo que necesitamos, nosotros queremos crearnos un cluster con nuestro propio fichero de configuración de Coherence.

Para hacer que el GRID de Coherence que estamos creando sea capaz de cargar ficheros específicos de configuración o que haga uso de clases definidas por nosotros, debemos crear una imagen Docker en la que incluiremos todos los ficheros que queremos aplicar, en una estructura de directorios determinada:

FROM scratch
COPY files/lib/  /app/lib/
COPY files/conf/ /app/conf/

En nuestro files/conf tendremos nuestro fichero storage-cache-config.xml y si tuviésemos algún Jar, iría en el directorio files/lib

<?xml version='1.0'?>
<cache-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns="http://xmlns.oracle.com/coherence/coherence-cache-config"
              xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-cache-config coherence-cache-config.xsd">

  <caching-scheme-mapping>
    <cache-mapping>
      <cache-name>test1</cache-name>
      <scheme-name>serverig</scheme-name>
    </cache-mapping>
    <cache-mapping>
      <cache-name>test2</cache-name>
      <scheme-name>serverig</scheme-name>
    </cache-mapping>
    <cache-mapping>
      <cache-name>test3</cache-name>
      <scheme-name>serverig</scheme-name>
    </cache-mapping>
  </caching-scheme-mapping>

  <caching-schemes>
    <distributed-scheme>
      <scheme-name>serverig</scheme-name>
      <service-name>ExampleDistributedIG</service-name>
      <backing-map-scheme>
        <local-scheme>
          <high-units>{back-limit-bytes 0B}</high-units>
        </local-scheme>
      </backing-map-scheme>
      <autostart>true</autostart>
    </distributed-scheme>
  </caching-schemes>
</cache-config>

Con la estructura de ficheros, genero la imagen:

docker build -t my-example:1.0.0 .

La subimos a un repositorio visible desde OKE, en nuestro caso la subiremos al repositorio del cloud en el que tenemos nuestro cluster de Kubernetes. Para configurar el acceso al Registry de Oracle, se puede seguir este tutorial: Push an Image to Oracle Cloud Infrastructure Registry

$ docker login fra.ocir.io
$ docker tag my-example:1.0.0 fra.ocir.io/fr1igxzyxw5l/my-example:1.0.0
$ docker push fra.ocir.io/fr1igxzyxw5l/my-example:1.0.0

Para nuestro ejemplo, y evitar problemas de acceso durante el despliegue, hacemos la imagen recién subida pública.

Es hora de configurar nuestro yaml para crear los nodos de coherence:

apiVersion: coherence.oracle.com/v1
kind: CoherenceCluster
metadata:
  name: my-cluster
spec:
  jvm:
    memory:
      heapSize: 2g
  imagePullSecrets:
    - name: my-coherence-secret
  application:
    image: fra.ocir.io/fr1igxzyxw5l/my-example:1.0.0
  roles:
    - role: storage
      replicas: 2
      resources:
        requests:
          memory: "3Gi"
          cpu: "500m"
        limits:
          memory: "3Gi"
          cpu: "500m"
      coherence:
        cacheConfig: storage-cache-config.xml
        storageEnabled: true

Y lo ejecutamos:

kubectl create -f my-cluster.yaml

Si listamos los pods:

NAME                                      READY   STATUS    RESTARTS   AGE
pod/coherence-operator-868c595d49-99l56 1/1 Running 0 1h
pod/my-cluster-storage-0 1/1 Running 0 13s
pod/my-cluster-storage-1 1/1 Running 0 13s

Cuando esten «ready», podemos verificar que el cluster está funcionando entrando a cada uno de los nodos que a su vez están en cada uno de los Pods, y una vez dentro cachear una variable desde uno y recuperarlo desde el otro:

$ kubectl exec -it my-cluster-storage-0 bash /scripts/startCoherence.sh console
Map (?): cache test1
Map (test1): put mykey myvalue
 null
Map (test1): get mykey
 myvalue
Map (test1): bye
$ kubectl exec -it my-cluster-storage-1 bash /scripts/startCoherence.sh console
Map (?): cache test1
Map (test1): get mykey
 myvalue
Map (test1): bye

OJO!!!
Cuando creamos un pool de nodos en OKE, si dejamos que la red se cree/configure automáticamente, se crean 2 subredes, una de ellas privada para la comunicación entre los diferentes nodos de kubernetes. Es necesario que se habilite el trafico UDP en esta red, ya que si no se hace, no se encontraran los nodos de coherence y a veces ni siquiera arrancarán correctamente.

Escalado
Podemos incrementar o disminuir el número de Pods con:

kubectl scale --replicas=3 coherencerole/my-cluster-storage

Read More

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *