Kubernetes 
Cette doc détaille le déploiement d'un cluster de master
Pré-requis à l'installation
Installer docker (voir CD/DockerSwarm)
Disposer d'au moins 3 machines (physiques ou virtuelles) :
- 3 machines seront appelées manager:
manager1,manager2,manager3
Chaque machine devra avoir au minimum 4Go de RAM.
Disposer des adresses IP de chacune des machines.
Installation de Kubernetes
Sur chacune des machines où installer Kubernetes
1 - Ajouter une liste de dépôts au fichier kubernetes.repo :
sudo echo -e "[kubernetes]\nname=Kubernetes\nbaseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg\n https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg">/etc/yum.repos.d/kubernetes.repo
2 - Installer les paquets nécessaires à Kubernetes :
sudo yum install -y yum-versionlock keepalived haproxy ipvsadm kubelet kubectl kubeadm sudo yum install -y https://packagecloud.io/linuxhq/hatop/packages/el/7/hatop-0.7.7-1.el7.centos.noarch.rpm/download.rpm
3 - Verrouiller la version de Kubernetes et de ses dépendances :
sudo yum versionlock kubectl kubeadm kubelet
4 - Modifier le fichier sysctl.conf :
sudo echo -e 'net.bridge.bridge-nf-call-iptables = 1\nvm.nr_hugepages = 0'>>/etc/sysctl.conf
5 - Appliquer la nouvelle configuration de sysctl :
sudo sysctl --system
6 - Désactiver la mémoire swap :
sudo swapoff -a;sed -i '/swap/d' /etc/fstab
7 - Désactiver le pare-feu :
sudo systemctl disable firewalld sudo systemctl stop firewalld
8 - Activer et démarrer Docker et Kubelet :
sudo systemctl enable docker kubelet
sudo systemctl start docker kubelet
9 - Récupérer les images de configuration :
sudo kubeadm config images pull
10 - Nettoyer le système d'une éventuelle précédente configuration de Kubernetes :
sudo kubeadm reset -f
11 - Désactiver SELinux :
sudo setenforce 0
sudo vim /etc/selinux/config
changer la valeur de SELINUX de enforcing à disabled pour desactiver SELinux de facon permanente
12 - Éditer le fichier /etc/hosts sur chaque noeud du cluster et ajouter dans ce fichier les ip des deux autres noeuds.
13 - Se connecter en SSH à chacun des comptes root de toutes les autres machines :
ssh <root@machineIP> ssh-copy-id <root@machineIP>
Installation de Keep Alived
Sur le manager1
1 - Éditer le fichier de configuration de Keep Alived :
cat >/etc/keepalived/keepalived.conf <<ENDF global_defs { notification_email { root@kube.prj.ajc.com } notification_email_from kube01@kube.prj.ajc.com smtp_server localhost smtp_connect_timeout 30 enable_script_security } vrrp_script check_haproxy { script "/usr/bin/killall -0 haproxy" interval 1 } vrrp_instance VRRP1 { state MASTER interface eth0 virtual_router_id 41 priority 130 advert_int 1 authentication { auth_type PASS auth_pass 01b6d874f190 } virtual_ipaddress { <ipmanager1>/24 } track_script { check_haproxy } } ENDF
2 - Autoriser et activer Keep Alived :
sudo systemctl enable keepalived
sudo systemctl start keepalived
Sur le manager2
1 - Éditer le fichier de configuration de Keep Alived :
cat >/etc/keepalived/keepalived.conf <<ENDF global_defs { notification_email { root@kube.prj.ajc.com } notification_email_from kube01@kube.prj.ajc.com smtp_server localhost smtp_connect_timeout 30 enable_script_security } vrrp_script check_haproxy { script "/usr/bin/killall -0 haproxy" interval 1 } vrrp_instance VRRP1 { state SLAVE interface eth0 virtual_router_id 41 priority 130 advert_int 1 authentication { auth_type PASS auth_pass 01b6d874f190 } virtual_ipaddress { <ipmanager2>/24 } track_script { check_haproxy } } ENDF
2 - Autoriser et activer Keep Alived :
sudo systemctl enable keepalived
sudo systemctl start keepalived
Sur le manager3
1 - Éditer le fichier de configuration de Keep Alived :
cat >/etc/keepalived/keepalived.conf <<ENDF global_defs { notification_email { root@kube.prj.ajc.com } notification_email_from kube01@kube.prj.ajc.com smtp_server localhost smtp_connect_timeout 30 enable_script_security } vrrp_script check_haproxy { script "/usr/bin/killall -0 haproxy" interval 1 } vrrp_instance VRRP1 { state SLAVE interface eth0 virtual_router_id 41 priority 130 advert_int 1 authentication { auth_type PASS auth_pass 01b6d874f190 } virtual_ipaddress { <ipmanager3>/24 } track_script { check_haproxy } } ENDF
2 - Autoriser et activer Keep Alived :
systemctl enable keepalived
systemctl start keepalived
Installation de HAProxy
Sur chacun des 3 managers
1 - Sauvegarder le fichier original de configuration de HA Proxy :
mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.orig
2 - Copier les 60 premières lignes de ce fichier de configuration dans le nouveau :
head -60 /etc/haproxy/haproxy.cfg.orig>/etc/haproxy/haproxy.cfg
3 - Éditer le nouveau fichier de configuration de HA Proxy (on changera manager 1, 2, 3 par les noms respectifs donnés aux vm si leurs noms sont différents de manager1, 2, 3:
cat >>/etc/haproxy/haproxy.cfg <<ENDF frontend api-front bind 0.0.0.0:5443 mode tcp option tcplog use_backend api-backend backend api-backend mode tcp option tcplog option tcp-check balance roundrobin server manager1 <ipmanager1>:6443 check server manager2 <ipmanager2>:6443 check server manager3 <ipmanager3>:6443 check ENDF
4 - Autoriser et démarrer HA Proxy :
sudo systemctl start haproxy
sudo systemctl enable haproxy
5 - Contrôler la présence de tous les noeuds :
hatop -s /var/lib/haproxy/stats
Configuration sur le 1er manager
1 - Éditer le fichier de configuration initiale :
cat >>/tmp/config.init.yml <<ENDF apiVersion: kubeadm.k8s.io/v1beta1 kind: ClusterConfiguration kubernetesVersion: stable apiServer: certSANs: - "<ipmanager1>" controlPlaneEndpoint: "<ipmanager1>:5443" networking: podSubnet: "10.244.0.0/16" ENDF
2 - Initialiser Kubernetes :
kubeadm init --config=/tmp/config.init.yml --ignore-preflight-errors=NumCPU 2>&1|tee $HOME/kubeadm.init.log
(Conservez le retour de cette commande, cela nous servira pour une prochaine étape)
3 - Créer un répertoire de configuration de Kubernetes :
mkdir -p $HOME/.kube # Confirmer l'écrasement du fichier cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
4 - Installer Flannel :
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
5 - Attendre la fin de l'installation :
watch kubectl get pods --all-namespaces -o wide
6 - Possible bug, le pod coredns reste en pending state éternellement, pour résoudre cela, il suffit d'éditer le fichier /etc/cni/net.d/10-flannel.conflist et de rajouter en première ligne (juste après la première accolade)
"cniVersion": "0.2.0",
Exemple d'un /etc/cni/net.d/10-flannel.conflist valide:
{ "cniVersion": "0.2.0", "name": "cbr0", "plugins": [ { "type": "flannel", "delegate": { "hairpinMode": true, "isDefaultGateway": true } }, { "type": "portmap", "capabilities": { "portMappings": true } } ] }
On attend quelques secondes et le pod coredns sort finalement de son pending state
7 - S'assurer de la bonne présence de Flannel :
kubectl get nodes
8 - Envoyer les fichiers suivants dans chacun des deux autres noeuds :
scp /etc/kubernetes/pki/apiserver-kubelet-client.crt root@NodeNameOuIp:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/apiserver-kubelet-client.key root@NodeNameOuIp:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/ca.crt root@NodeNameOuIp:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/ca.key root@NodeNameOuIp:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/front-proxy-ca.crt root@NodeNameOuIp:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/front-proxy-ca.key root@NodeNameOuIp:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/front-proxy-client.crt root@NodeNameOuIp:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/front-proxy-client.key root@NodeNameOuIp:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/sa.key root@NodeNameOuIp:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/sa.pub root@NodeNameOuIp:/etc/kubernetes/pki/ scp /etc/kubernetes/pki/etcd/ca.crt root@NodeNameOuIp:/etc/kubernetes/pki/etcd/ scp /etc/kubernetes/pki/etcd/ca.key root@NodeNameOuIp:/etc/kubernetes/pki/etcd/
9 - la commande kubeadm ini en 2) crée une commande qui permet aux autres noeuds de rejoindre le cluster. Cette commande ainsi créée est de la forme:
kubeadm join 192.168.1.100:5443 --token xxxxxx.xxxxxxx \ --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \ --control-plane
Il faut alors rajouter ces options pour éviter une erreur à propos d'un nombre nécessaire de cpu superieur à 1 :
--ignore-preflight-errors=NumCPU 2>&1|tee $HOME/kubeadm.init.log
La commande finale permettant de rejoindre le cluster une fois créé sur le manager primaire est de la forme:
kubeadm join 192.168.1.100:5443 --token xxxxxx.xxxxxxx \ --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \ --control-plane --ignore-preflight-errors=NumCPU 2>&1|tee $HOME/kubeadm.init.log
10 - Sur les autres noeuds manager on recopie donc cette commande afin de rejoindre le cluster créé. NB:Si le bug avec CoreDNS est aussi présent, le node qui a fraîchement rejoint le cluster ne sera pas READY state tant qu'on n'aura pas changé le fichier /etc/cni/net.d/10-flannel.conflist de la meme manière que sur le premier manager.
11 - Pour eviter des problèmes de taint, on copie-colle ces commandes sur un ou les deux derniers noeuds manager:
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config kubectl taint nodes --all node-role.kubernetes.io/master-
12 - Vous obtenez un cluster de 3 masters fully ready à l'emploi