Compilare e distribuire al servizio Azure Kubernetes con Azure Pipelines

Servizi di Azure DevOps

Usare Azure Pipelines per eseguire automaticamente la distribuzione nel servizio Azure Kubernetes (AKS). Azure Pipelines consente di creare, testare e distribuire integrazione continua (CI, continuous integration) e recapito continuo (CD, continuous delivery) tramite Azure DevOps.

Questo articolo illustra come creare una pipeline che compila e distribuisce continuamente l'app. Ogni volta che si modifica il codice in un repository che contiene un Dockerfile, viene effettuato il push delle immagini nel Registro Azure Container e i manifesti vengono quindi distribuiti nel cluster del servizio Azure Kubernetes.

Prerequisiti

Ottenere il codice

Creare una copia tramite fork del repository seguente contenente un'applicazione di esempio e un Dockerfile:

https://github.com/MicrosoftDocs/pipelines-javascript-docker

Creare le risorse di Azure

Accedere al portale di Azure e quindi selezionare il pulsante Cloud Shell nell'angolo in alto a destra. Usare l'interfaccia della riga di comando di Azure o PowerShell per creare un cluster del servizio Azure Kubernetes.

Creare un registro contenitori

# Create a resource group
az group create --name myapp-rg --location eastus

# Create a container registry
az acr create --resource-group myapp-rg --name mycontainerregistry --sku Basic

# Create a Kubernetes cluster
az aks create \
    --resource-group myapp-rg \
    --name myapp \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys

Accedere ad Azure Pipelines

Accedere ad Azure Pipelines. Dopo l'accesso, il browser passa a https://dev.azure.com/my-organization-name e visualizza il dashboard di Azure DevOps.

All'interno dell'organizzazione selezionata creare un progetto. Se non sono presenti progetti nell'organizzazione, viene visualizzata la schermata Crea un progetto per iniziare. In caso contrario, selezionare il pulsante Crea progetto nell'angolo superiore destro del dashboard.

Creare la pipeline

Connettersi e selezionare il repository

  1. Accedere all'organizzazione di Azure DevOps e passare al progetto.

  2. Passare a Pipeline e quindi selezionare Nuova pipeline.

  3. Eseguire i passaggi della procedura guidata selezionando prima di tutto GitHub come posizione del codice sorgente.

  4. Si potrebbe essere reindirizzati a GitHub per l'accesso. In questo caso, immettere le credenziali di GitHub.

  5. Quando si vede l’elenco dei repository, selezionarne uno.

  6. È possibile che si venga reindirizzati a GitHub per installare l'app Azure Pipelines. In tal caso, selezionare Approva e installa.

  7. Selezionare Distribuisci servizio Azure Kubernetes.

  8. Se richiesto, selezionare la sottoscrizione in cui è stato creato il registro e il cluster.

  9. Selezionare il cluster myapp.

  10. In Spazio dei nomi selezionare Esistente e quindi selezionare predefinito.

  11. Selezionare il nome del registro contenitori.

  12. È possibile lasciare il nome dell'immagine impostato sul valore predefinito.

  13. Impostare la porta del servizio su 8080.

  14. Impostare la casella di controllo Abilita verifica app per le richieste pull per includere la configurazione relativa all'applicazione di revisione nello YAML della pipeline generato automaticamente nei passaggi successivi.

  15. Selezionare Convalida e configura.

    Man mano che Azure Pipelines crea la pipeline, il processo:

    • Creare una connessione al servizio registro Docker per consentire alla pipeline di eseguire il push delle immagini nel registro contenitori.

    • Creare un ambiente e una risorsa Kubernetes all'interno dell'ambiente. Per un cluster abilitato per il controllo degli accessi in base al ruolo (RBAC), la risorsa Kubernetes creata crea in modo implicito oggetti ServiceAccount e RoleBinding nel cluster in modo che il ServiceAccount creato non possa eseguire operazioni esterne allo spazio dei nomi scelto.

    • Generare un file azure-pipelines.yml, che definisce la pipeline.

    • Scaricare i file manifesto Kubernetes Questi file vengono generati idratando i modelli di deployment.yml e service.yml in base alle selezioni effettuate. Quando si è pronti, selezionare Salva ed esegui.

  16. Seleziona Salva ed Esegui.

  17. È possibile modificare il messaggio Commit in modo che sia simile ad Aggiungi pipeline al repository. Quando si è pronti, selezionare Salva ed esegui per eseguire il commit della nuova pipeline nel repository e quindi iniziare la prima esecuzione della nuova pipeline.

