<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>VMware on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/vmware/</link><description>Recent content in VMware on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Mon, 08 Jan 2024 18:00:00 +0200</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/vmware/index.xml" rel="self" type="application/rss+xml"/><item><title>Déployer un hyperviseur VMware ESXi avec MAAS</title><link>https://blog.zwindler.fr/2024/01/08/maas-canonical-esxi/</link><pubDate>Mon, 08 Jan 2024 18:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2024/01/08/maas-canonical-esxi/</guid><description>&lt;img src="https://blog.zwindler.fr/2024/01/bearmetal2.webp" alt="Featured image of post Déployer un hyperviseur VMware ESXi avec MAAS" /&gt;&lt;p&gt;Cet article fait partie d&amp;rsquo;une série d&amp;rsquo;articles dédiés à la découverte de MAAS, un outil de déploiement d&amp;rsquo;OS sur un parc de serveurs (souvent baremetal mais pas que) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2023/12/21/premiers-pas-avec-maas-baremetal-canonical" &gt;Premiers pas avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2024/01/04/un-peu-plus-loin-avec-maas-canonical" &gt;Un peu plus loin avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2024/01/08/maas-canonical-esxi" &gt;Déployer un hyperviseur VMware ESXi avec MAAS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="résumé-des-épisodes-précédents"&gt;Résumé des épisodes précédents
&lt;/h2&gt;&lt;p&gt;Dans les deux derniers épisodes, on a vu comment déployer MAAS sur un lab perso, comment déployer ensuite nos premiers OS sur des machines baremetal de manière automatisée, comment les customiser en changeant de version d&amp;rsquo;Ubuntu ou avec cloud-init.&lt;/p&gt;
&lt;p&gt;Mais dans les promesses de MAAS, il y a plus que ça. En théorie, on doit pouvoir démarrer &amp;ldquo;out of the box&amp;rdquo; (ouais pas tout à fait, mais je ne spoil pas plus) des serveurs d&amp;rsquo;autres OS, comme Windows (beurk) ou des hyperviseurs VMware ESXi. Et même plus (mais ça n&amp;rsquo;est pas le but de cet article pour l&amp;rsquo;instant).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/deploy-any.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="esxi-"&gt;ESXi ?
&lt;/h2&gt;&lt;p&gt;Vous l&amp;rsquo;avez compris, point de Windows Server dans ce tutoriel, cependant sachez qu&amp;rsquo;avec les deux liens que j&amp;rsquo;ai déjà donnés dans l&amp;rsquo;article précédent, vous devriez pouvoir vous en sortir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://maas.io/docs/customising-images-for-specific-needs" target="_blank" rel="noopener"
&gt;Documentation de Canonical MAAS - How to customise images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://discourse.maas.io/t/how-to-build-maas-images/5100" target="_blank" rel="noopener"
&gt;Discourse de Canonical MAAS - How to build MAAS images&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Même si c&amp;rsquo;est un hyperviseur propriétaire, j&amp;rsquo;ai quand même passé pas mal de temps à travailler avec VMware et j&amp;rsquo;ai toujours été relativement content d&amp;rsquo;ESXi (no comment sur le reste de la &amp;ldquo;suite&amp;rdquo; par contre).&lt;/p&gt;
&lt;p&gt;Note : vous pouvez d&amp;rsquo;ailleurs retrouver tous &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=vmware" target="_blank" rel="noopener"
&gt;les articles qui parlent de VMware&lt;/a&gt; sur ce blog, ça date un peu, mais il reste peut-être des trucs utiles.&lt;/p&gt;
&lt;p&gt;On va donc voir si c&amp;rsquo;est si facile que ça&amp;hellip;&lt;/p&gt;
&lt;h2 id="ubuntu-pro-"&gt;Ubuntu Pro ?
&lt;/h2&gt;&lt;p&gt;La première chose qu&amp;rsquo;on apprend dans la doc, c&amp;rsquo;est qu&amp;rsquo;il existe 2 manières de customiser des OS non Ubuntu pour les faire marcher dans MAAS :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/canonical/packer-maas" target="_blank" rel="noopener"
&gt;Packer MAAS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MAAS Image Builder&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MAAS Image Builder nécessitant une souscription Ubuntu Pro, je vais évidemment me rabattre uniquement sur Packer MAAS&amp;hellip;&lt;/p&gt;
&lt;p&gt;Heureusement, le projet est relativement bien fourni, avec des CentOS (8 ou 9 stream), des Debian jusqu&amp;rsquo;à la 12, et donc&amp;hellip; VMware ESXi, de la 6 à la 8.&lt;/p&gt;
&lt;p&gt;Pour cet article, je me suis d&amp;rsquo;abord basé sur le &lt;a class="link" href="https://maas.io/tutorials/maas-esxi-quickstart#1-overview" target="_blank" rel="noopener"
&gt;tutoriel officiel&lt;/a&gt;, mais il est sévèrement &amp;ldquo;pas à jour&amp;rdquo; (on a un petit doute dès la première étape qui demande d&amp;rsquo;utiliser Ubuntu 18.04) et pointe vers des versions obsolètes&amp;hellip;&lt;/p&gt;
&lt;h2 id="installer-packer"&gt;Installer Packer
&lt;/h2&gt;&lt;p&gt;Comme son nom le laisse deviner, on va avoir besoin de Packer, un tool de mes copain⋅es de chez &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=hashicorp" target="_blank" rel="noopener"
&gt;Hashicorp&lt;/a&gt;. Pour l&amp;rsquo;instant personne n&amp;rsquo;a forké Packer, donc :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O- https://apt.releases.hashicorp.com/gpg &lt;span class="p"&gt;|&lt;/span&gt; sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; main&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/hashicorp.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install packer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On vérifie que ça a bien marché&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;packer --version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Packer v1.10.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="récupérer-un-iso-chez-vmware"&gt;Récupérer un ISO chez VMware
&lt;/h2&gt;&lt;p&gt;Alors, là, c&amp;rsquo;est la partie pénible. Si on n&amp;rsquo;est pas client VMware, il n&amp;rsquo;est pas possible de télécharger d&amp;rsquo;ISO de VMware ESXi sans :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;se créer un compte&lt;/li&gt;
&lt;li&gt;demander un trial sur une version (idéalement la dernière) d&amp;rsquo;ESXi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C&amp;rsquo;est pénible, ça demande plein d&amp;rsquo;infos personnelles et ça pourri les BAL, mais bon&amp;hellip; c&amp;rsquo;est ça aussi, d&amp;rsquo;utiliser des logiciels privateurs. Avant, l&amp;rsquo;usage de l&amp;rsquo;ESXi était gratuit, mais visiblement, c&amp;rsquo;est de l&amp;rsquo;histoire ancienne&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/download-trial.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pas de bol, j&amp;rsquo;avais fait mes premiers tests sur VMware ESXi 8.0u1, et j&amp;rsquo;ai voulu récupérer la u2, mais voici ce que me dit VMware&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Your evaluation has expired on August 29, 2023&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pour paraphraser un certain Linus T., &lt;strong&gt;F&amp;hellip; YOU VMware!&lt;/strong&gt; Tant pis, je vais donc faire avec l&amp;rsquo;ISO que j&amp;rsquo;ai&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VMware-VMvisor-Installer-8.0U1a-21813344.x86_64.iso&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="récupérer-packer-maas"&gt;Récupérer packer-maas
&lt;/h2&gt;&lt;p&gt;Si vous suivez le tuto que je vous ai donné en début d&amp;rsquo;article, il y a un moment où on va vous demander un Nom/Prénom/Email pour avoir le droit de télécharger un script pour transformer notre ISO VMware en image MAAS.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://maas.io/vmware-images" target="_blank" rel="noopener"
&gt;maas.io/vmware-images&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sauf que :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;l&amp;rsquo;archive que vous allez télécharger est obsolète et ne fonctionnera pas&lt;/li&gt;
&lt;li&gt;les sources et les releases sont dispos et à jour sur le &lt;a class="link" href="https://github.com/canonical/packer-maas/tree/main" target="_blank" rel="noopener"
&gt;github du projet&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Rant: Je suis éventuellement OK pour donner mes informations personnelles en échange de l&amp;rsquo;outil, mais s&amp;rsquo;il vous plait, gardez vos tutos à jour !?!&lt;/p&gt;
&lt;p&gt;On va donc plutôt télécharger directement la dernière version de packer-maas qui supporte les Debian et des variantes de RHEL supplémentaires :) et est disponible ici (&lt;a class="link" href="https://github.com/canonical/packer-maas/releases/tag/v1.1.0" target="_blank" rel="noopener"
&gt;page de la release&lt;/a&gt; / &lt;a class="link" href="https://github.com/canonical/packer-maas/archive/refs/tags/v1.1.0.tar.gz" target="_blank" rel="noopener"
&gt;archive tgz&lt;/a&gt;)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://github.com/canonical/packer-maas/archive/refs/tags/v1.1.0.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar xzf v1.1.0.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; packer-maas-1.1.0/vmware-esxi/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="construire-limage-vmware-esxi-pour-maas"&gt;Construire l&amp;rsquo;image VMware ESXi pour MAAS
&lt;/h2&gt;&lt;p&gt;On commence par charger le driver &lt;code&gt;nbd&lt;/code&gt;. Si comme moi, vous ne savez pas ce que c&amp;rsquo;est, sachez que c&amp;rsquo;est &lt;a class="link" href="https://en.wikipedia.org/wiki/Network_block_device" target="_blank" rel="noopener"
&gt;Network Block Devices&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo modprobe nbd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# si ça ne renvoie rien, c&amp;#39;est bon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ensuite, on lance Packer avec les arguments suivants :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo packer init .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo &lt;span class="nv"&gt;PACKER_LOG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; packer build -var &lt;span class="s1"&gt;&amp;#39;vmware_esxi_iso_path=../../VMware-VMvisor-Installer-8.0U1a-21813344.x86_64.iso&amp;#39;&lt;/span&gt; .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note: packer-maas fourni aussi un Makefile pour vous simplifier encore plus la vie&amp;hellip; Vous pouvez juste lancer &lt;code&gt;make ISO=/path/to/VMware-VMvisor-Installer.iso&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;À ce moment-là, les scripts de packer-maas vont booter une VM avec notre ISO et réaliser des actions pour &amp;ldquo;l&amp;rsquo;installer&amp;rdquo; en envoyant des caractères dans une session VNC !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/esxi-qemu-install.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Quand on y réfléchit, c&amp;rsquo;est à la fois un peu bourrin et &lt;em&gt;awesome&lt;/em&gt; à la fois.&lt;/p&gt;
&lt;p&gt;Si tout se passe bien, vous devriez vous retrouver avec un fichier &lt;code&gt;vmware-esxi.dd.gz&lt;/code&gt; au bout de quelques minutes.&lt;/p&gt;
&lt;h2 id="esxi-dans-maas"&gt;ESXi dans MAAS
&lt;/h2&gt;&lt;p&gt;Maintenant qu&amp;rsquo;on a notre image, on va l&amp;rsquo;envoyer dans MAAS !&lt;/p&gt;
&lt;p&gt;Sur l&amp;rsquo;UI, récupérer une clé pour API (sinon on ne pourra pas pousser l&amp;rsquo;image) sur votre utilisateur (il doit être avec des privilèges &lt;strong&gt;admin&lt;/strong&gt;) :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/apikey.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Je n&amp;rsquo;ai pas trouvé de menu dans la GUI pour le faire, mais on peut loguer notre terminal avec la commande suivante (en n&amp;rsquo;oubliant pas de renseigner l&amp;rsquo;API key) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;maas login admin http://192.168.x.y:5240/MAAS/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;API key &lt;span class="o"&gt;(&lt;/span&gt;leave empty &lt;span class="k"&gt;for&lt;/span&gt; anonymous access&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis envoyer l&amp;rsquo;image en CLI&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;maas admin boot-resources create &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;esxi/8.0u1&amp;#39;&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;VMware ESXi 8.0u1&amp;#39;&lt;/span&gt; &lt;span class="nv"&gt;architecture&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;amd64/generic&amp;#39;&lt;/span&gt; &lt;span class="nv"&gt;filetype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ddgz&amp;#39;&lt;/span&gt; content@&lt;span class="o"&gt;=&lt;/span&gt;vmware-esxi.dd.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note 1 : ne faites pas de Packer sur une partition Windows montée sous Linux (fuse + packer = KK)
Note 2 : si vous avez installé MAAS en tant que snap sur votre poste, vous ne pouvez accéder aux fichiers que dans votre /home (vous vous prendrez un &amp;ldquo;no such file or directory&amp;rdquo;)&lt;/p&gt;
&lt;p&gt;À partir de là, elle devrait apparaitre dans la liste des &amp;ldquo;Images&amp;rdquo; disponibles !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/esxi-image.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s go la déployer sur une machine du lab&amp;hellip; Et au bout de quelques minutes&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/esxi_booted.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/esxi-connected.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Victoire !&lt;/p&gt;</description></item><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>Sécurité des mots de passes ESXi 5.X et 6.X</title><link>https://blog.zwindler.fr/2020/04/06/securite-des-mots-de-passes-esxi-5-x-et-6-x/</link><pubDate>Mon, 06 Apr 2020 06:50:00 +0000</pubDate><guid>https://blog.zwindler.fr/2020/04/06/securite-des-mots-de-passes-esxi-5-x-et-6-x/</guid><description>&lt;img src="https://blog.zwindler.fr/2015/07/vmware2.webp" alt="Featured image of post Sécurité des mots de passes ESXi 5.X et 6.X" /&gt;&lt;h2 id="pourquoi-tu-nous-parles-desxi-5-"&gt;Pourquoi tu nous parles d’ESXi 5 ?
&lt;/h2&gt;&lt;p&gt;En voilà une bonne question ! Comme la majorité des blogueurs tech, j’ai dans mes brouillons une bonne 30aines d’articles en attente depuis plus ou moins longtemps (demandez à &lt;a class="link" href="https://blog.seboss666.info/" target="_blank" rel="noopener"
&gt;Seboss666&lt;/a&gt; ce qu’il en pense).&lt;/p&gt;
&lt;p&gt;Ca fait presque deux ans que je n’ai pas touché à un serveur VMware et pourtant, cette doc était pratiquement &amp;ldquo;prête à poster&amp;rdquo;. Tout comme &amp;ldquo;&lt;em&gt;Intégrer un RHEL 7 dans un Active Directory avec Ansible&lt;/em&gt;&amp;rdquo; et &amp;ldquo;&lt;em&gt;Mise en place de DRBD 8.4 sous CentOS 6.3&lt;/em&gt;&amp;rdquo;, mais c’est une autre histoire&amp;hellip;&lt;/p&gt;
&lt;p&gt;Et comme je n’aime pas gâcher, je &lt;em&gt;&amp;ldquo;profite&amp;rdquo;&lt;/em&gt; du confinement pour déconfiner des vieilles docs avant qu’elles ne soient plus définitivement plus d’actualité (trop tard, &lt;a class="link" href="https://blogs.vmware.com/vsphere/vsphere-7" target="_blank" rel="noopener"
&gt;vSphere 7 vient de sortir&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id="les-mots-de-passe-dans-vsphere"&gt;Les mots de passe dans vSphere
&lt;/h2&gt;&lt;p&gt;Un truc que je n’ai pas trouvé très très clair et qu’il est possible dans VMware d’avoir des comptes utilisateurs internes à l’ESXi avec des mots de passe plutôt bof complexes. En effet, il est tout à fait possible d’avoir un mot de passe avec que des lettres minuscules (voire même des chiffres ??) ce qui -nous sommes d’accord- est absolument catastrophique.&lt;/p&gt;
&lt;p&gt;Lorsqu’on sait qu’on a parfois besoin de se loguer sur la console à distance et que l’émulation des terminaux KVM des constructeurs est une bouse intergalactique qui vous transforme votre AZERTY en un gloubiboulga à mis chemin entre le QWERTY et DVORAK, c’est parfois tentant&amp;hellip;&lt;/p&gt;
&lt;p&gt;Bref, j’ai voulu comprendre la logique de VMware pour l’acceptation de la longueur des mots de passe.&lt;/p&gt;
&lt;p&gt;En fait, tout est expliqué, en fonction des versions, dans ce KB (lien mort, comme tout chez VMware).&lt;/p&gt;
&lt;h2 id="password-quality-control-pam-module"&gt;Password quality-control PAM module
&lt;/h2&gt;&lt;p&gt;Je ne savais pas, mais VMware utilise tout simplement le module PAM &lt;a class="link" href="https://linux.die.net/man/8/pam_passwdqc" target="_blank" rel="noopener"
&gt;Password quality-control PAM&lt;/a&gt;. Il permet de réaliser des contrôles simples sur la qualité des mots de passe choisi pour les utilisateurs Linux.&lt;/p&gt;
&lt;p&gt;Globalement, on dispose, via ce module, de différents flags pour valider une politique simple de gestion de mot de passe sur un système Linux (car oui, ESXi c’est un Linux).&lt;/p&gt;
&lt;p&gt;Les arguments retenus par VMware sont uniquement basés sur une taille minimale de mots de passe en fonction du nombre de type de caractères différents dont dispose ce mot de passe. Voilà à quoi ça ressemble :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;password requisite /lib/security/$ISA/pam_passwdqc.so retry=N min=N0,N1,N2,N3,N4
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Par défaut, voici ce que vous allez trouver dans vSphere 6 :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;retry=3 : Un utilisateur a droit à trois tentatives pour entrer un mot de passe suffisant.&lt;/li&gt;
&lt;li&gt;N0=12 : Le mot de passe comportant des caractères d’une seule classe doit contenir au moins 12 caractères.&lt;/li&gt;
&lt;li&gt;N1=9 : Le mot de passe comportant des caractères de deux classes doit contenir au moins neuf caractères, mais qui n’est pas éligibles aux conditions des passphrases.&lt;/li&gt;
&lt;li&gt;N2=8 : Le mot de passe respecte les conditions des passphrases. Il comporte des caractères de deux classes et doit contenir au moins huit caractères.&lt;/li&gt;
&lt;li&gt;N3=7 : Le mot de passe comportant des caractères de trois classes doit contenir au moins sept caractères.&lt;/li&gt;
&lt;li&gt;N4=6 : Le mot de passe comportant des caractères des quatre classes doit contenir au moins six caractères.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="procédure-pour-modifier-la-politique-de-sécurité"&gt;Procédure pour modifier la politique de sécurité
&lt;/h2&gt;&lt;p&gt;Si pour une raison ou pour une autre, vous souhaitez modifier ces paramètres (pour les durcir, hein !), voici la marche à suivre :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connectez-vous au Shell ESXi et obtenez les privilèges root.&lt;/li&gt;
&lt;li&gt;Ouvrez le fichier passwd avec un éditeur de texte.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/pam.d/passwd
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;Modifiez la ligne suivante :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;password requisite /lib/security/$ISA/pam_passwdqc.so retry=3 min=disabled,20,20,15,10
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cette commande vous permettra de désactiver la possibilité d’ajouter des utilisateurs dans ESXi dont les mots de passe n’ont qu’une classe de caractères et de complexifier fortement les autres types de mots de passe.&lt;/p&gt;
&lt;p&gt;Il existe de nombreux autres paramètres. Je vous invite à aller lire &lt;a class="link" href="https://linux.die.net/man/8/pam_passwdqc" target="_blank" rel="noopener"
&gt;la page man de ce module&lt;/a&gt; pour améliorer encore la sécurité des mots de passe dans vos ESXi.&lt;/p&gt;
&lt;h2 id="bonus-gui-pour-esxi-60"&gt;Bonus GUI pour ESXi 6.0
&lt;/h2&gt;&lt;p&gt;Si vous êtes allergique à la console jaune et noire d’ESXi (ou que vous n’avez pas la main sur un KVM), sachez que depuis ESXi 6.0, il est possible de modifier directement les valeurs du module PAM depuis la console vSphere. Ça se passe dans les options avancées de l’hôte (cf &lt;a class="link" href="https://www.vladan.fr/esxi-6-0-security-password-complexity-changes/" target="_blank" rel="noopener"
&gt;cet article de Vladan&lt;/a&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Password Complexity Rules – change here where In previous versions of ESXi, password complexity changes had to be made by hand-editing the /etc/pam.d/passwd file on each ESXi host. In vSphere 6.0 now this can be done by adding an entry in Host Advanced System Settings, enabling centrally managed setting changes for all hosts in a cluster.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/12/esxi_cluster3.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ouah, cébo !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;VMware KB 1012033 (lien mort, comme tout chez VMware)&lt;/li&gt;
&lt;li&gt;Doc vSphere 5, en français (lien mort, comme tout chez VMware)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://linux.die.net/man/8/pam_passwdqc" target="_blank" rel="noopener"
&gt;Page man de pam_passwdqc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.vladan.fr/esxi-6-0-security-password-complexity-changes/" target="_blank" rel="noopener"
&gt;Vladan : ESXi 6.0 Security and Password Complexity Changes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Harbor : la registry Docker open source de VMware – part 2</title><link>https://blog.zwindler.fr/2018/06/26/decouverte-de-harbor-la-registry-docker-open-source-de-vmware/</link><pubDate>Tue, 26 Jun 2018 11:45:04 +0000</pubDate><guid>https://blog.zwindler.fr/2018/06/26/decouverte-de-harbor-la-registry-docker-open-source-de-vmware/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/10/harbor.webp" alt="Featured image of post Harbor : la registry Docker open source de VMware – part 2" /&gt;&lt;h2 id="harbor-la-registry-docker-de-vmware"&gt;Harbor, la registry Docker de VMware
&lt;/h2&gt;&lt;p&gt;Il y a quelques mois, j’avais écris un article à propos d’une bonne surprise de la part de VMware : Harbor. Pour ceux qui n’ont pas lu mon article sur le sujet, j’ai développé dans la première partie ce qu’était Harbor et ce que cette solution apporte par rapport aux autres outils du marché, puis j’ai expliqué pas à pas comment l’installer et la configurer (&lt;a class="link" href="https://blog.zwindler.fr/2018/02/27/harbor-la-docker-registry-dentreprise-open-source-de-vmware-part-1/" &gt;vous pouvez vous rattraper ici&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Rapidement, Harbor est un des produits open sourcé par VMware. C’est un serveur permettant de stocker « on premise » ou dans le cloud des images Docker, au même titre que le produit historiquement appelé Docker Registry (maintenant &lt;em&gt;Docker Distribution&lt;/em&gt;), mais avec des fonctionnalités supplémentaires, notamment :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gestion de la sécurités, des comptes, rôles, habilitation (RBAC)&lt;/li&gt;
&lt;li&gt;Réplication des images entre plusieurs instances de Harbor&lt;/li&gt;
&lt;li&gt;Portail web&lt;/li&gt;
&lt;li&gt;Logging de toutes les opérations à des fins d’audit&lt;/li&gt;
&lt;li&gt;API RESTful&lt;/li&gt;
&lt;li&gt;Scan de vulnérabilité intégré&lt;/li&gt;
&lt;li&gt;Nettoyage automatique des images inutiles (garbage collection)&lt;/li&gt;
&lt;li&gt;Intégration native avec Notary pour la signature des images&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dans cette deuxième partie, j’ai voulu explorer un peu plus l’utilisation et l’administration de la plateforme que nous venons d’installer.&lt;/p&gt;
&lt;h2 id="administration-de-base"&gt;Administration de base
&lt;/h2&gt;&lt;p&gt;Dans l’article précédent, on a installé Harbor à l’aide &lt;a class="link" href="https://github.com/zwindler/ansible-deploy-harbor" target="_blank" rel="noopener"
&gt;d’un Docker Compose et d’Ansible&lt;/a&gt; pour faciliter la récupération de certains prérequis et la configuration des différents composants.&lt;/p&gt;
&lt;h3 id="démarrerarrêter-harbor"&gt;Démarrer/arrêter Harbor
&lt;/h3&gt;&lt;p&gt;Du coup, comme tout est configuré avec docker compose, l’arrêt et le redémarrage de la plateforme se limite à un simple docker-compose up ou down.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker-compose up
[...]
docker-compose down
Stopping nginx ... done
Stopping harbor-jobservice ... done
Stopping harbor-ui ... done
Stopping harbor-db ... done
Stopping registry ... done
Stopping harbor-adminserver ... done
Stopping harbor-log ... done
WARNING: Found orphan containers (notary-server, notary-signer, notary-db) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Removing nginx ... done
Removing harbor-jobservice ... done
Removing harbor-ui ... done
Removing harbor-db ... done
Removing registry ... done
Removing harbor-adminserver ... done
Removing harbor-log ... done
Removing network harbor_harbor
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="supprimer--réinstaller-harbor"&gt;Supprimer / Réinstaller Harbor
&lt;/h3&gt;&lt;p&gt;Contrairement à ce qu’on pourrait penser naïvement, un simple &lt;strong&gt;docker-compose down&lt;/strong&gt; ne suffit pas. Si les containers sont bien supprimé (cf. le « Removing&amp;hellip; » pour chaque composants plus haut), il reste encore les fichiers de configurations et les données des différents containers, toujours présents sur disques et persistés à l’aide de &lt;strong&gt;volumes Docker&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Il est nécessaire de supprimer ces fichiers créés par l’installation précédente, notamment le contenu de &lt;strong&gt;common/config&lt;/strong&gt; et le fichier &lt;strong&gt;secretkey&lt;/strong&gt;. Par défaut, l&amp;rsquo;emplacement de ces fichiers est configuré par le playbook Ansible que je vous ai proposé. &lt;strong&gt;common/config&lt;/strong&gt; est par défaut dans &lt;strong&gt;/usr/local/harbor&lt;/strong&gt;, et la &lt;strong&gt;secretkey&lt;/strong&gt; dans dans &lt;strong&gt;/data&lt;/strong&gt; (configurable dans le fichier &lt;em&gt;/usr/local/harhor/harbor.cfg&lt;/em&gt;).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd /usr/local/harbor
ll common/config/
total 0
drwxr-xr-x 2 root root 16 20 oct. 11:38 adminserver
drwxr-xr-x 2 root root 16 20 oct. 11:38 db
drwxr-xr-x 2 root root 31 20 oct. 11:38 jobservice
drwxr-xr-x 9 root root 139 20 oct. 11:38 nginx
drwxr-xr-x 3 root root 27 20 oct. 11:38 notary
drwxr-xr-x 2 root root 38 20 oct. 11:38 registry
drwxr-xr-x 2 root root 53 20 oct. 11:38 ui
cat harbor.cfg
[...]
secretkey_path /data
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Voilà donc la bonne méthode pour tout supprimer (maintenant qu’on a vérifié que les chemins configurés correspondent).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker-compose down
rm -rf /usr/local/harbor/common/config/
rm -rf /data/secretkey
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="pousser-push-une-image-depuis-un-client-configuré-vers-la-registry"&gt;Pousser (push) une image depuis un client configuré vers la Registry
&lt;/h2&gt;&lt;p&gt;Pour vous permettre d’organiser un peu vos images et donner des droits plus fins aux utilisateurs, les accès aux images sont découpés via des « projet » dans Harbor.&lt;/p&gt;
&lt;p&gt;Du coup, avant de pousser un image sur la registry, il est nécessaire de « taguer » l’image avec le nom du serveur registry ET son projet associé, au lieu de simplement taguer un nom d’image comme on l’aurait fait normalement avec la Docker Registry.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;REGISTRY=[hostname_de_la_registry]
DOCKER_IMAGE=[your-docker-image]
HARBOR_PROJET=library
docker login https://$REGISTRY
Username: admin
Password:
Login Succeeded
docker tag $DOCKER_IMAGE $REGISTRY/$HARBOR_PROJECT/$DOCKER_IMAGE
docker push $REGISTRY/$HARBOR_PROJECT/$DOCKER_IMAGE
The push refers to a repository [xxx/library/xwiki-tomcat8]
ac33aaa78bac: Pushed
[...]
fe40aaa9465f: Pushed
cf4aaa492384: Pushed
latest: digest: sha256:81b3a60d6936a07e9zzzzzzccb29ead8a1d1035fa5042297ac54f71a6c1e95bb size: 4504
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;L’image apparaît sur la console :&lt;br&gt;
&lt;img src="https://blog.zwindler.fr/2017/10/harbor_push01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="tirer-pull-une-image-depuis-un-client-configuré"&gt;Tirer (pull) une image depuis un client configuré
&lt;/h2&gt;&lt;p&gt;Même principe que pour le push, il faut être authentifié et sélectionner le projet dans lequel est située l’image&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;REGISTRY=[hostname_de_la_registry]
DOCKER_IMAGE=[your-docker-image]
HARBOR_PROJET=library
docker login https://$REGISTRY
Username: admin
Password:
Login Succeeded
docker pull $REGISTRY/$HARBOR_PROJECT/$DOCKER_IMAGE
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Tout simplement !&lt;/p&gt;
&lt;h2 id="interface-web--projects"&gt;Interface web : Projects
&lt;/h2&gt;&lt;p&gt;La vue &lt;strong&gt;Projects&lt;/strong&gt; a vocation a permettre la segmentation de la plateforme en plusieurs projets distincts.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor_projects01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Chaque projet peut être &lt;em&gt;privé&lt;/em&gt; ou &lt;em&gt;public&lt;/em&gt;, disposer d’habilitations et règles de réplications qui lui sont propres.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor_projects02.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="interface-web--logs"&gt;Interface web : Logs
&lt;/h2&gt;&lt;p&gt;La vue &lt;strong&gt;Logs&lt;/strong&gt; permet aux &lt;strong&gt;administrateurs&lt;/strong&gt; d’avoir une vue d’ensemble des logs (pull, push, etc) de TOUS les projets de manière centralisée.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor_logs01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor_logs02.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Chaque projet peut également voir ses propres logs dans la vue du projet.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor_logs03.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Clairement, ce n’est pas transcendant en terme de logging (à des fins d’audit par exemple) mais c’est mieux que rien (Docker Registry&amp;hellip;) et relativement intuitif.&lt;/p&gt;
&lt;h2 id="interface-web-partie-administration"&gt;Interface web, partie Administration
&lt;/h2&gt;&lt;p&gt;Le sous-menu &lt;strong&gt;Users&lt;/strong&gt; permet d’avoir une liste des utilisateurs et de les administrer.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor_admin_users01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Le sous-menu &lt;strong&gt;Replication&lt;/strong&gt; permet de gérer les endpoints de réplication et la réplication des projets (&lt;em&gt;Replication Rule&lt;/em&gt;) de manière globale.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor_admin_replication01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Le sous-menu &lt;strong&gt;Configuration&lt;/strong&gt; permet de visualiser et modifier une partie des paramètres généraux de la plateforme. Une partie des ces paramètres proviennent de la configuration &lt;strong&gt;harbor.cfg&lt;/strong&gt; renseignée lors de l’instanciation (via Ansible dans notre cas). Certains ne peuvent pas être changés depuis l’interface (comme la méthode d’authentification par exemple, mais je ne le testerai pas si j’étais vous&amp;hellip;).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor_admin_configuration01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Par défaut, la création de projets est permis pour tout le monte et l’enregistrement d’utilisateurs est possible. Pour des raisons de sécurité, il est préférable de le désactiver si ce n’est pas nécessaire.&lt;/p&gt;
&lt;h2 id="erreurs-rencontrées"&gt;Erreurs rencontrées
&lt;/h2&gt;&lt;p&gt;Dans l’ensemble, Harbor est un produit sympa et plutôt bien fini, qui étend avec des fonctionnalités vitales en entreprise la bête Docker Registry.&lt;/p&gt;
&lt;p&gt;Pour autant, le produit étant récent, il n’était pas exempt de quelques bugs à sa sortie (en grande partie corrigés depuis). Voilà ceux que j’ai rencontré au moment où j’ai rédigé le premier article (il y a quelques mois maintenant)&lt;/p&gt;
&lt;h3 id="modification-du-secretkey_path"&gt;Modification du secretkey_path
&lt;/h3&gt;&lt;p&gt;Si on modifie le paramètre &lt;strong&gt;secretkey_path&lt;/strong&gt;, le container &lt;strong&gt;harbor-adminserver&lt;/strong&gt; part en crash loop. Le problème est référencé sur ce ticket&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/vmware/harbor/issues/2208" target="_blank" rel="noopener"
&gt;github.com/vmware/harbor/issues/2208&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker ps
[...]
7dcd18a310bc vmware/harbor-adminserver:v1.2.0 &amp;#34;/harbor/harbor_ad...&amp;#34; 19 seconds ago Restarting (1) 3 seconds ago harbor-adminserver
docker-compose up
[...]
harbor-adminserver | 2017-10-20T09:56:16Z [INFO] initializing system configurations...
harbor-adminserver | 2017-10-20T09:56:16Z [INFO] the path of json configuration storage: /etc/adminserver/config/config.json
harbor-adminserver | 2017-10-20T09:56:16Z [DEBUG] [driver_json.go:46: path of configuration file: /etc/adminserver/config/config.json]
harbor-adminserver | 2017-10-20T09:56:16Z [INFO] the path of key used by key provider: /etc/adminserver/key
harbor-adminserver | 2017-10-20T09:56:16Z [INFO] configurations read from storage driver are null, will load them from environment variables
harbor-adminserver | 2017-10-20T09:56:16Z [FATAL] [main.go:46: failed to initialize the system: read /etc/adminserver/key: is a directory]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A priori il n’y a pas encore de correctif, la seule solution est de remttre le paramètre &lt;strong&gt;secretkey_path&lt;/strong&gt; à la valeur par défaut&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;secretkey_path /data
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="crash-loop-sur-nginx-lorsquon-utilise-notary"&gt;Crash loop sur nginx lorsqu’on utilise Notary
&lt;/h3&gt;&lt;p&gt;En cas d’installation avec Notary, le container frontend nginx (reverse proxy) part en crashloop&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;nginx | 2017/10/20 10:05:40 [emerg] 1#0: host not found in upstream &amp;#34;notary-server:4443&amp;#34; in /etc/nginx/conf.d/notary.upstream.conf:3
nginx | nginx: [emerg] host not found in upstream &amp;#34;notary-server:4443&amp;#34; in /etc/nginx/conf.d/notary.upstream.conf:3
nginx exited with code 1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A priori, il s’agit d’un problème d’ordonnancement du démarrage des containers dans le Docker Compose (notary n’est pas accessible au moment du démarrage du nginx). Un redémarrage du container nginx (uniquement )après le « docker compose up » règle la plupart du temps le problème.&lt;/p&gt;</description></item><item><title>Sortie de Proxmox VE 5.2.1, les nouveautés</title><link>https://blog.zwindler.fr/2018/05/22/sortie-de-proxmox-ve-5-2-1-les-nouveautes/</link><pubDate>Tue, 22 May 2018 14:45:57 +0000</pubDate><guid>https://blog.zwindler.fr/2018/05/22/sortie-de-proxmox-ve-5-2-1-les-nouveautes/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/08/proxmox_logo.webp" alt="Featured image of post Sortie de Proxmox VE 5.2.1, les nouveautés" /&gt;&lt;h2 id="proxmox-ve-521"&gt;Proxmox VE 5.2.1
&lt;/h2&gt;&lt;p&gt;La semaine dernière, &lt;em&gt;Proxmox Server Solutions GmbH&lt;/em&gt;, l’équipe derrière &lt;strong&gt;Proxmox VE&lt;/strong&gt; a sortie la version 5.2 de son hyperviseur libre &amp;amp; clé en main.&lt;/p&gt;
&lt;p&gt;J’ai déjà écris &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=proxmox" &gt;de nombreux articles sur cette distribution&lt;/a&gt; car c’est un très beau projet, à mon sens une des seuls distributions clés en main pour faire de la virtualisation aussi bien pour des besoins perso que des besoins pros. Pour ceux qui ne connaissent pas, je vous conseille de commencer par les tutos de M4vr0x sur Proxmox VE 5.x &lt;a class="link" href="https://blog.zwindler.fr/2017/07/11/deploiment-de-proxmox-ve-5-sur-un-serveur-dedie-part-1/" &gt;(part1)&lt;/a&gt; &lt;a class="link" href="https://blog.zwindler.fr/2017/07/18/deploiement-de-proxmox-ve-5-sur-un-serveur-dedie-part-2/" &gt;(part2)&lt;/a&gt; &lt;a class="link" href="https://blog.zwindler.fr/2017/07/25/deploiement-de-proxmox-ve-5-sur-un-serveur-dedie-part-3/" &gt;(part3)&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="dans-le-rétroviseur-proxmox-ve-50-et-proxmox-ve-51"&gt;Dans le rétroviseur, Proxmox VE 5.0 et Proxmox VE 5.1
&lt;/h2&gt;&lt;p&gt;Sortie l’été dernier, le changement de la branche 4 vers la branche 5 de Proxmox VE a surtout marqué une évolution de l’OS à la base de Proxmox VE (Debian 8 vers Debian 9), même si quelques features sympa avaient quand même été ajoutées.&lt;/p&gt;
&lt;p&gt;Dans les points marquants, il y avait tout de même eu :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le renforcement de l’intégration avec Ceph, via l’intégration de la version Luminous (Ceph 12.1, preview) et des améliorations dans le Dashboard Ceph dans l’UI (apparue en 4.4)&lt;/li&gt;
&lt;li&gt;l’introduction de la fonctionnalité de &lt;a class="link" href="https://pve.proxmox.com/wiki/Storage_Replication" title="Storage Replication"
target="_blank" rel="noopener"
&gt;Storage Replication&lt;/a&gt;, basée sur des mécanismes built-in de ZFS&lt;/li&gt;
&lt;li&gt;la migration à chaud de VMs, même s’il s’agit de stockages locaux&lt;/li&gt;
&lt;li&gt;un effort particulier pour &lt;a class="link" href="https://pve.proxmox.com/wiki/Qemu/KVM_Virtual_Machines#_importing_virtual_machines_from_foreign_hypervisors" title="Qemu/KVM Virtual Machines"
target="_blank" rel="noopener"
&gt;importer des VMs provenant d’autres hyperviseurs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Clairement, l’équipe de Proxmox a fait un focus sur le stockage, dans le but de rattraper les « grands » hyperviseurs sur ces aspects (&lt;em&gt;i.e. des alternatives à VSAN, vSphere Replication et storage vMotion&lt;/em&gt;). Voir ce genre de features dans un hyperviseur (qui peut être) gratuit et sans pour autant être une usine à gaz comme RHEV/oVirt est très appréciable.&lt;/p&gt;
&lt;p&gt;Sortie fin Octobre, la version 5.1 était passée relativement inaperçue (au moins de moi) puisqu’elle apporte surtout un passage à l’état « production ready » du stockage Ceph (v12.2) dans PVE ainsi qu’une mise à jour de ZFS apportant des gains de performance (en plus des mises à jour de kernel/packages habituelles).&lt;/p&gt;
&lt;h2 id="et-proxmox-ve-52-alors-"&gt;Et Proxmox VE 5.2 alors ?
&lt;/h2&gt;&lt;p&gt;Là, en revanche, ya du lourd !&lt;/p&gt;
&lt;p&gt;Déjà, on est passé sur une Debian 9.4, avec un kernel 4.15.17 (assez récent puisqu’on est en est au 4.16). LXC passe de la 2.0.0 à la 3.0.0, la LTS sortie en mars du &lt;strong&gt;container runtime&lt;/strong&gt; disponible dans PVE. Ceph passe en Luminous LTS stable, ce qui rassurera les plus frileux qui attendaient avant de tester Ceph sous Proxmox VE.&lt;/p&gt;
&lt;p&gt;Voilà pour les mises à jour de packages. Maintenant, les features que j’ai hâte de tester =&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support de Cloudinit dans la GUI. Pour ceux qui ne connaissent pas, c’est un mécanisme universel sous Linux permettant de configurer votre VM dès son instanciation (&lt;a class="link" href="https://cloud-init.io/" target="_blank" rel="noopener"
&gt;voir doc officielle&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;La possibilité de gérer les nœuds des clusters Proxmox VE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gestion des certificats Let’s encrypt directement depuis la GUI&lt;/strong&gt;; ce point va faire l’objet d’un petit article très vite ;-)&lt;/li&gt;
&lt;li&gt;Ajout des partages SMB/CIFS comme support de stockage officiel (backups, images, templates, iso et containers)&lt;/li&gt;
&lt;li&gt;Affichage de l’adresse IP de la VM dans l’UI (première intégration de l’agent &lt;strong&gt;qemu-guest-agent&lt;/strong&gt;, on peut espérer plus de fonctionnalités à l’avenir)&lt;/li&gt;
&lt;li&gt;Possibilité de limiter la bande passante lors des opérations de restauration des backups&lt;/li&gt;
&lt;li&gt;Intégration de xterm.js comme console en plus de noVNC et SPICE&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il y en a d’autre mais qui m’intéressent moins. Vous pouvez néanmoins consulter la liste complète sur le &lt;a class="link" href="https://pve.proxmox.com/wiki/Downloads#Proxmox_Virtual_Environment_5.2_.28ISO_Image.29" target="_blank" rel="noopener"
&gt;changelog de la version&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="concrètement-ça-donne-quoi-"&gt;Concrètement ça donne quoi ?
&lt;/h2&gt;&lt;p&gt;Je suis assez enthousiaste quant à cette nouvelle version, qui apporte plein de bonnes choses. Je ne souhaite pas en dire plus pour le moment, car je vais (en cours d’écriture) publier des articles dans les jours qui viennent sur ces nouvelles fonctionnalités. Un petit teasing tout de même :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/05/proxmox_cloud_init.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;cloud-init dans l’UI de PVE&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/05/proxmox_letsencrypt_tease.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Génération d’un certificat Let’s Encrypt pour un nœud PVE&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/05/prxmox_xterm.js.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;L’ajout de xterm.js dans l’UI&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/05/proxmox_cluster.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;La gestion des clusters dans l’UI de PVE&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/05/proxmox_io_limit_bandwidth.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Limites en MiB/s lors d’une restauration&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Récap’ du premier jour de KubeCon Europe 2018</title><link>https://blog.zwindler.fr/2018/05/03/recap-du-premier-jour-de-kubecon-europe-2018/</link><pubDate>Wed, 02 May 2018 22:09:43 +0000</pubDate><guid>https://blog.zwindler.fr/2018/05/03/recap-du-premier-jour-de-kubecon-europe-2018/</guid><description>&lt;img src="https://blog.zwindler.fr/2018/05/kubecon.webp" alt="Featured image of post Récap’ du premier jour de KubeCon Europe 2018" /&gt;&lt;h2 id="premier-jour-de-kubecon-aujourdhui-"&gt;Premier jour de KubeCon aujourd’hui !
&lt;/h2&gt;&lt;p&gt;Hier soir, je suis arrivé à Copenhague pour participer à la KubeCon + CloudNativeCon Europe 2018. Vous ne savez pas de quoi il s’agit ? C’est LA conférence sur 3 jours, organisée par la CNCF, qui parle de Kubernetes et tout ce qui gravite autour.&lt;/p&gt;
&lt;p&gt;Ce n’est pas la première conf que je couvre sur le blog, j’avais déjà fais &lt;a class="link" href="https://blog.zwindler.fr/2018/01/26/recap-hack-it-n-2018/" &gt;un récapitulatif de la Hack-It-N 2018&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/05/20180502_090306.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On est environ 4300&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La journée a commencée par des Keynotes, ponctuées par des petites interventions de Liz Rice et Kesley Hightower. La plupart étaient un peu humoristiques, mais j’ai retenu ceci parmis les keynotes du matin :&lt;/p&gt;
&lt;h3 id="où-en-sont-les-projets-de-la-cncf-"&gt;Où en sont les projets de la CNCF ?
&lt;/h3&gt;&lt;p&gt;&lt;em&gt;Keynote: CNCF Project Update - Liz Rice, Technology Evangelist, Aqua Security; Sugu Sougoumarane, CTO, PlanetScale Data; Colin Sullivan, Product Manager, Synadia Communications, Inc. &amp;amp; Andrew Jessup, Co-founder&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Cette année, le moins que l’on puisse dire est que la CNCF a réellement pris de l’ampleur, en terme de projets notamment.&lt;/p&gt;
&lt;p&gt;L’ajout de plusieurs projets à l’état « Sandbox » :&lt;/p&gt;
&lt;p&gt;Rook (abstraction du stockage), One Policy Agent (politiques de sécurité pour l’ensemble de la stack), SPIFFE (langage de spec) &amp;amp; SPIRE (runtime env) qui a pour but d’établir un lien de confiance entre l’infrastructure et les workloads.&lt;/p&gt;
&lt;p&gt;Plusieurs projets sont à l’état « Incubator » :&lt;/p&gt;
&lt;p&gt;CoreDNS, Linkerd (service mesh), Envoy (distributed proxy), Prometheus, OpenTracing, Jaeger (distributed tracing), Fluentd (Splunk Entreprise connector + fluentd daemonset for kubernetes), Fluent bit (client lightweight un peu comme Beats d’Elastic), NATS (messaging), Container Network Interface (CNI), gRPC (client/server), Container runtime (Containerd / Kubernetes CRI), TUF (The Update Framework), Notary, Vitess (distribution de données sur MySQL avec Sharding/resharding automatic)&lt;/p&gt;
&lt;p&gt;La liste est vertigineuse.&lt;/p&gt;
&lt;p&gt;Kubernetes est également passé à l’état « Graduated » (premier projet CNCF a passé à l’état « production ready » pour la plupart des projets informatiques, pas seulement pour les tech enthousiasts et les early adopters.&lt;/p&gt;
&lt;p&gt;Si j’ai tout listé, c’est que l’ensemble de ces projets ont par la suite droit à une ou plusieurs confs et j’aurai l’occasion de revenir dessus si je participe aux confs en question.&lt;/p&gt;
&lt;h3 id="re-thinking-networking-for-microservices"&gt;Re-thinking Networking for Microservices
&lt;/h3&gt;&lt;p&gt;&lt;em&gt;Keynote: Re-thinking Networking for Microservices - Lew Tucker, VP/CTO Cloud Computing, Cisco Systems, Inc.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Le CTO Cloud Computing de Cisco est venu nous expliquer que maintenir l’ensemble des services permettant au microservice d’échanger avec le monde extérieur, c’est compliqué, et qu’il vaut mieux utiliser du service mesh (découpler tous les services de communication et externes aux services comme logging, api, auth, &amp;hellip;).&lt;/p&gt;
&lt;h3 id="rex-du-cern"&gt;REX du CERN
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://schd.ws/hosted_files/kccnceu18/d0/CERN.pdf" target="_blank" rel="noopener"
&gt;&lt;em&gt;Keynote: CERN Experiences with Multi-Cloud Federated Kubernetes&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;On ne présente pas le CERN (mais en fait on a quand même eu droit à une présentation ;-p ), mais au delà des travaux scientifiques, il faut des ops pour faire tourner la puissance de calcul brute.&lt;/p&gt;
&lt;p&gt;10000 hyperviseurs, des quantités de données très importantes (1 Po/s généré, 10 Go/s enregistré).&lt;/p&gt;
&lt;p&gt;Malgré cette force de frappe plus qu’honnête, lors de grosses campagnes de calculs scientifiques, il faut tirer parti de ressources externes (clouds, universités), ce qui induit la nécessité d’un outils permettant de fédérer des machines provenant de tous horizons.&lt;/p&gt;
&lt;p&gt;Le CERN utilise la fédération de cluster de Kubernetes, avec en plus l’outil &lt;a class="link" href="https://research.cs.wisc.edu/htcondor/" target="_blank" rel="noopener"
&gt;HTCondor&lt;/a&gt; qui étend l’API de Kubernetes et leur permet de lancer les jobs sur les machines (distantes ou pas) en fonction du job demandé.&lt;/p&gt;
&lt;h3 id="mini-talk-du-vp--chief-open-source-officer-de-vmware"&gt;Mini talk du VP &amp;amp; Chief Open Source Officer de VMware
&lt;/h3&gt;&lt;p&gt;&lt;em&gt;Keynote: From Innovation to Production - Dirk Hohndel, VP &amp;amp; Chief Open Source Officer, VMware&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Au delà du présentation plus que rapide des produits opensource sur lesquels contribue VMware, (Harbor, pivotal, BOSH), Dirk Hohndel a surtout utilisé les 5 minutes qu’il avait pour nous faire remarquer que les gens de l’audience sont en grande majorité des hommes blancs et qu’il y a un vrai problème de mixité dans nos métiers. J’ai regardé autour de moi, difficile de lui donner tort.&lt;/p&gt;
&lt;h2 id="et-les-vraies-conférences-ont-pu-commencer-"&gt;Et les vraies conférences ont pu commencer !
&lt;/h2&gt;&lt;h3 id="pourquoi-y-a-t-il-autant-de-runtimes-"&gt;Pourquoi y a-t-il autant de runtimes ?
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://schd.ws/hosted_files/kccnceu18/08/What%E2%80%99s%20Up%20With%20All%20the%20Container%20Runtimes.pdf" target="_blank" rel="noopener"
&gt;&lt;em&gt;Whats Up With All The Different Container Runtimes? - Ricardo Aravena, Branch Metrics&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ricardo Aravena a brossé un tableau de l’évolution des containers runtimes sous Linux, puis a listé leurs avantages et leurs inconvénients. Un talk plutôt sympa en mode comparaisons et Pros/Cons sur les différents runtimes du marché.&lt;/p&gt;
&lt;h3 id="créer-et-gérer-une-communauté-open-source"&gt;Créer et gérer une communauté open source
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://schd.ws/hosted_files/kccnceu18/28/Building%20an%20Open%20Source%20Community%20-%20KubeCon%202018%20-%20Final.pptx" target="_blank" rel="noopener"
&gt;&lt;em&gt;Building an Open Source Community to Achieve Innovation-Through-Openness - Jonas Rosland, {code}&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Un talk « non technique » auquel j’avais vraiment envie d’aller. J’avais été assez surpris de remarquer l’ouverture de Dell EMC en 2015 avec l’équipe {code}, alors forcément, un REX sur comment gérer une communauté open source et le erreurs qui ont pu être faites m’intéressait forcément.&lt;/p&gt;
&lt;p&gt;Au final, le talk, même s’il est resté très haut niveau, a donné de bons conseils (planification de la roadmap, transparences, SIGs, focus sur les individus plus que les projets) et des ressources complémentaires (opensource.com guides, codeofconducts), qui n’existaient pas à l’époque où {code} s’est mise en place.&lt;/p&gt;
&lt;h3 id="rex-de-turbine-labs-a-propos-de-leur-migration-de-nginx-vers-envoy"&gt;REX de Turbine labs a propos de leur migration de nginx vers envoy
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://schd.ws/hosted_files/kccnceu18/a6/Turbine%20Labs_Move%20to%20Envoy%20Deck_V2.pdf" target="_blank" rel="noopener"
&gt;&lt;em&gt;Replacing NGINX with Envoy in a Traffic Control System - Mark McBride, Turbine Labs, Inc&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Le CEO de Turbine Labs nous a fait un REX sur un changement majeur qu’ils ont eu à réaliser sur leur produit : le changement de &lt;strong&gt;nginx&lt;/strong&gt; (limité pour leurs besoins spécifiques) pour &lt;strong&gt;Envoy&lt;/strong&gt;. Ce changement impliquait (1) d’écrire une partie des features manquantes dans Envoy (extensions maisons spécifiques à Turbine Labs pour leurs besoins propres) et la façon la plus progressives de migrer ce composant central dans leur architecture.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/05/20180502_141232-2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Si le talk était intéressant en soit (et permet d’avoir un premier aperçu de Envoy), c’était aussi l’occasion de se poser les bonnes questions pour tout migration, qu’elle qu’elle soit.&lt;/p&gt;
&lt;h3 id="rex-zalando-la-mise-à-jour-des-clusters-kubernetes"&gt;REX Zalando, la mise à jour des clusters Kubernetes
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://schd.ws/hosted_files/kccnceu18/18/2018-05-02%20Continuously%20Deliver%20your%20Kubernetes%20Infrastructure%20-%20KubeCon%202018%20Copenhagen.pdf" target="_blank" rel="noopener"
&gt;&lt;em&gt;Continuously Deliver your Kubernetes Infrastructure - Mikkel Larsen, Zalando SE&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Le site de e-commerce Zalando est quelque chose d’assez énorme. On ne s’en rend pas forcément compte, mais ce sont des dizaines de clusters Kubernetes qui sont nécessaires pour gérer la partie développement des nouvelles applications.&lt;/p&gt;
&lt;p&gt;Zalando est connue comme faisant partie des sociétés qui communiquent beaucoup sur leurs (bonnes) pratiques en terme d’IT. D’ailleurs l’amphi était plein à craquer :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/05/20180502_144136_HDR.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Mikkel Larsen n’y a pas coupé et nous a méthodiquement expliqué pas à pas tout ce qui était mis en place pour assurer (1) des mises à jours des clusters Kubernetes complètement transparentes et quasi automatiques, et (2) des test ends to ends complet permettant de repérer des régressions mêmes subtiles.&lt;/p&gt;
&lt;p&gt;Côté technique, Zalando travaille sur AWS, sur plusieurs availability zones, avec des Stack Cloud Formations, 1 seule AMI pour toutes les VMs, des clusters etcd externalisés des nœuds Kubernetes (rendant les masters stateless, et donc plus facile à mettre à jour), &amp;hellip;&lt;/p&gt;
&lt;h3 id="the-route-to-rootless-container"&gt;The Route to rootless container
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://schd.ws/hosted_files/kccnceu18/08/route_to_rootless_slides.pdf" target="_blank" rel="noopener"
&gt;&lt;em&gt;The Route To Rootless Containers - Ed King, Pivotal &amp;amp; Julz Friedman, IBM&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Je ne vais pas le cacher, je suis allé pour le titre de la conf et je n’ai pas été déçus côté clins d’œils / memes (ni par le contenu, mais c’est toujours plus agréables quand les speakers sont bons).&lt;/p&gt;
&lt;p&gt;Si Ed King et Julz Friedman ont commencé par dire qu’ils étaient contents qu’autant de gens soient présents pour un « sujet aussi basique », le talk n’était clairement pas à destination de débutants !&lt;/p&gt;
&lt;p&gt;Point par point, ils ont expliqué quels technologies et couches de sécurités étaient disponibles, contre quoi elle protégeaient et ne protégeaient pas. Dans une seconde partie, ils ont ensuite expliqués comment réussir à faire fonctionner des containers exécutés côté hôte par un utilisateurs non privilégié mais privilégié au sein du container. Mais surtout, pourquoi ça fonctionne et pourquoi ça n’était pas grave.&lt;/p&gt;
&lt;p&gt;Une vraie surprise car j’avais mal compris la conf (je pensais qu’on allait expliquer comment faire pour que les applications ne soient pas root DANS le container).&lt;/p&gt;
&lt;h3 id="améliorer-la-sécurité-des-workloads-kubernetes-avec-la-virtualisation-matérielle"&gt;Améliorer la sécurité des workloads Kubernetes avec la virtualisation matérielle
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://schd.ws/hosted_files/kccnceu18/9f/2018-03%20KubeCon%20EU%20-%20Improving%20your%20Kubernetes%20Workload%20Security%20with%20Hardware%20Virtualization.pdf" target="_blank" rel="noopener"
&gt;&lt;em&gt;Improving your Kubernetes Workload Security with Hardware Virtualization - Fabian Deutsch, Red Hat &amp;amp; Samuel Ortiz, Intel&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Une conf’ amusante où deux projets dont le but est de faire tourner des workloads Kubernetes dans des machines virtuelles (Kata et KubeVirt), &lt;em&gt;soit disant non concurrents,&lt;/em&gt; ont été présentés en même temps.&lt;/p&gt;
&lt;p&gt;La subtilité, selon eux, c’est que :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kata containers est plutôt à destination des personnes qui souhaitent :
&lt;ul&gt;
&lt;li&gt;ajouter une couche de sécurité/ségrégation supplémentaire à la conteneurisation simple en ajoutant l’isolation via la virtualisation matérielle&lt;/li&gt;
&lt;li&gt;utiliser des kernels différents pour des containers différents sur un même groupe d’hôtes Kubernetes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kubevirt permet l’adoption plus rapide de Kubernetes en permettant l’ajout des workload de type legacy « non containerisables » dans un cluster Kubernetes. Ces workloads deviennent des Pods qui tournent dans Kubernetes, ce qui a l’immense avantage d’ajouter toutes les fonctionnalités de Kubernetes sur les Pods, mais aussi la gestion de réseau et du stockage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A vous de me dire si vous êtes convaincus qu’il faut absolument 2 projets ;-).&lt;/p&gt;
&lt;h2 id="et-vous-reprendrez-bien-quelques-keynotes"&gt;Et vous reprendrez bien quelques keynotes
&lt;/h2&gt;&lt;h3 id="anatomy-of-a-production-kubernetes-outage"&gt;Anatomy of a Production Kubernetes Outage
&lt;/h3&gt;&lt;p&gt;&lt;em&gt;Keynote: Anatomy of a Production Kubernetes Outage - Oliver Beattie, Head of Engineering, Monzo Bank&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Un postmortem d’un incident qui a bloqué la prod d’une banque « digital native ». Très bien présenté et d’autant plus intéressant que les « erreurs » qui ont été faites tendent plus de la malchance et de fausses bonnes idées que de l’erreur a proprement parler; il était très facile de m’imaginer à la place des équipes qui ont géré cet incident.&lt;/p&gt;
&lt;h3 id="container-native-dev-and-ops-experience"&gt;Container Native Dev and ops Experience
&lt;/h3&gt;&lt;p&gt;&lt;em&gt;Keynote: Container-Native Dev-and-ops Experience: It’s Getting Easier, Fast. - Ralph Squillace, Principal PM – Azure Container Platform, Microsoft&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Je ne vais pas mentir, je suis un peu passé à côté de cette keynote. Ralph Squillace nous a fait une démo en live de code qui se déploie, se débugue et tourne sur Kubernetes pour nous prouver à quel point c’est simple. Moui, ok.&lt;/p&gt;
&lt;p&gt;Au delà de ça, j’ai surtout remarqué que son PC était sous Ubuntu. Venant de quelqu’un qui bosse chez Microsoft (même si c’est une team Kubernetes), c’est quand même quelque chose qui aurait été impensable il y a quelques années ;-p&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/tweet_kubecon_2018.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h3 id="cloud-native-observability--security"&gt;Cloud native observability &amp;amp; security
&lt;/h3&gt;&lt;p&gt;&lt;em&gt;Keynote: CNCF End User Awards - Presented by Chris Aniszczyk, COO, Cloud Native Computing Foundation&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Un résumé des annonces faites aujourd’hui par Google à l’occasion de la Kubecon.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gVisor, un système révolutionnaire qui va résoudre tous les pb de sécurité des containers&lt;/li&gt;
&lt;li&gt;stackdriver, un outil de monitoring (observability) génial, qui rendre nos vies géniales&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Peut être que le format était mal choisi, mais je suis extrêmement sceptique et je vais attendre d’en savoir plus ;)&lt;/p&gt;
&lt;h3 id="prometheus-20"&gt;Prometheus 2.0
&lt;/h3&gt;&lt;p&gt;&lt;em&gt;Keynote: Prometheus 2.0 – The Next Scale of Cloud Native Monitoring - Fabian Reinartz, Software Engineer, Google&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Une tonne de slides pour nous brosser l’historique de Prometheus dans un premier temps, puis nous expliquer qu’un gros problème est arrivé, la TSDB de Prometheus était trop lente sur de très gros workloads. Déluge de slides pour nous montrer à quel point Prometheus 2 est bien meilleur.&lt;/p&gt;
&lt;p&gt;Maintenant c’est mieux.&lt;/p&gt;
&lt;h2 id="et-demain-"&gt;Et demain ?
&lt;/h2&gt;&lt;p&gt;Et bien demain rebelote (enfin si je poste pas très vite, on va déjà être demain&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Si ça vous intéresse, vous pouvez suivre les confs que je vais voir sur &lt;a class="link" href="https://kccnceu18.sched.com/d.germain" target="_blank" rel="noopener"
&gt;kccnceu18.sched.com/d.germain&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Hack : diminuer la taille du VMDK d’une VM Linux LVM</title><link>https://blog.zwindler.fr/2018/03/14/diminuer-la-taille-du-vmdk-dune-vm-linux/</link><pubDate>Wed, 14 Mar 2018 12:45:43 +0000</pubDate><guid>https://blog.zwindler.fr/2018/03/14/diminuer-la-taille-du-vmdk-dune-vm-linux/</guid><description>&lt;img src="https://blog.zwindler.fr/2015/07/vmware2.webp" alt="Featured image of post Hack : diminuer la taille du VMDK d’une VM Linux LVM" /&gt;&lt;h2 id="réduire-un-vmdk"&gt;Réduire un VMDK
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Note : cet article n’est pas écrit par moi mais par mon ami et ancien collègue Steve aka ventreachoux85 (ahahah faut assumer maintenant Steve), que j’héberge avec grand plaisir sur le blog :-)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Note 2: &lt;strong&gt;Comme toute opération sur des disques, des partitions, des filesystems, elles sont à faire avec des backups préalables. Cette opération est dangereuse et est à vos risques et périls =&amp;gt; vous voilà prévenus.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sur un serveur Linux (CentOS 6.9 pour la petite histoire) hébergé sur un serveur VMware, je souhaite réduire la taille de mon disque virtuel de 75 Go car la volumétrie ne va pas bouger. S’il est simple d’agrandir un disque virtuel sous VMware, le réduire est une autre paire de manches !&lt;/p&gt;
&lt;p&gt;Si la machine avait été un serveur Windows, voilà ce que j’aurai fais :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Réduction du volume depuis l’utilitaire de gestion de disques&lt;/li&gt;
&lt;li&gt;Modification de l’&lt;em&gt;extent description&lt;/em&gt; directement sur le fichier .vmdk depuis l’ESXi (en SSH)&lt;/li&gt;
&lt;li&gt;Migration de la VM sur un autre datastore =&amp;gt; elle aurait eu la taille voulue à l’issue de l’opération&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je ne détaille volontairement pas cette procédure car celle qui suit est similaire et nous allons prendre le temps de tout voir.&lt;/p&gt;
&lt;p&gt;Et donc du coup, là c’était pas pour des windows, mais pour des machines sous Linux ! J’ai demandé son avis à zwindler, qui m’a demandé en échange de rédiger une petite procédure pour le blog ;-)&lt;/p&gt;
&lt;h2 id="réduction-du-fs"&gt;Réduction du FS
&lt;/h2&gt;&lt;p&gt;Voilà donc à quoi ressemble les disques de mon serveur avant l’opération :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Dans mon cas, je n’ai pas besoin de réduire les Filesystems, j’ai déjà beaucoup de PE de disponibles. S’il avait fallut le faire, on aurait été obligé de réduire les FS à froid (dans le cas ext*), voire même de passer par un liveCD si on avait du redimensionner « / » ou un autre FS vital pour l’OS.&lt;/p&gt;
&lt;h2 id="réduire-un-vmdk-partitionné-pour-du-lvm"&gt;Réduire un VMDK partitionné pour du LVM
&lt;/h2&gt;&lt;p&gt;Le problème avec la commande &lt;strong&gt;pvs&lt;/strong&gt; est que la taille utilisée et la taille disponible est arrondie pour être au format « human readable » d’Unix. Idéalement, il nous faut une mesure exacte pour redimensionner au plus juste.&lt;/p&gt;
&lt;p&gt;Une des manières simples de le faire est d’utiliser l’unité « secteur » de la commande &lt;strong&gt;pvs&lt;/strong&gt; (512 octets). Il faut faire la différence entre le PSize et le PFree pour avoir la taille définitive du disque :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image-1.avif%22"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Après un rapide calcul, si je veux réduire le disque de tous les PE disponibles :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;209453056 – 164757504 = 44695552&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La nouvelle taille du PV sera de 44965552 secteurs&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note de zwindler : Personnellement j’aurai laissé quelques PE, par habitude (limitations de LVM1 pénibles quand il n’y a plus de PE) et parce que je suis un froussard, mais a priori « ça marche ».&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On redimensionne le disque&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image-2.avif%22"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt;A noter, malgré le fait qu’on ait spécifié qu’il ne devait pas rester de PE de libre, a priori il en reste quand même quelques uns. Je ne sais pas si c’est une sécurité du pvresize ou si c’est lié aux arrondis et à la taille d’un PE sur ce PV.&lt;/del&gt; C’était une erreur de calcul (cf voir les commentaires).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image-3.avif%22"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pour vérifier que tout va bien, un petit &lt;strong&gt;pvscan/vgscan&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image-5.avif%22"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image-4.avif%22"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="réduire-la-partition"&gt;Réduire la partition
&lt;/h2&gt;&lt;p&gt;A partir de là, ça se corse. On a réduit sans trop de difficulté le PV qui héberge nos LV, mais il nous reste maintenant à réduire la partition qui héberge ce PV. Même si théoriquement on peut le faire à chaud, &lt;strong&gt;zwindler&lt;/strong&gt; m’a conseillé de faire ça à froid.&lt;/p&gt;
&lt;p&gt;Pour autant, si vous vous sentez l’âme d’un aventurier et/ou avec un OS récent et/ou que vous n’avez pas le choix, vous pouvez toujours aller lire ce post sur &lt;a class="link" href="https://askubuntu.com/questions/24027/how-can-i-resize-an-ext-root-partition-at-runtime" target="_blank" rel="noopener"
&gt;Ask Ubuntu&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le plus safe est quand même d’arrêter la VM puis booter sur un liveCD avec GParted.&lt;/p&gt;
&lt;p&gt;Clic droit sur la partition à modifier – désactiver (sinon impossible de la redimensionner)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image-6.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Sélectionner la partition puis Redimensionner / Déplacer&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image-7.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Attention : lors du premier redimensionnement, GParted ne prend ne réduit pas au maximum la partition. &lt;strong&gt;Il reste 2 Go qui sont inutilisés&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image-8.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On lance un nouveau redimensionnement pour récupérer la place disponible !!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note de zwindler : moi j’aurai laissé comme ça ;-)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;ATTENTION&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On voit que &lt;strong&gt;/dev/sda2&lt;/strong&gt; fait 21.44 Go après le &lt;strong&gt;pvresize&lt;/strong&gt; (cf. screenshot précédent). En essayant de réduire au maximum la place utilisée, on peut tout casser (expérience vécue !!!). Pour plus de sécurité, je conseille de resizer à l’entier supérieur (donc dans notre exemple 22 Gio soit 22528 Mio)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image-9.avif%22"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image-10.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image-11.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="redimensionner-le-vmdk"&gt;Redimensionner le VMDK
&lt;/h2&gt;&lt;p&gt;Maintenant que le disque est modifié au niveau de l’OS, il faut le redimensionner au niveau de VMware.&lt;/p&gt;
&lt;p&gt;Et là, rebelote : c’est pas « simple » à faire. En effet, &lt;a class="link" href="https://kb.vmware.com/s/article/1002019" target="_blank" rel="noopener"
&gt;VMware ne supporte pas la réduction des VMDK (que ce soit à chaud ou à froid)&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: You cannot shrink virtual disks using &lt;strong&gt;vmkfstools&lt;/strong&gt; in ESXi as the hypervisor is not aware of the file system layout and cannot ensure a safe shrink operation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Heureusement, des petits malins ont trouvés la technique depuis bien longtemps :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Se connecter en SSH sur l’ESX qui héberge la VM, se rendre dans le dossier de la VM et faire un &lt;strong&gt;vi&lt;/strong&gt; sur le fichier &lt;em&gt;NomVM.vmdk&lt;/em&gt;, qui est un fichier texte (configuration), contrairement au fichier &lt;em&gt;NomVM-flat.vmdk&lt;/em&gt; qui contient les données réelles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Modifier la valeur suivante :&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# Extent description
RW 209715200 VMFS &amp;#34;testsba-flat.vmdk&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;La nouvelle valeur du paramètre &lt;em&gt;extent description&lt;/em&gt; sera « 22 GB = 22 x 1024 x 1024 x 1024 / 512 (octets/secteur) = 46137344 secteurs »&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# Extent description
RW 46137344 VMFS &amp;#34;testsba-flat.vmdk&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="déplacer-la-vm-vers-un-autre-datastore"&gt;Déplacer la VM vers un autre Datastore
&lt;/h2&gt;&lt;p&gt;A partir de là, vous vous dites : « cool ! j’ai récupéré l’espace disque ». Et vous êtes déçus car rien ne se passe.&lt;/p&gt;
&lt;p&gt;En effet, ce paramètre n’est pris en compte que lors de la création du disque, lorsque le fichier contenant réellement les données (le fameux &lt;em&gt;NomVM-flat.vmdk&lt;/em&gt; dont je vous ai parlé plus tôt) est créé. Vous pouvez mettre n’importe quoi, ça ne changera rien du tout.&lt;/p&gt;
&lt;p&gt;Cependant, si vous avez la licence qui va bien sur votre cluster, vous pouvez feinter le cluster pour lui faire recréer un disque à chaud de la bonne taille avec un simple &lt;strong&gt;Storage vMotion&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avant le Storage vMotion :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image-12.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Après le Storage vMotion :&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image-13.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="pourquoi-ça-marche-"&gt;Pourquoi ça marche ?
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Petit aparté de zwindler :&lt;/strong&gt; Pour bien comprendre ce qu’il se passe, il faut comprendre comment marche un Storage vMotion. Au moment où vous demandez à VMware de déplacer un disque d’un datastore à l’autre, voici l’enchaînement des opérations :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prise d’un snapshot du disque initial&lt;/li&gt;
&lt;li&gt;Création d’un disque sur le datastore cible. Ce disque est identique au disque initial au moment du snapshot via la commande &lt;strong&gt;vmkfstools&lt;/strong&gt;. Cette commande relis la valeur contenu dans &lt;em&gt;extent description&lt;/em&gt; pour savoir quelle taille le fichier doit faire physiquement, ce qui nous permet de feinter VMware et d’avoir un disque à la bonne taille._&lt;br&gt;
_&lt;/li&gt;
&lt;li&gt;L’ensemble des IO depuis le snapshot sont écrites simultanément sur les deux datastores, ce qui permet d’avoir 2 copies identiques au moment de la fin de la copie du snapshot&lt;/li&gt;
&lt;li&gt;Migration de la VM  sur le nouveau disque&lt;/li&gt;
&lt;li&gt;Suppression de l’ancien disque hébergé par l’ancien datastore&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note de zwindler :&lt;/strong&gt; j’étais persuadé d’avoir fais un article là dessus (et en fait pas du tout) mais &lt;em&gt;il est évidemment possible de faire la même chose à la main sans Storage vMotion&lt;/em&gt;, simplement avec &lt;strong&gt;vmkfstools&lt;/strong&gt; à la main.&lt;/p&gt;
&lt;h2 id="boot-de-la-machine"&gt;Boot de la machine
&lt;/h2&gt;&lt;p&gt;Pour finir, une fois la VM bootée, il reste encore une petite opération de maintenance à réaliser. Il y a une petite différence de nombre de secteurs suite au redimensionnement.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image-14.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Il suffit de faire un &lt;strong&gt;pvresize&lt;/strong&gt; avec le nombre de secteurs indiqué par la commande &lt;strong&gt;pvs&lt;/strong&gt; précédente :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image-15.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Tout est dorénavant OK :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/03/word-image-16.avif%22"
loading="lazy"
&gt;&lt;/p&gt;</description></item><item><title>Harbor : la docker registry d’entreprise open source de VMware – part 1</title><link>https://blog.zwindler.fr/2018/02/27/harbor-la-docker-registry-dentreprise-open-source-de-vmware-part-1/</link><pubDate>Tue, 27 Feb 2018 12:45:35 +0000</pubDate><guid>https://blog.zwindler.fr/2018/02/27/harbor-la-docker-registry-dentreprise-open-source-de-vmware-part-1/</guid><description>&lt;img src="https://blog.zwindler.fr/2018/02/harbor.webp" alt="Featured image of post Harbor : la docker registry d’entreprise open source de VMware – part 1" /&gt;&lt;h2 id="harbor-"&gt;Harbor ?
&lt;/h2&gt;&lt;p&gt;Rien à voir avec l’île dans le Pacifique ou l’accord entre les Etats Unis et l’Union Européenne dans les années 90. Le Harbor dont je vais vous parler, c’est la registry Docker d’entreprise et Open Source de VMware !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Harbor est un des produits open sourcé par VMware. C’est un serveur permettant de stocker « on premise » ou dans le cloud des images Docker, au même titre que le produit historiquement appelé Docker Registry (maintenant &lt;em&gt;Docker Distribution&lt;/em&gt;), mais avec des fonctionnalités supplémentaires, notamment :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gestion de la sécurités, des comptes, rôles, habilitation (RBAC)&lt;/li&gt;
&lt;li&gt;Réplication des images entre plusieurs instances de Harbor&lt;/li&gt;
&lt;li&gt;Portail web&lt;/li&gt;
&lt;li&gt;Logging de toutes les opérations à des fins d’audit&lt;/li&gt;
&lt;li&gt;API RESTful&lt;/li&gt;
&lt;li&gt;Scan de vulnérabilité intégré&lt;/li&gt;
&lt;li&gt;Nettoyage automatique des images inutiles (garbage collection)&lt;/li&gt;
&lt;li&gt;Intégration native avec Notary pour la signature des images&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Rien que ça ;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pour ceux que ça intéressent et qui ne savaient pas (comme moi) que VMware met à disposition des logiciels open source, les autres sont disponibles &lt;a class="link" href="https://vmware.github.io/" target="_blank" rel="noopener"
&gt;sur la page Github de VMware&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="petite-étude-du-marché"&gt;Petite étude du marché
&lt;/h2&gt;&lt;p&gt;Je ne vais pas vous faire une analyse poussée du marché de la registry privée, mais si jamais vous cherchez des produits similaires, vous pouvez aller jeter un œil aux produits suivants qui ont attirés mon attention :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.docker.com/datacenter/dtr/2.3/guides/" target="_blank" rel="noopener"
&gt;Docker Trusted Registry (version entreprise de Docker Distribution)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gitlab.com/ee/user/packages/container_registry/" target="_blank" rel="noopener"
&gt;Gitlab Container Registry, fortement intégré à Gitlab CI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.jfrog.com/artifactory/" target="_blank" rel="noopener"
&gt;Artifactory supporte maintenant les containers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://quay.io/plans/?tab=enterprise" target="_blank" rel="noopener"
&gt;Quay de CoreOS, Inc.&lt;/a&gt; (maintenant racheté par Redhat)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et je vous met aussi quelques articles sympas qui parlent de ces différentes solutions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://web.archive.org/web/20180320225423/http://blog.wercker.com/ultimate-guide-to-container-registries" target="_blank" rel="noopener"
&gt;blog.wercker.com/ultimate-guide-to-container-registries (lien mort, racheté et tué par Oracle, retrouvé sur Internet Archive)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://rancher.com/container-registries-might-missed/" target="_blank" rel="noopener"
&gt;rancher.com/container-registries-might-missed/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.codeship.com/overview-of-docker-registries/" target="_blank" rel="noopener"
&gt;blog.codeship.com/overview-of-docker-registries/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="méthode-choisie"&gt;Méthode choisie
&lt;/h2&gt;&lt;p&gt;Ok ! Maintenant qu’on connaît un peu l’écosystème, on peut s’attaquer à la bête. Il existe plusieurs méthodes pour installer Harbor sur une infrastructure « on premise » :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Installer Harbor sur un serveur Docker via
&lt;ul&gt;
&lt;li&gt;l’installeur « online » (qui télécharge les images nécessaires sur Dockerhub)&lt;/li&gt;
&lt;li&gt;l’installeur « offline » (qui dispose déjà des images nécessaires)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Déployer une VM VMware via un OVA VIC (VMware vSphere Integated Containers) qui contient &lt;em&gt;entre autre&lt;/em&gt; un serveur Harbor préinstallé et préconfiguré&lt;/li&gt;
&lt;li&gt;Déployer Harbor directement sur un cluster Kubernetes via YAML (option communautaire)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les releases &lt;a class="link" href="https://github.com/vmware/harbor/releases" target="_blank" rel="noopener"
&gt;sont disponibles depuis la page « release » sur le dépôt Github&lt;/a&gt;. &lt;a class="link" href="https://web.archive.org/web/20240410013515/https://customerconnect.vmware.com/en/downloads/#all_products" target="_blank" rel="noopener"
&gt;L’OVA est lui disponible sur myvmware (lien mort, comme tout chez VMware, j&amp;rsquo;utilise Internet Archive)&lt;/a&gt;, le site de téléchargement habituel de VMware.&lt;/p&gt;
&lt;p&gt;Dans le cadre de cette article, la méthode d’installation que j’ai choisie est l’installation via les sources en mode « offline » car il m’arrive souvent dans les datacenters de ne pas avoir accès à Internet facilement (pour des raisons de sécurité).&lt;/p&gt;
&lt;h2 id="récupération-des-sources"&gt;Récupération des sources
&lt;/h2&gt;&lt;p&gt;Depuis un poste qui a accès à Internet, on va donc télécharger l’ensemble des fichiers dont nous aurons besoins : le fichier d’installation ainsi que sa signature md5.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;curl -L https://github.com/vmware/harbor/releases/download/v1.2.0/harbor-offline-installer-v1.2.0.md5.txt -o harbor-offline-installer-v1.2.0.md5.txt
curl -L https://github.com/vmware/harbor/releases/download/v1.2.0/harbor-offline-installer-v1.2.0.tgz -o harbor-offline-installer-v1.2.0.tgz
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;C’est super d’avoir mis un fichier MD5&amp;hellip; mais la comparaison avec la signature ne peut pas être faite telle quelle car un fichier de signature MD5 « valide » doit avoir le nom du fichier indiqué APRÈS la signature en elle même. Ce n’est pas le cas dans le fichier mis à disposition par VMware.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat harbor-offline-installer-v1.2.0.md5.txt
235fcfb9fe00ad61f6cbc2de4920b477
#Un fichier MD5 valide doit contenir &amp;#34;235fcfb9fe00ad61f6cbc2de4920b477 harbor-offline-installer-v1.2.0.tgz&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour pouvoir le comparer sous Linux avec md5sum, on doit recréer un fichier correct avec la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;file=&amp;#34;harbor-offline-installer-v1.2.0&amp;#34;
md5sum -c &amp;lt;(echo $(&amp;lt;${file}.md5.txt) ${file}.tgz)
harbor-offline-installer-v1.2.0.tgz: Réussi
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Source : &lt;a class="link" href="https://unix.stackexchange.com/questions/322286/most-practical-way-to-compare-md5-checksums" target="_blank" rel="noopener"
&gt;Most practical way to compare MD5 checksums sur StackExchange&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="installation-des-prérequis"&gt;Installation des prérequis
&lt;/h2&gt;&lt;p&gt;La documentation d’installation officielle nous indique les dépendances suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;python 2.7+&lt;/li&gt;
&lt;li&gt;docker 1.10+&lt;/li&gt;
&lt;li&gt;docker-compose 1.6+&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Depuis un serveur qui a accès à Internet, on va donc récupérer les sources de Docker compose&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vous ne trouvez pas que ça commence à être un peu relou toutes ces étapes ?&lt;/p&gt;
&lt;p&gt;Vous le voyez venir ? Quoi donc ?&lt;/p&gt;
&lt;p&gt;Et bien le playbook Ansible pardi !! Pour faciliter cette installation, j’ai écris des rôles Ansible pour automatiser ça ;-)&lt;/p&gt;
&lt;p&gt;Pourquoi ? &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=ansible" &gt;Parce que je kiffe Ansible&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="ansible-à-la-rescousse"&gt;Ansible à la rescousse
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/zwindler/ansible-deploy-harbor" target="_blank" rel="noopener"
&gt;Tout est sur mon Github&lt;/a&gt;, sauf docker compose et l’installeur d’Harbor évidemment (que vous aurez récupéré lors des étapes précédentes)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd /etc/ansible
git clone https://github.com/zwindler/ansible-deploy-harbor
cp /usr/local/bin/docker-compose /etc/ansible/roles/prereqs_harbor/files
cp harbor-offline-installer-v1.2.0.tgz /etc/ansible/roles/install_harbor/files
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et si vous voulez un coup d’œil rapide au fichier principal qui appelle les rôles, voici ce qu’il contient (et les variables qu’il convient de renseigner) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat deploy_harbor.yml
---
# Playbook pour installer Harbor
- name: &amp;#34;Install harbor prerequisites&amp;#34;
hosts: zwindler_linux
vars_prompt:
- name: &amp;#34;db_password&amp;#34;
prompt: &amp;#34;Harbor Database Password&amp;#34;
default: &amp;#34;HarborPassword&amp;#34;
- name: &amp;#34;clair_db_password&amp;#34;
promt: &amp;#34;ClairDB password&amp;#34;
default: &amp;#34;HarborPassword&amp;#34;
- name: &amp;#34;harbor_admin_password&amp;#34;
promt: &amp;#34;Harbor Admin password&amp;#34;
default: &amp;#34;HarborPassword&amp;#34;
vars:
- add_notary: false
- use_https : true
- generate_ssl: true
- harbor_install_path : &amp;#34;/usr/local/&amp;#34;
roles:
- prereqs_harbor
- install_harbor
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans le cas où l’on ne souhaite pas utiliser Notary, la configuration d’Harbor est plus simple et la configuration se fait en HTTP simple. Il est nécessaire de modifier la variable &lt;strong&gt;add_notary&lt;/strong&gt; à &lt;strong&gt;False&lt;/strong&gt; dans le playbook dans ce cas particulier.&lt;/p&gt;
&lt;p&gt;Dans le cas où l’on souhaite utiliser Notary, il est obligatoire de passer en HTTPS et d’avoir un certificat. Si tel est le cas, vous l’avez compris, il faut laisser le paramètre &lt;strong&gt;add_notary&lt;/strong&gt; à &lt;strong&gt;True&lt;/strong&gt; ce qui permettra de gérer ce cas particulier. Pour être honnête, je n’ai pas testé la partie Notary, je ne peux donc pas certifier à 100% que cette partie fonctionne convenablement.&lt;/p&gt;
&lt;p&gt;Enfin, le script Ansible peut générer un certificat autosigné en laissant la variable &lt;strong&gt;generate_ssl&lt;/strong&gt; à &lt;strong&gt;True&lt;/strong&gt;. Il est aussi possible &lt;a class="link" href="https://github.com/goharbor/harbor" target="_blank" rel="noopener"
&gt;d’en générer un à la main en suivant la documentation sur le site de Harbor&lt;/a&gt;. Auquel cas il ne faudra pas oublier de passer le paramètre &lt;strong&gt;generate_ssl&lt;/strong&gt; à &lt;strong&gt;False&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="configuration"&gt;Configuration
&lt;/h2&gt;&lt;p&gt;Le playbook déploie Harbor avec une authentification login/mdp stockés dans une base de données interne. Pour tester, c’est pas mal mais évidemment, dans un second temps, il sera opportun de déporter cette authentification à une source de type LDAP ou Active Directory par exemple.&lt;/p&gt;
&lt;p&gt;La première connexion se fait donc avec le login admin et le mot de passe tel que défini lors du déploiement du playbook.&lt;/p&gt;
&lt;p&gt;Une fois connecté, le portail permet d’explorer les projets et de réaliser les configurations complémentaires, telle que la création d’utilisateurs (si on est en mode de stockage « base de données »), la gestion des habilitations, ou la réplication des registries entre elles.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/10/harbor01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="configurer-un-client"&gt;Configurer un client
&lt;/h2&gt;&lt;p&gt;Comme le playbook est très bien fait (enfin normalement, hahaha), tout s’est bien passé et on peut maintenant configurer son poste client pour qu’il s’authentifie sur la Registry et commence à pousser/tirer des images Docker.&lt;/p&gt;
&lt;p&gt;Si vous êtes en HTTPS, vous aurez besoin sur le poste client du CA autosigné généré lors du déploiement d’Harbor, car la registry est du coup sécurisée. Il devrait être disponible dans &lt;strong&gt;/etc/ssl/ca/&lt;/strong&gt; et dans &lt;strong&gt;/etc/docker/certs.d/[hostname_de_la_registry]/&lt;/strong&gt; et doit être déposé dans &lt;strong&gt;/etc/docker/certs.d/&lt;/strong&gt; du &lt;em&gt;client&lt;/em&gt; depuis lequel on souhaite se connecter :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;scp /etc/docker/certs.d/ca.crt [machine_cliente]:/etc/docker/certs.d/[hostname_de_la_registry]/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois fait, on peut tenter de se connecter sur la registry avec la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;REGISTRY=[hostname_de_la_registry]
docker login https://$REGISTRY
Username: admin
Password:
Login Succeeded
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;Tadam !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="et-la-suite-"&gt;Et la suite ?
&lt;/h2&gt;&lt;p&gt;Et ben c’est déjà pas mal pour un premier article sur Harbor, non ? Vous venez, sans effort, de déployer une registry privée d’entreprise pour vos images Docker ;-)&lt;/p&gt;
&lt;p&gt;Mais comme vous l’avez sûrement vu dans le titre, ce n’est que la partie 1. J’ai encore plein de choses à vous raconter sur Harbor. La suite au prochain épisode !&lt;/p&gt;</description></item></channel></rss>