Despliegue continuo con OpenShift

En la entrada de hoy os queremos mostrar un ejemplo de las acciones mínimas necesarias para automatizar un despliegue en un clúster de OpenShift.

Antes de empezar

Como requisitos previos antes de ponernos al tema, vamos a necesitar disponer de lo siguiente:

  • Un usuario con permisos para realizar cambios en el namespace de OpenShift.
  • Acceso a través de la consola web o a través de terminal.
  • Se ha llevado a cabo la instalación inicial y configuración del Producto o Proyecto el cual queremos automatizar (deployments, pod, etc.).

Configuración previa OpenShift

Para poder realizar el despliegue continuo en OpenShift es necesario obtener el fichero «.kubeconfig», el cual contiene la información necesaria de permisos y accesos para poder operar sobre el namespace elegido.

A continuación detallamos una manera de poder crear un «ServiceAccount» específico para obtener el «.kubeconfig» que nos permita desplegar de manera automatizada.

Crear un ServiceAccount

Esto lo vamos a poder realizar de dos maneras.

A través de la consola web

En el lateral, seleccionamos el menú de User Management > ServiceAccount.

Pulsamos en donde pone «Create ServiceAccount» y lo completamos de la siguiente manera:

Si todo ha ido bien, podremos ver que se ha creado correctamente y aparecerá en el listado inicial:

A través del terminal de OpenShift

Ejecutando el siguiente comando:

oc create sa cd-jenkins-user

Si lo listamos, podremos ver que se ha creado correctamente:


Creación de un Rol específico

Para poder controlar qué operaciones pueden realizarse o sobre que recursos de los existentes un rol puede realizar modificaciones, es interesante crear un tipo de rol específico que se encuentre limitado para que no se realicen acciones no deseadas.

Esto, como en el caso anterior, podemos hacerlo de dos maneras posibles.

A través de la consola web

Para ello, nos situamos nuevamente en el menú lateral, seleccionado el menú User Management > Roles, y pulsando en «Create Role».

Rellenamos el yaml con los datos de las opciones permitidas sobre los recursos que creemos conveniente. Un ejemplo podría ser:

En este yaml se indica que sólo se van a poder realizar acciones «get o patch» para el grupo apps. Estas modificaciones solo se permiten hacer en los deployments y solo aquellos listados en «resourceNames».

A través del terminal de OpenShift

En este caso, ejecutaremos el siguiente comando con los valores necesarios:

oc create role deploy-cd --verb=get --verb=patch --resource=deployments -n 

Asociar Rol al ServiceAccount

En este paso asociamos el rol que queremos que nuestro ServiceAccount tenga. Le podríamos asociar cualquier rol ya existente, pero para este tutorial vamos a usar el rol que hemos creado en el paso previo.

A través de la consola web

Navegaremos a la opción de menú User Management > RoleBindings y pulsamos en «Create Binding».

Rellenaremos el formulario de la siguiente manera, seleccionando el ServiceAccount que hemos creado anteriormente:

Una vez creado, podremos verlo en la lista.

A través del terminal de OpenShift

Haremos uso del siguiente comando:

oc policy add-role-to-user admin -z cd-jenkins-user --rolebinding-name=jenkins

Hecho esto, podremos listarlo para ver que se ha creado correctamente.

Generar el archivo .kubeconfig a partir de un ServiceAccount

Ahora nos quedaría generar el fichero .kubeconfig del ServiceAccount, que añadiremos después al repositorio de nuestro código que queremos automatizar.

En los pasos anteriores hemos creado un ServiceAccount específico asociándole un rol. Estos pasos son opcionales ya que si ya disponemos de un ServiceAccount, no sería necesario generar uno nuevo.

A través de la consola web

Navegaremos dentro de los detalles del ServiceAccount generado, desplegando en la parte derecha el menú de «Actions» y seleccionando «Download kubeconfig file».

A través del terminal de OpenShift

Para generarlo, ejecutaremos el siguiente comando:

oc serviceaccounts create-kubeconfig cd-jenkins-user > kubeconfig-operational.kubeconfig

Recordemos que «cd-jenkins-user» es el nombre del ServiceAccount que hemos generado anteriormente. Esto nos genera un fichero llamado «kubeconfig-operational.kubeconfig» (podremos ponerle el nombre que queramos).

Acciones a realizar dentro del proyecto para automatizar el despliegue

Bueno, ya tenemos todo preparado, así que a continuación vamos a realizar una serie de acciones dentro de nuestro proyecto que nos permita llevar a cabo la automatización del despliegue.

Modificar el archivo podTemplate.yml

En caso de que no lo tengamos, tendremos que crearlo. Una vez localizado o creado, lo abrimos y añadimos lo siguiente:

- name: kubectl
   image: lachlanevenson/k8s-kubectl:latest
   command:
      - cat
   tty: true

Modificar el archivo JenkinsFile

En donde tendremos que añadir lo siguiente:

  1. Una variable «def DEPLOYMENT_NAME = »», que contendrá el nombre del deployment que queremos usar para el despliegue continuo.
  2. Añadir el siguiente stage, según el criterio del proyecto:
stage('Deploy Application'){
  steps{
    container('kubectl'){
      script {
        datevar = sh(returnStdout: true, script: 'date +%s').trim()
      }
      dir("devops") {
        sh "kubectl patch deploy '${DEPLOYMENT_NAME}' -p '{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"deployDate\":\"${datevar}\"}}}}}' --kubeconfig=kubeconfig"
      }
    }
  }
} 

Incorporar el archivo .kubeconfig generado en el directorio a criterio del proyecto

En el script anterior se hace referencia al directorio «devops».

Resultado

Una vez realizados los pasos anteriores, en función de las configuraciones de cada proyecto, podemos ver en Jenkins que se realiza un paso de Deploy Application (el stage que hemos añadido):

Podemos ver los registros del despliegue:

Ahora, podremos entrar en la consola de OpenShift y comprobar que en el deployment se ha actualizado el .yaml con el campo «deployDate»:

También comprobaremos que se ha producido el despliegue:

Autor

Deja una respuesta

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