# Kubernetes # Installation d'un cluster Kubernetes (CentOS 7) # Etape 1 - Préparer les hôtes du cluster *La procédure suivante couvre la préparation des hôtes Kubernetes sur **CentOS 7.6 (1810)** uniquement* Avant l'installation et le déploiement d'un cluster Kubernetes, quelques étapes sont nécessaires afin d'assurer le fonctionnement idéal du cluster. **L'ensemble de cette procédure est à effectuer sur tous les hôtes du cluster !** ##### Étapes préliminaires - Activer le module noyau "br\_netfilter" sur tous les hôtes du cluster, ce qui est requis par Kubernetes ```shell modprobe br_netfilter ``` - La commande modprobe permet le chargement d'un module noyau durant l'exécution, mais cela n'est pas persistant après un redémarrage des serveurs. Créer le fichier `/etc/sysctl.d/k8s.conf` et ajouter les lignes suivantes : ``` net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 ``` - Appliquer les règles sysctl directement ```shell sysctl --system ``` - Changer l'état de SELinux d'enforced à permissive pour éviter les problèmes à l'exécution de Kubernetes. La bonne pratique voudrait une configuration fine de SELinux ;) ```shell setenforce Permissive ``` - Éditer le fichier `/etc/selinux/config` ``` SELINUX=permissive SELINUXTYPE=targeted ``` ##### Installation de Docker-CE 18.09 - Installer tout d'abord les dépendances pour Docker-CE ```shell yum install -y yum-utils device-mapper-persistent-data lvm2 ``` - Ajouter le repository YUM ```shell yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ``` - Installer Docker-CE à la version requise (18.09) ```shell yum install -y docker-ce-18.09.8-3.el7.x86_64 docker-ce-cli-18.09.8-3.el7.x86_64 containerd.io ``` - Démarrer le service Docker et activer le démarrage du service au boot ```shell systemctl enable --now docker ``` ##### Configuration du Docker Daemon Kubernetes nécessite une configuration particulière de Docker au niveau de cgroups. Cette configuration n'est pas impérative mais est fortement conseillée. Elle consiste à switcher le driver cgroup ***cgroupfs***, par défaut utilisé par Docker, par le driver cgroup ***systemd***. **Explications** : [https://kubernetes.io/docs/setup/production-environment/container-runtimes/#cgroup-drivers](https://kubernetes.io/docs/setup/production-environment/container-runtimes/#cgroup-drivers) - Créer un fichier `/etc/docker/daemon.json` et ajouter le contenu suivant : ```json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] } ``` - Il convient finalement de redémarrer le daemon Docker pour prendre en compte les changements ```shell systemctl restart docker ``` - Vérifier que le driver cgroup **systemd** est bien chargé ```shell docker info | grep Cgroup Cgroup Driver: systemd ``` ##### Configuration du pare-feu Kubernetes requiert l'ouverture d'un certain nombre de ports sur les pare-feu de vos machines. - Sur le Kubernetes Master
**Port(s)****Description**
6443API Kubernetes
2379-2380API Serveur etcd
10250API Kubelet
10251Kube-Scheduler
10252Kube-Controller Manager
10255Read-Only Kubelet API
179Port BGP (pour Calico)
```shell firewall-cmd --permanent --add-port={6443,2379-2380,10250,10251,10252,10255,179}/tcp ``` - Sur les minions (workers)
**Port(s)****Description**
10250API Kubelet
10255Read-Only Kubelet API
30000-32767Ports Services NodePorts
179Port BGP (pour Calico)
```shell firewall-cmd --permanent --add-port={10250,10255,30000-32767,179}/tcp ``` ##### Configuration NetworkManager pour Calico **Cette section n'est valable que si vous utilisez NetworkManager et Calico comme CNI sur votre cluster.** NetworkManager manipule la table de routage pour les interfaces dans namespace réseau par défaut, où les veth Calico sont ancrées pour les connexions aux conteneurs. Ceci peut interférer sur la capacité de routage de l'agent Calico. - Créez le fichier de configuration suivant dans `/etc/NetworkManager/conf.d/calico.conf` pour empêcher NetworkManager d'interférer avec les interfaces : ```shell [keyfile] unmanaged-devices=interface-name:cali*;interface-name:tunl* ``` - Redémarrez NetworkManager ```shell systemctl restart NetworkManager ``` ##### That's it ! On se retrouve à [l'étape 2](https://doc.ataxya.net/books/kubernetes/page/etape-2---d%C3%A9ployer-le-cluster-kubernetes)! # Etape 2 - Déployer le cluster Kubernetes Une fois l'ensemble de vos hôtes Kubernetes préparés avec Docker installé, l'ensemble des tweaks configurés et vos règles firewall, il est désormais possible de déployer votre cluster. ##### Déploiement du Kubernetes master ##### Déploiement des minions (workers)