- Créer un compte et installer Azure CLI
- Créer un environnement ACR + AKS
- Créer un environnement ACR + AKS avec Azure CLI depuis Docker
- 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é
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": "[email protected]",
"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
đź“š 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
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>
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
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"
docker run -it mcr.microsoft.com/azure-cli
Ça marche ✅ on continue ➡
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)
-
on fork son projet github
-
on crée un Pipeline, il y a donc son
azure-pipelines.yml
mais onSave
uniquementAvant 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.
-
on va dans
Project Settings
,Service connections
, on crée une nouvelle connection de typeDocker Registry
, enfin on sélectionneAzure 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 âś…
-
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 ✅ -
On retourne sur le pipeline pour ajouter des variable globales
containerRegistry = registryacrdemon.azurecr.io
imageRepository = applicationnetcore
-
Il manque le package replacetokens
-
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
-
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 jobsBuild
etDeploy
se fassent dans ce pool. ➡ Plus de build en parallèle, et plus d'erreur ✅ -
Je lance un build + deploy en exécutant le pipeline
-
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- checkout latest commit
- build
- push image to ACR
- replace tokens in yaml files
- create pull secret
- deploy via rolling update
-
Déployé à http://40.66.61.211/