Contenu

création d'un cluster Kubernetes sur CentOS 7

Cloud Native Computing Foundation oeuvre pour l’incubation et l’éclosion de nouvelle génération de solution cloud tel que : Kubernetes , Prometheus , Calico et beaucoup de projets

Terminology

  • Container : Les applications conteneurisées sont plus faciles à déplacer d’un environnement à un autre (développement, test, production, etc.). Dans une approche Microservices votre application est subdivisée en plusieurs containers et chaque container représente une partie de votre application qu’on peut dorénavant considérer comme une sous-application
  • Pod : représente un ou plusieurs conteneurs qui sont étroitement liés et qui partagent des ressources (liés à la même sous-application)
  • Container engine : gère le container et lui donne accès aux ressources souhaités ( Docker , CRI-O , containerd , podman , frakti … )
  • Orchestration : dans une entreprise , nous sommes face à un ocean d’application. nous avons besoin d’orchestrateur afin d’automatiser le déploiement, le management, le networking, le scaling et la disponibilité des applications conteneurisées. on peut citer Nomad , Apache MESOS , Docker SWARM et bien sur Kubernetes

/images/blog/creation-kubernetes-centos-7/cluster-kubernetes.png
cluster-kubernetes

Préparation de l’environnement

Nous allons utiliser dans cet articles 04 VMs :

  • 1x kubemaster : gestion du cluster Kubernetes
  • 3x kubeworkers : exécution des PODs (containers)
VM hostname adresse IP vCPU vRAM
kubemaster master.formini.local 172.15.20.10 2 2048 MB
kubeworker01 worker01.formini.local 172.15.20.101 1 1024 MB
kubeworker02 worker02.formini.local 172.15.20.102 1 1024 MB
kubeworker03 worker03.formini.local 172.15.20.103 1 1024 MB

installation des prérequis

Info
Nous allons installer ces prérequis ci-dessus sur les 04 VMs

installation de Docker

Nous mettons à votre disposition un script shell sur github (install-docker.sh)

1
wget https://raw.githubusercontent.com/bkalem/kubernetes-init-join-vagrant/master/install-docker.sh

Ouvrez le compartiment ci-dessous décrivant step by step l’installation de Docker

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/bin/bash
echo "###############################"
echo "[Task 1] Installation des prerequis Docker"
echo "###############################"
sudo yum install yum-utils device-mapper-persistent-data lvm2 -y 

echo "###############################"
echo "[Task 2] Configuration du repository Docker"
echo "###############################"
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 

echo "###############################"
echo "[Task 3] installation Docker runtime"
echo "###############################"
sudo yum install docker-ce -y

echo "###############################"
echo "[Task 4] personalisation cgroupdriver=systemd"
echo "###############################"
sudo mkdir /etc/docker

# Set up the Docker daemon
sudo cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

echo "###############################"
echo "[Task 5] Start & Enable Docker"
echo "###############################"
sudo systemctl start docker
sudo systemctl enable docker

echo "###############################"
echo "[Task 6] add vagrant user to docker group"
echo "###############################"
usermod -aG docker vagrant

installation de Kubernetes

Nous mettons à votre disposition un script shell sur github (install-kubernetes.sh)

1
wget https://raw.githubusercontent.com/bkalem/kubernetes-init-join-vagrant/master/install-kubernetes.sh

Ouvrez le compartiment ci-dessous décrivant step by step l’installation de Kubernetes

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/bin/bash
echo "###############################"
echo "[Task 1] sysctl bridge"
echo "###############################"
sudo cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system

echo "###############################"
echo "[Task 2] desactivation et off swap"
echo "###############################"
sudo sed -i '/swap/d' /etc/fstab
sudo swapoff -a

echo "###############################"
echo "[Task 3] desactivation et off firewalld"
echo "###############################"
sudo systemctl disable firewalld
sudo systemctl stop firewalld

echo "###############################"
echo "[Task 4] desactivation et off SELinux"
echo "###############################"
sudo sed -i --follow-symlinks 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
sudo setenforce 0

echo "###############################"
echo "[Task 5] repository Kubernetes"
echo "###############################"
sudo cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/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

echo "###############################"
echo "[Task 6] installation Kubernetes"
echo "###############################"
sudo yum install kubeadm kubelet kubectl -y

echo "###############################"
echo "[Task 7] activation et on kubelet"
echo "###############################"
sudo systemctl enable kubelet
sudo systemctl start kubelet

Création du cluster Kubernetes

Maitenant que nous nous sommes assurer d’avoir installer sur les 04 VMs :

  • docker-ce
  • kubeadm
  • kubelet
  • kubectl

Nous allons entammer la création du cluster Kubernetes en (02) deux phases

initiation du cluster Kubernetes

attention
à faire seulement sur la VM kubemaster

nous allons initié notre cluster avec la commande :

1
kubeadm init --apiserver-advertise-address=172.15.20.10 --pod-network-cidr=172.20.0.0/16

