Coherence. Crear un nodo de tipo proxy con Coherence Operator.

En una entrada anterior se puede ver como crear un grid de Coherence en Oracle Cloud Service a través del proyecto open source Coherence Operator.

En esta entrada vamos a hacer uso de la instalación anterior para añadir un nuevo tipo de nodo al GRID, un nodo de tipo Proxy, mas concretamente Proxy Extend, que actualmente como servidor para dar acceso al cluster a Clientes Extend (Coherence*Extend). Configuraremos un servicio, primero para acceso interno (ClusterIP) y después lo modificaremos para hacer el Grid «Accesible desde Internet» dotando de una IP Pública al cluster convirtiendo este servicio en un LoadBalancer.

Por un tema de organización, vamos a crear un nuevo fichero de configuración de Coherence donde configuraremos el puerto de escucha del servicio de Proxy Extend. Como particularidad, decir que la ip de escucha debe ser «cualquier ip» (0.0.0.0), ya que ésta la gestionará Kubernetes a través de sus servicios.

El fichero de configuración proxy-cache-config.xml quedará así:

<?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>
    <proxy-scheme>
      <service-name>Proxy</service-name>
      <acceptor-config>
        <tcp-acceptor>
          <local-address>
            <address system-property="coherence.extend.address">0.0.0.0</address>
            <port system-property="coherence.extend.port">20000</port>
          </local-address>
        </tcp-acceptor>
      </acceptor-config>
      <load-balancer>client</load-balancer>
      <autostart>true</autostart>
    </proxy-scheme>
  </caching-schemes>
</cache-config>

Creamos una nueva imagen de Docker (o una nueva versión) que incluya este fichero, y la subimos al OCIR (Oracle Registry):

$ docker build -t my-example:1.0.1 .
$ docker login fra.ocir.io
$ docker tag ig-example:1.0.1 fra.ocir.io/fr1igxzyxw5l/my-example:1.0.1
$ docker push fra.ocir.io/fr1igxzyxw5l/ig-example:1.0.1

Modificamos nuestro yaml para añadir un nuevo ROLE de tipo proxy, de momento solo vamos a especificar el puerto de escucha y el fichero de configuración que debe cargar:

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.1
  roles:
    - role: storage
      replicas: 2
      resources:
        requests:
          memory: "3Gi"
          cpu: "500m"
        limits:
          memory: "3Gi"
          cpu: "500m"
      coherence:
        cacheConfig: storage-cache-config.xml
        storageEnabled: true
    - role: proxy
      replicas: 1
      ports:
        - name: proxy
          port: 20000
      coherence:
        cacheConfig: proxy-cache-config.xml
        storageEnabled: false

Aplicamos el cambio y listamos los servicios:

$ kubectl apply -f my-cluster.yaml
$ kubectl get svc

NAME                          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
my-cluster-proxy-headless     ClusterIP   None                   7/TCP       4m34s
my-cluster-proxy-proxy        ClusterIP   10.96.207.29           20000/TCP   4m34s
my-cluster-storage-headless   ClusterIP   None                   7/TCP       4m35s
my-cluster-wka                ClusterIP   None                   7/TCP       4m36s

Aquí vemos el servicio my-cluster-proxy-proxy, que tiene una IP (privada) de escucha. Esto quiere decir que podríamos conectarnos con un cliente Extend si estuviésemos dentro del cluster. Nosotros vamos a hacer trampa y vamos a configurar el reenvío de puertos para poder hacer la prueba:

kubectl port-forward my-cluster-proxy-0 20000:20000

Configuramos nuestro fichero cache_config.xml cliente para acceder a la IP 127.0.0.1 y al puerto 20000. Y probamos a traernos la entrada con la que probamos en la anterior entrada (y que seguirá ahí si no hemos reiniciado el cluster por completo):

<?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">
 <scope-name>test.coherence</scope-name>
  <caching-scheme-mapping>
  <cache-mapping>
      <cache-name>test1</cache-name>
      <scheme-name>cohi-proxy</scheme-name>
  </cache-mapping>
  <cache-mapping>
      <cache-name>test2</cache-name>
      <scheme-name>cohi-proxy</scheme-name>
  </cache-mapping>
  <cache-mapping>
      <cache-name>test3</cache-name>
      <scheme-name>cohi-proxy</scheme-name>
  </cache-mapping>

  </caching-scheme-mapping>

<caching-schemes>
  <remote-cache-scheme>
   <scheme-name>cohi-proxy</scheme-name>
   <service-name>ExampleDistributedIG</service-name>
   <initiator-config>
    <tcp-initiator>
     <remote-addresses>
    <socket-address>
     <address system-property="proxy.address">127.0.0.1</address>
     <port system-property="proxy.port">20000</port>
    </socket-address>
     </remote-addresses>
    </tcp-initiator>
   </initiator-config>
  </remote-cache-scheme>
</caching-schemes>
</cache-config>
$ ./misScripts/startMyCoherence.sh
Map (?): cache test1
Map (test1): get mykey
 myvalue
Map (test1): bye

Si queremos que la IP sea pública, y poder acceder a mi cluster de Coherence desde cualquier lugar, solo hay que modificar un poco la definición del ROLE proxy, añadiéndole el tipo (a LoadBalancer), el protocolo y para no liarnos, le cambiaremos también el nombre:

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.1
  roles:
    - role: storage
      replicas: 2
      resources:
        requests:
          memory: "3Gi"
          cpu: "500m"
        limits:
          memory: "3Gi"
          cpu: "500m"
      coherence:
        cacheConfig: storage-cache-config.xml
        storageEnabled: true
    - role: proxy
      replicas: 1
      ports:
        -  name: proxy
           port: 20000
           protocol: TCP
           service:
             enabled: true
             name: ig-cluster-loadbalancer
             port: 20000
             type: LoadBalancer 
      coherence:
        cacheConfig: proxy-cache-config.xml
        storageEnabled: false

Si listamos los servicios ahora:

$ kubectl get svc
NAME                                  TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)           AGE
 service/ig-cluster-loadbalancer       LoadBalancer   10.96.207.29   131.141.250.155   20000:30700/TCP   56s
 service/ig-cluster-proxy-headless     ClusterIP      None                        7/TCP             21m
 service/ig-cluster-storage-headless   ClusterIP      None                        7/TCP             21m
 service/ig-cluster-wka                ClusterIP      None                        7/TCP             21m

Ya podemos acceder a las diferentes cachés del cluster sin necesidad de configurar el Port Forward:

...
<caching-schemes>
  <remote-cache-scheme>
   <scheme-name>cohi-proxy</scheme-name>
   <service-name>ExampleDistributedIG</service-name>
   <initiator-config>
    <tcp-initiator>
     <remote-addresses>
    <socket-address>
     <address system-property="proxy.address">131.141.250.155</address>
     <port system-property="proxy.port">20000</port>
    </socket-address>
     </remote-addresses>
    </tcp-initiator>
   </initiator-config>
  </remote-cache-scheme>
</caching-schemes>
...

Read More

1 Comment

Deja una respuesta

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