Saltar a contenido

Repositorio de manifiestos

El repositorio de manifiesto es donde se encuentra toda la configuración de despliegue de nuestra aplicación.

Value.yaml

el archivo value.yaml es el que debemos modificar en primera instancia. Tiene la siguiente pinta

#############################################################################
#######################  Parametros para despliegue  ########################
#############################################################################
## NOMBRE DE APLICACION: [nombre-de-app]
#############################################################################
##
## Variables y Secrets ######################################################
env:
  # Definición de Variabless
  normal:
    # [key]:"[value]"
    entorno: "qa"
    redisHost: "10.20.0.10"
    redisPort: "6379"
    mysqlHost: "10.20.0.10"
    mysqlPort: "3306"
    apiURL: "{0}/api/Contratos/InformacionContratoPorNumeroDeEnvio/{1}?format=json"
  # Definición de Secrets
  secret:
    mysqlUsername: "user1"
    mysqlPassword: "password1"
    redisUsername: "user2"
    redisPassword: "password2"
    apiToken: "akgladkfi14$235kas#dlvxzxs"
#############################################################################
##
##  Grupo de aplicacion donde va a estar contenido ##########################
applicationGroup:
  # Si esta o no contenido: true o false
  group: true
  # Nombre
  partOf: "Bridge-MQ"
#############################################################################
##
## Revisiones y escalamiento horizontal #####################################
replicacontroller:
  # Cantidad de revisiones: de 1 a 3
  revisionHistoryLimit: 1
  # Cantidad de instancias (Pods): de 1 a 10
  replicas: 3
#############################################################################
##
## Red ######################################################################
service:
  # Puerto del servicio: [port]
  Port: 8080
  # Puerto del contenedor: [port]
  targetPort: 8080
##
# Formato estandar de ruta: 
# [nombre-de-app]-[nombre-de-proyecto]-[ambiente].clusterFQDN
# Exponer en una ruta privada: true o false
route: true
#############################################################################
##
##  Pruebas de lectura y vida ###############################################
healthcheck:
  # Ejecutar prueba de lectura: true o false
  readiness: false
  # Path: "[path]"
  readinesspath: "/index.html"
  # Port: "[Port]"
  readinessport: "8080"
  # Type: HTTP
  readinessscheme: HTTP
  # Ejecutar prueba de vida: true o false
  liveness: false
  # Path: "[path]"
  livenesspath: "/index.html"
  # Port: "[Port]"
  livenessport: "8080"
  # Type: HTTP
  livenessscheme: HTTP
#############################################################################
##
##  Cronjobs ################################################################
cronjob:
  enable: false
  crons:
    "0":
     name: diario
     schedule: "10 10 * * *"
     successfulJobsHistoryLimit: 3
     failedJobsHistoryLimit: 1
    "1":
     name: semanal
     schedule: "10 10 * * 5" 
     successfulJobsHistoryLimit: 3
     failedJobsHistoryLimit: 1
    "2":
     name: mensual
     schedule: "10 10 5 * *"
     successfulJobsHistoryLimit: 3
     failedJobsHistoryLimit: 1
    "3":
     name: anual
     schedule: "10 10 * 12 5"
     successfulJobsHistoryLimit: 3
     failedJobsHistoryLimit: 1
#############################################################################
##
##  Configmap ###############################################################
configMap:
  enable: false
  path: /home/redis-master
  file: redis.conf
  key: redis-config
  map:
    linea1: "uno \n dos"

#############################################################################
##
##  Redireccion de Logs #####################################################
clusterlogging: true
#############################################################################
#############################################################################

Environment

env:
  # Definición de Variabless
  normal:
    # [key]:"[value]"
    entorno: "qa"

La configuración de variables de entorno de tipo normal se deben especificar el el espacio mencionado arriba, la estructura de las environment es KEY: VALUE. Este ejemplo se refleja en OCP de la siguiente manera:

single env

Para los proyectos de .NET, ya que trabajamos con archivos de configuración json o yaml debemos convertir a environment de entorno que sean compatibles con Bash. Pueden profundizar en "Variables de entorno".

Ejemplo:

example:
  key: value
  array:
    - keyArray: value
    - value 

Mapping:

example__key = value

example__array__0__keyArray = value

example__array__1 = value

ATENCIÓN: debemos cargar todas las variables de entorno que sean para configuración de nuestra app y que puedan modificar el comportamiento de la app. No debemos tener archivos de configuración para PROD o QA dentro de los repositorios de código, esto es por temas de seguridad y para evitar generar una nueva versión en caso de modificar la config

Importante: Utilizar entrecomillado con comillas dobles ("Valor") para todos los valores. No utilizar variables de entorno sin un valor establecido, o con un valor vacío ("").

Secrets

Desde el manifiesto podemos generar secrets de ocp

env:
  secret:
    DataAccessRegistry__ProviderName: System.Data.SqlClient

Esto se refleja en OCP de la siguiente manera...

secrets

Es recomendable que los datos sensibles (tokens, api keys, conexiones, etc) estén configurados de a través de Secrets. Si no se utilizan secrets, es importante dejar igualmente la sección, aunque no contenga ninguno.

