Hoy voy a explicar como crear una pipeline en azure devops para que nos compile un dockerfile y lo publique en un Azure Container Registry.

Crear un Azure Container registry

Si ya lo tienes creado esta parte de la puedes saltar.

Podemos crearlo de muchas formas, yo aqui voy a proponer 2. La primera es de forma manual y la segundo usando terraform. En la parte de terraform solo dare algunas pautas pero si alguien quiere más detalle puede contactar conmigo sin problemas.

Desde el portal

Entramos a nuestro azure portal, accedemos a un resource group y le damos a crear.

Buscamos container registry y seleccionamos el primero.

  • Comprobamos que la subscription y el grupo de recursos es correcto
  • Ponemos el nombre que queremos, recuerda que solo se permite texto alfanumérico, sin guiones ni nada
  • Ubicación: Aquí ya depende de ti pero si estas en europa ya esta bien como sale en la imagen
  • Zona de disponibilidad: Esto es para habilitar la redundancia dentro de la misma region. Te pongo un link donde lo explican bastante bien. Si solo quieres trastear o es un entorno de desarrollo yo te aconsejo que lo dejes desactivado ahorraras dinero
  • SKU: depende del que elijas te saldrá más caro o no. Yo elegiré el básico que para este ejemplo es más que suficiente
    • Básico: 0,159 €/dia (unos 16 céntimos) con 10gb
    • Estándar: 0,633 €/dia 100gb
    • Prémium: 1,581 €/dia (1€ 60 céntimos aprox) con 500Gb, el único con zonas de disponibilidad, replicación geografica y la posibilidad de hacerlo privado.

Ya lo tenemos.

Con terraform

Yo os recomiendo que os creais un modulo de terraform. Si mucha gente me lo pide publicare el mio.

resource "azurerm_kubernetes_cluster" "kubernetes" { 
  name                            = <nombre que queremos ponerle al aks>
  location                        = <En que región la queremos, por ejemplo West Europe>
  resource_group_name             = <Nombre del resource group donde queremos el aks>
  dns_prefix                      = <el prefijo que le queremos dar al dns, es necesario para luego poder configurar un traffic manager>
  kubernetes_version              = <versión de kubernetes (k8s) que queremos>
  sku_tier                        = <si lo queremos free o Paid, con el Free no tenemos SLA>
  api_server_authorized_ip_ranges = <Lista de ips que queremos que tengan acceso al cluster, no es necesaria>
  node_resource_group             = <el nombre del resource group (lo crea él) que quieres para alojar los grupos de nodos, si no pones nada el pondra uno por defecto

  default_node_pool {
    name                         = <nombre que le quieres poner al pool de nodos por defecto>
    vm_size                      = <Como de grande quieres la VM>
    enable_node_public_ip        = <Si quieres que tenga una ip publica, yo te aconsejo que lo dejes en false>
    enable_auto_scaling          = <Si quieres autoescalado para el nodo por defecto>
    max_count                    = <Numero máximo de nodos que permitirás escalar>
    min_count                    = <Numero mínimo de nodos activos en el autoescalado>
    node_count                   = <numero de nodos que quieres al principio>
    type                         = <VirtualMachineScaleSets -> VMs con zonas de disponibilid>
    zones                        =<Las zonas de disponibilidad que activas, por ejemplo todas [1, 2, 3] >
    vnet_subnet_id               = <vnet id al que quieres que perteneza el nodo por defecto>
    tags                         = <simplemente tags que pueden ayudarte para hacer busquedas de recursos>
  }

< y mas cosas>
}

Os dejo los links para que veais todas sus configuraciones que necesitais

Pipeline yaml para Azure Devops

Lo primero que debemos hacer en nuestra pipeline es login contra el Azure Contairner Registry, a partir de ahora ACR.

Crear el service connection contra el ACR

Antes de nada necesitamos un token para poder conectarnos contra el ACR. Primero nos vamos a nuestro ACR nos vamos a «Tokens».

Creamos un nuevo token

En token escribimos el nombre de usuario que queremos, en asignación de ámbito o scopes tenenos tres opciones, un admin, pull (solo lectura) y push(escritura). También podemos crear scopes personalizados con los que podemos dar permisos a repositorios específicos. Para este ejemplo yo usare el genérico de push para poder publicar las imágenes.

Una vez creado tenemos podemos disponer de 2 passwords.

Generamos una de las passwords, podemos incluir fecha de expiración, y nos copiamos el token que nos ha generado.

Ahora nos vamos a nuestro Azure devops -> Nuestro proyecto-> settings-> Service connections -> new Service connection y elegimos el de tipo «Docker Registry».

Seleccionamos «others»

Docker Registry: ponemos la URL que nos da nuestro ACR en information

Docker Id: El nombre del token que hemos creado en el ACR.

Docker Password: La contraseña que hemos generado.

Service connection name: El nombre que le queremos dar a nuestro service connection, yo usare este ACRServiceConnection que es el que usare más adelante.

También puedes usar la opcion de Azure Container Registry pero necesitas permisos especiales que no siempre tenemos.

Login contra el ACR

Debemos usar la task «Docker@2» indicándole que queremos hacer un login y el nombre de la service connection de nuestro Azure

parameters:
  dockerRegistryServiceConnection : 'ACRServiceConnection' <-- Service connection de ACR

steps:
- task: Docker@2
  displayName: login to ACR
  inputs:
      command: login
      containerRegistry: ${{ parameters.dockerRegistryServiceConnection }}

Creamos la imagen docker

              - task: Docker@2
                displayName: Building Docker Image  $(buildVersion)
                inputs:          
                    command: build                    
                    repository: ${{ parameters.repository }}  <-- nombre del repositorio 
                    arguments: $(buildArguments) <- argumentos extras para el docker build, si los necesitas
                    dockerfile : $(Build.SourcesDirectory)/Dockerfile  <- Rais de nuestro repositorio que es donde pongo mis Dockerfiles pero puedes cambiarlos        
                    tags: | < Los tags, le pongo el lastes y el numero de versión de la build esto sera util para luego poder usar la imagen cuando queramos hacer un deploy contra AKS> 
                        latest
                        $(buildVersion)

Publicamos la imagen en ACR

- task: Docker@2
                displayName: Pushing Docker Image
                inputs:          
                    command: push
                    containerRegistry: ${{ parameters.dockerRegistryServiceConnection }} <- recordar que en mi caso su valor es ACRServiceConnection 
                    repository: ${{ parameters.repository }}                    
                    tags: |
                        latest
                        $(buildVersion)

Algo importante que debéis saber que la task de Docker puedes generar la imagen y push en una unica task pero tiene algunas limitaciones, como por ejemplo ignorara el «arguments» con lo cual no le puedes pasar parámetros cuando haga la build.

En el próximo post continuaremos con el deploy contra el AKS, espero que os haya sido util para cualquier cosa podéis dejar un comentario.