<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kubespray on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/kubespray/</link><description>Recent content in Kubespray on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Tue, 30 Jan 2018 12:45:54 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/kubespray/index.xml" rel="self" type="application/rss+xml"/><item><title>Kubernetes avec Kubespray part 2 – Astuces &amp; troubleshooting</title><link>https://blog.zwindler.fr/2018/01/30/astuces-troubleshooting-kubespray/</link><pubDate>Tue, 30 Jan 2018 12:45:54 +0000</pubDate><guid>https://blog.zwindler.fr/2018/01/30/astuces-troubleshooting-kubespray/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/12/kubespray.webp" alt="Featured image of post Kubernetes avec Kubespray part 2 – Astuces &amp; troubleshooting" /&gt;&lt;h2 id="kubespray-"&gt;Kubespray ?
&lt;/h2&gt;&lt;p&gt;Pour ceux qui ne savent pas ce qu’est Kubernetes, &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=Kubernetes" &gt;je vous invite à lire les articles que j’ai écris à ce sujet&lt;/a&gt;. Kubernetes est un produit permettant de gérer des clusters de machines exécutant des containers en production. Et pour ceux qui ne connaissent pas Kubespray, il s’agit d’un outil principalement basé sur Ansible permettant de simplifier l’installation (relativement complexe) de Kubernetes.&lt;/p&gt;
&lt;p&gt;En théorie, si vous partez avec des machines vierges et qui peuvent discuter entre elles, vous devriez avoir &lt;em&gt;un cluster Kubernetes opérationnel en une vingtaine de minutes et en deux lignes de commande&lt;/em&gt;, en suivant &lt;a class="link" href="https://blog.zwindler.fr/2017/12/05/installer-kubernetes-kubespray-ansible/" &gt;ce tutoriel pas à pas&lt;/a&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -i inventaire_kubernetes/inventory.cfg cluster.yml -b -v --private-key=~/.ssh/id_rsa
[...]
Monday 29 January 2018 15:57:07 +0100 (0:00:00.050) 0:17:56.289 ********
===============================================================================
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Bon&amp;hellip; j’ai quand même eu quelques erreurs et j’ai décidé de les consigner « à part » de l’article d’installation. Je le mettrais à jour dès que j’en rencontre de nouvelles.&lt;/p&gt;
&lt;h2 id="erreur-kubespray-defaults--configure-defaults"&gt;Erreur kubespray-defaults : Configure defaults
&lt;/h2&gt;&lt;p&gt;Si l’installation plante à cette étape avec une très loooongue erreur bien rouge, vérifier qu’il n’y a pas écrit en fin de ligne&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;The ipaddr filter requires python-netaddr be installed on the ansible controller
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si c’est le cas, vous avez probablement oublié d’installer le paquet &lt;strong&gt;python-netaddr&lt;/strong&gt; comme indiqué &lt;a class="link" href="https://blog.zwindler.fr/2017/12/05/installer-kubernetes-kubespray-ansible/" &gt;au début du tutoriel d’installation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="erreur-kubernetespreinstall--stop-if-swap-enabled"&gt;Erreur « kubernetes/preinstall : Stop if swap enabled »
&lt;/h2&gt;&lt;p&gt;Cette erreur est assez explicite : vous avez oublié de désactiver la swap sur un des nœuds.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;TASK [kubernetes/preinstall : Stop if swap enabled] *********************************************************************************************************
Monday 29 January 2018 15:06:44 +0100 (0:00:00.092) 0:00:23.562 ********
fatal: [kube01.zwindler.fr]: FAILED! =&amp;gt; {
&amp;#34;assertion&amp;#34;: &amp;#34;ansible_swaptotal_mb == 0&amp;#34;,
&amp;#34;changed&amp;#34;: false,
&amp;#34;evaluated_to&amp;#34;: false
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On peut facilement la désactiver avec la boucle Ansible suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible kube*.zwindler.fr -m shell -a &amp;#34;swapon -s&amp;#34;
kube01.zwindler.fr | SUCCESS | rc=0 &amp;gt;&amp;gt;
Nom de fichier Type Taille Utilisé Priorité
/dev/sda3 partition 1048572 25812 -1
[...]
ansible kube*.zwindler.fr -m shell -a &amp;#34;swapoff -a&amp;#34;
kube01.zwindler.fr | SUCCESS | rc=0 &amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mais il ne faudra pas oublier de passer &lt;strong&gt;aussi dans la fstab&lt;/strong&gt; pour que le changement soit permanent (attention le sed est un peu brut, je vous invite à vérifier ce qu’il fait) !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible kube*.zwindler.fr -m shell -a &amp;#34;grep swap /etc/fstab&amp;#34;
kube01.zwindler.fr | SUCCESS | rc=0 &amp;gt;&amp;gt;
UUID=18eaabbe-aaaa-aaaa-aaaa-205cdaa94fe6 swap swap defaults 0 0
ansible kube*.zwindler.fr -m shell -a &amp;#34;sed -i.bak &amp;#39;/swap/d&amp;#39; /etc/fstab&amp;#34;
[WARNING]: Consider using template or lineinfile module rather than running sed
kube01.zwindler.fr | SUCCESS | rc=0 &amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="too-many-nameservers"&gt;Too many nameservers
&lt;/h2&gt;&lt;p&gt;Typiquement c’est vraiment une erreur « à la c** ». Pas de bol pour moi, ça a planté directement avec l’erreur « Too many nameservers ». O-kay&amp;hellip;&lt;/p&gt;
&lt;p&gt;Effectivement, j’ai plusieurs serveurs DNS renseignés sur mon OS et Kubespray ne supporte pas plus de 2 out of the box.&lt;/p&gt;
&lt;p&gt;Bon pas de drame, l’utilitaire nous indique qu’on peut contourner cette « erreur » simplement en modifiant une variable :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can relax this check by set docker_dns_servers_strict=no and we will only use the first 3.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dans le fichier &lt;strong&gt;cluster.yml&lt;/strong&gt;, recherchez le block suivant et ajouter les lignes &lt;strong&gt;-vars&lt;/strong&gt; puis &lt;strong&gt;- docker_dns_servers_strict: no&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi cluster.yml
[...]
- hosts: k8s-cluster:etcd:calico-rr
any_errors_fatal: &amp;#34;{{ any_errors_fatal | default(true) }}&amp;#34;
vars:
- docker_dns_servers_strict: no
roles:
- { role: kubespray-defaults}
- { role: kernel-upgrade, tags: kernel-upgrade, when: kernel_upgrade is defined and kernel_upgrade }
- { role: kubernetes/preinstall, tags: preinstall }
- { role: docker, tags: docker }
- role: rkt
tags: rkt
when: &amp;#34;&amp;#39;rkt&amp;#39; in [etcd_deployment_type, kubelet_deployment_type, vault_deployment_type]&amp;#34;
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="proxy-pour-pull-les-images-docker"&gt;Proxy pour pull les images Docker
&lt;/h2&gt;&lt;p&gt;J’ai été pas mal embêté par le proxy lors de l’installation de mon cluster avec &lt;strong&gt;kubeadm&lt;/strong&gt;. Même si je n’ai pas été &lt;em&gt;bloqué&lt;/em&gt; avec Kubespray, j’ai quand même été un peu embêté ;-).&lt;/p&gt;
&lt;p&gt;Le contournement est simple, ici il suffit de configurer le proxy sur les démons docker de toutes les machines du cluster. Avec Ansible :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible -m shell master* worker* -a &amp;#39;cat &amp;gt; /etc/systemd/system/docker.service.d/http-proxy.conf &amp;lt;&amp;lt; EOF
[Service] Environment=&amp;#34;HTTP_PROXY=http://@IP-mon-super-proxy:8080/&amp;#34;&amp;#39;
ansible -m shell master* worker* -a &amp;#34;systemctl daemon-reload&amp;#34;
ansible -m shell master* worker* -a &amp;#34;systemctl restart docker&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Attention au &lt;em&gt;restart&lt;/em&gt; si vous avez des containers qui tournent&amp;hellip; mais je vais partir du principe que nous puisque vous êtes en train d’installer un cluster Kubernetes (depuis zéro).&lt;/p&gt;
&lt;h2 id="the-error-was-no-test-named-equalto"&gt;The error was: no test named ‘equalto’
&lt;/h2&gt;&lt;p&gt;Vous avez probablement oublié &lt;a class="link" href="https://blog.zwindler.fr/2017/12/05/installer-kubernetes-kubespray-ansible/" &gt;un des prérequis du tutoriel&lt;/a&gt; : la version de jinja n’est pas pas à jour&amp;hellip;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pip install --upgrade Jinja2
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="messages-dinformation-à-chaque-exécution-de-kubectl"&gt;Messages d’information à chaque exécution de kubectl
&lt;/h2&gt;&lt;p&gt;J’ai aussi eu un petit bug (non bloquant) une fois l’installation terminée. A chaque exécution de kubectl, j’avais les messages suivants qui s’affichaient dans le terminal.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl describe service kubernetes-dashboard --namespace=kube-system
2017-08-24 10:20:09.035979 I | proto: duplicate proto type registered: google.protobuf.Any
2017-08-24 10:20:09.036050 I | proto: duplicate proto type registered: google.protobuf.Duration
2017-08-24 10:20:09.036066 I | proto: duplicate proto type registered: google.protobuf.Timestamp
[…]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une « issue » a été remontée sur &lt;a class="link" href="https://github.com/Azure/acs-engine/issues/1083" target="_blank" rel="noopener"
&gt;le github de la version de Kubernetes déployée par Azure, à savoir acs-engine&lt;/a&gt;, mais est applicable dans notre cas aussi. A priori c’est une version de &lt;strong&gt;kubectl&lt;/strong&gt; qui a le problème.&lt;/p&gt;
&lt;p&gt;Le problème devrait être résolu avec la version qu’on trouve sur les repository.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mv /usr/local/bin/kubectl /usr/local/bin/kubectl.old
yum install -y kubectl
ln -s /usr/bin/kubectl /usr/local/bin/kubectl
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Installer Kubernetes avec Kubespray (Ansible)</title><link>https://blog.zwindler.fr/2017/12/05/installer-kubernetes-kubespray-ansible/</link><pubDate>Tue, 05 Dec 2017 12:45:25 +0000</pubDate><guid>https://blog.zwindler.fr/2017/12/05/installer-kubernetes-kubespray-ansible/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/12/kubespray.webp" alt="Featured image of post Installer Kubernetes avec Kubespray (Ansible)" /&gt;&lt;h2 id="kubeadm-quand-on-a-pas-ou-mal-accès-à-internet"&gt;Kubeadm quand on a pas ou mal accès à Internet
&lt;/h2&gt;&lt;p&gt;Rapidement pour resituer un peu le sujet, Kubernetes est un produit permettant de gérer des clusters de machines exécutant des containers en production. Un moyen simple d’installer cet outil complexe est d’utiliser l’outil &lt;strong&gt;kubeadm&lt;/strong&gt;, qui était jusqu’à il y a peu déconseillé pour la production (la documentation de la version 1.8 ne le mentionne pas mais le message apparaît toujours lors du &lt;code&gt;kubeadm init&lt;/code&gt;). Pour y voir plus clair, &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=kubernetes" &gt;vous pouvez lire les articles que j’ai écris à ce sujet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dans le cadre d’un déploiement d’un cluster Kubernetes on-premise, j’ai été assez ennuyé par le proxy. En théorie, on peut utiliser kubeadm derrière un proxy mais de nombreux utilisateurs remontent des difficultés de ce côté là (je ne suis pas le seul, ouf). Si vous voulez plus d’info à ce sujet j’ai mis un paragraphe en fin d’article.&lt;/p&gt;
&lt;h2 id="kubespray-à-la-rescousse"&gt;Kubespray à la rescousse
&lt;/h2&gt;&lt;p&gt;Depuis quelques mois, il existe une nouvelle manière de déployer Kubernetes, qui s’appelle &lt;strong&gt;Kubespray&lt;/strong&gt;. Et cerise sur le MacDo, ce méthode utilise Ansible (et vous savez comme &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=ansible" &gt;je suis friand d’Ansible&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;J’ai donc décidé de tester et, vous vous en doutez puisque j’en fais un article, j’ai réussi à installer Kubernetes avec &lt;strong&gt;Kubespray&lt;/strong&gt; derrière mon proxy capricieux ;-).&lt;/p&gt;
&lt;p&gt;A noter, Kubespray ne se limite pas à déployer un Kubernetes &lt;em&gt;on premise&lt;/em&gt;, puisqu’il supporte aussi AWS et OpenStack via l’utilisation de scripts Terraform (outil qui fera l’objet d’un petit article à venir).&lt;/p&gt;
&lt;p&gt;Vous pouvez trouver la documentation sur les sites suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kubernetes.io/docs/setup/production-environment/tools/" target="_blank" rel="noopener"
&gt;La documentation sur le site de Kubernetes (attention pas toujours à jour)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/kubernetes-sigs/kubespray/blob/master/docs/getting_started/getting-started.md" target="_blank" rel="noopener"
&gt;La documentation sur le Github du projet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation-des-prérequis"&gt;Installation des prérequis
&lt;/h2&gt;&lt;p&gt;Un petit tour sur le Github nous donne les prérequis :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/11/requirement.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;A ceci j’ajouterai le fait que Kubernetes demande maintenant que la swap soit désactivée sur tous les nœuds ! Si ce n’est pas déjà fait, il faut passer sur tous les serveurs et la désactiver (ne pas oublier &lt;strong&gt;la fstab aussi!&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kubespray&lt;/strong&gt; nécessite l’installation des outils de développements sur la machine qui exécute le script Ansible, ainsi que Python 3. Sur les CentOS / RHEL 7, la version de Python est la 2.7, qui n’est donc pas compatible avec le script Python 3 qui génère le fichier d’inventaire pour le déploiement Ansible.&lt;/p&gt;
&lt;p&gt;En soit, ce n’est pas vital, mais ça facilite quand même le travail donc ça vaut le coup.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;yum -y install yum-utils
yum -y groupinstall development
yum -y install https://centos7.iuscommunity.org/ius-release.rpm
yum -y install python36u python-netaddr
yum -y install python-pip
pip install --upgrade Jinja2
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="récupération-et-configuration-de-kubespray"&gt;Récupération et configuration de kubespray
&lt;/h2&gt;&lt;p&gt;Les sources de Kubespray sous sur Github, on les récupère&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;git clone https://github.com/kubernetes-incubator/kubespray
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Récupérer les dépendances pip&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 pip install -r requirements.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On copie le dossier inventory d’origine pour se faire sa propre conf :&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;&lt;span class="nb"&gt;cd&lt;/span&gt; kubespray
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp -r inventory inventaire_kubernetes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On déclare les adresses IPs des futurs nœuds kubernetes puis on lance le script pour générer l’inventaire :&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;&lt;span class="nb"&gt;declare&lt;/span&gt; -a &lt;span class="nv"&gt;IPS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;192.168.1.101 192.168.1.102 192.168.1.103 192.168.1.104&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CONFIG_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;inventaire_kubernetes/inventory.cfg python3.6 contrib/inventory_builder/inventory.py &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IPS&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On peut regarder le contenu de modifier le fichier inventaire_kubernetes/inventory.cfg si nécessaire :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;all]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;master01 ansible_host=192.168.1.101 ip=192.168.1.101&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;worker01 ansible_host=192.168.1.102 ip=192.168.1.102&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;worker02 ansible_host=192.168.1.103 ip=192.168.1.103&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;worker03 ansible_host=192.168.1.104 ip=192.168.1.104&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;kube-master]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;master01&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;worker01&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;kube-node]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;master01&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;worker01&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;worker02&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;worker03&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;etcd]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;master01&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;worker01&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;worker02&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;k8s-cluster:children]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;kube-node&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;kube-master&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;calico-rr]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;vault]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;master01&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;worker01&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;worker02&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Typiquement ici dans mon cas, n’ayant que 4 machines et ne souhaitant pas faire tourner de container sur les masters (bien que ce soit possible), j’ai prévu de ne mettre qu’un master et 3 workers.&lt;/p&gt;
&lt;p&gt;Du coup, les groupes sont à adapter en fonction des rôles de chacun. J’ai retiré worker01 du groupe &lt;strong&gt;kube-master&lt;/strong&gt;. Idéalement bien entendu, il aurait fallu avoir plus d’un master (3 idéalement ou au moins 2).&lt;/p&gt;
&lt;p&gt;Idem pour la répartition du &lt;strong&gt;vault&lt;/strong&gt; et du &lt;strong&gt;etcd&lt;/strong&gt; sur les workers. Le mieux serait d’avoir un peu de haute disponibilité supplémentaire sur ces composants et donc de les répartir comme le propose le script d’inventaire, mais rien ne vous y oblige.&lt;/p&gt;
&lt;h2 id="déploiement-du-cluster"&gt;Déploiement du cluster
&lt;/h2&gt;&lt;p&gt;Maintenant que notre inventaire est prêt, Kubespray déploie le cluster avec ce oneliner :&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;ansible-playbook -i inventaire_kubernetes/inventory.cfg cluster.yml -b -v --private-key&lt;span class="o"&gt;=&lt;/span&gt;~/.ssh/id_rsa
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pas mal hein ? Par rapport à l’installation avec kubeadm que je décris dans &lt;a class="link" href="https://blog.zwindler.fr/2017/06/07/installer-cluster-kubernetes-vm-centos/" &gt;Installer un cluster Kubernetes sur des VMs CentOS 7&lt;/a&gt;, c’est quand même bien plus simple !&lt;/p&gt;
&lt;p&gt;Oui oui, vous avez compris, c’est déjà fini !&lt;/p&gt;
&lt;h2 id="bonus--changer-le-service-du-dashboard-de-kubernetes-pour-le-publier-sur-un-port"&gt;Bonus : Changer le service du dashboard de kubernetes pour le publier sur un port
&lt;/h2&gt;&lt;p&gt;Contrairement à kubeadm, Kubespray installe le dashboard par défaut, pas besoin d’importer et d’appliquer le YAML.&lt;/p&gt;
&lt;p&gt;Cependant, même si normalement on préfère accéder au dashboard de Kubernetes avec le kubeproxy, on peut vouloir dans certains cas accéder directement au Dashboard depuis un port fixe.&lt;/p&gt;
&lt;p&gt;Pour ce faire, on remplace le ClusterIP (interne à Kubernetes uniquement) par un Nodeport en récupérant la configuration du service, en la modifiant et en la ré-appliquant :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;kubectl get svc kubernetes-dashboard --namespace=kube-system -o yaml &amp;gt; kubernetes-dashboard-svc.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;vi kubernetes-dashboard-svc.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;v1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;k8s-app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kubernetes-dashboard&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kubernetes-dashboard&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kube-system&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;TCP&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;targetPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9090&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;k8s-app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kubernetes-dashboard&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;NodePort&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Une fois les modification faites, on réapplique la configuration et on vérifie que ça a fonctionné&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;kubectl apply -f kubernetes-dashboard-svc.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get svc --namespace&lt;span class="o"&gt;=&lt;/span&gt;kube-system
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME CLUSTER-IP EXTERNAL-IP PORT&lt;span class="o"&gt;(&lt;/span&gt;S&lt;span class="o"&gt;)&lt;/span&gt; AGE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kube-dns 10.233.0.3 &amp;lt;none&amp;gt; 53/UDP,53/TCP 97d
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-dashboard 10.233.33.140 &amp;lt;nodes&amp;gt; 80:30000/TCP 97d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le Dashboard est disponible sur le port 30000 !&lt;/p&gt;
&lt;h2 id="bonus--kubeadm-et-les-proxy-internet"&gt;Bonus : Kubeadm et les proxy internet
&lt;/h2&gt;&lt;p&gt;J’en parle en début de l’article, j’ai beaucoup galéré avec kubeadm et sa gestion de proxy. Si vous n’en avez pas, ça marche très bien mais si vous avez un proxy, kubeadm fait des appels à Internet via de multiples canaux (je n’ai pas vérifié si c’était mieux en 1.8) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;docker pull pour récupérer les images&lt;/li&gt;
&lt;li&gt;un accès direct&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J’ai eu beau ajouter ‘with_proxy’, configurer les variables HTTP_PROXY/HTTPS_PROXY/NO_PROXY (et en minuscules) aussi bien au niveau de l’OS que du démon Docker mais rien n’y a fait&amp;hellip;&lt;/p&gt;
&lt;p&gt;Quelques pistes si vous voulez vous y essayer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/kubernetes/kubeadm/issues/292" target="_blank" rel="noopener"
&gt;Une personne qui a eu le même genre de soucis que moi (si je ne met pas  » »with-proxy= » ça bloque, si je le met, ça bloque un peu plus loin)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://kubernetes.io/docs/reference/generated/kubeadm/#kubeadm-init" target="_blank" rel="noopener"
&gt;La documentation officielle de kubeadm init&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/kubernetes/kubeadm/issues/182" target="_blank" rel="noopener"
&gt;kubeadm init should provide a HTTP_PROXY configure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/kubernetes/kubeadm/issues/324" target="_blank" rel="noopener"
&gt;Where does kubeadm take the proxy settings from?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/kubernetes/kubeadm/issues/257" target="_blank" rel="noopener"
&gt;with KUBE_REPO_PREFIX, but the kubeadm is using « gcr.io/google_containers/pause-amd64 »&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On peut même également installer un cluster Kubernetes avec kubeadm sans accès à Internet en préchargeant les images docker nécessaires, mais là encore, l’outil kubeadm se bloque au moment d’aller vérifier sur Internet s’il existe des images plus récentes à télécharger.&lt;/p&gt;</description></item></channel></rss>