Skip to content

Exemple de déploiement avec pipeline CI/CD et cluster Kubernetes sur Azure 🌅🔀

Notifications You must be signed in to change notification settings

gforien/azure-cicd-pipeline

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Pipeline de CI/CD Azure DevOps ACR + AKS

Table des matières

  1. Créer un compte et installer Azure CLI
  2. Créer un environnement ACR + AKS
  3. Créer un environnement ACR + AKS avec Azure CLI depuis Docker
  4. Créer le pipeline

Pour plus tard: CI/CD on GKE et CI/CD on EKS

Les samples sur GitHub: Azure Samples, AWS Samples, et GCP Samples

Le EKS workshop: eksworkshop.com et le respository github associé


1. Créer un compte et installer Azure CLI

đź“š Source

On installe Azure CLI et il y a aussi Azure CLI Classic

il y a dev.azure.com sur lequel on peut créer une organisation facilement mais pour créer un compte azure c'est portal.azure.com

az login
    {
    "cloudName": "AzureCloud",
    "homeTenantId": "xxxxxxxxxxxxxxxxx",
    "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "isDefault": true,
    "managedByTenants": [],
    "name": "Essai gratuit",
    "state": "Enabled",
    "tenantId": "xxxxxxxxxxxxxxxxx",
    "user": {
      "name": "monadresse@outlook.com",
      "type": "user"
    }
    }

az extension list-available
az extension add --name azure-devops
az extension list
    {
      "experimental": false,
      "extensionType": "whl",
      "name": "azure-devops",
      "path": "C:\\Users\\moi\\.azure\\cliextensions\\azure-devops",
      "preview": false,
      "version": "0.18.0"
    }

az devops configure --defaults organization=https://dev.azure.com/mon-orga project=mypipe

az pipelines build list -o table

2. Créer un environnement ACR + AKS

đź“š Source (avec Azure CLI)
📚 Source n°2 (en GUI sur la plateforme Azure)

az acr create --name $registry --resource-group $aksrg --sku basic
# Resource provider 'Microsoft.ContainerRegistry' used by this operation is not registered. We are registering for you.

az aks create --name $aks --resource-group $aksrg --attach-acr $registryId --generate-ssh-keys --vm-set-type VirtualMachineScaleSets --load-balancer-sku standard --node-count 2 --zones 1
# SSH key files 'id_rsa' and 'id_rsa.pub' have been generated under ~/.ssh to allow SSH access to the VM. If using machines without permanent storage like Azure Cloud Shell without an attached file share, back up your keys to a safe location

# Resource provider 'Microsoft.ContainerService' used by this operation is not registered. We are registering for you.

# → ça prend trop de temps

On troubleshoot 🔥

az upgrade

VĂ©rifier son account subscription

az account set --subscription xxxxxxxxxxxxxxxxxxxxxxxxxx
az account subscription list
# xxxxxxxxxxxxxxxxxxxx

VĂ©rifier son contexte Kubernetes

k config view 
    # bla bla bla...
k config current-context
    #> clusterAKS
k config use-context docker-desktop
    #> Switched to context "docker-desktop".
k describe service
    #> Name:              kubernetes
    #> Namespace:         default
    #> Labels:            component=apiserver
    #>                    provider=kubernetes
    #> Annotations:       <none>
    #> Selector:          <none>
    #> Type:              ClusterIP
    #> IP:                10.96.0.1
    #> Port:              https  443/TCP
    #> TargetPort:        6443/TCP
    #> Endpoints:         192.168.65.3:6443
    #> Session Affinity:  None
    #> Events:            <none>

Vérifier que son client PS/Kubernetes a les permissions (pas réussi)

kubectl describe service my-service
    #> Code="LinkedAuthorizationFailed" Message="The client 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' with object id 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' has permission to perform action 'Microsoft.Network/loadBalancers/write' on scope '/subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Network/loadBalancers/kubernetes-internal'; however, it does not have permission to perform action 'Microsoft.Network/virtualNetworks/subnets/join/action' on the linked scope(s) '/subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microsoft.Network/virtualNetworks/<vnet>/subnets/<subnet>' or the linked scope(s) are invalid.

az role assignment create `
    --role Owner `
    --assignee xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Éventuellement passer à WSL2 ?

wsl -l -v
    #>   NAME            STATE           VERSION
    #> * Ubuntu-18.04    Running         1

Eventuellement tester la Azure Voting App

Pour l'autocomplétion

Azure CLI est fait pour être utilisé sous bash, il n'implémente pas l'autocomplétion pour Powershell (voir open issue). Mais c'est parce qu'il y a déjà un module Powershell / une image Docker Azure Powershell qui implémentent l'autocomplétion pour Powershell, et qui est powershell-like. Voir aussi "Choosing the right CLI tool"

Lancer Azure CLI depuis Docker

docker run -it mcr.microsoft.com/azure-cli

