My Profile Photo

Mauricio Villagran - Blog


#Cloud #DevOps #Azure #Powershell #Microsoft


Kubernetes & CI/CD App - Capitulo 2

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.

Jenkins deploy using Helm

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.