Spring Cloud Kubernetes 

Spring Cloud Kubernetes provee implementaciones de interfaces de Spring Cloud para permitir a los desarrolladores construir y correr aplicaciones Spring Cloud dentro de entornos de Kubernetes

A continuación vamos a explicar una serie de pasos para poder incluir y usar Spring Cloud Kubernetes dentro de nuestros proyectos.

Añadir la dependencia

El primer paso será incluir la siguiente dependencia dentro del «pom.xml» de nuestro proyecto:

<dependency> 
       <groupId>org.springframework.cloud</groupId> 
       <artifactId>spring-cloud-starter-kubernetes-config</artifactId> 
</dependency> 

Configuración del proyecto

Una vez añadida la dependencia, hace falta configurar un par de ficheros en nuestro proyecto para poder hacer uso de las funcionalidades que Spring Cloud Kubernetes nos ofrece:

Creación de los ficheros de Kubernetes

Los config-map son ficheros de Kubernetes que nos permiten definir pares claves-valor que luego utilizar para la configuración de nuestros deployments. Un ejemplo de un config-map sería el siguiente: 

apiVersion: v1 by d 
kind: ConfigMap 
metadata: 
  name: onesait-cloudkubernetes 
data: 
  application.properties: |- 
    example.message= Testing reload! Message from backend is: %s <br/> Services : %s 

Una vez definido nuestro config-map, podremos importarlo dentro de nuestro deployment

onesait-cloudkubernetes.yaml

kind: Deployment 
apiVersion: apps/v1 
metadata: 
  name: onesait-cloudkubernetes 
  labels: 
    app: onesait-cloudkubernetes 
    group: architecture 
spec: 
  replicas: 1 
  selector: 
    matchLabels: 
      app: onesait-cloudkubernetes 
  template: 
    metadata: 
      creationTimestamp: null 
      labels: 
        app: onesait-cloudkubernetes 
    spec: 
      containers: 
        - name: app-back 
          image: >- 
            solucionesregistry.azurecr.io/architecture/cloud-kubernetes-example:dev 
          ports: 
            - name: 8080tcp8080 
              containerPort: 8080 
              protocol: TCP 
          envFrom: 
            - configMapRef: 
                name: onesait-cloudkubernetes 
          resources: 
            limits: 
              cpu: 500m 
              memory: 800Mi 
            requests: 
              cpu: 250m 
              memory: 500Mi 
          terminationMessagePath: /dev/termination-log 
          terminationMessagePolicy: File 
          imagePullPolicy: Always 
      restartPolicy: Always 
      terminationGracePeriodSeconds: 30 
      dnsPolicy: ClusterFirst 
      securityContext: {} 
      imagePullSecrets: 
        - name: solutionsregistry 
      schedulerName: default-scheduler 
  strategy: 
    type: Recreate 
  revisionHistoryLimit: 10 
  progressDeadlineSeconds: 600 

Configuración del cliente Java

En nuestro proyecto vamos a tener varias formas de recoger dichas variables de entorno que definamos en el config-map; la recomendada sería definir una clase de configuración que recoja las variables y acceder a ellas a través de dicha clase: 

ClientConfig.java  

@Configuration 
@ConfigurationProperties(prefix = "example") 
public class ClientConfig { 
 
    private String message = "Message from backend is: %s <br/> Services : %s"; 
    // getters and setters 
} 

En este ejemplo, estamos especificando que vamos a tener la variable «example.message», la cual posee un valor por defecto pero, en caso de que en nuestros ficheros de configuración se le especifique algún valor nuevo, se utilizaría dicho valor. 

Definiendo esta clase de configuración, el proyecto al arrancar buscará si existe dicha variable y obtendrá el valor que se le haya definido, en este caso el valor es el que ha sido definido en el config-map

Problemas con roles

Existe la posibilidad de que al arrancar la aplicación se indique que nuestro Service Account no tiene permisos para acceder a los config-maps o a los pods. Para solucionarlo, es necesario que creemos un nuevo rol con acceso a los siguientes resources

role-example.yaml

kind: Role 
apiVersion: rbac.authorization.k8s.io/v1 
metadata: 
  name: example 
rules: 
  - verbs: 
      - get 
      - watch 
      - list 
    apiGroups: 
      - '' 
    resources: 
      - configmaps 
      - pods 

Y posteriormente crear un role-binding de nuestro Service Account con el nuevo rol que se ha creado: 

role-binding-example.yaml

kind: RoleBinding 
apiVersion: rbac.authorization.k8s.io/v1 
metadata: 
  name: role-binding-example 
subjects: 
  - kind: ServiceAccount 
    name: default 
    namespace: onesait-caregiver 
roleRef: 
  apiGroup: rbac.authorization.k8s.io 
  kind: Role 
  name: example 

Recarga de variables en tiempo de ejecución

Spring Cloud Kubernetes nos ofrece la posibilidad de que nuestro proyecto recargue las variables de entorno importadas desde el configmap cada vez que estas sufran un cambio, de modo que la ejecución de la misma no se vea cortada y se apliquen los cambios automáticamente. Para ello es necesario definir las siguientes líneas en nuestro «application.yml»: 

application.yml  

spring.cloud.kubernetes.reload.enabled: true 
spring.cloud.kubernetes.reload.mode: event 
spring.cloud.kubernetes.reload.strategy: refresh 

Con esta configuración y recogiendo las variables en un fichero de configuración como el explicado anteriormente, a cada cambio que sufra el config-map, nuestra aplicación hará una recarga y actualizará los valores de las variables internas del programa.

Autor

Deja una respuesta

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