<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Azure on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/azure/</link><description>Recent content in Azure on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Mon, 02 Aug 2021 06:15:00 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/azure/index.xml" rel="self" type="application/rss+xml"/><item><title>Sauvegarder son Kubernetes avec Velero (ex Ark)</title><link>https://blog.zwindler.fr/2021/08/02/__trashed-2/</link><pubDate>Mon, 02 Aug 2021 06:15:00 +0000</pubDate><guid>https://blog.zwindler.fr/2021/08/02/__trashed-2/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/08/68747470733a2f2f76656c65726f2e696f2f646f63732f6d61696e2f696d672f76656c65726f2e706e67.webp" alt="Featured image of post Sauvegarder son Kubernetes avec Velero (ex Ark)" /&gt;&lt;h2 id="contexte"&gt;Contexte
&lt;/h2&gt;&lt;p&gt;J’ai écris cet article / tuto en janvier 2019 sans jamais le terminer / mettre en forme. A l’époque, Heptio était en train de se faire racheter par VMware. Au moment où j’allais le poster, VMware a fait quelques modifications dans le tool, notamment en &lt;a class="link" href="https://github.com/vmware-tanzu/velero" target="_blank" rel="noopener"
&gt;changeant le nom de Ark vers Velero et en l’intégrant à Tanzu&lt;/a&gt; (le Kubernetes de VMware).&lt;/p&gt;
&lt;p&gt;Idéalement, j’aurais donc aimé réécrire l’article en remettant tout à jour, les noms, les lignes de commandes, etc. Sauf que je ne l’ai jamais fait. Et aujourd’hui, je ne travaille plus sur des clusters Kubernetes avec des workloads majoritairement Stateful et préfère l’approche Déclarative (type FluxCD) dans l’hypothèse où j’aurais un énorme crash à gérer plutôt que de tenter une restauration, avec tous les effets de bords et les risques que ça implique.&lt;/p&gt;
&lt;p&gt;Cependant, plutôt que de mettre cet article « presque fini » à la corbeille, je prend donc le parti de le poster « tel quel », avec tous les défauts qu’il pourra avoir (notamment si certaines parties sont &lt;em&gt;outdated&lt;/em&gt;). Le concept général lui, restera le même.&lt;/p&gt;
&lt;p&gt;Pour illustrer le propos, j’avais déployé un cluster AKS mais ça marche bien évidemment avec n’importe quel cluster Kubernetes.&lt;/p&gt;
&lt;h2 id="générer-le-cluster-k8s-aks"&gt;Générer le cluster K8s AKS
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;az login
az group create --name myownkubernetescluster --location westeurope \
--subscription &amp;#34;Visual Studio Professional&amp;#34;
az aks create --resource-group myownkubernetescluster --name myawesomeakscluster \
--node-count 3 --enable-addons monitoring --node-vm-size Standard_B2s \
--kubernetes-version 1.10.9 --ssh-key-value ~/.ssh/dgermain_never_expire_rsa_openssl2.pub \
--subscription &amp;#34;Visual Studio Professional&amp;#34;
az aks get-credentials --resource-group myownkubernetescluster --name myawesomeakscluster \
--subscription &amp;#34;Visual Studio Professional&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="éventuellement-ajouter-les-droits-pour-le-dashboard"&gt;Éventuellement ajouter les droits pour le dashboard
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl create clusterrolebinding kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard
az aks browse --resource-group myownkubernetescluster --name myawesomecluster
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="sauvegarde--restauration-avec-velero"&gt;Sauvegarde / restauration avec Velero
&lt;/h2&gt;&lt;p&gt;Information sur Velero (Ark Heptio) &lt;a class="link" href="https://github.com/vmware-tanzu/velero" target="_blank" rel="noopener"
&gt;github.com/vmware-tanzu/velero&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Comme on est sur Azure dans mon exemple :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vmware-tanzu/velero-plugin-for-microsoft-azure#setup" target="_blank" rel="noopener"
&gt;github.com/vmware-tanzu/velero-plugin-for-microsoft-azure#setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On commencer par créer un ressource group spécifique aux backups (pour ne pas tout perdre si le ressource group est supprimé)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;AZURE_BACKUP_RESOURCE_GROUP=arkbackups
az group create -n $AZURE_BACKUP_RESOURCE_GROUP --location westeurope \
--subscription &amp;#34;Visual Studio Professional&amp;#34;
AZURE_STORAGE_ACCOUNT_ID=&amp;#34;ark$(uuidgen | cut -d &amp;#39;-&amp;#39; -f5 | tr &amp;#39;[A-Z]&amp;#39; &amp;#39;[a-z]&amp;#39;)&amp;#34;
az storage account create \
--name $AZURE_STORAGE_ACCOUNT_ID \
--resource-group $AZURE_BACKUP_RESOURCE_GROUP \
--sku Standard_GRS \
--encryption-services blob \
--https-only true \
--kind BlobStorage \
--access-tier Hot \
--location westeurope \
--subscription &amp;#34;Visual Studio Professional&amp;#34;
az storage container create -n arkblob --public-access off \
--account-name $AZURE_STORAGE_ACCOUNT_ID --subscription &amp;#34;Visual Studio Professional&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Récupérer le groupe de ressource du cluster K8s&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;az group list --query &amp;#39;[].{ ResourceGroup: name, Location:location }&amp;#39; --subscription &amp;#34;Visual Studio Professional&amp;#34;
[...]
{
&amp;#34;Location&amp;#34;: &amp;#34;westeurope&amp;#34;,
&amp;#34;ResourceGroup&amp;#34;: &amp;#34;MC_myownkubernetescluster_myawesomeakscluster_westeurope&amp;#34;
},
{
&amp;#34;Location&amp;#34;: &amp;#34;westeurope&amp;#34;,
&amp;#34;ResourceGroup&amp;#34;: &amp;#34;myownkubernetescluster&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans le cas d’AKS, il s’agit bien de choisir le groupe qui contient les VMs (MC_myownkubernetescluster_myawesomeakscluster_westeurope), et pas celui que vous avez créé en début de procédure (myownkubernetescluster) qui ne contient que l’objet « Kubernetes service ».&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/01/aks_ark.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;AZURE_RESOURCE_GROUP=MC_myownkubernetescluster_myawesomeakscluster_westeurope
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Créer un « Service principal » (compte de service dans Azure). Ne pas oublier de stocker le secret (contenu de la variable AZURE_CLIENT_SECRET) car on y aura plus accès a posteriori.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;AZURE_CLIENT_SECRET=`az ad sp create-for-rbac --name &amp;#34;myarkserviceprincipal&amp;#34; --role &amp;#34;Contributor&amp;#34; --query &amp;#39;password&amp;#39; -o tsv`
AZURE_CLIENT_ID=`az ad sp list --display-name &amp;#34;myarkserviceprincipal&amp;#34; --query &amp;#39;[0].appId&amp;#39; -o tsv`
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="récupérer-les-sources"&gt;Récupérer les sources
&lt;/h3&gt;&lt;p&gt;Dans mon cas, la dernière version disponible est la v1.6.2, et j’ai besoin des la version linux amd64&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir velero &amp;amp;&amp;amp; cd velero
wget https://github.com/vmware-tanzu/velero/releases/download/v1.6.2/velero-v1.6.2-linux-amd64.tar.gz
tar -xzf velero-v1.6.2-linux-amd64.tar.gz
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="créer-un-namespace-et-un-service-provider-différents-de-ceux-par-défaut"&gt;Créer un namespace et un service provider (différents de ceux par défaut)
&lt;/h3&gt;&lt;p&gt;Quelque soit le cloud provider, il faut modifier le fichier config/common/00-prereqs.yaml&lt;/p&gt;
&lt;p&gt;Comme indiqué dans la documentation dédiée, ce fichier contient la plupart des informations génériques, notamment, les définitions (CRD pour les backups/restores Ark), le namespace, le service account et les rôles (RBAC).&lt;/p&gt;
&lt;p&gt;Dans notre cas, on doit donc modifier le fichier config/common/00-prereqs.yaml pour qu’il créé un autre namespace, qu’on appellera « backup » pour faire original;&lt;br&gt;
On va aussi modifier le nom du service account pour qu’il colle à celui du Service Principal azure (pas obligatoire, mais c’est pour rester cohérent) et surtout son namespace.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi config/common/00-prereqs.yaml
[...]
---
apiVersion: v1
kind: Namespace
metadata:
name: backup
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: myarkserviceprincipal
namespace: backup
labels:
component: ark
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: ark
labels:
component: ark
subjects:
- kind: ServiceAccount
namespace: backup
name: myarkserviceprincipal
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, il faut également modifier les spécifiques à notre cloud provider (ici Azure), en particulier le namespace, mais aussi nos informations de connexion à notre blob&lt;/p&gt;
&lt;p&gt;Dans le déploiement, changer le namespace et le serviceAccountName&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi config/azure/00-ark-deployment.yaml
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
namespace: backup
name: ark
[...]
spec:
restartPolicy: Always
serviceAccountName: myarkserviceprincipal
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;vi config/azure/05-ark-backupstoragelocation.yaml
---
apiVersion: ark.heptio.com/v1
kind: BackupStorageLocation
metadata:
name: default
namespace: backup
spec:
provider: azure
objectStorage:
bucket: arkblob
config:
resourceGroup: arkbackups
storageAccount: arkANDTHEUUID
vi config/azure/06-ark-volumesnapshotlocation.yaml
---
apiVersion: ark.heptio.com/v1
kind: VolumeSnapshotLocation
metadata:
name: azure-default
namespace: backup
spec:
provider: azure
config:
apiTimeout: 30s
resourceGroup: ark-EUW-sandbox-RG
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Créer les objets sur le cluster Kubernetes sur Azure&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl --context=myawesomeakscluster apply -f config/common/00-prereqs.yaml
customresourcedefinition.apiextensions.k8s.io/backups.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/schedules.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/restores.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/downloadrequests.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/deletebackuprequests.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/podvolumebackups.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/podvolumerestores.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/resticrepositories.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/backupstoragelocations.ark.heptio.com created
customresourcedefinition.apiextensions.k8s.io/volumesnapshotlocations.ark.heptio.com created
namespace/backup created
serviceaccount/arkeuwsandboxsp created
clusterrolebinding.rbac.authorization.k8s.io/ark created
kubectl --context=myawesomeakscluster apply -f config/azure/
deployment.apps/ark created
backupstoragelocation.ark.heptio.com/default created
volumesnapshotlocation.ark.heptio.com/azure-default created
daemonset.apps/restic created
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A noter : avant le premier appel de ark, sur chaque machine, il faudra spécifier dans quel namespace est ark sur notre cluster K8s.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;./ark client config set namespace=backup
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Créer le secret du service provider&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#AZURE_RESOURCE_GROUP=MC_myownkubernetescluster_myawesomeakscluster_westeurope
AZURE_SUBSCRIPTION_ID=d717105a-ac1d-457c-8ef8-7467aa90df5c
AZURE_TENANT_ID=15eb2494-5298-4347-81a3-e2d3c08a0f82
AZURE_CLIENT_ID=f44ae340-97a2-4d54-bdc5-c4d7b2a49a2a
AZURE_CLIENT_SECRET=r+VGoBqOwraH9uVdk/sED3Ezdb7bIZI1xjvZyyvmnzM=
kubectl --context=myawesomeakscluster --namespace=backup create secret generic ark-azure-credentials \
--from-literal AZURE_SUBSCRIPTION_ID=${AZURE_SUBSCRIPTION_ID} \
--from-literal AZURE_TENANT_ID=${AZURE_TENANT_ID} \
--from-literal AZURE_CLIENT_ID=${AZURE_CLIENT_ID} \
--from-literal AZURE_CLIENT_SECRET=${AZURE_CLIENT_SECRET} \
--from-literal AZURE_RESOURCE_GROUP=${AZURE_RESOURCE_GROUP}
secret/ark-azure-credentials created
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="créer-des-données-dans-le-cluster-pour-vérifier-le-fonctionnement"&gt;Créer des données dans le cluster pour vérifier le fonctionnement
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl create ns testrestore
namespace/testrestore created
kubectl run pod ubuntu --image=ubuntu --namespace=testrestore
deployment.apps/pod created
kubectl --namespace=testrestore get all
NAME READY STATUS RESTARTS AGE
pod/pod-5945cc9b88-sq8c8 0/1 RunContainerError 1 14s
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.apps/pod 1 1 1 0 14s
NAME DESIRED CURRENT READY AGE
replicaset.apps/pod-5945cc9b88 1 1 0 14s
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="créer-une-backup"&gt;Créer une backup
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;./ark backup create $(date +&amp;#34;%Y%m%d-%H%M&amp;#34;)
Backup request &amp;#34;20190109-1553&amp;#34; submitted successfully.
Run `ark backup describe 20190109-1553` or `ark backup logs 20190109-1553` for more details.
./ark backup describe 09-01-2019
Name: 09-01-2019
Namespace: backup
Labels:
Annotations:
Phase: New
Namespaces:
Included: *
Excluded:
Resources:
Included: *
Excluded:
Cluster-scoped: auto
Label selector:
Storage Location:
Snapshot PVs: auto
TTL: 720h0m0s
Hooks:
Backup Format Version: 0
Started: &amp;lt;n/a&amp;gt;
Completed: &amp;lt;n/a&amp;gt;
Expiration: 0001-01-01 00:00:00 +0000 UTC
Validation errors:
Persistent Volumes:
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="restaurer-une-backup"&gt;Restaurer une backup
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl --namespace=testrestore delete ns testrestore
namespace &amp;#34;testrestore&amp;#34; deleted
./ark backup get
NAME STATUS CREATED EXPIRES STORAGE LOCATION SELECTOR
20190109-1553 Completed 2019-01-02 14:30:17 +0100 CET 23d default
./ark restore create restore-01 --from-backup 20190109-1553
Restore request &amp;#34;restore-01&amp;#34; submitted successfully.
Run `ark restore describe restore-01` or `ark restore logs restore-01` for more details.
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>CIVO : du kubernetes managé à partir de 4$/mois, vraiment ?</title><link>https://blog.zwindler.fr/2021/07/16/civo-du-kubernetes-manage-a-partir-de-4-mois-vraiment/</link><pubDate>Fri, 16 Jul 2021 07:00:00 +0000</pubDate><guid>https://blog.zwindler.fr/2021/07/16/civo-du-kubernetes-manage-a-partir-de-4-mois-vraiment/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/07/PXL_20210715_193337426.webp" alt="Featured image of post CIVO : du kubernetes managé à partir de 4$/mois, vraiment ?" /&gt;&lt;p&gt;Pendant la &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=kubecon&amp;#43;2021" &gt;Kubecon EU 2021&lt;/a&gt;, un provider que je ne connaissais pas a mis le paquet pour s’assurer de la visibilité : &lt;a class="link" href="https://www.civo.com" target="_blank" rel="noopener"
&gt;CIVO&lt;/a&gt;. Et avec une promesse plus qu’alléchante : un Kubernetes managé basé sur &lt;a class="link" href="https://blog.zwindler.fr/2019/03/21/deployer-en-5-minutes-un-cluster-kubernetes-sur-arm-avec-k3s-et-ansible/" &gt;k3s (que j’adore&lt;/a&gt;) et avec un tarif &lt;strong&gt;à partir de&lt;/strong&gt; 4$/mois !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/07/00_civo.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Chez les concurrents, on a rien sous les 15€ / mois (Scaleway), quand ce n’est pas 30 voire 80… De quoi piquer ma curiosité donc.&lt;/p&gt;
&lt;h2 id="un-de-plus-"&gt;Un de plus ?
&lt;/h2&gt;&lt;p&gt;J’ai donc pris un compte d’essai proposé par l’entreprise aux participants de la Kubecon et j’ai créé un compte.&lt;/p&gt;
&lt;p&gt;La première chose que j’ai testé, c’est l’interface (il y a aussi une CLI). Forcément, chez un pure player, c’est simple et efficace, on s’y retrouve et l’interface est léchée. On est loin du gloubiboulga visuel de chez Azure (cf &lt;a class="link" href="https://blog.zwindler.fr/2018/12/18/jai-teste-pour-vous-aks-la-plateforme-kubernetes-managee-dazure/" &gt;mon test d’AKS&lt;/a&gt;). Après, c’est un minimum&amp;hellip; c’est forcément plus simple quand on commence de zéro et qu’on a pas des centaines de produits ;-p.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/07/01_civo_dashboard.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On a un dashboard avec les opérations réalisées chronologiquement, un menu pour créer des clusters kube, un menu pour créer du compute et des LB « nus ». Rien de bien révolutionnaire, ça fait le job.&lt;/p&gt;
&lt;p&gt;La partie « KubeQuest », c’est de la bête gamification (« Créez un cluster pour passer niveau 2!!! »), je ne m’y attarderai même pas.&lt;/p&gt;
&lt;h2 id="bon-on-le-créé-ce-cluster-à-4-"&gt;Bon, on le créé ce cluster à 4$ ?
&lt;/h2&gt;&lt;p&gt;Bon, ne vous enflammez pas, l’offre « à partir de 4$/mois » ne sera pas utilisable en prod, pas de miracle. Mais c’est déjà un tour de force qu’ils arrivent à le proposer, notamment grâce à k3s.&lt;/p&gt;
&lt;p&gt;Pas de surprise, le pricing des nodes est immédiatement affiché, et voilà à quoi ça ressemble :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/07/02_civo_4dollars.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pour 4$ par mois, on vous propose un « cluster » d’un seul node, avec seulement 1 vCPU et 1 Go de RAM. Pas de quoi faire tourner grand chose d’autre que quelques containers nginx&amp;hellip; Si ça jamais ça fonctionne ?! (on y reviendra)&lt;/p&gt;
&lt;p&gt;Au delà, les prix sont similaires à ce que l’on trouve sur le marché « bon marché » (Scaleway notamment). Si on veut être un peu sérieux et comparer ce qui est comparable, on peut booter des machines avec 2vCPU et 4 Go de RAM à16$/mois l’unité (moins de ~13,5€ en ce moment).&lt;/p&gt;
&lt;h2 id="kubernetes-easy-to-install"&gt;Kubernetes easy to install
&lt;/h2&gt;&lt;p&gt;La plupart des offres managées de Kubernetes (si ce n’est toutes) viennent avec une certaine quantité de personnalisation préinstallée. Chez Azure, vous pouvez choisir parti 2 CNIs et le dashboard (ou pas). Chez Scaleway si c’est Calico qui est préinstallé ou pas.&lt;/p&gt;
&lt;p&gt;Chez CIVO, ils ont poussé le concept beaucoup plus loin, en reprenant l’idée de Rancher ou d’Openshift du « marketplace ».&lt;/p&gt;
&lt;p&gt;Avant de boostraper votre cluster, vous avez accès à tout un magasin d’applications (ni plus ni moins que des charts helm avec une icône pour cliquer dessus) et éventuellement une très petite personnalisation avec un dropdown menu (mais vraiment trivial, très peu de choix).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/07/03_civo_marketplace-2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et là, pour le coup en terme d’UX je trouve ça très très malin. En quelques clics, j’ai (dé)sélectionné les composants qui m’intéressent et ils ont été préinstallés pour moi avec mon cluster.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/07/04_civo_security.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On peut même préinstaller des produits de sécurité, notamment Kyverno avec un ensemble de règles de sécurité préconfigurées.&lt;/p&gt;
&lt;h2 id="et-cest-pas-fini-"&gt;Et c’est pas fini !
&lt;/h2&gt;&lt;p&gt;Pour ce qui est des composants d’infrastructure, je comprend l’incentive. Pour certains devs, l’infra c’est ch***t.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mon cluster je le veux up and running sans perte de temps, sans pour autant que mes données soient à poil sur Internet&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mais comme tout ce qui « cache » la complexité du métier d’Ops (cf mon article « Au secours, le métier d’Ops va disparaître »), la difficulté n’est pas tant le déploiement que le « day 2 operations ». Et si vous voulez modifier un paramètre, vous êtes marrons.&lt;/p&gt;
&lt;p&gt;Tout de même, préconfigurer cette partie dès le bootstrap du cluster est malin. Et ce qui est encore plus malin, c’est qu’ils ont open sourcé leur marketplace.&lt;/p&gt;
&lt;p&gt;Qu’est ce qu’ils y gagnent, me direz vous ?&lt;/p&gt;
&lt;p&gt;Et bien, s’il y a un nouveau « shiny composant » qui fait rêver tout le monde, vous pouvez aller faire une PR pour ajouter une tuile dans l’UI de CIVO. Comme ça vous bossez pour eux. Elle est pas belle la vie ? ;-p (je troll, mais je trouve ça cool, en vrai).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/07/07_civo_githubpr.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="et-le-cluster-il-boote-vite-"&gt;Et le cluster, il boote vite ?
&lt;/h2&gt;&lt;p&gt;C’est un peu la guéguerre entre Kubernetes managés à qui bootstrappera le control plane et les workers le plus vite. Azure met plus de 20 minutes. OVH bootstrappe le control plane en une minute mais met des plombes à sortir les VMs à cause de leur OpenStack. Exoscale fait le tout (control plane + workers) en moins de 2 minutes.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/07/05_civo_creating-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;CIVO nous promet 90 secondes et c’était pas loin d’être vrai. Je ne dirai pas que c’est les plus rapides mais ils sont dans le top 3 de tous les kubes managés que j’ai pu tester, sans hésiter.&lt;/p&gt;
&lt;p&gt;Une fois le cluster opérationnel, on vous propose évidemment de télécharger votre kubeconfig et roule ma poule&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/07/06_civo_kubeconfig.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="mais-quest-ce-quon-peut-faire-tourner-dans-kube-avec-1-ou-4-go-de-ram-"&gt;Mais qu’est ce qu’on peut faire tourner dans Kube avec 1 (ou 4) Go de RAM ?
&lt;/h2&gt;&lt;p&gt;Le souci avec ce genre de « petites machines », c’est que si vous n’avez pas OS et kubernetes optimisés, une part non négligeable de la VM ne sera pas utilisable pour vos workloads et vous n’aurez que (dans le pire des cas) 2 Go de libre.&lt;/p&gt;
&lt;p&gt;Et c’est là toute la « &lt;em&gt;malinerie&lt;/em&gt; » d’utiliser k3s plutôt qu’un k8s vanilla. k3s est spécialement pensé pour tourner sur des petites machines (en edge notamment). J’avais pu installer un master kubernetes sur un raspberry pi 1 (model B, 1 CPU ridicule et 512 Mo de RAM) tellement l&amp;rsquo;empreinte mémoire demandée est faible.&lt;/p&gt;
&lt;p&gt;Associé à un magasin d’applications maison pré-tuné pour consommer peu (très petites requests pour fit les petites machines sans tout bloquer), on arrive avec des nodes quasiment sans overhead. Dans cet exemple, j’ai cliqué sur plusieurs composants (cert-manager, kyverno, ha-proxy, prometheus+alertmanager+grafana, metrics-server, falco). Je me retrouve avec des nodes (4vCPU 8Go) quasiment vides !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl --kubeconfig civo-zwindler-kubeconfig top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k3s-zwindler-deadbeef-node-pool-31af 230m 5% 945Mi 12%
k3s-zwindler-deadbeef-node-pool-6609 97m 2% 471Mi 6%
k3s-zwindler-deadbeef-node-pool-e07c 141m 3% 874Mi 11%
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Du coup, pour du lab perso ou des workloads qui nécessitent très peu de puissance, l’offre de CIVO est plutôt bien positionnée. Je ne suis pas complètement convaincu de l’intérêt de l’offre extra small à 4$ qui est plus là pour la &lt;em&gt;prouesse technique&lt;/em&gt; qu’une réelle utilisation. Mais dès small ou medium, on a un service qui fonctionne, moins cher que de nombreux concurrents et surtout bien plus optimisé en terme de ratio overhead/puissance totale.&lt;/p&gt;
&lt;p&gt;Au delà de kubernetes, l’offre est quasiment inexistante. Des VMs (plus chères que les workers kubes !!! wtf) et des loadbalancer à 10$/mois (Scaleway le fait à 8€, on est dans les prix « pas cher ») et c’est tout&amp;hellip;&lt;/p&gt;
&lt;p&gt;Autant dire que c’est kubernetes ou rien. Du coup, est ce qu’il y a un marché pour ce besoin, je ne suis pas certain&amp;hellip; mais pourquoi pas ? En tout cas, bonne surprise !&lt;/p&gt;</description></item><item><title>J’ai testé pour vous : l’offre Kubernetes as a service d’OVH</title><link>https://blog.zwindler.fr/2019/07/09/jai-teste-pour-vous-loffre-kubernetes-as-a-service-dovh/</link><pubDate>Tue, 09 Jul 2019 11:30:50 +0000</pubDate><guid>https://blog.zwindler.fr/2019/07/09/jai-teste-pour-vous-loffre-kubernetes-as-a-service-dovh/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/07/cropped-ovh_kubernetes.webp" alt="Featured image of post J’ai testé pour vous : l’offre Kubernetes as a service d’OVH" /&gt;&lt;h2 id="ovh-sort-son-offre-kubernetes-managée"&gt;OVH sort son offre Kubernetes managée
&lt;/h2&gt;&lt;p&gt;Vous avez peut être vu passer l’actualité début février, OVH a lancé (comme d’autres cloud providers) &lt;a class="link" href="https://www.ovh.com/fr/public-cloud/kubernetes/" target="_blank" rel="noopener"
&gt;son offre Kubernetes as a service (KaaS)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/06/kas.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cette blague hilarante vous est offerte par zwindler !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Comme beaucoup de techno non triviales, une offre managée, c’est un bon moyen de mettre le pied à l’étrier si vous ne connaissez pas encore Kubernetes. C’est aussi un bon moyen pour OVH pour ne pas trop se laisser distancer par les géants américains.&lt;/p&gt;
&lt;p&gt;En avril dernier, j’ai pu participer à un meetup dans les locaux d’OVH et de rencontrer les personnes qui avaient mis en place cette technologie. Du coup, je vous propose un petit article dans lequel on va voir ensemble à quoi ça ressemble.&lt;/p&gt;
&lt;h2 id="côté-tarif"&gt;Côté tarif
&lt;/h2&gt;&lt;p&gt;C’est le nerf de la guerre. Comme tous les autres (à l’exception notable d’EKS d’Amazon), vous ne payez que pour les workers, pas pour les masters (le control plane donc). Niveau tarif pour les workers, c’est simple, ce sont les tarifs applicables sur l’offre cloud public d’OVH.&lt;/p&gt;
&lt;p&gt;La plus petite machine que vous pouvez sélectionner est un machine Linux de type B2-7, avec 2 vCPUs, 7 Go de RAM et 50 Go de SSD local.&lt;/p&gt;
&lt;p&gt;C’est suffisant pour faire des tests, mais en production on en voudra au minimum 3, ce qui à 22€HT/mois pièce vous fera quand même environ 75€ / mois.&lt;/p&gt;
&lt;p&gt;Au final, on est objectivement moins cher que ce que &lt;a class="link" href="https://blog.zwindler.fr/2018/12/18/jai-teste-pour-vous-aks-la-plateforme-kubernetes-managee-dazure/" &gt;j’avais pu tester sur AKS&lt;/a&gt;. Car pour rappel, j’avais monté un cluster de machines de type B2ms avec 2 vCPU et 8 Go de RAM pour 30€ / mois, donc identique. SAUF que ces machines sont des machines dites &amp;ldquo;burstable&amp;rdquo; (vous n’avez qu’une portion d’un vCPU, que vous ne pouvez dépasser que pour une durée réduite avant de subir un throttling). Des machines équivalentes reviendraient sur Azure à utiliser des D2, pour un tarif de 83€TTC / mois&amp;hellip; par machine !!!&lt;/p&gt;
&lt;p&gt;Le fait que le control plane (les masters) ne soient pas payant est à la fois un avantage et un inconvénient. Pour OVH, je n’ai pas encore la réponse, mais lorsque j’avais testé AKS d’Azure, j’avais demandé au commercial ce qui se passait si mon control plane était HS (vu que c’est eux qui gèrent, je ne peux pas prendre la main pour le fixer). Il m’avait répondu texto : &amp;ldquo;comme c’est un produit gratuit, on ne s’engage sur aucune SLA (seulement un SLO de 2h)&amp;rdquo;. De quoi refroidir quand on est habitué à avoir la main sur son cluster Kubernetes.&lt;/p&gt;
&lt;h2 id="et-si-on-testait-"&gt;Et si on testait ?
&lt;/h2&gt;&lt;p&gt;Assez parlé ! Dans mon manager d’OVH, j’ai créé un nouveau projet, que j’ai nommé de manière originale &amp;ldquo;Kubernetes Project&amp;rdquo;. Puis, j’ai créé un cluster Kubernetes en cliquant sur &amp;ldquo;Créer un cluster Kubernetes&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/06/ovh_manager1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Actuellement, seul le DC &amp;ldquo;Graveline 5&amp;rdquo; semble capable d’accueillir l’offre KaaS d’OVH. Un point qu’il faudra améliorer dans le futur pour pouvoir se construire une infrastructure réellement résiliente.&lt;/p&gt;
&lt;p&gt;Edit: Une deuxième région sera disponible dans le mois (cf Maxime Hurtrel, PM K8s chez OVH)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/06/creer_kubernetes1-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Niveau version de Kubernetes, bonne nouvelle, OVH s’est donné les moyens de proposer des versions très à jour de Kubernetes. Toutes les versions depuis la 1.11 jusqu’à la version 1.14 sont disponibles. La 1.14, qui n’a que quelques mois, est devenue dispo chez OVH assez rapidement. On peut imaginer que la 1.15 de Kubernetes qui vient tout juste de sortir (mi juin) sera probablement assez vite disponible aussi.&lt;/p&gt;
&lt;p&gt;A titre de comparaison, chez Azure, ils sont assez bons dans ce domaine, et pourtant ils n’ont la 1.14 qu’en preview. Le mauvais élève Amazon est à la traîne avec seulement la 1.12 (pourtant sortie en septembre 2018).&lt;/p&gt;
&lt;h2 id="ca-va-trop-vite"&gt;&amp;ldquo;Ca va trop vite&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;Cette partie là est relativement impressionnante. La création d’un nouveau cluster est extrêmement rapide.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/06/kube1.4-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Au total, l’instanciation d’un cluster met moins d’une minute, là où AKS en nécessite une 20aine (en comptant les workers certes, mais bon la moitié du temps le portal ou l’appel à l’API plante !).&lt;/p&gt;
&lt;p&gt;Ceci est du à la façon dont le control plane a été créé et conçu par les équipes d’OVH (j’y reviendrais juste après) et est clairement une réussite. Pour avoir déployé à la main Kubernetes un paquet de fois et avec de nombreuses méthodes différentes (&lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=kubernetes" &gt;cf mes divers articles sur le sujet&lt;/a&gt;), c’est la méthode la plus rapide d’installer Kubernetes, et de loin.&lt;/p&gt;
&lt;h2 id="larchitecture-du-control-plane"&gt;L’architecture du control plane
&lt;/h2&gt;&lt;p&gt;Un des trucs sympas avec OVH, c’est qu’ils n’hésitent pas à communiquer sur les détails techniques. Certes, ils ne sont pas les seuls, mais c’est toujours agréables.&lt;/p&gt;
&lt;p&gt;Lors du &lt;a class="link" href="https://www.meetup.com/fr-FR/Cloud-Native-Computing-Bordeaux/events/259991418/" target="_blank" rel="noopener"
&gt;CNCF Meetup, Kevin Georges, Pierre Peronnet et Sébastien Jardin&lt;/a&gt; nous ont donc présenté les entrailles de leur Kubernetes as a service.&lt;/p&gt;
&lt;p&gt;L’idée principale est que le &lt;em&gt;control plane&lt;/em&gt; doit être le plus léger possible, pour coûter le moins cher possible à OVH (vu que c’est gratuit), tout en restant résilient.&lt;/p&gt;
&lt;p&gt;La solution qui a été retenue pour arriver à une solution acceptable a été de déployer les services nécessaires au control plane de Kubernetes (control malanger, api server, scheduler) dans &amp;hellip; un Kubernetes ! La seule brique non containerisée est etcd, et il s’agit ici d’un cluster dédié sur des machines physiques (ce qui explique probablement la limitation au DC Graveline).&lt;/p&gt;
&lt;p&gt;Dans tous les cas, ça explique probablement aussi la vitesse de démarrage d’un nouveau cluster : il faut juste lancer 3 containers et zou, un nouveau cluster.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/07/1-pFziI2YQgKEYx2qLWP68ww.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Source : OVH &lt;a class="link" href="https://www.ovh.com/fr/blog/kubinception-using-kubernetes-to-run-kubernetes/" target="_blank" rel="noopener"
&gt;https://www.ovh.com/fr/blog/kubinception-using-kubernetes-to-run-kubernetes/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;L’article technique détaillant tout ça est dispo &lt;a class="link" href="https://www.ovh.com/fr/blog/kubinception-using-kubernetes-to-run-kubernetes/" target="_blank" rel="noopener"
&gt;sur le site d’OVH&lt;/a&gt;, je n’en dis pas plus, ils l’expliquent mieux que moi.&lt;/p&gt;
&lt;h2 id="les-workers"&gt;Les workers
&lt;/h2&gt;&lt;p&gt;Pour la partie Workers, plutôt que de développer sa propre API et l’intégrer comme module du projet Kubernetes (comme les autres gros cloud providers, &lt;a class="link" href="https://github.com/kubernetes/kubernetes/tree/7f23a743e8c23ac6489340bbb34fa6f1d392db9d/pkg/cloudprovider/providers" target="_blank" rel="noopener"
&gt;qui ont leur code embarqué dans celui de Kubernetes&lt;/a&gt;), la team chez OVH en charge du projet s’est appuyée sur de l’existant : leurs propres services OpenStack fournissent déjà l’ensemble des briques dont ils ont besoin pour créer des VMs à la volées et les intégrer à des clusters Kubernetes.&lt;/p&gt;
&lt;p&gt;Quand j’ai demandé au Meetup combien de temps il fallait pour &amp;ldquo;poper&amp;rdquo; un nouveau worker, un des trois speakers m’a dit, tout désolé &amp;ldquo;on ne fait pas de miracles, il faut quelques minutes&amp;rdquo;. Il n’a pas compris le pauvre quand j’ai éclaté de rire (parce que sur Azure, ça prend des plombes).&lt;/p&gt;
&lt;h2 id="ajouter-des-workers"&gt;Ajouter des workers
&lt;/h2&gt;&lt;p&gt;La procédure est assez simple, mais se fait au travers de l’interface (comme la création du cluster). Je suis quasiment certain que tout doit pouvoir se piloter par API (je vois mal pourquoi ils auraient fait autrement pour un service tout neuf), pour autant, je n’en ai pas trouvé de trace dans la &lt;a class="link" href="https://docs.ovh.com/gb/en/kubernetes/" target="_blank" rel="noopener"
&gt;documentation officielle (pas à jour avec la nouvelle interface et encore un peu light)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/06/add_nodes_ovh2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Bon, alors je suis peut être mal tombé, mais quand j’ai cliqué dans l’interface pour ajouter des nodes, ça a quand même pris énormément de temps (facile 20-30 minutes). Du coup j’étais un peu (très) déçu&amp;hellip;&lt;/p&gt;
&lt;p&gt;Après investigation, en fait&amp;hellip; c’est l’interface qui déconne ! En réalité, mon nœud était UP depuis longtemps déjà.&lt;/p&gt;
&lt;p&gt;Je m’en suis rendu compte en faisant un petit kubectl get nodes et j’ai vu que mon node &amp;ldquo;Ready&amp;rdquo; depuis 28 minutes était encore marqué &amp;ldquo;En cours d’installation&amp;rdquo; &amp;hellip;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
vm1.12-1 Ready &amp;lt;none&amp;gt; 28m v1.12.7 51.77.204.236 &amp;lt;none&amp;gt; Container Linux by CoreOS 2135.4.0 (Rhyolite) 4.19.50-coreos-r1 docker://18.6.3
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="se-connecter-au-cluster"&gt;Se connecter au cluster
&lt;/h2&gt;&lt;p&gt;D’ailleurs, comment on s’y connecte ? Pas de souci de ce côté, OVH vous simplifie la vie en vous proposant de télécharger directement votre fichier kubeconfig préconfiguré, prêt à utiliser.&lt;/p&gt;
&lt;p&gt;Si vous en avez plusieurs, pour rappel, vous pouvez utiliser le flag &amp;ldquo;&amp;ndash;kubeconfig=kubeconfig.yml&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/07/kubeconfig.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="en-vrai-un-node-ne-met-que-3-minutes-à-poper"&gt;En vrai, un node ne met que 3 minutes à poper
&lt;/h2&gt;&lt;p&gt;Du coup, j’ai voulu retester le démarrage d’une nouvelle VM, en sachant que le temps indiqué sur l’interface web n’est pas bon.&lt;/p&gt;
&lt;p&gt;Après quelques tests, en 3 minutes, le node apparait en &amp;ldquo;Not Ready&amp;rdquo;, puis passe &amp;ldquo;Ready&amp;rdquo; au bout de quelques secondes. On est donc très proche de ce dont j’avais pu parler avec les gens d’OVH du coup, c’est très bon comme temps de boot.&lt;/p&gt;
&lt;p&gt;Ouf, on est rassurés !&lt;/p&gt;
&lt;h2 id="mise-à-jour"&gt;Mise à jour
&lt;/h2&gt;&lt;p&gt;Un point sympa que permettent les solutions de type KaaS est la gestion des mises à jour depuis votre interface de gestion. Mettre à jour Kubernetes, c’est pénible. La moitié du temps, on a peur de tout casser.&lt;/p&gt;
&lt;p&gt;Alors je ne dis pas que rien ne va casser avec le Kubernetes d’OVH, mais comme l’infra est cadrée et gérée par eux, j’imagine que c’est suffisamment bien testé dans des conditions similaires aux vôtres pour être un peu plus serein le jour où ça arrive.&lt;/p&gt;
&lt;p&gt;A noter, contrairement à AKS, vous n’avez que peu la main sur les mises à jour. Cela se limite à ça, et je n’ai pas trouver comment monter de la 1.12 à la 1.13 par exemple&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/07/politique_secu_ovh_kubernetes.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Edit: Toujours selon Maxime Hurtrel, ça devrait arriver bientôt&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="conclusion--au-delà-du-compute-lui"&gt;Conclusion : au delà du compute, l’UI
&lt;/h2&gt;&lt;p&gt;Dans les points qui déchirent : OVH sait fournir un control plane à une vitesse à faire pâlir d’envie tous les concurrents.&lt;/p&gt;
&lt;p&gt;Cependant, cela se fait sur un cluster Kubernetes mono DC (DC5 Graveline), avec la partie etcd externalisée à part, sur un cluster mutualisé. Je ne fais pas de jugement de valeur car, contrairement à OVH qui est transparent, je n’ai pas d’info technique sur les versions proposées par la concurrence.&lt;/p&gt;
&lt;p&gt;En revanche, je peux comparer avec un cluster que j’installe moi même, et là clairement, je suis un cran en dessous en terme de ce qui peut être fait en terme de sécurisation de mon cluster.&lt;/p&gt;
&lt;p&gt;Pour ce qui est de l’interface, elle souffre un peu de sa jeunesse. Il n’y a rien de plus que les onglets pour créer un cluster et pour ajouter ou supprimer des nœuds (et encore, pas plus d’info sur ces nœuds que leur nom et leur taille !).&lt;/p&gt;
&lt;p&gt;Un dernier onglet existe pour &amp;ldquo;visualiser&amp;rdquo; ses containers et ses services, mais il est pour l’instant vide et sera de toute façon probablement moins utile que le dashboard ou tout autre outil existant (sauf à fournir un énorme effort de dev sur ce point).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/07/kube_dashboard.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Encore un exemple de la jeunesse de la solution et particulièrement de son interface : OVH pope des VMs (workers) très vite, ce qui devrait être super cool et soulever les foules&amp;hellip; mais si on teste la solution rapidement, comme l’interface ne l’indique pas, on pourrait penser que ce n’est pas le cas ! Dommage !&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Edit: Le problème est connu et en cours de fix&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;[Le tweet n&amp;rsquo;est plus disponible]&lt;/p&gt;
&lt;p&gt;Et pour ce qui est des mises à jour, c’est le flou total. On vous explique que tout est maintenu à jour, mais les montées de versions majeurs sur un cluster ne semble pas disponible pour l’instant.&lt;/p&gt;
&lt;p&gt;Dans les points pas glop : aucune trace dans la doc d’API pour créer des clusters à la volée ou les gérer de manière automatisée via Ansible ou autre&amp;hellip;&lt;/p&gt;
&lt;p&gt;Edit: &lt;a class="link" href="https://api.ovh.com/console/#/cloud/project/%7BserviceName%7D/kube#GET" target="_blank" rel="noopener"
&gt;l’API est là&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[Le tweet n&amp;rsquo;est plus disponible]&lt;/p&gt;
&lt;p&gt;Bref, vous l’aurez compris, techniquement c’est une réussite. Chez OVH, ils savent gérer des VMs et des containers et ça se voit. Mais l’offre KaaS d’OVH manque peut être encore d’un petit coup de polish pour qu’on se sente bien chez soi, et pleinement en confiance. Et c’est d’autant plus rageant que la solution a plein de bons points, que le travail abattu (en peu de temps) est colossal.&lt;/p&gt;
&lt;p&gt;Je voudrais donc tenter de terminer sur une note positive, car c’est mon ressenti au global. Pour avoir rencontré des membres de l’équipes (de vrais passionnés), j’ai envie de croire que ce produit est amené à grandir, et ses petits défauts de jeunesse à disparaître.&lt;/p&gt;
&lt;p&gt;A suivre donc !&lt;/p&gt;
&lt;h2 id="bonus-gpu"&gt;Bonus GPU
&lt;/h2&gt;&lt;p&gt;Dans les petits &amp;ldquo;trucs&amp;rdquo; qui m’ont fait sourire, j’ai vu passer un tweet indiquant qu’OVH se lançait également (en alpha par contre pour l’instant) dans Kubernetes managé avec des instances baremetal avec GPU.&lt;/p&gt;
&lt;p&gt;Je n’ai pas forcément de workload en tête, mais pour ceux qui veulent lancer des containers avec des calculs GPU, c’est une option qui peut faire sens.&lt;/p&gt;
&lt;p&gt;Si vous voulez en savoir plus, c’est par ici :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://labs.ovh.com/gpu-baremetal-kubernetes-nodes" target="_blank" rel="noopener"
&gt;Labs OVH GPU baremetal k8s nodes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Déléguer l’authentification Gitlab à Azure AD avec OAuth2</title><link>https://blog.zwindler.fr/2019/05/14/deleguer-lauthentification-gitlab-a-azure-ad-avec-oauth2/</link><pubDate>Tue, 14 May 2019 11:45:56 +0000</pubDate><guid>https://blog.zwindler.fr/2019/05/14/deleguer-lauthentification-gitlab-a-azure-ad-avec-oauth2/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/05/gitlab_azuread-1.webp" alt="Featured image of post Déléguer l’authentification Gitlab à Azure AD avec OAuth2" /&gt;&lt;h2 id="gérer-les-comptes-internes-à-gitlab-cest-bof-le-sso-cest-mieux-"&gt;Gérer les comptes internes à Gitlab, c’est bof, le SSO, c’est mieux !
&lt;/h2&gt;&lt;p&gt;Dans le cadre de l’hébergement d’un nouveau serveur Gitlab, j’ai voulu intégrer notre base de compte existante, synchronisée dans Azure à l’aide de l’outil Azure AD, qui est le pendant « cloud » de l’Active Directory, bien connus de mes amis Windowiens (oui, il y en a). La plupart des applications savent aujourd’hui déléguer l’authentification à des fournisseurs tiers, généralement de type LDAP, via des protocoles tels que SAML(2) ou OAuth(2).&lt;/p&gt;
&lt;p&gt;Cependant, bien que ces protocoles soient standards, leur implémentation dépend fortement du logiciel en question et il n’est pas toujours facile de s’y retrouver.&lt;/p&gt;
&lt;p&gt;Pour faciliter cette opération, Azure a mis à disposition, directement dans Azure AD, des objets préconfigurés pour des milliers d’applications tierces. C’est comme ça qu’on peut implémenter, de manière simple et rapide, le SSO Active Directory avec les produits Atlassian (JIRA + Confluence), par exemple.&lt;/p&gt;
&lt;h2 id="tout-commence-dans-azure"&gt;Tout commence dans Azure
&lt;/h2&gt;&lt;p&gt;Dans le portail Azure, ouvrir « Entreprise applications », puis cliquer sur « New Application »&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Malheureusement pour nous, il n’y a pas de template pour Gitlab ! Il va falloir le faire à la main.&lt;/p&gt;
&lt;p&gt;A noter, le principe déroulé dans ce tutoriel est valable pour n’importe quelle autre application supportant des mécanismes similaire. Il est possible de réutiliser un template utilisé pour un soft et le réadapter pour d’autres logiciels qui fonctionnent de la même façon. C’est juste une histoire de paramètres.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Le menu nous conseille donc de choisir « Non-gallery application », puisque nous ne trouvons pas Gitlab. Sauf que, bizarrement, il faut un compte Premium pour utiliser cette feature.&lt;/p&gt;
&lt;p&gt;On se rabat donc sur « Application you’re developing ». C’est d’ailleurs ce que conseille d’utiliser &lt;a class="link" href="https://docs.gitlab.com/ee/integration/azure.html" target="_blank" rel="noopener"
&gt;la documentation de Gitlab&lt;/a&gt;. Sauf que, pas de chance non plus, ça ne marche plus comme ça, maintenant ;)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread3.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="créer-une-app-registration-pour-gitlab"&gt;Créer une App registration pour Gitlab
&lt;/h2&gt;&lt;p&gt;Pour toutes les applications qui ne sont pas dans le store, on ne peut donc plus passer par les « Entreprise Applications ». On va donc créer une « App registration », qui n’est ni plus ni moins qu’un compte de service avec un ID et un (ou plusieurs) secrets.&lt;/p&gt;
&lt;p&gt;Cliquer sur « New registration », puis lui donner un nom.&lt;/p&gt;
&lt;p&gt;Sélectionner le type de comptes qui pourront accéder à cette application. Dans mon cas, il s’agit uniquement d’autoriser les comptes provenant de mon AD, mais on peut imaginer le cas d’une application ouverte en BtoB ou carrément ouverte à tout Internet.&lt;/p&gt;
&lt;p&gt;Enfin, renseigner l’URL de callback, qui permettra à Azure de rediriger l’utilisateur qui s’est authentifié avec succès vers notre Gitlab.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We’ll return the authentication response to this URI after successfully authenticating the user. Providing this now is optional and it can be changed later, but a value is required for most authentication scenarios.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dans le cas précis de Gitlab, cette URL aura la forme : &lt;a class="link" href="https://mongitlab.example.org/users/auth/azure_oauth2/callback" target="_blank" rel="noopener"
&gt;mongitlab.example.org/users/auth/azure_oauth2/callback&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread4-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="récupérer-des-valeurs-qui-intéressent-gitlab"&gt;Récupérer des valeurs qui intéressent Gitlab
&lt;/h2&gt;&lt;p&gt;Retourner ensuite dans l’overview de notre nouvelle « App registration ». Dans les détails, elle dispose d’un Application ID, aussi appelé Client ID et d’un Tenant ID :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread5.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On va maintenant créer un Secret. Pour les secrets, on peut choisir soit d’uploader un certificat (conseillé car plus sécurisé), ou de lui générer un mot de passe. Pour la simplicité de ce tutoriel, je vais créer un mot de passe pour notre application, mais je le répète, mieux vaut uploader un certificat.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread6.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On dispose maintenant de notre CLIENT_ID, notre TENANT_ID et de notre CLIENT_SECRET. Notez les bien, car une fois que la fenêtre sera fermée, il ne sera plus possible de relire à nouveau le secret et il faudra en générer un nouveau&amp;hellip;&lt;/p&gt;
&lt;h2 id="ajouter-des-restrictions-ou-des-fonctionnalités-complémentaires"&gt;Ajouter des restrictions ou des fonctionnalités complémentaires
&lt;/h2&gt;&lt;p&gt;En fonction de votre niveau de licence pour Azure AD, vous aurez accès à plus ou moins de choses. Moi, je n’ai accès à pratiquement aucune feature, mais si vous avez mieux, vous aller pouvoir ajouter des options très pratiques telles que le self service (les utilisateurs peuvent demander eux même à avoir accès à l’application, et si c’est validé, ils sont ajouté dans le bon groupe) et aux autorisations/restrictions par groupes Azure AD.&lt;/p&gt;
&lt;p&gt;Pour se faire, il faut RETOURNER dans les Entreprises Applications (#RollingEyes), puis chercher notre « App registration » qui y apparaît maintenant dans la liste (avec le filtre All applications).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread7.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="configuration-de-gitlab"&gt;Configuration de Gitlab
&lt;/h2&gt;&lt;p&gt;Gitlab ayant été installé avec les packages, la configuration se situe dans le fichier &lt;strong&gt;/etc/gitlab/gitlab.rb&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Dans le fichier de configuration, ajouter le bloc suivant en remplaçant les valeurs en majuscules par celles qu’on vient de récupérer :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gitlab_rails[&amp;#39;omniauth_providers&amp;#39;] = [
{
&amp;#34;name&amp;#34; =&amp;gt; &amp;#34;azure_oauth2&amp;#34;,
&amp;#34;args&amp;#34; =&amp;gt; {
&amp;#34;client_id&amp;#34; =&amp;gt; &amp;#34;CLIENT_ID&amp;#34;,
&amp;#34;client_secret&amp;#34; =&amp;gt; &amp;#34;CLIENT_SECRET&amp;#34;,
&amp;#34;tenant_id&amp;#34; =&amp;gt; &amp;#34;TENANT_ID&amp;#34;,
}
}
]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Rechargez ensuite Gitlab pour prise en compte de ce nouveau paramètre&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo gitlab-ctl reconfigure
[...]
Running handlers complete
Chef Client finished, 13/637 resources updated in 26 seconds
gitlab Reconfigured!
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une boite d’authentification Azure Oauth2 devrait apparaître sous le login classique !! Youpi :)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread8.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="et-voilà-cest-fini-ou-presque"&gt;Et voilà c’est fini&amp;hellip; ou presque&amp;hellip;
&lt;/h2&gt;&lt;p&gt;Vous avez maintenant ajouté du SSO et l’authentification via Azure AD pour l’accès à votre Gitlab ! On essaye de se connecter ?&lt;/p&gt;
&lt;p&gt;Et Paf !!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/05/git_azuread9.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Signing in using your Azure Oaut2 account without a pre-existing gitLab account is not allowed&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En fait, c’est normal.&lt;/p&gt;
&lt;p&gt;Par défaut, il n’est pas possible de s’authentifier avec Azure Oauth2 si un compte n’existe pas préalablement dans Gitlab, ce qui est quand même bien dommage si vous avez beaucoup de comptes à créer.&lt;/p&gt;
&lt;p&gt;Deux cas de figure.&lt;/p&gt;
&lt;h3 id="soit-vous-ne-souhaitez-pas-que-nimporte-qui-dans-votre-ad-puisse-se-connecter-sans-votre-accord-préalable"&gt;Soit vous ne souhaitez pas que n’importe qui dans votre AD puisse se connecter sans votre accord préalable
&lt;/h3&gt;&lt;p&gt;Dans ce cas là, ce cas vous est finalement assez favorable, puisque vous allez pouvoir explicitement dire qui peut ou ne peut pas se connecter. Si vous ne disposez pas des bonnes licences et que vous avez pas pu restreindre l’accès à un groupe d’utilisateurs, c’est une « solution » de contournement acceptable.&lt;/p&gt;
&lt;p&gt;Cependant, pour éviter de créer à la main tous les comptes, il sera probablement préférable de les créer de manière automatique &lt;a class="link" href="https://docs.gitlab.com/ee/api/" target="_blank" rel="noopener"
&gt;à l’aide de l’API Gitlab&lt;/a&gt; et même &lt;a class="link" href="https://docs.ansible.com/ansible/latest/modules/gitlab_user_module.html" target="_blank" rel="noopener"
&gt;du très bon module Ansible gitlab_user&lt;/a&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;- name: &amp;#34;Create Gitlab User&amp;#34;
gitlab_user:
server_url: &amp;#34;{{gitlab_api}}&amp;#34;
login_token: &amp;#34;{{token}}&amp;#34;
validate_certs: True
name: &amp;#34;Zwindler&amp;#34;
username: &amp;#34;zwindler&amp;#34;
password: &amp;#34;{{ 99999999 | random | to_uuid }}&amp;#34;
confirm: no
email: &amp;#34;zwindler@zwindler.fr&amp;#34;
state: present
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="soit-à-linverse-vous-souhaitez-que-tous-les-utilisateurs-de-votre-ad-puissent-avoir-accès-sans-pour-autant-devoir-les-ajouter-uns-par-uns"&gt;Soit, à l’inverse, vous souhaitez que tous les utilisateurs de votre AD puissent avoir accès, sans pour autant devoir les ajouter uns par uns
&lt;/h3&gt;&lt;p&gt;Il existe alors des lignes sont à ajouter dans la configuration gitlab pour autoriser cette option :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gitlab_rails[&amp;#39;omniauth_allow_single_sign_on&amp;#39;] = [&amp;#39;azure_oauth2&amp;#39;]
gitlab_rails[&amp;#39;omniauth_block_auto_created_users&amp;#39;] = false
gitlab_rails[&amp;#39;sync_profile_from_provider&amp;#39;] = [&amp;#39;azure_oauth2&amp;#39;]
gitlab_rails[&amp;#39;sync_profile_attributes&amp;#39;] = [&amp;#39;name&amp;#39;, &amp;#39;email&amp;#39;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;D’un point de vue sécurité, c’est un peu moins bien puisque n’importe qui avec un compte pourra se connecter, sans que vous le sachiez.&lt;/p&gt;
&lt;p&gt;Cependant, ce problème est un peu moins grave qu’il n’y parait puisque l’utilisateur sera logué mais n’aura accès à rien (ou juste ce qui est « public »).&lt;/p&gt;
&lt;p&gt;Dans le cas d’un Gitlab d’entreprise, où tous les développeurs doivent pouvoir se connecter, cette seconde option me parait quasi obligatoire. C’est encore plus acceptable si vous avez pu restreindre l’accès au SSO par groupe dans Azure AD, comme indiqué plus haut.&lt;/p&gt;
&lt;p&gt;Have fun :)&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/integration/azure.html" target="_blank" rel="noopener"
&gt;docs.gitlab.com/ee/integration/azure.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://serverfault.com/questions/874484/gitlab-and-oauth-to-azure-ad" target="_blank" rel="noopener"
&gt;serverfault.com/questions/874484/gitlab-and-oauth-to-azure-ad&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>J’ai testé pour vous AKS, la plateforme Kubernetes managée d’Azure</title><link>https://blog.zwindler.fr/2018/12/18/jai-teste-pour-vous-aks-la-plateforme-kubernetes-managee-dazure/</link><pubDate>Tue, 18 Dec 2018 12:45:33 +0000</pubDate><guid>https://blog.zwindler.fr/2018/12/18/jai-teste-pour-vous-aks-la-plateforme-kubernetes-managee-dazure/</guid><description>&lt;img src="https://blog.zwindler.fr/2018/12/aks.webp" alt="Featured image of post J’ai testé pour vous AKS, la plateforme Kubernetes managée d’Azure" /&gt;&lt;h2 id="aks--azure-kubernetes-service"&gt;AKS = Azure Kubernetes Service
&lt;/h2&gt;&lt;p&gt;Après EKS (Amazon) et GKE (Google) (et plein d’autres en fait), Azure a fini par lancer aussi son service managé de Kubernetes (&lt;a class="link" href="https://azure.microsoft.com/en-us/blog/introducing-azure-container-service-aks-managed-kubernetes-and-azure-container-registry-geo-replication/" target="_blank" rel="noopener"
&gt;preview en octobre 2017&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Ce service ne doit pas être confondu avec ACI (Azure Container Instances) qui est le service d’Azure CaaS, où vous pouvez instancier les containers à la demande sur les Kubernetes d’Azure, où Kubernetes vous est complètement caché.&lt;/p&gt;
&lt;p&gt;Vous verrez aussi peut être dans la littérature des références à ACS (l’ancien nom d’AKS) ou alors de &lt;a class="link" href="https://github.com/Azure/acs-engine" target="_blank" rel="noopener"
&gt;ACS-engine&lt;/a&gt;, qui est le projet utilisé par Azure pour déployer des clusters Kubernetes (sur du IaaS) pour leur besoins propres et qu’ils ont open sourcé.&lt;/p&gt;
&lt;p&gt;Il s’agit donc bien d’un service fourni par Azure, qui masque toute la complexité du déploiement des machines et des composants de Kubernetes. Vous n’aurez pas accès aux VMs, on n’est donc pas sur du IaaS. Mais contrairement à ACI, vous aurez les pleins pouvoir sur le &lt;em&gt;control plane&lt;/em&gt; de Kubernetes, et vous pourrez l’administrer comme bon vous semble.&lt;/p&gt;
&lt;h2 id="cest-vraiment-facile-à-installer-"&gt;C’est vraiment facile à installer ?
&lt;/h2&gt;&lt;p&gt;Oui, c’est vraiment simple. L’installation peut se faire depuis le portail ou en quelques commandes « az cli »&lt;/p&gt;
&lt;p&gt;Pour tout vous dire, Microsoft a même pousser le vice jusqu’à faciliter l’installation du binaire &lt;strong&gt;kubectl&lt;/strong&gt;, ainsi que la configuration de votre cluster dans les contextes (via des commandes « az cli »). Dans l’absolu, les commandes qu’on va faire ci dessous sont équivalentes à celles que j’ai décrites dans l’article &lt;a class="link" href="https://blog.zwindler.fr/2018/10/16/configurer-ses-contextes-pour-kubectl-sur-un-poste-client/" &gt;Installer kubectl et Configurer kubectl&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nice to have&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="cest-parti-"&gt;C’est parti !!
&lt;/h2&gt;&lt;p&gt;Depuis le portail, cherchez « Kubernetes services », puis cliquez sur « Add ».&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/12/aks_setup2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et si vous préférez comme moi le faire en lignes de commande, ça donne quelque chose comme ça :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;az group create --name myownkubernetescluster --location westeurope --subscription &amp;#34;mysubscription&amp;#34;
az aks create --resource-group myownkubernetescluster --name myawesomeclsuter --node-count 3 --enable-addons monitoring --node-vm-size Standard_B2s --kubernetes-version 1.10.9 --ssh-key-value ~/.ssh/mypublicsshkey.pub --subscription &amp;#34;mysubscription&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si vous l’avez fait depuis le portail, vous verrez également une popup sur la droite pour vous aider à configurer kubectl (mais vous pouvez aussi les utiliser si vous avez monté le cluster avec les commandes précédentes aussi).&lt;/p&gt;
&lt;p&gt;Les commandes à lancer après avoir déployé le cluster sont les suivantes :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/10/aks_login01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;az aks install-cli
Downloading client to /usr/local/bin/kubectl from https://storage.googleapis.com/kubernetes-release/release/v1.12.0/bin/linux/amd64/kubectl
Please ensure that /usr/local/bin is in your search PATH, so the `kubectl` command can be found.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si vous essayez de les lancer sans avoir fait votre &lt;strong&gt;az login&lt;/strong&gt;, vous aurez l’erreur suivante&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;az aks get-credentials --resource-group myownkubernetescluster --name myawesomeclsuter
Resource group &amp;#39;test_AKS&amp;#39; could not be found.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On se logue, donc&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;az login
Note, we have launched a browser for you to login. For old experience with device code, use &amp;#34;az login --use-device-code&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Comme l’indique la commande, &lt;strong&gt;az cli&lt;/strong&gt; à récemment changé de méthode d’authentification par défaut.&lt;/p&gt;
&lt;p&gt;Si vous lancez ces commandes et que vous n’avez pas d’environnement graphique (dans une petite VM par exemple), vous pouvez toujours utiliser l’ancienne méthode avec un code à recopier dans une page web avec la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;az login --use-device-code
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code TOTOTOTOTO to authenticate.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans mon cas, j’ai accès à un abonnement Visual Studio en plus de mes souscriptions habituelles.&lt;/p&gt;
&lt;p&gt;Par défaut, cette souscription est filtrée, donc &lt;strong&gt;az cli&lt;/strong&gt; continuera à ne pas « voir » le ressource group que j’aurai créé pour l’occasion. L’idéal est de l’indiquer explicitement en ajoutant un « &amp;ndash;subscription ». Une autre solution, plus simple, pour éviter le problème est de positionner cette souscription comme « par défaut »&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;az account set --subscription &amp;#34;Visual Studio&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Maintenant ça devrait marcher. On récupère les crédentials et les informations du contexte.&lt;/p&gt;
&lt;p&gt;Par défaut, &lt;strong&gt;az cli&lt;/strong&gt; va merger ces informations avec votre &lt;strong&gt;.kube/config&lt;/strong&gt; existant s’il existe. Si vous avez peur qu’il fasse des bêtises, pensez à le sauvegarder avant.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;az aks get-credentials --resource-group myownkubernetescluster --name myawesomeclsuter
/root/.kube/config has permissions &amp;#34;644&amp;#34;.
It should be readable and writable only by its owner.
Merged &amp;#34;testaksdge&amp;#34; as current context in /root/.kube/config
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/10/aks_login02.avif"
loading="lazy"
&gt;
Maintenant que l’outil &lt;strong&gt;az cli&lt;/strong&gt; a configuré notre contexte pour nous, on peut interagir avec le cluster normalement :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get nodes
NAME STATUS ROLES AGE VERSION
aks-nodepool1-36034183-0 Ready agent 26m v1.10.9
aks-nodepool1-36034183-1 Ready agent 26m v1.10.9
aks-nodepool1-36034183-2 Ready agent 26m v1.10.9
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Lancer le « proxy » (pour afficher le dashboard et accéder à l’API)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;az aks browse --resource-group myownkubernetescluster --name myawesomeclsuter
[...]
Proxy running on http://127.0.0.1:8001/
Press CTRL+C to close the tunnel...
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/10/aks_login03.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="etape-supplémentaire-si-vous-avez-activé-le-rbac"&gt;Etape supplémentaire si vous avez activé le RBAC
&lt;/h2&gt;&lt;p&gt;Si vous avez activé le RBAC, &lt;strong&gt;ce que je vous conseille fortement et qui devrait être le choix par défaut&lt;/strong&gt;, votre dashboard n’aura pratiquement accès à rien !&lt;/p&gt;
&lt;p&gt;Il faut lui ajouter des droits sur le cluster. La procédure complète d’Azure &lt;a class="link" href="https://docs.microsoft.com/fr-fr/azure/aks/kubernetes-dashboard" target="_blank" rel="noopener"
&gt;vous indique la marche à suivre ici&lt;/a&gt;. Ce que eux conseillent, qui est effectivement le plus simple (mais pas le plus sage), est de donner les droits &lt;strong&gt;cluster-admin&lt;/strong&gt; au service account &lt;strong&gt;kubernetes-dashboard&lt;/strong&gt;&amp;hellip;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl create clusterrolebinding kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mais attention aux conséquences ! De très nombreuses personnes laissent le dashboard ouvert sur Internet et si EN PLUS votre dashboard est admin du cluster, vous allez rapidement miner des cryptocurrencies et lancer des mails de SPAM à votre insu&amp;hellip;&lt;/p&gt;
&lt;p&gt;N’autorisez donc pas le portail depuis l’extérieur.&lt;/p&gt;
&lt;h2 id="et-après-"&gt;Et après ?
&lt;/h2&gt;&lt;p&gt;Dans le cycle de vie d’un cluster Kubernetes, deux tâches vont très vite vous intéresser. Sauvegarder vos objets (ce qu’on peut faire avec &lt;a class="link" href="https://github.com/heptio/ark" target="_blank" rel="noopener"
&gt;Ark de Heptio&lt;/a&gt;) et mettre à jour votre cluster (ce qu’on peut faire avec AKS).&lt;/p&gt;
&lt;p&gt;Ces deux points seront le focus d’articles futurs ;-)&lt;/p&gt;</description></item><item><title>Sortie d’Ansible 2.7 et ma première contribution</title><link>https://blog.zwindler.fr/2018/10/10/sortie-dansible-2-7-et-ma-premiere-contribution/</link><pubDate>Wed, 10 Oct 2018 12:15:12 +0000</pubDate><guid>https://blog.zwindler.fr/2018/10/10/sortie-dansible-2-7-et-ma-premiere-contribution/</guid><description>&lt;img src="https://blog.zwindler.fr/2018/10/ansible_logo.webp" alt="Featured image of post Sortie d’Ansible 2.7 et ma première contribution" /&gt;&lt;h2 id="sortie-dansible-27"&gt;Sortie d’Ansible 2.7
&lt;/h2&gt;&lt;p&gt;Hier soir, la dernière version d’Ansible (2.7) est sortie. Cette release s’est concentrée sur une amélioration de la performance et de la stabilité, même si de très nombreux modules ont fait leur apparition, comme à chaque nouvelle version.&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;p&gt;Le support de Python 2.6 est abandonné, au profit de Python 2.7. Cela signifie que l’hôte qui exécutera le playbook devra disposer de Python 2.7 au minimum (même si Python 2.6 est toujours supporté sur la machine cible).&lt;/p&gt;
&lt;h3 id="écritures-concurrentes"&gt;Écritures concurrentes
&lt;/h3&gt;&lt;p&gt;Un problème auquel j’ai déjà eu affaire est la gestion des écritures concurrentes sur un même fichier (par exemple si plusieurs hôtes écrivent sur un même fichier distant ou alors un delegate_to). A priori il existe maintenant un « lock » pour éviter d’écraser les modifications. Il faudra que je teste pour voir si ça marche bien.&lt;/p&gt;
&lt;h3 id="performances-accrues-généralisation-du-ssh-pipelining-"&gt;Performances accrues, généralisation du SSH pipelining ?
&lt;/h3&gt;&lt;p&gt;La plus grosse modification, qui va nécessiter des tests approfondis, est la modification de la manière dont sont déclenchées les actions/modules sur les serveurs distants. Précédemment, les tasks nécessitaient 2 commandes SSH au lieu d’une maintenant. Effectivement, le temps d’exécution de playbooks contenant des actions simple mais très nombreuses pouvait être très long.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ansible-2.7 changes the Ansiballz strategy for running modules remotely so that invoking a module only needs to invoke python once per module on the remote machine instead of twice.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Un gain de performance dans ce genre de cas où on passe plus de temps à lancer des commandes que les exécuter est forcément une bonne nouvelle. Je me demande si ce n’est pas simplement une activation « par défaut » de la variable d’environnement ANSIBLE_SSH_PIPELINING=1 (que j’utilise déjà dans ce genre de cas).&lt;/p&gt;
&lt;p&gt;A priori non &lt;a class="link" href="https://github.com/ansible/ansible/issues/36275" target="_blank" rel="noopener"
&gt;si j’en crois cette issue&lt;/a&gt;, mais pour l’instant je n’ai pas remarqué de différence significative sur mes playbooks les plus gourmands en temps d’exécution.&lt;/p&gt;
&lt;h3 id="module-reboot"&gt;Module reboot
&lt;/h3&gt;&lt;p&gt;A noter, la plupart des gens remontent l’arrivée d’un module « reboot » (et son équivalent « win_reboot ») qui redémarre une machine et ré-initie une connexion une fois que la machine a refait surface. Personnellement je n’utilise pas ce genre de fonctionnalité mais j’imagine que c’est une feature « nice to have » plutôt que d’utiliser le module « pause » ou la fonctionnalité « retry » en attendant que l’hôte refasse surface.&lt;/p&gt;
&lt;h2 id="les-nouveaux-modules"&gt;Les nouveaux modules
&lt;/h2&gt;&lt;p&gt;Je ne vais pas en faire la liste complète (disponible &lt;a class="link" href="https://github.com/ansible/ansible/tree/stable-2.7/changelogs" target="_blank" rel="noopener"
&gt;dans le changelog&lt;/a&gt;), mais cette version a visiblement été l’occasion pour les équipes de plusieurs cloud providers de se mettre en avant.&lt;/p&gt;
&lt;p&gt;On peut noter les équipes de Google Cloud comme grands vainqueurs avec 39 nouveaux modules. Ils sont suivi par Azure (+21, avec l’apport des bases de données et des webapps), Vultr (13), et 8 pour Scaleway.&lt;/p&gt;
&lt;p&gt;Tout ça m’intéresse beaucoup car, notamment pour Scaleway, de nombreux objets étaient encore indisponibles et il a fallut que j’écrive des scripts à la main pour curler l’API, ne serait ce que pour &lt;a class="link" href="https://docs.ansible.com/ansible/2.7/modules/scaleway_image_facts_module.html#scaleway-image-facts-module" target="_blank" rel="noopener"
&gt;récupérer les IDs des templates de VMs&lt;/a&gt; que je voulais utiliser (impossible à lister autrement).&lt;/p&gt;
&lt;p&gt;Avant :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;curl -X GET -H &amp;#34;X-Auth-Token: $SCW_API_KEY&amp;#34; -H &amp;#39;Content-Type: application/json&amp;#39; https://cp-par1.scaleway.com/images | jq -r &amp;#39;.images[] | select(.name|contains(&amp;#34;CentOS&amp;#34;)) | .id,.name,.arch,.modification_date&amp;#39;
37832f54-c18f-4338-a552-113e4302a236
CentOS 7.4
x86_64
2018-09-06T10:40:08.145552+00:00
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Maintenant, je peux sois l’exécuter à la main directement depuis Ansible, soit requêter le serveur Scaleway pour avoir une liste des images disponible directement dans mes playbooks :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible localhost -m scaleway_image_facts -a region=par1
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match &amp;#39;all&amp;#39;
localhost | SUCCESS =&amp;gt; {
&amp;#34;ansible_facts&amp;#34;: {
&amp;#34;scaleway_image_facts&amp;#34;: [
{
&amp;#34;arch&amp;#34;: &amp;#34;x86_64&amp;#34;,
&amp;#34;creation_date&amp;#34;: &amp;#34;2018-09-14T10:01:24.268850+00:00&amp;#34;,
&amp;#34;default_bootscript&amp;#34;: {
&amp;#34;architecture&amp;#34;: &amp;#34;x86_64&amp;#34;,
&amp;#34;bootcmdargs&amp;#34;: &amp;#34;LINUX_COMMON scaleway boot=local nbd.max_part=16&amp;#34;,
&amp;#34;default&amp;#34;: false,
&amp;#34;dtb&amp;#34;: &amp;#34;&amp;#34;,
&amp;#34;id&amp;#34;: &amp;#34;15fbd2f7-a0f9-412b-8502-6a44da8d98b8&amp;#34;,
[...]
- name: Gather Scaleway images facts 
scaleway_image_facts: 
region: par1
register: images_facts
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et tant qu’on est dans le genre module qui vient remplacer des trucs que je faisais à la mimine, on peut aussi citer &lt;a class="link" href="https://docs.ansible.com/ansible/2.7/modules/docker_swarm_module.html#docker-swarm-module" target="_blank" rel="noopener"
&gt;docker_swarm&lt;/a&gt; + &lt;a class="link" href="https://docs.ansible.com/ansible/2.7/modules/docker_swarm_service_module.html#docker-swarm-service-module" target="_blank" rel="noopener"
&gt;docker_swarm_service&lt;/a&gt; pour gérer un cluster docker Swarm (comme son nom l’indique), ou &lt;a class="link" href="https://docs.ansible.com/ansible/2.7/modules/k8s_facts_module.html#k8s-facts-module" target="_blank" rel="noopener"
&gt;k8s_facts&lt;/a&gt; pour récupérer des objets dans Kubernetes.&lt;/p&gt;
&lt;h2 id="et-ma-première-contribution-"&gt;Et ma première contribution !
&lt;/h2&gt;&lt;p&gt;Même si j’ai déjà contribué sur plusieurs projets open source (traductions du site de Shinken, petites contributions à plusieurs plugins Nagios et à XWiki, ouverture d’issues dans de nombreux projects open source), j’ai également résolu ma première issue sur un gros projet grâce à Ansible et l’équipe d’Azure.&lt;/p&gt;
&lt;p&gt;Il y a peu, Microsoft a mis à disposition sur Azure de machine virtuelle disposant gratuitement d’interface physique dédiées (non virtualisées donc) à 30 Gbps et avec une latence moindre (plus d’info sur &lt;a class="link" href="https://docs.microsoft.com/fr-fr/azure/virtual-network/create-vm-accelerated-networking-cli" target="_blank" rel="noopener"
&gt;la documentation officielle&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Comme il s’agissait d’un simple flag à ajouter dans l’API et que &lt;a class="link" href="https://github.com/ansible/ansible/issues/41218" target="_blank" rel="noopener"
&gt;l’issue avait été taguée en « easy fix » par les maintainer&lt;/a&gt;, j’ai sauté sur l’occasion et j’ai pris l’issue à mon compte.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/10/accelerated_network_ansible1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Au final, sur les 70 lignes de mon commit, il n’y a que 10 lignes de codes (le reste étant des tests et de la documentation, obligatoires pour toute soumission), mais je suis quand même content car ça marche bien ;)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/10/accelerated_network_ansible2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Champomy !!&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Votre première VM dans Azure… déployée avec Ansible bien sûr !</title><link>https://blog.zwindler.fr/2018/08/07/premiere-vm-dans-azure-avec-ansible-bien-sur/</link><pubDate>Tue, 07 Aug 2018 11:45:22 +0000</pubDate><guid>https://blog.zwindler.fr/2018/08/07/premiere-vm-dans-azure-avec-ansible-bien-sur/</guid><description>&lt;img src="https://blog.zwindler.fr/2018/06/azure.webp" alt="Featured image of post Votre première VM dans Azure… déployée avec Ansible bien sûr !" /&gt;&lt;h2 id="mais-tu-nas-pas-déjà-fais-un-article-sur-ansible-et-des-vms-"&gt;Mais tu n’as pas déjà fais un article sur Ansible et des VMs ?
&lt;/h2&gt;&lt;p&gt;Si vous me suivez depuis quelques temps, vous savez que j’apprécie particulièrement Ansible. J’ai déjà écris &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=ansible" &gt;plusieurs articles sur le sujet&lt;/a&gt;, ainsi que de nombreux playbooks que j’ai mis à votre disposition sur &lt;a class="link" href="https://github.com/zwindler?utf8=%E2%9C%93&amp;amp;tab=repositories&amp;amp;q=ansible&amp;amp;type=&amp;amp;language=" target="_blank" rel="noopener"
&gt;mon compte github.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Un des articles qui intéresse le plus les lecteurs du blogs est un article en deux parties (&lt;a class="link" href="https://blog.zwindler.fr/2017/06/20/deployer-machines-virtuelles-ansible-vmware/" &gt;part1&lt;/a&gt; &lt;a class="link" href="https://blog.zwindler.fr/2017/11/14/deployer-vm-vmware-ansible-part-2/" &gt;part2&lt;/a&gt;) qui détaille comment déployer des machines virtuelles sur une architecture VMware vSphere avec Ansible. J’en ai d’ailleurs fait une version en anglais également qui attire pas mal de monde aussi ;-).&lt;/p&gt;
&lt;p&gt;Du coup, maintenant que je me suis attaqué aux principaux clouds providers (AWS, GCP et Azure), il était grand temps de faire un article sur cette partie également !&lt;/p&gt;
&lt;p&gt;Comme d’autres outils d’automatisation, Ansible fait la part belle aux intégrations cloud. Je vous laisse jeter un oeil à la liste des modules Ansible disponibles pour le cloud :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.ansible.com/ansible/2.9/modules/list_of_cloud_modules.html" target="_blank" rel="noopener"
&gt;docs.ansible.com/ansible/2.9/modules/list_of_cloud_modules.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et c’est particulièrement vrai pour Azure, dont l’équipe dédiée chez Microsoft est assez réactive et ajoute des features de manière très régulière (on aura l’occasion d’y revenir dans un prochain article, #teasing).&lt;/p&gt;
&lt;h2 id="les-prérequis"&gt;Les prérequis
&lt;/h2&gt;&lt;p&gt;Finalement, déployer un VM dans Azure, c’est presque pareil que comme déployer une VM dans VMware. On a des prérequis, une liste de paramètres à renseigner et pouf, on va poper une VM.&lt;/p&gt;
&lt;p&gt;Bon, en vrai, ce n’est pas aussi trivial : si pour VMware, on se contentait d’une API python relativement simple à installer avec &lt;strong&gt;pip&lt;/strong&gt; et d’un mot de passe, sur Azure, il va falloir trimer un poil plus.&lt;/p&gt;
&lt;p&gt;Deux ressources nous donnent la marche à suivre pour configurer notre poste :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/fr-fr/azure/developer/ansible/overview" target="_blank" rel="noopener"
&gt;Le guide de Microsoft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/fr-fr/azure/ansible/ansible-overview" target="_blank" rel="noopener"
&gt;Le guide d’Ansible&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="installer"&gt;Installer
&lt;/h3&gt;&lt;p&gt;Sur une machine mint/debian/ubuntu, récupérer les modules python nécessaires :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;apt install python-pip ansible
pip install setuptools wheel
pip install ansible[azure]
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="configurer"&gt;Configurer
&lt;/h3&gt;&lt;p&gt;Pour déployer des VMs sur Azure, il faut&amp;hellip; un compte sur Azure !&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thanks, captain obvious.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bon, si jamais vous voulez essayer, sachez que vous pouvez vous créer un compte gratuit avec 200$ de crédit offert, mais seulement valable 30 jours. C’est hyper radin de leur part, là où un GCP offre 300$ pendant 1 an, ce qui offre largement plus de temps pour tester.&lt;/p&gt;
&lt;p&gt;Pour ouvrir le compte, il faut simplement aller à &lt;a class="link" href="https://azure.microsoft.com/fr-fr/free/search/?&amp;amp;WT.srch=1&amp;amp;wt.mc_id=AID719808_SEM_Xu5DFmXy&amp;amp;gclid=Cj0KCQjwv-DaBRCcARIsAI9sba9FHepWuC6mzBDlrT2LqPIAQzFYrCdyjTC72M2QqEtYRd6GXXoyooQaAhYsEALw_wcB&amp;amp;dclid=COf_zsaAutwCFY1h0wodDDcOqg" target="_blank" rel="noopener"
&gt;cette URL&lt;/a&gt; et renseigner &lt;strong&gt;une carte bancaire&lt;/strong&gt;. Oui je sais, j’ai flippé moi aussi.&lt;/p&gt;
&lt;p&gt;Normalement, ils ne vous prélèveront pas sans vous prévenir, c’est simplement pour éviter les bots. Personnellement je n’ai pas eu de problèmes mais je ne peux rien garantir (même si je pense que ça se saurait s’il y avait eu des soucis de ce côté là).&lt;/p&gt;
&lt;p&gt;Une fois le compte créé, on va générer les fichiers de configuration pour Azure. Le plus simple pour le faire, c’est d’utiliser la commande « az login » (mais du coup il faut &lt;a class="link" href="https://docs.microsoft.com/fr-fr/cli/azure/install-azure-cli?view=azure-cli-latest" target="_blank" rel="noopener"
&gt;installer az cli&lt;/a&gt; en plus).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;az login
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code CCHMTROLL to authenticate.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/08/azcli.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Vous devriez avoir un dossier .azure dans votre homedir&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ll .azure
total 8
drwxrwxrwx 1 zwindler zwindler 512 Aug 4 17:00 ./
drwxr-xr-x 1 zwindler zwindler 512 Aug 4 16:56 ../
-rw------- 1 zwindler zwindler 7124 Aug 4 17:00 accessTokens.json
-rw-rw-rw- 1 zwindler zwindler 5 Aug 4 16:56 az.json
-rw-rw-rw- 1 zwindler zwindler 5 Aug 4 16:56 az.sess
-rw-rw-rw- 1 zwindler zwindler 333 Aug 4 17:00 azureProfile.json
-rw-rw-rw- 1 zwindler zwindler 66 Aug 4 17:00 clouds.config
-rw------- 1 zwindler zwindler 27 Aug 4 16:56 config
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="et-donc-on-la-déploie-sur-azure-cette-vm-"&gt;Et donc, on la déploie sur Azure, cette VM ?
&lt;/h2&gt;&lt;p&gt;Maintenant que notre poste est configuré, ça redeviens simple. Ouf !&lt;/p&gt;
&lt;p&gt;Le module à invoquer dans notre playbook est &lt;strong&gt;azure_rm_virtualmachine&lt;/strong&gt;, dont la documentation est disponible à l’adresse suivante :&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://docs.ansible.com/ansible/latest/modules/azure_rm_virtualmachine_module.html#azure-rm-virtualmachine-module" target="_blank" rel="noopener"
&gt;https://docs.ansible.com/ansible/latest/modules/azure_rm_virtualmachine_module.html#azure-rm-virtualmachine-module&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Voici un des exemples donnés dans la documentation du module :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;- name: Create a VM with managed disk
azure_rm_virtualmachine:
resource_group: Testing
name: testvm001
vm_size: Standard_D4
managed_disk_type: Standard_LRS
admin_username: adminUser
ssh_public_keys:
- path: /home/adminUser/.ssh/authorized_keys
key_data: &amp;lt; insert your ssh public key here... &amp;gt;
image:
offer: CoreOS
publisher: CoreOS
sku: Stable
version: latest
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La plupart des options que je vous met plus haut sont obligatoires. Il y en a beaucoup d’autre, mais celles ci sont un minimum. Pour expliquer un peu de quoi il s’agit, voici une petite traduction :&lt;/p&gt;
&lt;p&gt;&lt;u&gt;resource_group&lt;/u&gt;&lt;br&gt;
Sur Azure, il existe plusieurs entités logiques permettant de segmenter les ressources entre elles. La souscription (plus haut niveau de segmentation, utile au niveau billing) et les &lt;strong&gt;resources groups&lt;/strong&gt;. On peut donc avoir plusieurs resource groups dans une souscription.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;name&lt;/u&gt;&lt;br&gt;
Le nom de la ressource, telle qu’elle apparaîtra dans votre portail Azure. Pas plus important que ça.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;vm_size&lt;/u&gt;&lt;br&gt;
Là on rentre dans le vif du sujet ; il s’agit de la taille de la VM (en terme de nombre de CPU et de Go de RAM) que va avoir votre VM. Un guide des tailles (sans le billing) est disponible &lt;a class="link" href="https://docs.microsoft.com/fr-fr/azure/virtual-machines/windows/sizes-general" target="_blank" rel="noopener"
&gt;à l’adresse suivante&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;managed_disk_type&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Pour faire simple, est ce que votre disque sera sur des baies SSD ou sur des baies mixant SSD et HDD classiques. On a assez peu d’information sur la façon dont sont stockées les données, au delà d’un nombre d’IOPS qui sera d’autant plus important que vous aurez réservé d’espace disque. Par exemple, un disque Premium de 128 Go, on aura droit à 500 IOPS et 100Mo/s max. Si vous passez au delà (de 129 à 256), vous aurez droit à 1100 IOPS et 125 Mo/s.&lt;/p&gt;
&lt;p&gt;Quelques infos quand même :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/fr-fr/azure/virtual-machines/windows/premium-storage" target="_blank" rel="noopener"
&gt;docs.microsoft.com/fr-fr/azure/virtual-machines/windows/premium-storage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/fr-fr/azure/virtual-machines/windows/standard-storage" target="_blank" rel="noopener"
&gt;docs.microsoft.com/fr-fr/azure/virtual-machines/windows/standard-storage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je vois vos petits yeux pétiller de malice.&lt;/p&gt;
&lt;p&gt;Vous vous dites « ahah, je vais les feinter, me payer un disque de 129 Go pour avoir les perfs d’un disque de 256 pour à peine plus qu’un disque de 128 Go ».&lt;/p&gt;
&lt;p&gt;Et bien non, ils ne sont pas fous, vous payerez pour un disque de 256 même si vous ne demandez que 129 (et même si vous n’utilisez 1 Go dedans).&lt;/p&gt;
&lt;p&gt;&lt;u&gt;admin_username &amp;amp; ssh_public_keys&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Je ne vais pas vous faire l’affront de détailler ça. Il faut rentrer un utilisateur, un path pour la clé SSH et le contenu de votre clé publique.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;image&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Sur azure, vous avez accès à un magasin pré configuré d’images de VMs.&lt;/p&gt;
&lt;p&gt;Si on veut un Ubuntu 16.04, on mettra :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;image:
offer: UbuntuServer
publisher: Canonical
sku: &amp;#39;16.04.0-LTS&amp;#39;
version: latest
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour un CentOS 7.4 :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;image:
offer: CentOS
publisher: OpenLogic
sku: &amp;#39;7.4&amp;#39;
version: latest
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="toujours-plus"&gt;Toujours plus
&lt;/h2&gt;&lt;p&gt;Alors OK, avoir un bout de doc qui explique comment déployer une VM sur Azure, c’est chouette. Mais est ce qu’on pourrait pas faire mieux ?&lt;/p&gt;
&lt;p&gt;Et oui, bien sûr ! Car en fait, dans Azure, on ne va pas simplement pouvoir déployer notre VM comme ça et espérer que ça marche.&lt;/p&gt;
&lt;p&gt;Je l’ai déjà dis, il existe des ressources groups, dans lequel toutes vos ressources doivent être. On va devoir le créer. Mais il va aussi nous falloir une carte réseau, qui aura une adresse IP qui elle même proviendra d’un réseau virtuel, qui auront leur propres règles de sécurité (genre de firewalling basique). Et bien sûr, tout ça, c’est des objets à créer (à la main :-( &amp;hellip; ou pas) !&lt;/p&gt;
&lt;p&gt;Mais comme je suis sympa, je vais vous donner un playbook clé en main qui fait tout ça pour vous ;)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;---
- name: &amp;#34;Create Azure resources&amp;#34;
connection: local
hosts: all
vars_prompt:
- name: &amp;#34;location&amp;#34;
prompt: &amp;#34;Choose region to deploy VMs&amp;#34;
private: no
default: &amp;#34;westeurope&amp;#34;
- name: &amp;#34;project_prefix&amp;#34;
prompt: &amp;#34;Choose a prefix for all the resources&amp;#34;
private: no
default: &amp;#34;test&amp;#34;
- name: &amp;#34;instances_number&amp;#34;
prompt: &amp;#34;Choose a number of virtual machines to create&amp;#34;
private: no
default: 1
- name: &amp;#34;vm_size&amp;#34;
prompt: &amp;#34;Choose a size for azure virtual machines&amp;#34;
private: no
default: &amp;#34;Standard_B2s&amp;#34;
- name: &amp;#34;managed_disk_type&amp;#34;
prompt: &amp;#34;Choose a type for azure virtual disks&amp;#34;
private: no
default: &amp;#34;Standard_LRS&amp;#34;
- name: &amp;#34;admin_username&amp;#34;
prompt: &amp;#34;Choose an admin username&amp;#34;
private: no
default: &amp;#34;zwindler&amp;#34;
- name: &amp;#34;admin_pub_path&amp;#34;
prompt: &amp;#34;Where can I find the admin public key ?&amp;#34;
private: no
default: &amp;#34;~/.ssh/id_rsa.pub&amp;#34;
- name: &amp;#34;local_ip&amp;#34;
prompt: &amp;#34;your local IP address (skip if you don&amp;#39;t want to add 22 port to NSG)&amp;#34;
private: no
default: &amp;#34;skip&amp;#34;
- name: &amp;#34;virtualnetwork_cidr&amp;#34;
prompt: &amp;#34;Give a network CIDR for virtual network (large)&amp;#34;
private: no
default: &amp;#34;172.16.0.0/18&amp;#34;
- name: &amp;#34;subnet_cidr&amp;#34;
prompt: &amp;#34;Give a subnet of that network&amp;#34;
private: no
default: &amp;#34;172.16.1.0/24&amp;#34;
vars:
- resourcegroup_name: &amp;#34;{{project_prefix}}-rg&amp;#34;
- availabilityset_name: &amp;#34;{{project_prefix}}-avset&amp;#34;
- virtualnetwork_name: &amp;#34;{{project_prefix}}-vnet&amp;#34;
- subnet_name: &amp;#34;{{project_prefix}}-subnet&amp;#34;
- securitygroup_name: &amp;#34;{{project_prefix}}-nsg&amp;#34;
- vm_root_name: &amp;#34;{{project_prefix}}-vm&amp;#34;
- public_ip_name: &amp;#34;{{project_prefix}}-ip&amp;#34;
- nic_root_name: &amp;#34;{{project_prefix}}-nic&amp;#34;
tasks:
- name: &amp;#34;Create {{project_prefix}}-rg Resource Group&amp;#34;
azure_rm_resourcegroup:
name: &amp;#34;{{resourcegroup_name}}&amp;#34;
location: &amp;#34;{{location}}&amp;#34;
- name: &amp;#34;Create {{availabilityset_name}} Availability Set&amp;#34;
azure_rm_availabilityset:
name: &amp;#34;{{availabilityset_name}}&amp;#34;
location: &amp;#34;{{location}}&amp;#34;
resource_group: &amp;#34;{{resourcegroup_name}}&amp;#34;
sku: Aligned
- name: &amp;#34;Create {{virtualnetwork_name}} Virtual Network&amp;#34;
azure_rm_virtualnetwork:
name: &amp;#34;{{virtualnetwork_name}}&amp;#34;
resource_group: &amp;#34;{{resourcegroup_name}}&amp;#34;
address_prefixes_cidr:
- &amp;#34;{{virtualnetwork_cidr}}&amp;#34;
- name: &amp;#34;create {{subnet_name}} Subnet in {{virtualnetwork_name}} for VMs&amp;#34;
azure_rm_subnet:
name: &amp;#34;{{subnet_name}}&amp;#34;
virtual_network_name: &amp;#34;{{virtualnetwork_name}}&amp;#34;
resource_group: &amp;#34;{{resourcegroup_name}}&amp;#34;
address_prefix_cidr: &amp;#34;{{subnet_cidr}}&amp;#34;
register: subnet
- name: &amp;#34;Create {{securitygroup_name}} security rules (if local IP address was given)&amp;#34;
azure_rm_securitygroup:
name: &amp;#34;{{securitygroup_name}}&amp;#34;
resource_group: &amp;#34;{{resourcegroup_name}}&amp;#34;
purge_rules: yes
rules:
- name: &amp;#39;AllowSSHFromYourOwnInternetIP&amp;#39;
protocol: &amp;#39;Tcp&amp;#39;
source_address_prefix: &amp;#34;{{local_ip}}&amp;#34;
destination_port_range: 22
access: Allow
priority: 1000
direction: Inbound
when: local_ip | ipaddr
- name: &amp;#34;Create a {{nic_root_name}}X network interface for each VM&amp;#34;
azure_rm_networkinterface:
name: &amp;#34;{{nic_root_name}}{{item}}&amp;#34;
resource_group: &amp;#34;{{resourcegroup_name}}&amp;#34;
virtual_network: &amp;#34;{{virtualnetwork_name}}&amp;#34;
subnet_name: &amp;#34;{{subnet_name}}&amp;#34;
security_group: &amp;#34;{{securitygroup_name}}&amp;#34;
ip_configurations:
- name: &amp;#34;ipconfig&amp;#34;
public_ip_address_name: &amp;#34;{{public_ip_name}}&amp;#34;
primary: True
with_sequence: count=&amp;#34;{{instances_number}}&amp;#34;
- name: &amp;#34;Create {{vm_root_name}}X VM with existing NIC&amp;#34;
azure_rm_virtualmachine:
resource_group: &amp;#34;{{resourcegroup_name}}&amp;#34;
name: &amp;#34;{{vm_root_name}}{{item}}&amp;#34;
vm_size: &amp;#34;{{vm_size}}&amp;#34;
managed_disk_type: &amp;#34;{{managed_disk_type}}&amp;#34;
admin_username: &amp;#34;{{admin_username}}&amp;#34;
availability_set: &amp;#34;{{availabilityset_name}}&amp;#34;
ssh_password_enabled: false
ssh_public_keys:
- path: &amp;#34;/home/{{admin_username}}/.ssh/authorized_keys&amp;#34;
key_data: &amp;#34;{{lookup(&amp;#39;file&amp;#39;, &amp;#39;{{admin_pub_path}}&amp;#39;) }}&amp;#34;
network_interface_names: &amp;#34;{{nic_root_name}}{{item}}&amp;#34;
image:
offer: UbuntuServer
publisher: Canonical
sku: &amp;#39;16.04.0-LTS&amp;#39;
version: latest
with_sequence: count=&amp;#34;{{instances_number}}&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour ceux qui veulent d’économiser un copier coller, j’ai mis à disposition ce playbook à l’adresse suivante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/zwindler/ansible-deploy-azure" target="_blank" rel="noopener"
&gt;github.com/zwindler/ansible-deploy-azure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et il ne reste plus qu’à l’exécuter :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pip install --user netaddr
echo localhost &amp;gt; hosts
ansible-playbook -i hosts azure-deploy.yml
[...]
TASK [Create test-vmX VM with existing NIC] *****************************************
changed: [localhost] =&amp;gt; (item=1)
PLAY RECAP **************************************************************************
localhost : ok=1 changed=7 unreachable=0 failed=0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/08/azure_vm.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="le-mot-de-la-fin"&gt;Le mot de la fin
&lt;/h2&gt;&lt;p&gt;Bon, on en est où maintenant ?&lt;/p&gt;
&lt;p&gt;Et bien maintenant, vous avez un playbook qui vous permet de déployer des VMs à tour de bras dans Azure certes, mais aussi de les préconfigurer avec votre clé SSH et votre utilisateur administrateur, et seul votre IP (ou celle que vous aurez donné ou un subnet) pourra y accéder en SSH.&lt;br&gt;
Vous avez toutes vos VMs dans un même sous réseau, lui même dans un réseau virtuel.&lt;br&gt;
Vous avez également un AVSET qui vous permet de ne pas avoir toutes vos VMs sur les mêmes hyperviseurs et augmenter la disponibilité de votre application.&lt;br&gt;
Et tout ça, sans rien avoir eu à faire à la main.&lt;/p&gt;
&lt;p&gt;Badass non ?&lt;/p&gt;
&lt;p&gt;Et encore! J’en ai gardé un peu sous le coude, pour d’autres articles ;-)&lt;/p&gt;</description></item><item><title>Sécuriser l’émission de vos certificats avec un CAA (Azure)</title><link>https://blog.zwindler.fr/2018/06/12/securiser-lemission-de-vos-certificats-azure-avec-un-caa/</link><pubDate>Tue, 12 Jun 2018 11:45:10 +0000</pubDate><guid>https://blog.zwindler.fr/2018/06/12/securiser-lemission-de-vos-certificats-azure-avec-un-caa/</guid><description>&lt;img src="https://blog.zwindler.fr/2018/06/azure.webp" alt="Featured image of post Sécuriser l’émission de vos certificats avec un CAA (Azure)" /&gt;&lt;h2 id="caa--azure-"&gt;CAA ? Azure ?!?
&lt;/h2&gt;&lt;p&gt;Et oui, je travaille sur Azure ! Je crois bien que c’est le premier article que je vais faire à ce sujet donc je commence par quelque chose de léger, créer un CAA.&lt;/p&gt;
&lt;p&gt;Au-delà de toute considération purement dogmatique, le cloud de Microsoft fait quand même partie des plus grands, avec une richesse fonctionnelle et une API aussi riche que ce qu’on trouve chez les autres. J’aurai l’occasion de faire d’autres articles sur Azure car j’utilise énormément les modules Ansible développés par les équipes de Microsoft (qui s’appuient sur l’API d’Azure).&lt;/p&gt;
&lt;h2 id="et-donc-le-caa-"&gt;Et donc, le CAA ?
&lt;/h2&gt;&lt;p&gt;Mais cet article parle de CAA. Pour ceux qui ne connaitraient pas, un CAA est un « nouveau » (2017) type d’enregistrement DNS :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;La CAA est une mesure de sécurité qui permet aux propriétaires d’un nom de domaine de préciser dans leur DNS (Domain Name System) les autorités de certification (AC) qui sont autorisées à émettre des certificats pour leur nom de domaine.&lt;/p&gt;
&lt;p&gt;Global Sign (lien mort, pas disponible sur Internet Archive)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Concrètement, si je possède un domaine avec un grand nombre de sites web signés, que je n’utilise qu’une ou deux (ou un nombre fini) autorités de certifications, je peux maintenant spécifier lesquelles (parmi la centaine des AC existantes) sont autorisées à émettre un certificat pour mon domaine. Cela permettra d’éviter que des personnes mal intentionnées génèrent un certificat pour une URL dans un de vos sous domaines.&lt;/p&gt;
&lt;h2 id="comment-ça-fonctionne-"&gt;Comment ça fonctionne ?
&lt;/h2&gt;&lt;p&gt;Il existe donc un nouveau type d’entrée dans votre DNS qui devrait ressembler à ça :&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;
Name
&lt;/th&gt;
&lt;th&gt;
Type
&lt;/th&gt;
&lt;th&gt;
Value
&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan="2"&gt;
zwindler.fr.
&lt;/td&gt;
&lt;td rowspan="2"&gt;
CAA
&lt;/td&gt;
&lt;td rowspan="1"&gt;
0 issue « letsencrypt.org »
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan="1"&gt;
0 iodef « mailto:zwindler@zwindler.fr »
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Pour l’entrée zwindler.fr., j’ai donc un CAA qui dispose de 2 variables (issue et iodef) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La première indiquant que seul letsencrypt.org peut générer des certificats pour mon domaine. On peut en avoir plusieurs si on a plusieurs autorités de certification.&lt;/li&gt;
&lt;li&gt;La seconde indiquant qu’il faut m’envoyer un email si jamais quelqu’un qui n’a pas les droits essaye de générer un certificat.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;A noter :&lt;/strong&gt; iodef n’est pas respecté par toutes les autorités de certifications, donc vous n’aurez potentiellement pas d&amp;rsquo;emails en cas de tentative de génération de certificat chez une AC non autorisé.&lt;/p&gt;
&lt;h2 id="ok-comment-je-créé-un-caa-"&gt;Ok, comment je créé un CAA ?
&lt;/h2&gt;&lt;p&gt;Normalement, c’est trivial. Il s’agit d’un enregistrement DNS comme un autre. Par exemple chez OVH, vous pouvez directement le créer depuis l’interface :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/06/caa01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="et-sur-azure-"&gt;Et sur Azure ?
&lt;/h2&gt;&lt;p&gt;Il faut bien que ce soit rigolo. Dans le portail d’Azure, il n’est pas possible de créer (ni même de voir !!!) les champs de types CAA, pourtant disponibles depuis mi 2017.&lt;/p&gt;
&lt;p&gt;La seule solution est d’utiliser l’API REST, la CLI azure, ou Powershell :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/cli/azure/network/dns/record-set/caa?view=azure-cli-latest" target="_blank" rel="noopener"
&gt;Page de documentation azure cli&lt;/a&gt; (record-set)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/fr-fr/azure/dns/dns-operations-recordsets" target="_blank" rel="noopener"
&gt;Gérer les enregistrements DNS avec Powershell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="avec-azure-cli"&gt;Avec Azure cli
&lt;/h2&gt;&lt;p&gt;Du coup je suis parti de la doc pour faire ça :&lt;/p&gt;
&lt;p&gt;En partant du principe que vous avez un compte sur Azure, que vous gérez les DNS de la zone &lt;strong&gt;zwindler.fr&lt;/strong&gt; depuis Azure DNS (dans un resource group appelé &lt;strong&gt;dns-rg&lt;/strong&gt;), voilà ce qu’il faut faire pour créer une protection pour le sous domaine *&lt;strong&gt;.test.zwindler.fr&lt;/strong&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;az network dns record-set caa add-record --resource-group dns-rg --zone-name zwindler.fr --record-set-name test --flags 0 --tag &amp;#34;issue&amp;#34; --value &amp;#34;letsencrypt.org&amp;#34;
az network dns record-set caa add-record --resource-group dns-rg --zone-name zwindler.fr --record-set-name test --flags 0 --tag &amp;#34;iodef&amp;#34; --value &amp;#34;zwindl3r@zwindler.fr&amp;#34;
az network dns record-set caa list --resource-group dns-rg --zone-name zwindler.fr
{
&amp;#34;caaRecords&amp;#34;: [
{
&amp;#34;flags&amp;#34;: 0,
&amp;#34;tag&amp;#34;: &amp;#34;iodef&amp;#34;,
&amp;#34;value&amp;#34;: &amp;#34;zwindl3r@zwindler.fr&amp;#34;
},
{
&amp;#34;flags&amp;#34;: 0,
&amp;#34;tag&amp;#34;: &amp;#34;issue&amp;#34;,
&amp;#34;value&amp;#34;: &amp;#34;letsencrypt.org&amp;#34;
}
],
&amp;#34;etag&amp;#34;: &amp;#34;aaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaa&amp;#34;,
&amp;#34;fqdn&amp;#34;: &amp;#34;test.zwindler.fr.&amp;#34;,
&amp;#34;id&amp;#34;: &amp;#34;/subscriptions/aaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaa/resourceGroups/dns-rg/providers/Microsoft.Network/dnszones/zwindler.fr/CAA/test&amp;#34;,
&amp;#34;metadata&amp;#34;: null,
&amp;#34;name&amp;#34;: &amp;#34;test&amp;#34;,
&amp;#34;resourceGroup&amp;#34;: &amp;#34;dns-rg&amp;#34;,
&amp;#34;ttl&amp;#34;: 3600,
&amp;#34;type&amp;#34;: &amp;#34;Microsoft.Network/dnszones/CAA&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="et-si-je-veux-le-domaine-entier-"&gt;Et si je veux le domaine entier ?
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Et là c’est la blague !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si vous créez un record-set « &lt;em&gt;test&lt;/em&gt;« , il va vous créer un CAA pour &lt;em&gt;test&lt;/em&gt;.zwindler.fr (voire le champ &lt;strong&gt;fqdn&lt;/strong&gt; dans la réponse du list). Vous n’avez pas la main sur le &lt;strong&gt;fqdn&lt;/strong&gt; directement (que ce soit en création ou en mise à jour), il est créé à partir du nom.&lt;/p&gt;
&lt;p&gt;Or, vous avez très probablement envie de protéger &lt;strong&gt;zwindler.fr&lt;/strong&gt;, pas seulement &lt;strong&gt;test.zwindler.fr&lt;/strong&gt;, car ça n’aurait pas vraiment de sens (on rappelle que le but de la manœuvre et d&amp;rsquo;empêcher des gens de générer des certificats pour des sous domaine de votre domaine) sinon.&lt;/p&gt;
&lt;p&gt;Créer une liste exhaustive de tous les sous domaines possibles me semble complexe ;-).&lt;/p&gt;
&lt;p&gt;L’astuce, que vous ne trouverez pas dans la documentation (en tout cas dans les pages que j’ai lues), est de créer un recordset avec comme nom « @ » (j’avais testé, vide, « * », « . », mais pas « @ »&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Et là, un recordset sera créé pour l’ensemble de votre zone DNS (&lt;strong&gt;zwindler.fr&lt;/strong&gt; dans mon exemple).&lt;/p&gt;
&lt;p&gt;Magie-magie&amp;hellip;&lt;/p&gt;
&lt;h2 id="liens-utiles"&gt;Liens utiles
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.ssllabs.com/ssltest/" target="_blank" rel="noopener"
&gt;Un site pour tester son site en HTTPS (Qualys)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://sslmate.com/caa/" target="_blank" rel="noopener"
&gt;Un site pour générer les CAA records (SSLmate)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>