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