Visualizzare la distribuzione dell'app

Durante l'esecuzione della pipeline, osservare come fase di compilazione e quindi la fase di distribuzione passare da blu (in esecuzione) a verde (completato). È possibile selezionare le fasi e i processi per controllare la pipeline in azione.

Nota

Se si usa un agente ospitato da Microsoft, è necessario aggiungere l'intervallo IP dell'agente ospitato da Microsoft al firewall. Ottenere l'elenco settimanale degli intervalli IP dal file JSON settimanale, pubblicato ogni mercoledì. I nuovi intervalli IP diventano effettivi il lunedì seguente. Per altre informazioni, vedere Agenti ospitati da Microsoft. Per trovare gli intervalli IP necessari per l'organizzazione di Azure DevOps, vedere come identificare gli intervalli IP possibili per gli agenti ospitati da Microsoft.

Al termine dell'esecuzione della pipeline, esaminare cosa è successo e quindi vedere l'app distribuita. Dal riepilogo della pipeline:

  1. Fare clic sulla scheda Ambienti.

  2. Selezionare Visualizza ambiente.

  3. Selezionare l'istanza dell'app per lo spazio dei nomi distribuito in. Se sono state usate le impostazioni predefinite, si tratta dell'app myapp nello spazio dei nomi predefinito.

  4. Selezionare la scheda Servizi.

  5. Selezionare e copiare l'indirizzo IP esterno negli Appunti.

  6. Aprire una nuova scheda o finestra del browser e immettere <l'indirizzo IP>:8080.

Se stai creando l'app di esempio, hello world viene visualizzato nel browser.

Compilazione della pipeline

Dopo aver selezionato le opzioni e aver completato la convalida e la configurazione della pipeline Azure Pipelines ha creato automaticamente una pipeline usando il modello Distribuisci nel servizio Azure Kubernetes.

La fase di compilazione usa l'attività Docker per compilare ed eseguire il push dell'immagine nel Registro Azure Container.

- stage: Build
  displayName: Build stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

    - task: PublishPipelineArtifact@1
      inputs:
        artifactName: 'manifests'
        path: 'manifests'

Il processo di distribuzione usa l'attività Manifesto Kubernetes per creare il imagePullSecret richiesto dai nodi del cluster Kubernetes per eseguire il pull dalla risorsa registro Azure Container. I file manifesto vengono quindi usati dall'attività manifesto kubernetes per la distribuzione nel cluster Kubernetes. I file manifesto service.yml e deployment.yml sono stati generati quando è stato usato il modello Distribuisci nel servizio Azure Kubernetes.

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  jobs:
  - deployment: Deploy
    displayName: Deploy job
    pool:
      vmImage: $(vmImageName)
    environment: 'myenv.aksnamespace' #customize with your environment
    strategy:
      runOnce:
        deploy:
          steps:
          - task: DownloadPipelineArtifact@2
            inputs:
              artifactName: 'manifests'
              downloadPath: '$(System.ArtifactsDirectory)/manifests'

          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              namespace: $(k8sNamespace)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              namespace: $(k8sNamespace)
              manifests: |
                $(System.ArtifactsDirectory)/manifests/deployment.yml
                $(System.ArtifactsDirectory)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

Pulire le risorse

Al termine delle risorse create, è possibile usare il comando seguente per eliminarle:

az group delete --name myapp-rg

Immettere y quando viene richiesto.

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019

Usare Azure Pipelines per eseguire automaticamente la distribuzione nel servizio Azure Kubernetes (AKS). Azure Pipelines consente di creare, testare e distribuire integrazione continua (CI, continuous integration) e recapito continuo (CD, continuous delivery) tramite Azure DevOps.

Questo articolo illustra come creare una pipeline che compila e distribuisce continuamente l'app. Ogni volta che si modifica il codice in un repository che contiene un Dockerfile, viene effettuato il push delle immagini nel Registro Azure Container e i manifesti vengono quindi distribuiti nel cluster del servizio Azure Kubernetes.

Prerequisiti

Ottenere il codice

Creare una copia tramite fork del repository seguente contenente un'applicazione di esempio e un Dockerfile:

https://github.com/MicrosoftDocs/pipelines-javascript-docker

Creare le risorse di Azure

Accedere al portale di Azure e quindi selezionare il pulsante Cloud Shell nell'angolo in alto a destra. Usare l'interfaccia della riga di comando di Azure o PowerShell per creare un cluster del servizio Azure Kubernetes.