les composants de kubernetes seront alors télécharger entant qu’image lors du preflight et déployer sur le master entant que POD (containers) :

  • API Server
  • etcd
  • scheduller
  • controller-manager
  • kube-proxy
  • coredns

/images/blog/creation-kubernetes-centos-7/kuemaster-image.png
les images télécharger du kubemaster

copie du fichier admin.conf (API)

afin d’interoger l’API de votre cluster Kubernetes depuis cette VM , vous devez copier, dans le répertoire de travail de l’utilisateur courant ( root dans cet example ) , le fichier /etc/kubernetes/admin.conf

1
2
3
sudo mkdir -p /root/.kube
sudo cp -i /etc/kubernetes/admin.conf /root/.kube/config
sudo chown root:root /root/.kube/config

calico : le réseau des PODs

attention
à faire seulement sur la VM kubemaster
Container Network Interface
il est obligatoire d’installer une solution réseau CNI afin de permettre aux PODs (containers) de communiquer entre eux. ClusterDNS (coredns) ne démarre pas tant que le réseau n’est pas installer
calico est une solution inventer par l’entreprise tigera et sélectionner par la cncf comme l’une des solutions réseau à utiliser avec kubernetes. Avant de commencer à déployer nos PODs (containers) , il faut s’assurer avoir une solution réseau prête sur notre kubemaster.
Nous allons installer la solution réseau calico avec la commande suivante :

1
kubectl create -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml

les images et PODs de la solution réseau calico seront alors télécharger puis déployer , d’abords sur le master , puis automatiquement sur chauque worker des la jonction au cluster.

génération du token join cluster

Tout est prêt pour commencer la jonction des workers au cluster ❤️ Pour cela nous devons générer un token et l’utiliser sur chaque worker que nous souhaitons ajouter à notre cluster

1
kubeadm token create --print-join-command

voila que notre commande de génération du token vient de nous fournir une nouvelle commande à exécuter sur chaque worker

/images/blog/creation-kubernetes-centos-7/kubeadm-token-create.png
génération du join token sur kubemaster

jonction des workers au cluster

désormais sur chaque worker , vous pouvez coller / exécuter la commande fournit précédement lors de la génération du token

1
kubeadm join 172.15.20.10:6443 --token xxxxxx.XXXXXXXXXXX --discovery-token-ca-cert-hash sha256:XXXXXXXXXXXXXXXXXXXX

une fois que vous joignez les worker au cluster, les PODs necessaires seront déployer automatiquement dans chauqe worker
Soyez patient, le temps que tout les PODs passe en READY 1/1 vous pouvez vérifier l’état des PODs avec la commande

1
kubectl get pods -n kube-system

/images/blog/creation-kubernetes-centos-7/kubectl-get-pods-n-kube-system.png
kubectl get pods -n kube-system

et voila notre cluster Kubernetes est enfin prêt ❤️

1
kubectl get nodes

/images/blog/creation-kubernetes-centos-7/kubectl-get-nodes.png

déployer votre 1er POD

Apres tous ce magnifique travail, vous méritez bien de déployer votre premier POD

création d’un manifest

nous mettons à votre disposition ce manifest sur github (nginx.yaml)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: v1
kind: Pod
metadata: 
  name: nginx
spec: 
  containers:
  - image: nginx
    name: nginx
    ports: 
    - containerPort: 80

déploiment du POD

une fois que vous avez créer le fichier manifest en language YAML (n’utiliser pas de tabulation) afin de décrire votre desired state , vous pouvez désormais créer votre premier avec la commande suivante :

1
kubectl create -f nginx.yaml

/images/blog/creation-kubernetes-centos-7/kubectl-get-pods-nginx.png
kubectl get pods -o wide
Et voici la vidéo démo déploiment d'un POD 😉

Automate with vagrant

pour votre confort, nous mettons à votre disposition sur github le repository
(kubernetes-init-join-vagrant) permetant d’automatiser le processus de bout en bout ❤️ :

  • création des 04 VMs
  • configuration des 04 VMs
  • installation des prérequis
  • construction d’un serveur / client NFS (pour l’échange de token de jonction)
  • initiation du cluster Kubernetes sur le master
  • installation de calico sur le master
  • generation du token dans un fichier /root/.kube/join-kube-cluster.sh
  • envoie du token vers les workers en utilisant le serveur NFS
  • jonction automatique des workers au cluster Kubernetes

tout cela en 03 commandes :

1
2
3
git clone https://github.com/Bahlat87/kubernetes-init-join-vagrant.git
cd kubernetes-init-join-vagrant
vagrant up


à votre service ❤️
Si cet article vous a plu, je vous invite à contacter notre entreprise integrateur open source pour vous aider à mettre en place cette solution et la faire évoluer selon vos besoins.

Aussi, je vous invites à vous abonner à nos réseaux sociaux:

démo d’automatisation en vidéo

Et voici la vidéo résumant l'automatisation du déploiment Kubernetes 😉