Esta va a ser una serie de posts, en los que como siempre, me mata la curiosidad por seguir aprendiendo del tema. Les voy a mostrar cosas tan simples como desplegar un mini cluster de kubernetes en Windows, tambien veremos como instalar Jenkins en dicho cluster con Helm, y por ultimo armar un pipeline para desplegar una aplicacion. Esta va a ser una serie de tres post los cuales ire subiendo a medida que pueda irlos publicando.
Introducción
A continuacion vamos a ir definiendo los capitulos que vamos a ir publicando en este post:
-
Instalacion de un cluster de Kubernetes en Windows (En este caso use mi notebook, I5, 16 GB Ram, etc).
-
Despliegue de Jenkins en dicho cluster, puede ser usando Helm o tambien armando la receta para desplegar en Kubernetes.
-
Crearemos un pipeline de CI/CD, en el cual como resultado final, desplegara una aplicacion.
Despliegue de Jenkins
Podemos desplegar Jenkins de dos maneras diferentes, la primera es usando un gestor de paquetes para kubernetes llamado Helm.
Aqui en la documentacion oficial se explica muy bien como desplegarlo.
Hay una segunda forma que es generando nosotros nuestros manifiestos. A continuacion les muestro como hacerlo y desplegar jenkins en el cluster de kubernetes.
Pasos
Creamos un name space llamado Jenkins
kubectl create ns jenkins
Luego creamos un manifiesto llamado jenkins.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
containers:
- name: jenkins
image: jenkins/jenkins:lts
ports:
- name: http-port
containerPort: 8080
- name: jnlp-port
containerPort: 50000
volumeMounts:
- name: jenkins-vol
mountPath: /var/jenkins_vol
volumes:
- name: jenkins-vol
emptyDir: {}
Este manifiesto se encarga de crear un deployment en kubernetes, con la ultima imagen de jenkins y expone el puerto del contenedor. Ademas monta un volumen persistente, entre otras configuraciones.
A continuacion vamos a crear este deployment usando dicho manifiesto.
kubectl create -f jenkins.yml
En algunos minutos podremos ver el estado de los pods correspondientes al despliegue de jenkins, ejecutando el siguiente comando:
kubectl get pods -n jenkins
Deberiamos obtener una salida como la siguiente:
NAME READY STATUS RESTARTS AGE
jenkins-6fb205cfc5-twnvn 1/1 Running 0 5s
Lo siguiente que vamos a hacer es exponer el pod que tenemos corriendo, desplegando un Service en kubernetes.
Vamos a crear el siguiente manifiesto llamado jenkins-service.yaml
apiVersion: v1
kind: Service
metadata:
name: jenkins
spec:
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 32000
selector:
app: jenkins
---
apiVersion: v1
kind: Service
metadata:
name: jenkins-jnlp
spec:
type: ClusterIP
ports:
- port: 50000
targetPort: 50000
selector:
app: jenkins
En el manifiesto, se define un NodePort que expone el puerto 8080 del pod hacia el puerto 32000, que es el puerto al cual vamos a acceder luego con la url que nos de jenkins.
No se olviden que el concepto de NodePort consta en exponer el mismo puerto por cada nodo worker que forme parte del cluster.
A continuacion crearemos este servicio:
kubectl get services --namespace jenkins
Luego para comprobar que el servicio esta corriendo, ejecutaremos el siguiente comando:
kubectl get services --namespace jenkins
Esto deberia devolver una salida parecida a la siguiente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jenkins NodePort cluster_ip <none> 8080:30000/TCP 20m
Accediendo a Jenkins
Como estamos exponiendo jenkins usando NodePort debemos conocer las ip de nuestros nodos, para ello ejecutamos el siguiente comando:
kubectl get nodes -o wide
Recordar que podemos acceder a jenkins con cualquiera de las ip de los nodos workers, y el puerto expuesto 32000
Accederemos a la siguiente Url http://external_ip:32000
Al acceder a la url de jenkins en la primer pantalla, solicita un password de administrador generado por defecto. Para ello debemos ver los logs de alguno de los pods de jenkins.
Ejecutaremos:
kubectl get pods -n jenkins
Una vez ejecutado el comando, obtendremos la salida de los pods que estan corriendo.
NAME READY STATUS RESTARTS AGE
jenkins-6fb205cfc5-twnvn 1/1 Running 0 5s
Luego deberemos ver dichos logs del pod para obtener esta password, ejecutaremos el siguiente comando:
kubectl logs jenkins-6fb205cfc5-twnvn -n jenkins
Esto nos dara la siguiente salida, donde veremos dicha password para copiar y pegar en la web del asistente de configuracion de jenkins.
Running from: /usr/share/jenkins/jenkins.war
webroot: EnvVars.masterEnvVars.get("JENKINS_HOME")
. . .
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
your_jenkins_password
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
Copiamos your_jenkins_password la cual sera una combinacion de numeros y letras.
Luego es seguir el asistente, instalando los plugins a usar, etc.
Espero que les sea de utilidad.