Azure DevOps Pipelines - Installare gli Agent dentro Kubernetes


Agent di Azure DevOps containerizzati e in Chart Helm per Kubernetes

Visit this page in English

[Aggiornamento 04/02/2022]: Migrazione della Repository Helm

La Repository Helm è stata spostata in data 04/02/2022 subendo un cambio di URL, visitare la pagina dedicata per ulteriori dettagli (Helm Repository).


In questo articolo spiegheremo in breve qual è l’approccio standard per installare gli Agent di Azure DevOps, e qual è la nostra soluzione containerizzata per Kubernetes.

Azure DevOps Pipelines in Kubernetes

Azure DevOps (conosciuto negli anni anche come ALM o TFS) è un popolare strumento targato Microsoft per gestire Pipeline in CI/CD, in linea con la cultura DevOps (come suggerisce il nome).

In tutti gli strumenti di CI/CD è presente il concetto di “Agent” (o “Runner”, o altro a seconda dello strumento utilizzato) che consiste nel servizio, o il pool di servizi, che prende in carico l’effettivo lavoro di esecuzione dei vari task delle nostre Pipeline.

Su Azure DevOps, questi servizi che hanno il ruolo di mero esecutore, vengono logicamente raggruppati in 2 diverse entità denominate:

  • Agent Pools: maggiormente trasversali ai diversi progetti.
  • Deployment Groups: legati al progetto dove vengono creati, e quindi non usabili in altri.

Per altre differenze riguardo queste 2 tipologie di raggruppamento vi invito a leggere la documentazione ufficiale; per quanto riguarda invece l’agent, entrambe queste 2 tipologie si basano essenzialmente sullo stesso applicativo che poi verrà registrato in 2 modi differenti a seconda se dovrà entrare a far parte di un Agent Pool o di un Deployment Group.

Una volta definito un Agent Pool o un Deployment Group, Azure DevOps automaticamente ci genera/fornisce gli script in Powershell e Bash (quindi sia Windows che Linux) per installare e registrare i singoli Agent del Pool/Group scelto. Quindi, al netto di alcuni parametri di registrazione iniziale, la creazione di quest’ultimi risulta abbastanza agevole; ma confinata su Macchine Virtuali.

E se invece volessimo containerizzare i nostri Agent?

Al momento Azure DevOps non fornisce un Docker Container ufficiale per l’uso dei suoi agent; e, ora che che siamo nel pieno dell’era targata Kubernetes per orchestrare nel cloud tutti i nostri applicativi, perchè non fare lo stesso con anche i nostri agent di Azure DevOps?

Al fine di raggiungere tale obbiettivo, abbiamo buildato e pubblicato (rispettivamente nel nostro Docker Registry e Helm Repository ufficiali) 2 Immagini Docker e 2 Chart Helm che andiamo a descrivere di seguito:

Agent Containerizzati

azuredevops-agent

Immagine Docker dell’Agent di Azure DevOps con registrazione di tipo “Agent Pool”.

Di seguito come scaricare e configure la versione 1.1.0; invece, per la documentazione e altre versioni, andare qui.

docker pull registry.gitlab.com/nevertheless.space/docker-registry/azuredevops-agent:1.1.0
Variabili di Ambiente
  • AZP_URL: Azure DevOps - URL
  • AZP_TOKEN: Azure DevOps - Personal Access Token (PAT)
  • AZP_AGENT_NAME: Azure DevOps - Nome di Registrazione dell’Agent
  • AZP_POOL: Azure DevOps - Nome dell’Agent Pool

azuredevops-deploymentgroup

Immagine Docker dell’Agent di Azure DevOps con registrazione di tipo “Deployment Group”.

Di seguito come scaricare e configure la versione 1.1.0; invece, per la documentazione e altre versioni, andare qui.

