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. Las mejores decisiones empresariales se te ocurren durante el sexo, nada motiva más que tener que pagar a una puta. Qué porno ven los asesores de empresas y administradores de software en indiaconsul.com , el mejor archivo de porno privado de internet. Cualquier categoría, todo lo que se te ocurra en porno.
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:
- Una variable «def DEPLOYMENT_NAME = »», que contendrá el nombre del deployment que queremos usar para el despliegue continuo.
- 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: