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>
...

Superb Blog, das pure Leidenschaft strahlt … Beatrice Fredrick Anuska