docker pull registry.gitlab.com/nevertheless.space/docker-registry/azuredevops-deploymentgroup:1.1.0
Variabili di Ambiente
  • AZP_URL: Azure DevOps - URL
  • AZP_TOKEN: Azure DevOps - Personal Access Token (PAT)
  • AZP_AGENT_NAME: Azure DevOps - Nome di Registrazione dell’Agent
  • AZP_COLL_NAME: Azure DevOps - Nome della Collection del Deployment Group
  • AZP_PRJ_NAME: Azure DevOps - Nome del Progetto del Deployment Group
  • AZP_DG_NAME: Azure DevOps - Nome del Deployment Group
  • AZP_DG_TAGS: Azure DevOps - Tags da associare all’agent
    • Per esempio: "tag1, tag2, tag3"

Helm Charts

Per agevolare il deploy in Kubernetes sono stati prodotti anche dei Chart Helm, che, a partire dalla versione 1.2.0, assolvono alle necessità di poter:

  • deployare i nostri agent sia come Deployments (Stateless), che come Stateful Set con un suo disco dedicato; questo sarà possibile farlo settando opportunamente le variabili statefulSet.* del Chart Helm.
  • schedulare i nostri pod solo su dei nodi specifici, e possiamo farlo settando opportunamente le variabili nodeSelector.* del Chart Helm.
  • definire il numero di agent da creare, settando opportunamente la variabile replicaCount del Chart Helm o scalando da Kubernetes.
  • settare dei limiti di risorse ai nostri pod settando opportunamente le variabili limits.* del Chart Helm.

Inizializzazione dell’Helm Repository

Per usare i nostri Chart Helm bisogna collegarsi alla nostra Repository Helm:

helm repo add nevertheless.space https://helm.nevertheless.space
helm repo update

azuredevops-agent

Chart Helm dell’Agent di Azure DevOps con registrazione di tipo “Agent Pool”.

Di seguito è mostrato come installare e configurare la versione 1.2.0; per altre versioni invece, andare qui.

helm install -f values.yaml --namespace="<namespace_name>" --create-namespace "<my_release_name>" nevertheless.space/azuredevops-agent:1.2.0 
Values.yaml di esempio
# Chart: nevertheless.space/azuredevops-agent:1.2.0 - values.yaml

replicaCount: 1

azureDevOps:
  url: "https://myazuredevops.com/tfs"
  pool: "Agent-Pool-1"
  pat: "XXXXXXXXXXXXXXXXXXXXX"

workingDir: "_work"

statefulSet:
  enabled: false
  storageClassName: "default"
  storageSize: "20Gi"

limits:
  enabled: false
  requestedMemory: "128Mi"
  requestedCPU: "250m"
  memoryLimit: "1Gi"
  CPULimit: "1"

nodeSelector:
  enabled: false
  key: "Kubernetes.io/hostname"
  value: "eu-central-1.10.11.10.2"

azuredevops-deploymentgroup

Chart Helm dell’Agent di Azure DevOps con registrazione di tipo “Deployment Group”.

Di seguito è mostrato come installare e configurare la versione 1.2.0; per altre versioni invece, andare qui.

helm install -f values.yaml --namespace="<namespace_name>" --create-namespace "<my_release_name>" nevertheless.space/azuredevops-deploymentgroup:1.2.0 
Values.yaml di esempio
# Chart: nevertheless.space/azuredevops-deploymentgroup:1.2.0 - values.yaml

replicaCount: 1

azureDevOps:
  url: "https://myazuredevops.com/tfs"
  project: "Project 1"
  collection: "Collection 2"
  deploymentGroup: "Kubernetes-Agents"
  pat: "XXXXXXXXXXXXXXXXXXXXX"
  tags: "k8s, linux"

workingDir: "_work"

statefulSet:
  enabled: false
  storageClassName: "default"
  storageSize: "20Gi"

limits:
  enabled: false
  requestedMemory: "128Mi"
  requestedCPU: "250m"
  memoryLimit: "1Gi"
  CPULimit: "1"

nodeSelector:
  enabled: false
  key: "Kubernetes.io/hostname"
  value: "eu-central-1.10.11.10.2"

Conclusione

Nei progetto Gitlab del nostro Docker Registry e Helm Repository potete trovare il codice sorgente e le varie documentazioni, nonchè contribuire con segnalazioni o Merge Requests.


Annunci Pubblicitari



comments powered by Disqus