<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Docker CE on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/docker-ce/</link><description>Recent content in Docker CE on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Wed, 07 Jun 2017 12:00:53 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/docker-ce/index.xml" rel="self" type="application/rss+xml"/><item><title>Installer un cluster Kubernetes sur des VMs CentOS 7</title><link>https://blog.zwindler.fr/2017/06/07/installer-cluster-kubernetes-vm-centos/</link><pubDate>Wed, 07 Jun 2017 12:00:53 +0000</pubDate><guid>https://blog.zwindler.fr/2017/06/07/installer-cluster-kubernetes-vm-centos/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/06/kubernetes2.webp" alt="Featured image of post Installer un cluster Kubernetes sur des VMs CentOS 7" /&gt;&lt;h2 id="kubernetes-cest-quoi-ça-"&gt;Kubernetes, c’est quoi ça ?
&lt;/h2&gt;&lt;p&gt;Dans cet article, je vais vous guider pour installer pas à pas un cluster Kubernetes sur des serveurs CentOS/RHEL 7. Attention cet article est un gros morceau !&lt;/p&gt;
&lt;p&gt;Pour ceux qui ne connaissent pas Kubernetes, il faut savoir que c’est un des leaders dans le domaine des orchestrateurs de containers Docker ou Rkt.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/06/kubernetes01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Un bel empilage de couches, pour au final exécuter des applications dans des containers LXC (ou Windows)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pour ce qui est de la genèse de Kubernetes, c’est un outil dont le code provient de Borg d’un outil maison de chez Google. Au bout de 10 ans d’utilisation, quand les containers Linux ont commencés à percer, le code source a été légué en 2015 à la &lt;a class="link" href="https://www.cncf.io/" target="_blank" rel="noopener"
&gt;CNCF (Cloud Native Computing Foundation)&lt;/a&gt;. L’outil est donc maintenant open source.&lt;/p&gt;
&lt;p&gt;Sa couverture fonctionnelle est (pour l’instant) supérieure à celle de &lt;a class="link" href="https://blog.zwindler.fr/2017/01/31/premiers-pas-avec-swarm-fr/" &gt;Docker Swarm&lt;/a&gt;, notamment grâce à :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;une gestion de la multitenancy via les namespaces&lt;/li&gt;
&lt;li&gt;une gestion des secrets (bien que limitée)&lt;/li&gt;
&lt;li&gt;une gestion des replicas pour un même container, avec scale-up/down&lt;/li&gt;
&lt;li&gt;une gestion native du loadbalancing&lt;/li&gt;
&lt;li&gt;une gestion des rolling upgrades&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un article sympa d’Octo &lt;a class="link" href="http://blog.octo.com/docker-en-production-la-bataille-sanglante-des-orchestrateurs-de-conteneurs/" target="_blank" rel="noopener"
&gt;résume pas mal l’écosystème et la guerre qui fait rage dans ce domaine&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Avant de commencer le tutoriel, il faut déjà avoir une bonne connaissance de l’écosystème de la containerisation (sujet sur lequel &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=container" &gt;j’ai écris quelques articles&lt;/a&gt; mais qui est bien plus vaste que ça!).&lt;br&gt;
Il faut savoir que Kubernetes est aussi un outil assez complet mais complexe, avec ses propres concepts et sa terminologie associée. Je vous conseille d’abord de vous familiariser avec ces concepts sur &lt;a class="link" href="https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes" target="_blank" rel="noopener"
&gt;un des tutos de Digital Ocean (ils sont souvent très biens fait)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour ceux qui sont extrêmement pressés, on peut dire brièvement que, dans la terminologie Kubernetes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un &lt;strong&gt;Node&lt;/strong&gt; est un serveur qui exécute les applications&lt;/li&gt;
&lt;li&gt;le &lt;strong&gt;Kubelet&lt;/strong&gt; est un service (au sens démon) présent sur tous les nodes qui leur permet de discuter et de recevoir les ordres&lt;/li&gt;
&lt;li&gt;un &lt;strong&gt;Pod&lt;/strong&gt;, généralement décrit comme « la plus petite unité de traitement de Kubernetes ». Il est composé d’un ou plusieurs containers et on le caractérise généralement comme « &lt;strong&gt;une&lt;/strong&gt; application »&lt;/li&gt;
&lt;li&gt;un &lt;strong&gt;Service&lt;/strong&gt; représente un répartiteur de charge qui est conscient de la présence d’un ensemble de containers (backend) et qui permet de rediriger les flux entrants vers eux&lt;/li&gt;
&lt;li&gt;un &lt;strong&gt;Deployment&lt;/strong&gt; est un ensemble de sous éléments (comme les Pods et les Services, mais aussi d’autres que je ne présentent pas) qui permet de déployer une application avec toutes ses caractéristiques (volumes, secrets) et ses contraintes (nombres de réplicas)&lt;/li&gt;
&lt;li&gt;toutes les interactions avec Kubernetes se font avec une seule commande : &lt;strong&gt;kubeadm&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/06/kubernetes02.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Source : kubernetes.io&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="solutions-de-déploiement"&gt;Solutions de déploiement
&lt;/h2&gt;&lt;p&gt;D’abord, la première chose à dire est qu’il existe de nombreuses manières de déployer Kubernetes qui a donc créé un page dédiée à centraliser &lt;a class="link" href="https://kubernetes.io/docs/setup/" target="_blank" rel="noopener"
&gt;l’ensemble des solutions possibles&lt;/a&gt;. Et elle est longue !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/05/kubernetes2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ceci n’est qu’une fraction des solutions actuellement proposées sur le site. Ça ne rentre pas sur mon écran 29 pouces&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dans mon cas, je suis parti du plus simple pour moi, avec les ressources que j’ai à disposition, c’est à dire 2 machines virtuelles sous CentOS 7.3 :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;controlplane01 : 192.168.100.100&lt;/li&gt;
&lt;li&gt;worker01 : 192.168.100.101&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour autant, les solutions avec Vagrant ou sur des clouds publics sont aussi des solutions valables pour commencer si vous maitrisez ces outils. Je vous laisserai regarder la documentation associée si ça vous intéresse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A noter&lt;/strong&gt;, en fonction de la solutions choisie, il existe aussi des considérations réseaux à avoir, et &lt;a class="link" href="https://kubernetes.io/docs/concepts/cluster-administration/networking/" target="_blank" rel="noopener"
&gt;elles sont documentées ici&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="le-plus-simple--minikube"&gt;Le plus simple : Minikube
&lt;/h2&gt;&lt;p&gt;Je ne vais pas m’attarder sur cette méthode mais celle qui me semble vraiment la plus simple si vous voulez commencer rapidement à jouer avec Kubernetes est d’utiliser &lt;strong&gt;minikube&lt;/strong&gt;. Elle utilise de la virtualisation pour déployer l’environnement Kubernetes de manière automatisée sur votre poste et ça fonctionne très bien.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;minikube start
Starting local Kubernetes cluster...
Running pre-create checks...
Creating machine...
Starting local Kubernetes cluster...
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="la-solution-de-larticle--utiliser-kubeadm"&gt;La solution de l’article : Utiliser Kubeadm
&lt;/h2&gt;&lt;p&gt;On ne va pas se le cacher, installer Kubernetes à la main est complexe. Tellement complexe qu’il existe de nombreuses méthodes clé en main pour automatiser le processus.&lt;/p&gt;
&lt;p&gt;La solution que je vous présente ici est un script qui package l’installation des différents composants de Kubernetes. Ces composants sont en fait containerisés pour faciliter leur déploiement.&lt;/p&gt;
&lt;p&gt;La documentation officielle de cette méthode est disponible à l’adresse &lt;a class="link" href="https://kubernetes.io/docs/getting-started-guides/kubeadm/" target="_blank" rel="noopener"
&gt;suivante&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="configuration-des-dépôts"&gt;Configuration des dépôts
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Sur les deux nœuds&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A noter : Dans le cas où vous ne disposeriez pas d’un serveur DNS en propre, le plus simple est de configurer sur vos deux machines leurs noms complets dans le fichier « hosts ». Cela vous évitera des bugs et effets de bords.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo &amp;#34;192.168.100.100 controlplane01.example.org
192.168.100.101 worker01.example.org&amp;#34; &amp;gt;&amp;gt; /etc/hosts
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Configurer les repositories officiels :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF &amp;gt; /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
#yum install -y yum-utils
#yum-config-manager \
# --add-repo \
# https://download.docker.com/linux/centos/docker-ce.repo
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;J’ai volontairement commenté l’ajout du dépôt de Docker car à date, la dernière version de Kubernetes n’a pas encore complètement validé les dernières versions de Docker (celles depuis le grand renommage, qui sont sur le modèle YY.MM comme la 17.03). C’est pourquoi j’utilise dans ce tutoriel la version packagée par mon OS, la 1.12.6.&lt;/p&gt;
&lt;h3 id="selinux"&gt;SELinux
&lt;/h3&gt;&lt;p&gt;A l’heure actuelle, SELinux est mal supporté par kubelet, le client de Kubernetes présent sur chaque machine. Il est donc malheureusement nécessaire de désactiver cette sécurité pour pouvoir utiliser Kubernetes, pour l’instant.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Disabling SELinux by running setenforce 0 is required in order to allow containers to access the host filesystem, which is required by pod networks for example. You have to do this until SELinux support is improved in the kubelet.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il se peut aussi que le firewall pose des problèmes s’il est activé et mal configuré&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dans le cadre d’un PoC, on pourra éventuellement se permettre de désactiver le firewall et SELinux si on estime que l’environnement est suffisamment sécurisé. C’est bien entendu hors de question pour tout autre environnement non éphémère !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;setenforce 0
vi /etc/selinux/config
[...]
SELINUX=disabled
systemctl disable firewalld
systemctl stop firewalld
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="installation-des-packages"&gt;Installation des packages
&lt;/h3&gt;&lt;p&gt;Comme dit plus haut, j’installe la version Docker de l’OS et non la dernière version. Dans les versions suivantes, Kubernetes aura probablement rattrapé ce retard (si ce n’est pas déjà le cas). On termine par démarrer Docker puis le démon kubelet.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;yum install -y docker kubelet kubeadm kubectl kubernetes-cni
#yum install -y docker-ce kubelet kubeadm kubectl kubernetes-cni
systemctl enable docker &amp;amp;&amp;amp; systemctl start docker
systemctl enable kubelet &amp;amp;&amp;amp; systemctl start kubelet
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="initialisation-du-cluster"&gt;Initialisation du cluster
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Sur le controlplane&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Maintenant que les prérequis sont installés, on peut démarrer Kubernetes. L’ensemble des commandes de Kubernetes utilise le binaire kubeadm et la première à utiliser est kubeadm init.&lt;/p&gt;
&lt;p&gt;Attention cependant, la commande kubeadm init peut nécessiter des arguments complémentaires en fonction du fournisseur de réseau qui sera choisi.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubeadm init
#ou
kubeadm init --pod-network-cidr 10.244.0.0/16 #Si on utilise flannel
#ou
kubeadm init --pod-network-cidr=192.168.0.0/16 #Si on utilise Calico
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si vous avez un proxy chez vous, n’hésitez pas d’exporter la variable http_proxy et à configurer docker pour l’utiliser (voir &lt;a class="link" href="https://stackoverflow.com/questions/23111631/cannot-download-docker-images-behind-a-proxy" target="_blank" rel="noopener"
&gt;ce thread sur stackoverflow&lt;/a&gt;).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;export http_proxy=http://@IP_proxy.zwindler.fr:8080/
export no_proxy=localhost,127.0.0.0,[@IP_control_plane]
mkdir /etc/systemd/system/docker.service.d
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_proxy.zwindler.fr:8080/&amp;#34;
EOF
systemctl daemon-reload
systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On termine l’initialisation côté serveur controlplane avec les commandes suivantes (indiquées dans le retour donné par le kubeadm init) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A noter, en toute fin de retour, kubeadm nous donne la ligne de commande nécessaire pour ajouter des nœuds supplémentaires au cluster via un token. Copiez et conservez cette partie pour plus tard. NE PAS LE FAIRE MAINTENANT !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#You can now join any number of machines by running the following on each node
#as root:
# kubeadm join --token &amp;lt;token&amp;gt; &amp;lt;ip_controlplane&amp;gt;:6443
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, le cluster va s’initialiser et déployer tous les containers nécessaires. Cela peut prendre un certain temps et certains containers peuvent passer par un état Fail, mais au final tout doit être dans l’état « Running », à l’exception des kube-dns*.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system etcd-controlplane01.example.org 1/1 Running 0 13m
kube-system kube-apiserver-controlplane01.example.org 1/1 Running 0 12m
kube-system kube-controller-manager-controlplane01.example.org 1/1 Running 0 13m
kube-system kube-dns-3913472980-gnt72 0/3 Pending 0 13m
kube-system kube-proxy-4m1nd 1/1 Running 0 13m
kube-system kube-scheduler-controlplane01.example.org 1/1 Running 0 13m
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vérifiez la présence du controlplane avec la commande :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get nodes
NAME STATUS AGE VERSION
controlplane01.example.org NotReady 12m v1.6.2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A noter : Le Nœud restera à NotReady tant que les containers « kube-dns- » ne seront pas démarrés. Or, les « kube-dns- » ne démarreront pas tant que la configuration des « Network Pods » n’est pas faite (on va voir ça plus loin), ce qui est donc normal pour l’instant.&lt;/p&gt;
&lt;h3 id="waiting-for-the-control-plane-to-become-ready-qui-ne-rend-jamais-la-main"&gt;« waiting for the control plane to become ready » qui ne rend jamais la main
&lt;/h3&gt;&lt;p&gt;En cas de blocage sur l’étape « &lt;em&gt;[apiclient] Created API client, waiting for the control plane to become ready&lt;/em&gt;« , vérifier les logs dans &lt;strong&gt;/var/log/messages&lt;/strong&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Apr 26 16:27:58 controlplane01 kubelet: error: failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: &amp;#34;cgroupfs&amp;#34; is different from docker cgroup driver: &amp;#34;systemd&amp;#34;
Apr 26 16:27:58 controlplane01 systemd: kubelet.service: main process exited, code=exited, status=1/FAILURE
Apr 26 16:27:58 controlplane01 systemd: Unit kubelet.service entered failed state.
Apr 26 16:27:58 controlplane01 systemd: kubelet.service failed.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ceci est du à un &lt;a class="link" href="https://github.com/kubernetes/kubernetes/issues/43805" target="_blank" rel="noopener"
&gt;bug de kubeadm sur CentOS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il n’y a pas vraiment de solution à partir de là. On ne peut pas utiliser « kubeadm reset » pour désinstaller proprement car cela supprime le fichier &lt;strong&gt;10-kubeadm.conf&lt;/strong&gt;, celui qui doit être corrigé/modifié.&lt;br&gt;
La seule possibilité d’est d’interrompre le processus « kubeadm init », de modifier le 10-kubeadm.conf puis de recommencer.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[CTRL-C]
sed -i &amp;#39;s#Environment=&amp;#34;KUBELET_KUBECONFIG_ARGS=-.*#Environment=&amp;#34;KUBELET_KUBECONFIG_ARGS=--kubeconfig=/etc/kubernetes/kubelet.conf --require-kubeconfig=true --cgroup-driver=systemd&amp;#34;#g&amp;#39; /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
systemctl daemon-reload
systemctl restart kubelet
#Puis relancer
kubeadm init #--pod-network-cidr 10.244.0.0/16
[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
[init] Using Kubernetes version: v1.6.2
[init] Using Authorization mode: RBAC
[preflight] Running pre-flight checks
[preflight] WARNING: docker version is greater than the most recently validated version. Docker version: 17.03.1-ce. Max validated version: 1.12
[preflight] Some fatal errors occurred:
/etc/kubernetes/manifests is not empty
[preflight] If you know what you are doing, you can skip pre-flight checks with `--skip-preflight-checks`
kubeadm init --skip-preflight-checks
#Là, ça devrait fonctionner
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="taint-node"&gt;Taint node
&lt;/h3&gt;&lt;p&gt;Par défaut, Kubernetes n’utilise pas le controlplane pour faire tourner des pods. Si vous voulez changer ce comportement, on peut le faire avec la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl taint nodes --all node-role.kubernetes.io/controlplane-
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configuration-des-network-pods"&gt;Configuration des Network Pods
&lt;/h2&gt;&lt;p&gt;La première chose à configurer sur le cluster est le « Network Pod ». On a le choix entre un certain nombre de modules, dont la liste est disponible sur &lt;a class="link" href="https://kubernetes.io/docs/concepts/cluster-administration/addons/" target="_blank" rel="noopener"
&gt;cette documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="flannel"&gt;Flannel
&lt;/h3&gt;&lt;p&gt;La configuration la plus couramment utilisée semble être flannel (de CoreOS), donc le fichier de configuration yaml est disponible sur Github&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sur le controlplane&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
serviceaccount &amp;#34;flannel&amp;#34; created
configmap &amp;#34;kube-flannel-cfg&amp;#34; created
daemonset &amp;#34;kube-flannel-ds&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="calico"&gt;Calico
&lt;/h3&gt;&lt;p&gt;On peut aussi essayer &lt;a class="link" href="http://docs.projectcalico.org/v2.1/getting-started/kubernetes/installation/hosted/kubeadm/" target="_blank" rel="noopener"
&gt;Calico&lt;/a&gt;. Personnellement j’ai eu des disfonctionnement avec la version Flannel et donc j’utilise Calico.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sur le controlplane&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl apply -f http://docs.projectcalico.org/v2.4/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml
configmap &amp;#34;calico-config&amp;#34; created
daemonset &amp;#34;calico-etcd&amp;#34; created
service &amp;#34;calico-etcd&amp;#34; created
daemonset &amp;#34;calico-node&amp;#34; created
deployment &amp;#34;calico-policy-controller&amp;#34; created
clusterrolebinding &amp;#34;calico-cni-plugin&amp;#34; created
clusterrole &amp;#34;calico-cni-plugin&amp;#34; created
serviceaccount &amp;#34;calico-cni-plugin&amp;#34; created
clusterrolebinding &amp;#34;calico-policy-controller&amp;#34; created
clusterrole &amp;#34;calico-policy-controller&amp;#34; created
serviceaccount &amp;#34;calico-policy-controller&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Les pods pour le réseaux se créent. Vérifiez que tout a bien fonctionné avant d’ajouter des nœuds dans le cluster :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get pods --all-namespaces
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="ajout-de-nœuds-supplémentaires"&gt;Ajout de nœuds supplémentaires
&lt;/h2&gt;&lt;p&gt;A partir de cette étape, le cluster Kubernetes fonctionne réellement, tous les composants sont opérationnels, à ceci près que c’est un cluster avec seulement une machine. On peut donc maintenant intégrer les machines supplémentaires.&lt;/p&gt;
&lt;p&gt;Récupérez la commande avec le token que vous avez conservé précédemment (lors du kubeadm init) et exécutez la sur le nœud « worker ».&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sur le worker&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubeadm join --token &amp;lt;token&amp;gt; 192.168.100.100:6443
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si on obtient l’erreur suivante, il faut ajouter 2 lignes dans le fichier « sysctl.conf » et appliquer la modification.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[preflight] Some fatal errors occurred:
/proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[preflight] If you know what you are doing, you can skip pre-flight checks with `--skip-preflight-checks`
echo &amp;#34;net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1&amp;#34; &amp;gt;&amp;gt; /etc/sysctl.conf
sysctl -p
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Sur le controlplane&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vérifier la présence du controlplane et de son worker avec la commande kubectl :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get nodes
NAME STATUS AGE VERSION
worker01.example.org NotReady 1m v1.6.2
controlplane01.example.org Ready 33m v1.6.2
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="déployer-la-console-web"&gt;Déployer la console web
&lt;/h2&gt;&lt;p&gt;Bravo, votre cluster Kubernetes fonctionne !&lt;/p&gt;
&lt;p&gt;Un bon moyen de débuter est d’installer la WebUI de Kubernetes. Comme tout le reste sur Kubernetes, elle se déploie simplement avec un fichier YAML. La documentation officielle est &lt;a class="link" href="https://kubernetes.io/docs/tasks/web-ui-dashboard/" target="_blank" rel="noopener"
&gt;disponible à cette adresse&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;&lt;span class="c1"&gt;# Add kubernetes-dashboard repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Deploy a Helm Release named &amp;#34;kubernetes-dashboard&amp;#34; using the kubernetes-dashboard chart&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La console est déployée. Elle est accessible de 2 manières.&lt;/p&gt;
&lt;h3 id="kubectl-proxy"&gt;kubectl proxy
&lt;/h3&gt;&lt;p&gt;Cette sous commande kubectl permet de faire un tunnel entre le poste depuis lequel la commande est lancée et le serveur exécutant les pods. Cette commande est pratique pour tester les connexions à des pods sans avoir à travailler sur le serveur (depuis son poste par exemple).&lt;/p&gt;
&lt;p&gt;Le Dashboard deviendra accessible via l’URL :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;http://localhost:8001/ui&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cependant, dans ce cas là, l’interface ne sera disponible que depuis votre poste, ce qui peut ne pas vous convenir.&lt;/p&gt;
&lt;h3 id="via-le-serveur-controlplane"&gt;Via le serveur controlplane
&lt;/h3&gt;&lt;p&gt;On peut également accéder à la console directement depuis l’URL /ui, qui pointe sur le serveur « controlplane » (controlplane01 dans notre cas).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;https://@ip_controlplane]/ui&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La console demandera un login/mdp que l’on peut retrouver avec kubectl&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl config view
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="le-mot-de-la-fin"&gt;Le mot de la fin
&lt;/h2&gt;&lt;p&gt;Ça y est, vous savez tout.&lt;/p&gt;
&lt;p&gt;Vous êtes maintenant en mesure de déployer vos premières applications avec Kubernetes, et vous amuser à Scale-up &amp;amp; scale-down, faire des rolling upgrades, tester la haute disponibilité et la répartition de charge !&lt;/p&gt;
&lt;p&gt;Have fun :)&lt;/p&gt;</description></item></channel></rss>