Creare un registro contenitori

# Create a resource group
az group create --name myapp-rg --location eastus

# Create a container registry
az acr create --resource-group myapp-rg --name mycontainerregistry --sku Basic

# Create a Kubernetes cluster
az aks create \
    --resource-group myapp-rg \
    --name myapp \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys 

Configurare l'autenticazione

Quando si usa Registro Azure Container (ACR) con il servizio Azure Kubernetes (AKS), è necessario stabilire un meccanismo di autenticazione. Questa operazione può essere ottenuta in due modi:

  1. Concedere al servizio Azure Container l'accesso a Registro Azure Container Vedere Autenticazione con Registro Azure Container dal servizio Azure Kubernetes.

  2. Usare un segreto pull di immagini Kubernetes. È possibile creare un segreto pull di immagini usando l'attività di distribuzione Kubernetes.

Creare una pipeline di versione

La pipeline di compilazione usata per configurare l'integrazione continua ha già creato un'immagine Docker ed è stata inserita in un Registro Azure Container. Include anche un pacchetto e ha pubblicato un grafico Helm come artefatto. Nella pipeline di versione si distribuirà l'immagine del contenitore come applicazione Helm nel cluster del servizio Azure Kubernetes.

  1. In Azure Pipelines aprire il riepilogo per la compilazione.

  2. Nel riepilogo della compilazione scegliere l'icona Rilascio per avviare una nuova pipeline di versione.

    Se in precedenza è stata creata una pipeline di versione che usa questi artefatti di compilazione, verrà richiesto di creare una nuova versione. In tal caso, passare alla pagina Versioni e avviare una nuova pipeline di versione da questa posizione scegliendo l'icona +.

  3. Selezionare il modello Fase vuota.

  4. Aprire la pagina Attività e selezionare Processo agente.

  5. Scegliere + per aggiungere una nuova attività e aggiungere un'attività di installazione dello strumento Helm. In questo modo, l'agente che esegue le attività successive include Helm e Kubectl installati.

  6. Scegliere + di nuovo e aggiungere un’attività Creare un pacchetto e distribuire grafici Helm. Configurare le impostazioni per questa attività come indicato di seguito:

    • Tipo di connessione: selezionare Azure Resource Manager per connettersi a un cluster del servizio Azure Kubernetes usando una connessione al servizio di Azure. In alternativa, se si vuole connettersi a qualsiasi cluster Kubernetes usando kubeconfig o un account del servizio, è possibile selezionare Connessione al servizio Kubernetes. In questo caso, è necessario creare e selezionare una connessione al servizio Kubernetes anziché una sottoscrizione di Azure per l'impostazione seguente.

    • Sottoscrizione Azure: selezionare una connessione nell'elenco in Connessioni ai servizi di Azure disponibili oppure creare una connessione con autorizzazioni con maggiori restrizioni alla sottoscrizione di Azure. Se accanto all'input viene visualizzato un pulsante Autorizza, usarlo per autorizzare la connessione alla sottoscrizione di Azure. Se non viene visualizzata la sottoscrizione di Azure necessaria nell'elenco delle sottoscrizioni, vedere Creare una connessione al servizio di Azure per configurare manualmente la connessione.

    • Gruppo di risorse: immettere o selezionare il gruppo di risorse contenente il cluster del servizio Azure Kubernetes.

    • Cluster Kubernetes: immettere o selezionare il cluster del servizio Azure Kubernetes creato.

    • Comando: selezionare init come comando Helm. In questo modo Tiller viene installato nel cluster Kubernetes in esecuzione. Verrà inoltre configurata qualsiasi configurazione locale necessaria. Selezionare Usa la versione dell'immagine canary per installare la versione non definitiva più recente di Tiller. È anche possibile scegliere di aggiornare Tiller se è preinstallato selezionando Aggiorna Tiller. Se queste opzioni sono abilitate, l'attività esegue helm init --canary-image --upgrade

  7. Scegliere + nell’agente di processo e aggiungere un’altra attività Creare un pacchetto e distribuire grafici Helm. Configurare le impostazioni per questa attività come indicato di seguito:

    • Cluster Kubernetes: immettere o selezionare il cluster del servizio Azure Kubernetes creato.

    • Spazio dei nomi: immettere lo spazio dei nomi del cluster Kubernetes in cui si vuole distribuire l'applicazione. Kubernetes supporta più cluster virtuali supportati dallo stesso cluster fisico. Questi cluster virtuali sono denominati spazi dei nomi. È possibile usare gli spazi dei nomi per creare ambienti diversi, ad esempio sviluppo, test e gestione temporanea nello stesso cluster.

    • Comando: selezionare Aggiorna come comando Helm. È possibile eseguire qualsiasi comando Helm usando questa attività e passare le opzioni di comando come argomenti. Quando si seleziona l'aggiornamento, l'attività mostra altri campi:

      • Tipo di grafico: selezionare Percorso file. In alternativa, è possibile specificare il nome del grafico se si desidera specificare un URL o un nome di grafico. Ad esempio, se il nome del grafico è stable/mysql, l'attività esegue helm upgrade stable/mysql

      • Percorso del grafico: può trattarsi di un percorso di un grafico in pacchetto o di un percorso di una directory del grafico decompressa. In questo esempio si sta pubblicando il grafico usando una compilazione CI, quindi selezionare il pacchetto di file usando selezione file o immettere $(System.DefaultWorkingDirectory)/**/*.tgz

      • Nome versione: immettere un nome per la versione, ad esempio azuredevops

      • Ricrea pod: selezionare questa casella di controllo se è presente una modifica della configurazione durante la versione e si vuole sostituire un pod in esecuzione con la nuova configurazione.

      • Reimposta valori: selezionare questa casella di controllo se si desidera che i valori incorporati nel grafico eseguano l'override di tutti i valori forniti dall'attività.

      • Forza: selezionare questa casella di controllo se, in caso di conflitti, si vuole eseguire l'aggiornamento e il rollback per eliminare, ricreare la risorsa e reinstallare la versione completa. Ciò è utile negli scenari in cui l'applicazione delle patch può avere esito negativo, ad esempio per i servizi perché l'indirizzo IP del cluster non è modificabile.

      • Argomenti: immettere gli argomenti del comando Helm e i relativi valori; per questo esempio --set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId) Vedere questo paragrafo per una descrizione dei motivi per cui vengono usati questi argomenti.

      • Abilita TLS: selezionare questa casella di controllo per abilitare connessioni complesse basate su TLS tra Helm e Tiller.

      • Certificato CA: specificare un certificato CA da caricare e usare per rilasciare certificati per Tiller e il client Helm.

      • Certificato: specificare il certificato Tiller o il certificato client Helm

      • Chiave: specificare la chiave del client Tiller o Helm

  8. Nella pagina Variabili della pipeline aggiungere una variabile denominata imageRepoName e impostare il valore sul nome del repository di immagini Helm. In genere, questo è nel formato example.azurecr.io/coderepository

  9. Salvare la pipeline di versione.