Application Group

El Application Group es un agrupador de aplicaciones que ofrece OCP, no tiene un valor relevante para el despliegue pero si para mejorar la visibilidad de las aplicaciones en el namespace de OCP.

applicationGroup:
  # Si esta o no contenido: true o false
  group: true
  # Nombre
  partOf: "Bridge-MQ"

partOf representa al nombre de application group.

En caso de tener muchas apps y aplication group nuestro namespace podría tener la siguiente pinta...

app group

Actualmente esta función no está disponible en CICD, pero es una funcionalidad que se estará agregando pronto.

Replication Controller

El replication controller es el encargado de manejar la cantidad de réplicas levantadas que tenemos de nuestra app.

replicacontroller:
  # Cantidad de revisiones: de 1 a 3
  revisionHistoryLimit: 1
  # Cantidad de instancias (Pods): de 1 a 10
  replicas: 3

réplicas es el valor que debemos modificar para incrementar o decrementar la cantidad de Pod.

En caso de que replicas:0 se realizara el despliegue pero no va a tener ninguna instancia levantada, use esta información para dar de baja o apagar el servicio. Si por alguna razón fuera necesario reiniciar un servicio, sólo es necesario poner las réplicas a 0 y luego volverlas a establecer en el número en que estaban.

ATENCIÓN: no debemos superar el límite de 10 instancias por aplicación, en caso de necesitar más instancias comunicarse con infraestructura.

Podemos ver la cantidad de instancias en:

replicas

Routes

Si necesitamos exponer una ruta interna debemos setear el flag de ...

route: true

Esto generará una Route de OCP con la siguiente nomenclatura:

[nombre-de-app]-[nombre-de-proyecto]-[ambiente].clusterFQDN

Ej: https://api-b2c-architecture-it-qa.apps.ocpprod.andreani.com.ar

Health Checks

healthcheck:
  # Ejecutar prueba de lectura: true o false
  readiness: false
  # Path: "[path]"
  readinesspath: "/index.html"
  # Port: "[Port]"
  readinessport: "8080"
  # Type: HTTP
  readinessscheme: HTTP
  # Ejecutar prueba de vida: true o false
  liveness: false
  # Path: "[path]"
  livenesspath: "/index.html"
  # Port: "[Port]"
  livenessport: "8080"
  # Type: HTTP
  livenessscheme: HTTP

Readiness

Un readiness determina si un contenedor está listo para aceptar solicitudes de servicio. Si el readiness falla para un contenedor, el kubelet elimina el pod de los enpoints disponibles del services.

Después de una falla, la sonda continúa examinando el módulo. Si el pod está disponible, el kubelet agrega el pod a la lista de los enpoints disponibles del services.

Esta acción lo podemos configurar desde...

  # Ejecutar prueba de lectura: true o false
  readiness: false
  # Path: "[path]"
  readinesspath: "/index.html"
  # Port: "[Port]"
  readinessport: "8080"
  # Type: HTTP
  readinessscheme: HTTP

Liveness

un Liveness determina si un contenedor aún se está ejecutando. Si la Liveness falla debido a una condición como un interbloqueo, el kubelet elimina el contenedor. Luego, el pod responde según su política de reinicio.

Por ejemplo, un Liveness en un pod con restartPolicy de Always o OnFailure elimina y reinicia el contenedor.

Para ejecutar la acción debemos configurar...

  # Ejecutar prueba de vida: true o false
  liveness: false
  # Path: "[path]"
  livenesspath: "/index.html"
  # Port: "[Port]"
  livenessport: "8080"
  # Type: HTTP
  livenessscheme: HTTP

Ambos mecanismos realizan una petición HTTP a la ruta y puerto especificado.

En caso de no obtener un response con status code 200, se interpretará como que fallo la prueba, en caso de fallar 3 veces consecutivas el mecanismo procederá a ejecutar la acción pertinente, deshabilitar o reiniciar el pod respectivamente.

Estas pruebas se repiten con un periodo de 30 segundos y todos los despliegues tienen la política de reinicio seteada como restartPolicy: Always

Un ejemplo de configuración:

Si utilizamos Platform NET tenemos la configuración de HealthCheck por lo que debemos apuntar al path /health

healthcheck:
  # Ejecutar prueba de lectura: true o false
  readiness: true
  # Path: "[path]"
  readinesspath: "/health"
  # Port: "[Port]"
  readinessport: "8080"
  # Type: HTTP
  readinessscheme: HTTP
  # Ejecutar prueba de vida: true o false
  liveness: true
  # Path: "[path]"
  livenesspath: "/health"
  # Port: "[Port]"
  livenessport: "8080"
  # Type: HTTP
  livenessscheme: HTTP

Cron Job

Config Map

Recolección de Logs de Pod

el flag

clusterlogging: true

Habilita la redirección de logs de consola a elasticsearch.

¡ATENCIÓN! en caso de ser un project (namespace) de OCP nuevo, se debe solicitar a infraestructura por única vez que se redireccionen los logs.