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. Azərbaycanın ən yaxşı onlayn kazinolarının reytinqi
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.