<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Google on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/google/</link><description>Recent content in Google 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/google/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><item><title>L’enfer des blogs conseils en référencement : sortir de la jungle du clickbait et de l’enfoncement des portes ouvertes</title><link>https://blog.zwindler.fr/2015/07/20/lenfer-des-blogs-conseils-en-referencement-sortir-de-la-jungle-du-clickbait-et-de-lenfoncement-des-portes-ouvertes/</link><pubDate>Mon, 20 Jul 2015 10:30:53 +0000</pubDate><guid>https://blog.zwindler.fr/2015/07/20/lenfer-des-blogs-conseils-en-referencement-sortir-de-la-jungle-du-clickbait-et-de-lenfoncement-des-portes-ouvertes/</guid><description>&lt;img src="https://blog.zwindler.fr/2010/04/nyanonymous2.webp" alt="Featured image of post L’enfer des blogs conseils en référencement : sortir de la jungle du clickbait et de l’enfoncement des portes ouvertes" /&gt;&lt;p&gt;Il y a 6 mois, j’ai pris la décision d’être un peu plus sérieux avec ce blog et avec, de bonnes résolutions : un rythme de publication plus soutenu et surtout plus régulier, un contenu un peu plus large (comprenez « moins de sujets niche ») et un vrai hébergement.&lt;/p&gt;
&lt;h2 id="migration-depuis-wordpresscom-vers-un-hébergement-tiers"&gt;Migration depuis wordpress.com vers un hébergement tiers
&lt;/h2&gt;&lt;p&gt;Ça impliquait forcément de perdre une partie de l’audience car &lt;a class="link" href="https://blog.zwindler.fr/2010/10/18/pages-perso-free-vs-wordpress/" &gt;-je le savais bien depuis le début-&lt;/a&gt; wordpress.com est relativement bridé dans sa partie gratuite, et n’autorise pas les mécanismes de redirection pour migrer votre audience vers un blog externe.&lt;/p&gt;
&lt;p&gt;Sauf si vous payez 13USD/an bien sûr ! Notez que même si je suis un peu ironique, ce n’est pas forcément un mauvais choix si vous avez déjà une petite communauté à faire suivre. Le tarif est salé mais pas prohibitif.&lt;/p&gt;
&lt;p&gt;Une fois que c’est réglé et que votre hébergement (&lt;a class="link" href="https://blog.zwindler.fr/2015/04/11/tutoriel-migrer-facilement-son-blog-de-wordpress-com-vers-un-hebergement-mutualise-ovh/" &gt;voir ici si ce n’est pas encore fait&lt;/a&gt;), encore faut il trouver des lecteurs. Mais comment faire ?&lt;/p&gt;
&lt;p&gt;Simple, demandons à l’Internet son avis sur la question !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note :&lt;/strong&gt; pour ceux qui ne veulent pas saigner des yeux, vous pouvez tout de suite aller lire la fin de l’article pour les liens vers deux sites sérieux (ou cliquer [ici][3])&lt;/p&gt;
&lt;h2 id="faire-de-largent-en-faisant-miroiter-aux-autres-quils-peuvent-en-faire-aussi"&gt;Faire de l’argent en faisant miroiter aux autres qu’ils peuvent en faire aussi
&lt;/h2&gt;&lt;p&gt;Mettez les termes « référencement », « blog », « gratuit », « wordpress » dans un ordre aléatoire dans votre moteur de recherche préféré et vous tomberez d’abord sur une multitude de sites payants pour vous aider à vous faire connaitre. Ils sont suivis par des articles de blogs avec plus ou moins les mêmes conseils pour &lt;em&gt;réussir&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Vous y apprendrez qu’il faut &lt;em&gt;-selon eux-&lt;/em&gt; impérativement poster plusieurs fois par semaine. Il faudrait écrire des articles sur le blog d’un autre blogueur plus connu, sur des forums à forte affluence&amp;hellip; Il faudrait écrire des tutoriels simples pour toucher le public le plus large, illustrés avec des images et des vidéos Youtube. Tout ceci est vrai, un peu &lt;em&gt;obvious&lt;/em&gt; parfois et probablement efficace. Vous finirez par « attirer des visites », même si dans la pratique je ne vois pas comment trouver de la matière intéressante plusieurs fois par semaine sans dégrader la qualité. Je ne vois pas trop l’intérêt d’un vidéo tutoriel pour apprendre à utiliser la commande « reboot ».&lt;/p&gt;
&lt;p&gt;On y apprend également qu’il existe des outils pour optimiser le rendement des moteurs de recherche, notamment via des plugins comme « WordPress SEO by Yoast », « Google XML Sitemaps ». Il faut également utiliser les outils des webmasters fournis par les grands moteurs de recherche, &amp;hellip; Là on commence à toucher du doigt le vrai principe du référencement, mais sans aller jusqu’au bout de la démarche au delà de leur simple paramétrage. Dommage.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/07/masterblog01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AHAHAHAHA ! Tu as vraiment cru que j’allais cliquer ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="clickbaiiiiiiiit--click-click-click-je-veux-des-clics"&gt;Clickbaiiiiiiiit : &lt;strong&gt;Click click click&lt;/strong&gt; je veux des clics!
&lt;/h2&gt;&lt;p&gt;C’est le genre de site pour vous aider à référencer gratuitement votre site le plus courant. Et celui là est juste fantastique.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/07/marketing01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;J’en connais un qui s’est dit après coup que 10 étapes c’était mieux en terme de marketing&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le premier conseil donne le ton :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Remplissez soigneusement le titre de votre blog en y insérant vos mots clés, mais au travers d’une phrase qui &lt;strong&gt;donnera envie de cliquer aux internautes&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Et après ça, on a droit à la totale. Une grosse image moche en plein milieu pour « illustrer », des ebook gratuits avec des liens partout. Pratiquement pas de mise en page ou alors elle n’est pas respectée dans tout l’article. Et une vidéo Youtube pour finir. Ça ne s’invente pas ;-).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/07/marketing02.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Pardon, je vais vomir, et je reviens&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/07/marketing03.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hum ! Cet ebook TOP SECRET m’a l’air particulièrement passionnant !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/07/marketing04.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;APPRENEZ A BLOGUER COMME UN PRO EN 2008 §§§§ (désolé la touche verr. maj. était bloquée)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Alors oui, il est très probable que ce blog soit un succès en terme de visites. On tombe &lt;strong&gt;facilement&lt;/strong&gt; sur ce blog (ou d’autres), malgré son contenu mal présenté et ses ebooks envahissants. Et si ce que vous cherchez est du clic (je ne parle pas d’audience) à tout prix, ces conseils sont probablement bons.&lt;/p&gt;
&lt;p&gt;On arrive quand même à trouver &lt;em&gt;quelques&lt;/em&gt; conseils valables en tout début d’article (déjà vus dans le paragraphe précédent), notamment l’utilisation des outils SEO et moteurs de recherche.&lt;/p&gt;
&lt;h2 id="fin"&gt;Des sites un peu plus sérieux
&lt;/h2&gt;&lt;p&gt;Heureusement, à force de recherches, vous finirez par tomber sur des sites un peu plus sérieux qui vous expliqueront de manière &lt;strong&gt;claire&lt;/strong&gt; les bonnes pratiques lorsqu’on se lance dans la rédaction de contenu. C’est particulièrement intéressant car ces sites introduisent d’abord les principes du référencement pour vous aider à &lt;strong&gt;comprendre comment fonctionnent&lt;/strong&gt; les moteurs de recherche, ce qui selon moi est la meilleur façon d’introduire un sujet.&lt;/p&gt;
&lt;p&gt;Je citerai les sites suivants mais il y en a surement beaucoup d’autres :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://web.archive.org/web/20220522172541/https://www.commentcamarche.net/faq/38743-optimiser-le-referencement-de-son-blog-wordpress" target="_blank" rel="noopener"
&gt;www.commentcamarche.net/faq/38743-optimiser-le-referencement-de-son-blog-wordpress (lien mort, j&amp;rsquo;utilise Internet Archive)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://web.archive.org/web/20140814134237/http://www.progresser-en-informatique.com/cours-wordpress/optimiser-le-referencement-dun-site-wordpress/" target="_blank" rel="noopener"
&gt;www.progresser-en-informatique.com/cours-wordpress/optimiser-le-referencement-dun-site-wordpress (lien mort, j&amp;rsquo;utilise Internet Archive)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un petit dernier pour la route car j’ai échangé un peu avec Mehdi de blogbooster. Si je ne suis pas forcément en phase avec le style d’écriture, Mehdi donne quelques astuces qui sont rarement mise en avant par d’autres site. Ça peut valoir le coup d’aller y jeter un œil :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blogbooster.fr/comment-referencer-son-blog/" target="_blank" rel="noopener"
&gt;blogbooster.fr/comment-referencer-son-blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Courage, c’est plus long mais c’est la bonne marche à suivre pour réussir :-).&lt;br&gt;
Bon référencement !&lt;/p&gt;</description></item></channel></rss>