Desplegar charts de Helm en Azure DevOps con la integración nativa de Flux en AKS

La semana pasada estuve jugando de nuevo con la integración que se ha hecho de Flux en AKS, a través de la pestaña GitOps. En este artículo quiero compartirte mis pruebas para desplegar charts de Helm en este escenario, ya que el uso de Azure CLI en este caso es un poco diferente a cuando trabajas con el CLI de Flux.

Cómo es en Flux

Cuando trabajas directamente con Flux, si quieres generar una configuración para desplegar un chart de Helm, una HelmRelease y su correspondiente repositorio en Git, puedes utilizar su CLI de la siguiente forma:

# Create Git Repository
flux create source git tour-of-heroes \
--url=$REPO_GITOPS_DEMOS \
--branch=main \
--interval=30s
# Create Helm Release
flux create helmrelease tour-of-heroes-helm \
--source=GitRepository/tour-of-heroes \
--chart="./helm/tour-of-heroes-chart" \
--target-namespace=tour-of-heroes-helm \
--interval=30s 

En mi ejemplo quiero hacer lo mismo pero el repositorio es privado, está alojado en Azure DevOps y quiero usar la integración de Flux con AKS.

Generar la configuración en el repositorio

En el caso de la integración con AKS no tenemos una opción de crear directamente la helm release, a través del CLI, por lo que debemos hacerla de manera declarativa en un repositorio. Lo ideal es que tuviéramos un repo que representara al clúster con todas sus configuraciones.

En mi ejemplo, he utilizado el mismo repo donde está el chart de Helm, por simplicidad, creando un nuevo directorio llamado helm-configuration:

# helm-configuration/helm-release.yaml
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: GitRepository
metadata:
  name: tour-of-heroes-helm-git-repo
  namespace: helm-tour-of-heroes
spec:
  gitImplementation: libgit2
  interval: 30s
  ref:
    branch: main
  url: <AZURE_DEVOPS_HELM_CHART_REPO>
  secretRef:
    name: az-devops-basic-auth
  
---
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
  name: tour-of-heroes-helm-release
  namespace: helm-tour-of-heroes
spec:
  chart:
    spec:
      chart: ./tour-of-heroes-chart
      reconcileStrategy: ChartVersion
      sourceRef:
        kind: GitRepository
        name: tour-of-heroes-helm-git-repo         
  interval: 30s
  values:
    replicaCount: 3
    api:
      replicaCount: 2

En este archivo tengo dos objetos definidos: el primero de ellos es la configuración del repositorio Git que voy a utilizar, donde está el chart de Helm. Como está en Azure Repos y estoy utilizando autenticación a través de HTTPS, para que funcione correctamente debo añadir gitImplementation: libgit2. Además he almacenado las credenciales que necesito, al ser un repo privado, en un secreto llamado az-devops-basic-auth. Este debe tener como claves username y password. Puedes crearlo de forma rápida así:

kubectl create secret generic az-devops-basic-auth -n helm-tour-of-heroes --from-literal=username=<USER_NAME> --from-literal=password=<PAT>

El segundo objeto se trata del HelmRelease que es el que define cómo queremos desplegar el chart, con qué valores, etcétera. Además hace referencia al repositorio git anterior.

Nota: Es importante indicar el namespace de los recursos, ya que de lo contrario dará error. Puedes crear también un archivo kustomization.yaml en el mismo directorio y añadir el namespace ahí, de forma que esté centralizado y en un único lugar.

Ahora el siguiente paso es desplegarlo en nuestro clúster a través de la extensión k8s-configuration, como ya te conté en este otro artículo:

# Helm repo
AZURE_DEVOPS_REPO_HELM="<AZURE_DEVOPS_REPO_URL>"
# Generate secret
k create secret generic az-devops-basic-auth -n helm-tour-of-heroes --from-literal=username=<USER_NAME> --from-literal=password=<PAT> 
# Generate a Flux Configuration (Helm chart)
az k8s-configuration flux create \
--resource-group $RESOURCE_GROUP \
--cluster-name $AKS_CLUSTER_NAME \
--name helm-tour-of-heroes \
--namespace helm-tour-of-heroes \
--cluster-type managedClusters \
--url $AZURE_DEVOPS_REPO_HELM \
--https-user $AZURE_DEVOPS_USERNAME \
--https-key $AZURE_DEVOPS_PASSWORD \
--branch flux-aks \
--sync-interval=10s \
--kustomization name=helm path=helm-configuration prune=true sync_interval=10s retry_interval=1m timeout=2m

En este caso lo que hago es crear una configuración, la cual se va a crear en el namespace helm-tour-of-heroes, utiliza de la misma forma el repo donde tengo el chart, y puedo pasarle las credenciales a través de –https-user y –https-key. Por último, como path en –kustomization le pongo la carpeta donde he guardado el archivo con la configuración del repositorio git y el helm release. Una vez desplegado el resultado debería de ser como el siguiente:

GitOps configuration para un chart de Helm

En este caso deberíamos tener cuatro objetos: dos de ellos se corresponden a la configuración que he lanzado a través de Azure CLI, donde le dicen dónde está el archivo de configuración del chart de Helm. Los otros dos son producidos por dicha configuración que es la que despliega el chart.

Como decía, lo habitual sería que la configuración de lo que se quiere desplegar esté en un repo que represente al clúster y el chart de helm esté otro repositorio a parte.

¡Saludos!