Ça marche ✅ on continue ➡

3. Créer un environnement ACR + AKS avec Azure CLI depuis Docker

az login
az account list
az account subscription list

location="francecentral"
aksrg="rg-aks"
aks="clusterAKS"
registry="registryACRDemo"

# Création du groupe de ressource
az group create --name $aksrg --location $location
az group list
    #> OK

# Création de la registry
az acr create --name $registry --resource-group $aksrg --sku basic
az acr list
    #> OK

# Id de la registry
registryId=$(az acr show --name $registry --resource-group $aksrg --query "id" --output tsv)

# Création du cluster AKS avec zone de disponibilité
az aks create --name $aks --resource-group $aksrg --attach-acr $registryId --generate-ssh-keys --vm-set-type VirtualMachineScaleSets --load-balancer-sku standard --node-count 2 --zones 1
    #> on attend 4 min...
az aks list
    #> OK

# Récupération de l'id du cluster AKS
aks_resourceId=$(az aks show -n $aks -g $aksrg --query id -o tsv)

# En attente du déploiement
az resource wait --exists --ids $aks_resourceId

# si kubectl n'est pas installé
az aks install-cli
echo -e "\nalias k=kubectl" >> ~/.bashrc && source ~/.bashrc

# Connexion au cluster AKS
az aks get-credentials --resource-group $aksrg --name $aks  --overwrite-existing

# Récupération des infos du cluster
k cluster-info
    #> Kubernetes control plane is running at https://clusteraks-rg-aks-7....
    #> CoreDNS is running at https://clusteraks-rg-aks-77d...
    #> Metrics-server is running at https://clusteraks-rg-aks-77d...

On a donc un environnement Azure avec un RG contenant un ACR et un cluster AKS (2 nodes)

4. Créer le pipeline

đź“š Source

  1. on fork son projet github

  2. on crée un Pipeline, il y a donc son azure-pipelines.yml mais on Save uniquement

    Avant de l’exécuter, j’ai besoin d’ajouter 2 services connexion à mon projet Azure DevOps, une connexion à mon CRegistry Azure et une seconde à mon cluster AKS.

  3. on va dans Project Settings, Service connections, on crée une nouvelle connection de type Docker Registry, enfin on sélectionne Azure Connection Registry pour le connecter directement à notre registryACRDemo

Problème: impossible de sélectionner le registry
➡ Il faut un access level de type Owner dans le permissions de la subscription comme expliqué ici.
➡ sur le portail Azure on va dans la subscription Essai gratuit, puis Access control (IAM) et on clique sur Add role assignment pour m'ajouter le rôle Owner.
On continue âś…

  1. Même problème avec la connection Kubernetes. Je m'assigne un role Owner sur clusterAKS et je désactive les protections Brave pour que la popup puisse s'ouvrir ✅

  2. On retourne sur le pipeline pour ajouter des variable globales

    • containerRegistry = registryacrdemon.azurecr.io
    • imageRepository = applicationnetcore
  3. Il manque le package replacetokens

  4. Impossible de build car impossible de lancer des projets en parallèle. Lu le billet de blog de Microsoft à ce sujet, et rempli ma demande.

    • Solution sur r/azuredevops pour lancer un self hosted agent
    • Je suis ces instructions qui me font seulement crĂ©er un PAT
    • Je lance l'image Docker d'un Azure Pipelines Agent
    • en fait l'image est deprecated, et plus mise Ă  jour depuis 5 ans comme Ă©crit sur leur Github
    • Je trouve les nouvelles instructions pour lancer l'image Docker d'un agent en prĂ©cisant les variables d'environnement, sur un container Windows avec HyperV
    • De plus, l'agent doit pouvoir accĂ©der Ă  Docker (pseudo docker-in-docker), et c'est logique car c'est un agent de CI. Il faut donc passer au container Linux et binder la socker. Voir les rĂ©ponses stackoverflow ici et ici pour binder la socket sous Windows et une issue github oĂą le mec choisit plutĂ´t de faire un vrai docker-in-docker
  5. Donc, j'ai mon propre dockeragent capable de faire un pseudo docker-in-docker. Il est seul dans son pool mydockerpool, et j'ai modifié azure-pipelines.yaml pour que les deux jobs Build et Deploy se fassent dans ce pool. ➡ Plus de build en parallèle, et plus d'erreur ✅

  6. Je lance un build + deploy en exécutant le pipeline

  7. Si je modifie index.cshtml directement sur Github et que je fais une PR (attention Ă  ne pas l'accepter trop vite), le pipeline se relance automatiquement

  8. Déployé à http://40.66.61.211/

About

Exemple de déploiement avec pipeline CI/CD et cluster Kubernetes sur Azure 🌅🔀

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C# 36.9%
  • HTML 33.2%
  • CSS 11.9%
  • PowerShell 10.7%
  • Dockerfile 5.3%
  • JavaScript 2.0%