Argomenti usati nell'attività di aggiornamento Helm

Nella pipeline di compilazione l'immagine del contenitore viene contrassegnata con $(Build.BuildId) e viene eseguito il push in un Registro Azure Container. In un grafico Helm è possibile parametrizzare i dettagli dell'immagine del contenitore, ad esempio il nome e il tag, perché lo stesso grafico può essere usato per la distribuzione in ambienti diversi. Questi valori possono essere specificati anche nel filevalues.yaml o sottoposti a override da un file di valori fornito dall'utente, che a sua volta può essere sottoposto a override dai parametri --set durante l'installazione o l'aggiornamento di Helm.

In questo esempio vengono passati gli argomenti seguenti:

--set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId)

Il valore di $(imageRepoName) è stato impostato nella pagina Variabili (o nella sezionevariabili del file YAML). In alternativa, è possibile sostituirlo direttamente con il nome del repository di immagini nel file value --set o values.yaml degli argomenti. Ad esempio:

  image:
    repository: VALUE_TO_BE_OVERRIDDEN
    tag: latest

Un'altra alternativa consiste nell'impostare l'opzione Imposta valori dell'attività per specificare i valori dell'argomento come coppie chiave-valore separate da virgole.

Creare una versione per distribuire l'app

A questo punto è possibile creare una versione, ovvero avviare il processo di esecuzione della pipeline di versione con gli artefatti prodotti da una compilazione specifica. Ciò comporta la distribuzione della compilazione:

  1. Scegliere + Versione e selezionare Crea versione.

  2. Nel pannello Crea una nuova versione verificare che la versione dell'artefatto da usare sia selezionata e scegliere Crea.

  3. Scegliere il collegamento di rilascio nel messaggio della barra delle informazioni. Ad esempio: "Versione Versione-1 è stata creata”.

  4. Nella visualizzazione pipeline scegliere il collegamento di stato nelle fasi della pipeline per visualizzare i log e l'output dell'agente.