Ceci est une ancienne révision du document !


Version - 2020.03

Dernière mise-à-jour : 2020/12/31 10:14

DOF301 - Création de Clusters Kubernetes

Contenu du Module

  • DOF301 - Création de Clusters Kubernetes
    • Contenu du Module
    • L'Orchestration de Conteneurs
    • Présentation de Kubernetes (k8s)
      • Master
      • Nœuds (Minions)
    • LAB #1 - Création du Cluster Kubernetes avec des Machines Virtuelles
      • 1.1 - Présentation
      • 1.2 - Créer le Réseau Privé Hôte 192.168.56.0/24
      • 1.3 - Démarrer les Machines Virtuelles
      • 1.4 - Connexion à la Machine Virtuelle kubemaster
      • 1.5 - Tester le Réseau
      • 1.6 - Initialisation du Maître du Cluster
      • 1.7 - Installation d'une Extension Réseau pour la Communication entre des PODs
      • 1.8 - Connexion des Travailleurs au Maître
    • LAB #2 - Création du Cluster Kubernetes avec Minikube
      • 2.1 - Présentation de Minikube
      • 2.2 - Installation de Minikube
      • 2.3 - Configuration de Minikube
      • 2.4 - Installation de kubectl
      • 2.5 - Mettre à jour Minikube
      • 2.6 - La Commande minikube dashboard
      • 2.7 - La Commande minikube addons
    • LAB #3 - Création du Cluster Kubernetes avec kind
      • 3.1 - Présentation de kind
      • 3.2 - Installation de Docker-CE
      • 3.3 - Installation de kubelet, kubeadm et kubectl
      • 3.4 - Installation de kind et Démarrage du Cluster

L'Orchestration de Conteneurs

Les principales solutions de la containérisation sont :

Les principales solutions d'orchestration de conteneurs sont :

L'orchestration de conteneurs apporte :

  • La haute disponibilité,
  • L'équilibrage de charge,
  • L'augmentation et la réduction du Services (Scale up / scale down).

Présentation de Kubernetes (k8s)

Master

  • Contrôleur du cluster,
  • Responsable de l'orchestration.

Le Master contient :

  • Serveur API,
    • Front end,
  • Service etcd,
    • Key-value store qui stocke toutes les données utilisées pour gérer le cluster et gérer les verrous,
  • Contrôleur,
    • Surveille l'état des conteneurs, nœuds et end-points. Responsable de la mise en place de nouveaux conteneurs en cas de défaillances.
  • Ordonnanceur,
    • Distribue les conteneurs existants aux nœuds et cherche des nouveaux conteneurs et les attribue aux nœuds.

Certains ports doivent être ouverts sur le noeud maître :

Protocole Direction Port(s) Exécutable
TCP Entrante 6443 Kubernetes API server
TCP Entrante 2379-2380 etcd server client API
TCP Entrante 10250 Kubelet API
TCP Entrante 10251 kube-scheduler
TCP Entrante 10252 kube-controller-manager

Noeuds (Minions)

  • Machine physique ou virtuelle sur laquelle est installé Kubernetes,
  • Un travailleur sur lequel Kubernetes lance des conteneurs,

Le Nœud contient :

  • Service kubelet,
    • Agent qui s'exécute sur chaque noeud. Responsable de la surveillance des conteneurs.
  • Container runtime,
    • Docker,
    • rkt (rocket),
    • CRI-O (crio).

Certains ports doivent être ouverts sur chaque noeud travailleur :

Protocole Direction Port(s) Exécutable
TCP Entrante 10250 Kubelet API
TCP Entrante 30000-32767 Services NodePort

LAB #1 - Création du Cluster Kubernetes avec des Machines Virtuelles

1.1 - Présentation

Notez que les machines virtuelles utilisées avec Kubernetes doivent être sous une des distributions suivantes :

  • Ubuntu 16.04+,
  • Debian 9+,
  • CentOS 7,
  • RHEL 7,
  • Fedora 25+,
  • HypriotOS v1.0.1+,
  • Flatcar Container Linux (tested with 2512.3.0).

Chaque machine doit avoir :

  • Un minimum de 2 GO de RAM,
  • Un minimum de 2 CPU.

Les machines doivent :

  • être dans le même réseau,
  • posséder un nom d'hôte unique, une adresse MAC unique ainsi qu'un product_uuid unique,
  • avoir le swap désactivé,
  • avoir l'utilisation de dnsmasq par NetworkManager sous Systemd désactivée.

Le serveur que vous utilisez est muni de VirtualBox. Trois machines virtuelles Debian 9 ont été configurées selon le tableau ci-dessous :

Machine Virtuelle Nom d'hôte Interface 1 Redirection de Port Interface 2 Redirection de Port
kubemaster kubemaster.ittraining.loc 10.0.2.15 2022 > 22 192.168.56.2 Aucune
kubenode1 kubenode1.ittraining.loc 10.0.2.15 3022 > 22 192.168.56.3 Aucune
kubenode2 kubenode2.ittraining.loc 10.0.2.15 4022 > 22 192.168.56.4 Aucune

Les noms d'utilisateurs et les mots de passe sont :

Utilisateur Mot de Passe
trainee trainee
root fenestros

Important : Chaque machine virtuelle a été pré-installée avec Docker, kubeadm, kubelet et kubectl.

1.2 - Créer le Réseau Privé Hôte 192.168.56.0/24

Créez le Réseau Privé Hôte 192.168.56.0/24 qui permettra la communication entre les trois machines virtuelles kubemaster, kubenode1 et kubenode2 :

desktop@serverXX:~$ VBoxManage hostonlyif create
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Interface 'vboxnet0' was successfully created

1.3 - Démarrer les Machines Virtuelles

Pour lancer la machine kubemaster, utilisez la commande suivante à partir de votre serveur dédié :

desktop@serverXX:~$ VBoxManage startvm kubemaster --type headless
Waiting for VM "kubemaster" to power on...
VM "kubemaster" has been successfully started.

Pour lancer la machine kubenode1, utilisez la commande suivante à partir de votre serveur dédié :

desktop@serverXX:~$ VBoxManage startvm kubenode1 --type headless
Waiting for VM "kubenode1" to power on...
VM "kubenode1" has been successfully started.

Pour lancer la machine kubenode2, utilisez la commande suivante à partir de votre serveur dédié :

desktop@serverXX:~$ VBoxManage startvm kubenode2 --type headless
Waiting for VM "kubenode2" to power on...
VM "kubenode2" has been successfully started.

1.4 - Connexion à la Machine Virtuelle kubemaster

Tapez la commande suivante pour vous connecter à la machine kubemaster :

desktop@serverXX:~$ ssh -l trainee 192.168.56.2

1.5 - Tester le Réseau

Vérifiez la connectivité de chaque machine virtuelle :

trainee@kubemaster:~$ ping -c 4 192.168.56.3
PING 192.168.56.3 (192.168.56.3) 56(84) bytes of data.
64 bytes from 192.168.56.3: icmp_seq=1 ttl=64 time=0.762 ms
64 bytes from 192.168.56.3: icmp_seq=2 ttl=64 time=0.765 ms
64 bytes from 192.168.56.3: icmp_seq=3 ttl=64 time=0.819 ms
64 bytes from 192.168.56.3: icmp_seq=4 ttl=64 time=0.682 ms

--- 192.168.56.3 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 0.682/0.757/0.819/0.048 ms
trainee@kubemaster:~$ ping -c 4 192.168.56.4
PING 192.168.56.4 (192.168.56.4) 56(84) bytes of data.
64 bytes from 192.168.56.4: icmp_seq=1 ttl=64 time=1.26 ms
64 bytes from 192.168.56.4: icmp_seq=2 ttl=64 time=0.710 ms
64 bytes from 192.168.56.4: icmp_seq=3 ttl=64 time=0.684 ms
64 bytes from 192.168.56.4: icmp_seq=4 ttl=64 time=0.710 ms

--- 192.168.56.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 0.684/0.841/1.260/0.242 ms
trainee@kubemaster:~$ ping -c 4 www.free.fr
PING www.free.fr (212.27.48.10) 56(84) bytes of data.
64 bytes from www.free.fr (212.27.48.10): icmp_seq=1 ttl=53 time=64.6 ms
64 bytes from www.free.fr (212.27.48.10): icmp_seq=2 ttl=53 time=76.3 ms
64 bytes from www.free.fr (212.27.48.10): icmp_seq=3 ttl=53 time=75.3 ms
64 bytes from www.free.fr (212.27.48.10): icmp_seq=4 ttl=53 time=87.2 ms

--- www.free.fr ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 64.674/75.894/87.200/7.975 ms

1.6 - Initialisation du Maître du Cluster

Initialisez le maître du cluster kubemaster en spécifiant le CIDR de l'extension réseau Calico ainsi que l'adresse IP du maître :

trainee@kubemaster:~$ su -
Mot de passe : fenestros
root@kubemaster:~# kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=192.168.56.2
W0922 10:24:14.615373    1711 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[init] Using Kubernetes version: v1.19.2
[preflight] Running pre-flight checks
        [WARNING SystemVerification]: missing optional cgroups: hugetlb
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kubemaster.ittraining.loc kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.56.2]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [kubemaster.ittraining.loc localhost] and IPs [192.168.56.2 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [kubemaster.ittraining.loc localhost] and IPs [192.168.56.2 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 17.505264 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.19" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node kubemaster.ittraining.loc as control-plane by adding the label "node-role.kubernetes.io/master=''"
[mark-control-plane] Marking the node kubemaster.ittraining.loc as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: d5hb0g.a45h8d6qczwi3g5w
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.56.2:6443 --token d5hb0g.a45h8d6qczwi3g5w \
    --discovery-token-ca-cert-hash sha256:979365a44435cd3cd9bd364357b6b59d0f759606f2d9de98f121c1b56b3c20b4

Important : Notez le message Your Kubernetes control-plane has initialized successfully.

A Faire : Copiez dans un fichier la dernière ligne de la sortie, par exemple kubeadm join 192.168.56.2:6443 –token d5hb0g.a45h8d6qczwi3g5w –discovery-token-ca-cert-hash sha256:979365a44435cd3cd9bd364357b6b59d0f759606f2d9de98f121c1b56b3c20b4.

Créez maintenant la variable KUBECONFIG :

root@kubemaster:~# export KUBECONFIG=/etc/kubernetes/admin.conf

Insérez les deux lignes suivantes à la fin du fichier /root/.bashrc :

root@kubemaster:~# vi .bashrc
root@kubemaster:~# tail .bashrc
...
KUBECONFIG=/etc/kubernetes/admin.conf
export KUBECONFIG

1.7 - Installation d'une Extension Réseau pour la Communication entre des PODs

Afin que les PODs puissent communiquer entre eux, il faut installer une extension pour le réseau . Il existe plusieurs extensions sur lesquelles nous reviendrons plus tard dans ce cours :

Afin d'obtenir un cluster fonctionnel, nous allons utiliser la première extension de la liste, à savoir Calico :

root@kubemaster:~# curl https://docs.projectcalico.org/v3.10/manifests/calico.yaml -O
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 20679  100 20679    0     0  71889      0 --:--:-- --:--:-- --:--:-- 71802
root@kubemaster:~# ls
calico.yaml
root@kubemaster:~# kubectl apply -f calico.yaml
configmap/calico-config created
Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
serviceaccount/calico-node created
deployment.apps/calico-kube-controllers created
serviceaccount/calico-kube-controllers created

Vérifiez que tout est dans un état Running :

root@kubemaster:~# kubectl get pods --all-namespaces
NAMESPACE     NAME                                                READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-7854b85cf7-hk62x            1/1     Running   0          53s
kube-system   calico-node-pxjt4                                   1/1     Running   0          53s
kube-system   coredns-f9fd979d6-77g4x                             1/1     Running   0          33m
kube-system   coredns-f9fd979d6-stw5f                             1/1     Running   0          33m
kube-system   etcd-kubemaster.ittraining.loc                      1/1     Running   0          34m
kube-system   kube-apiserver-kubemaster.ittraining.loc            1/1     Running   0          34m
kube-system   kube-controller-manager-kubemaster.ittraining.loc   1/1     Running   0          34m
kube-system   kube-proxy-n4qn2                                    1/1     Running   0          33m
kube-system   kube-scheduler-kubemaster.ittraining.loc            1/1     Running   0          34m

1.8 - Connexion des Travailleurs au Maître

Si vous avez oublié de copier la commande kudadm join, exécutez la commande kubeadm token create –print-join-command et copiez la sortie de la commande :

root@kubemaster:~# kubeadm token create --print-join-command
W0922 11:01:22.063743   14065 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
kubeadm join 192.168.56.2:6443 --token rcm3uz.lq4dshqdr00wkkpf     --discovery-token-ca-cert-hash sha256:979365a44435cd3cd9bd364357b6b59d0f759606f2d9de98f121c1b56b3c20b4

Connectez-vous à kubenode1 :

root@kubemaster:~# ssh -l trainee kubenode1
The authenticity of host 'kubenode1 (192.168.56.3)' can't be established.
ECDSA key fingerprint is SHA256:sEfHBv9azmK60cjqF/aJgUc9jg56slNaZQdAUcvBOvE.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'kubenode1,192.168.56.3' (ECDSA) to the list of known hosts.
trainee@kubenode1's password: trainee
Linux kubenode1.ittraining.loc 4.9.0-13-amd64 #1 SMP Debian 4.9.228-1 (2020-07-05) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Sep 21 20:13:58 2020 from 192.168.56.1
trainee@kubenode1:~$

Utilisez maintenant la commande copiée pour joindre le nœud au cluster :

trainee@kubenode1:~$ su -
Mot de passe : fenestros
root@kubenode1:~# kubeadm join 192.168.56.2:6443 --token rcm3uz.lq4dshqdr00wkkpf     --discovery-token-ca-cert-hash sha256:979365a44435cd3cd9bd364357b6b59d0f759606f2d9de98f121c1b56b3c20b4
[preflight] Running pre-flight checks
        [WARNING SystemVerification]: missing optional cgroups: hugetlb
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

Déconnectez-vous de kubenode1 et connectez-vous à kubenode2 :

root@kubenode1:~# exit
déconnexion
trainee@kubenode1:~$ exit
déconnexion
Connection to kubenode1 closed.
root@kubemaster:~# ssh -l trainee kubenode2
The authenticity of host 'kubenode2 (192.168.56.4)' can't be established.
ECDSA key fingerprint is SHA256:sEfHBv9azmK60cjqF/aJgUc9jg56slNaZQdAUcvBOvE.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'kubenode2,192.168.56.4' (ECDSA) to the list of known hosts.
trainee@kubenode2's password: trainee
Linux kubenode2.ittraining.loc 4.9.0-13-amd64 #1 SMP Debian 4.9.228-1 (2020-07-05) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Sep 21 20:14:15 2020 from 192.168.56.1
trainee@kubenode2:~$

Utilisez maintenant la commande copiée pour joindre le nœud au cluster :

trainee@kubenode2:~$ su -
Mot de passe : fenestros
root@kubenode2:~# kubeadm join 192.168.56.2:6443 --token rcm3uz.lq4dshqdr00wkkpf     --discovery-token-ca-cert-hash sha256:979365a44435cd3cd9bd364357b6b59d0f759606f2d9de98f121c1b56b3c20b4
[preflight] Running pre-flight checks
        [WARNING SystemVerification]: missing optional cgroups: hugetlb
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

Attendez que l'état des nœuds soit Ready :

root@kubenode2:~# exit
déconnexion
trainee@kubenode2:~$ exit
déconnexion
Connection to kubenode2 closed.
root@kubemaster:~#
root@kubemaster:~# kubectl get nodes
NAME                        STATUS   ROLES    AGE     VERSION
kubemaster.ittraining.loc   Ready    master   48m     v1.19.2
kubenode1.ittraining.loc    Ready    <none>   5m44s   v1.19.2
kubenode2.ittraining.loc    Ready    <none>   57s     v1.19.2

Arrêtez maintenant les machines virtuelles :

root@kubemaster:~# exit
déconnexion
trainee@kubemaster:~$ exit
déconnexion
Connection to kubemaster closed.
desktop@serverXX:~$ VBoxManage controlvm kubenode2 poweroff
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
desktop@serverXX:~$ VBoxManage controlvm kubenode1 poweroff
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
desktop@serverXX:~$ VBoxManage controlvm kubemaster poweroff
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

Ensuite restaurez l'état d'origine des machines virtuelles :

desktop@serverXX:~$ VBoxManage snapshot kubenode2 restore snapshot1
Restoring snapshot 'snapshot1' (22df4e22-876a-4e94-88a8-8422a3a6b158)
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
desktop@serverXX:~$ VBoxManage snapshot kubenode1 restore snapshot1
Restoring snapshot 'snapshot1' (22df4e22-876a-4e94-88a8-8422a3a6b158)
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
desktop@serverXX:~$ VBoxManage snapshot kubemaster restore snapshot1
Restoring snapshot 'snapshot1' (22df4e22-876a-4e94-88a8-8422a3a6b158)
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

Dernièrement supprimez le Réseau Privé Hôte 192.168.56.0/24 :

desktop@serverXX:~$ VBoxManage hostonlyif remove "vboxnet0"
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

</code>

LAB #2 - Création du Cluster Kubernetes avec Minikube

2.1 - Présentation de Minikube

Pour installer Kubernetes rapidement et facilement il convient d'utiliser Minikube. Minikube permet de créer un cluster avec un seul nœud.

2.2 - Installation de Minikube

Commencez par télécharger Minikube :

desktop@serverXX:~$ wget  https://github.com/kubernetes/minikube/releases/download/v1.14.2/minikube-linux-amd64
--2020-11-18 09:43:17--  https://github.com/kubernetes/minikube/releases/download/v1.14.2/minikube-linux-amd64
Resolving github.com (github.com)... 140.82.121.4
Connecting to github.com (github.com)|140.82.121.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://github-production-release-asset-2e65be.s3.amazonaws.com/56353740/3cc4d800-186c-11eb-8c88-776be2397800?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20201118%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20201118T084317Z&X-Amz-Expires=300&X-Amz-Signature=2b7ea6ead1e1297d491db1c514347b1f97e2665bd72014e5fa1730aa7b68a2be&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=56353740&response-content-disposition=attachment%3B%20filename%3Dminikube-linux-amd64&response-content-type=application%2Foctet-stream [following]
--2020-11-18 09:43:17--  https://github-production-release-asset-2e65be.s3.amazonaws.com/56353740/3cc4d800-186c-11eb-8c88-776be2397800?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20201118%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20201118T084317Z&X-Amz-Expires=300&X-Amz-Signature=2b7ea6ead1e1297d491db1c514347b1f97e2665bd72014e5fa1730aa7b68a2be&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=56353740&response-content-disposition=attachment%3B%20filename%3Dminikube-linux-amd64&response-content-type=application%2Foctet-stream
Resolving github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)... 52.216.113.131
Connecting to github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)|52.216.113.131|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 55960880 (53M) [application/octet-stream]
Saving to: ‘minikube-linux-amd64’

minikube-linux-amd64                                        100%[=========================================================================================================================================>]  53.37M  10.7MB/s    in 5.8s    

2020-11-18 09:43:24 (9.24 MB/s) - ‘minikube-linux-amd64’ saved [55960880/55960880]

Renommez le binaire téléchargé et rendez-le exécutable :

desktop@serverXX:~$ mv minikube-linux-amd64 minikube
desktop@serverXX:~$ chmod u+x minikube

Déplacez ensuite le binaire minikube dans le répertoire /usr/local/bin/ :

desktop@serverXX:~$ sudo mv minikube /usr/local/bin/ 
[sudo] password for desktop:

Testez ensuite l'installation avec la commande minikube version :

desktop@serverXX:~$ minikube version
minikube version: v1.14.2
commit: 2c82918e2347188e21c4e44c8056fc80408bce10

2.3 - Configuration de Minikube

Configurez maintenant l'hyperviseur par défaut de minikube :

desktop@serverXX:~$ minikube config set vm-driver virtualbox
❗  These changes will take effect upon a minikube delete and then a minikube start

Vérifiez la prise en charge de la dernière commande :

desktop@serverXX:~$ minikube config get vm-driver
virtualbox

Par défaut, lors de démarrage de Minikube, celui-ci va allouer 2 vCPUs et 2Go de RAM à sa machine virtuelle. Augmentez la quantité de mémoire qui sera allouée avec la commande suivante :

desktop@serverXX:~$ minikube config set memory 4000
❗  These changes will take effect upon a minikube delete and then a minikube start

Vérifiez la prise en charge de la dernière commande :

desktop@serverXX:~$ minikube config get memory
4000

2.4 - Installation de kubectl

Démarrez maintenant Minikube :

desktop@serverXX:~$ minikube start
😄  minikube v1.14.2 on Ubuntu 16.04
✨  Using the virtualbox driver based on user configuration
💿  Downloading VM boot image ...
    > minikube-v1.14.0.iso.sha256: 65 B / 65 B [-------------] 100.00% ? p/s 0s
    > minikube-v1.14.0.iso: 178.27 MiB / 178.27 MiB [] 100.00% 9.08 MiB p/s 19s
👍  Starting control plane node minikube in cluster minikube
💾  Downloading Kubernetes v1.19.2 preload ...
    > preloaded-images-k8s-v6-v1.19.2-docker-overlay2-amd64.tar.lz4: 486.33 MiB
🔥  Creating virtualbox VM (CPUs=2, Memory=4000MB, Disk=20000MB) ...
🐳  Preparing Kubernetes v1.19.2 on Docker 19.03.12 ...
🔎  Verifying Kubernetes components...
🌟  Enabled addons: default-storageclass, storage-provisioner
💡  kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
🏄  Done! kubectl is now configured to use "minikube" by default

Notez l'erreur kubectl not found.. Exécutez donc la commande minikube kubectl – get pods -A pour installer kubectl :

desktop@serverXX:~$ minikube kubectl -- get pods -A
    > kubectl.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
    > kubectl: 41.01 MiB / 41.01 MiB [---------------] 100.00% 11.43 MiB p/s 3s
NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
kube-system   coredns-f9fd979d6-d97dg            1/1     Running   0          17m
kube-system   etcd-minikube                      1/1     Running   0          17m
kube-system   kube-apiserver-minikube            1/1     Running   0          17m
kube-system   kube-controller-manager-minikube   1/1     Running   0          17m
kube-system   kube-proxy-vqmqd                   1/1     Running   0          17m
kube-system   kube-scheduler-minikube            1/1     Running   0          17m
kube-system   storage-provisioner                1/1     Running   0          17m

Consultez la liste des machines virtuelles en cours d'exécution :

desktop@serverXX:~$ VBoxManage list runningvms
"minikube" {1b656fb9-ea02-4b0c-baeb-f25dbd9813bd}

Arrêtez maintenant Minikube :

desktop@serverXX:~$ minikube stop
✋  Stopping node "minikube"  ...
🛑  1 nodes stopped.

Notez que, bien qu'arrêtée, la machine virtuelle minikube est toujours présente :

desktop@serverXX:~$ VBoxManage list runningvms
desktop@serverXX:~$ VBoxManage list vms
"Ansible" {91ba383a-cb9e-49ee-aa9c-c4bbf5b52894}
"CentOS_7" {ef84d93f-1964-43a5-a6a9-0b205c2b2af4}
"Debian_9" {c46d614a-866f-4609-aaa0-0ae44a2af9bf}
"Debian_9_1" {1c884792-f34a-4aae-95f4-eb2ad23156ee}
"Manager" {2176d97f-4e8e-428b-8d88-c8234bfc8294}
"TargetA" {f552b529-3064-4791-a5d8-47c542f3b572}
"TargetB" {21aa961c-b181-41f7-9978-94e95131c16a}
"Web01" {aa2afa3c-1fde-4723-8cd0-cf5d4941b8c8}
"Web02" {1c02a19d-5adf-4c4e-9ab9-8816f4561e35}
"Web03" {3bc94079-7dcf-41f3-964d-d7453e231658}
"Web04" {692c1f49-7a0d-41c2-b5ef-3df055906216}
"Worker1" {0f976eda-895e-4022-a5ca-24946822d88a}
"Worker2" {00e75205-694c-4c60-9533-a294a008df2b}
"Windows10" {09710adb-3fde-4f56-a1c4-87ee5d5a40a2}
"CentOS_8" {1534479b-922f-4a16-b8ab-d4c64485f38b}
"Debian_10" {46bd607e-7c1a-4985-9437-5e5788460a09}
"CentOS_7 1" {5d0ce034-b759-4ccf-a449-28aea94a7d93}
"Debian_9 1" {f6c8c63b-68a0-40c0-ac0e-861397c80ff3}
"Debian_9_1 1" {3538f398-a7fc-48cf-a915-5aaa7dc0db1f}
"kubemaster 1" {6df7d88c-18a7-4f8f-a504-28b357b85583}
"kubemaster" {88755cef-524a-45ae-b64c-9d8274ce3d27}
"kubenode1" {e05d0605-36f9-4b8d-acc8-07e16152222d}
"kubenode2" {af2c11a5-19d3-4f22-82dd-b5f8fb6b1205}
"minikube" {1b656fb9-ea02-4b0c-baeb-f25dbd9813bd}

Pour détruire le cluster Kubernetes ainsi que la machine virtuelle minikube, il convient d'utiliser la commande minikube delete :

desktop@serverXX:~$ minikube delete
🔥  Deleting "minikube" in virtualbox ...
💀  Removed all traces of the "minikube" cluster.

Démarrez de nouveau minikube :

desktop@serverXX:~$ minikube start
😄  minikube v1.14.2 on Ubuntu 16.04
✨  Using the virtualbox driver based on user configuration
👍  Starting control plane node minikube in cluster minikube
🔥  Creating virtualbox VM (CPUs=2, Memory=4000MB, Disk=20000MB) ...
🐳  Preparing Kubernetes v1.19.2 on Docker 19.03.12 ...
🔎  Verifying Kubernetes components...
🌟  Enabled addons: storage-provisioner, default-storageclass
💡  kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
🏄  Done! kubectl is now configured to use "minikube" by default
desktop@serverXX:~$ minikube kubectl -- get pods -A
NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
kube-system   coredns-f9fd979d6-gmzps            0/1     Pending   0          16s
kube-system   etcd-minikube                      0/1     Running   0          15s
kube-system   kube-apiserver-minikube            1/1     Running   0          15s
kube-system   kube-controller-manager-minikube   0/1     Running   0          15s
kube-system   kube-proxy-d4cs2                   1/1     Running   0          16s
kube-system   kube-scheduler-minikube            0/1     Running   0          15s
kube-system   storage-provisioner                0/1     Pending   0          21s

Contrôlez la version de kubectl qui a été installée :

desktop@serverXX:~$ minikube kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.2", GitCommit:"f5743093fd1c663cb0cbc89748f730662345d44d", GitTreeState:"clean", BuildDate:"2020-09-16T13:41:02Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.2", GitCommit:"f5743093fd1c663cb0cbc89748f730662345d44d", GitTreeState:"clean", BuildDate:"2020-09-16T13:32:58Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}

Important : La sortie de cette commande indique une version 1.19.2 de Kubernetes. Par conséquence, nous avons besoin d'une version 3.4.x de Helm.

La version de kubectl installée par minikube se trouve dans le répertoire /home/desktop/.minikube/cache/linux/v1.19.2/ :

desktop@serverXX:~$ ls -l /home/desktop/.minikube/cache/linux/v1.19.2/kubectl
-rwxr-xr-x 1 desktop desktop 43003904 Nov 13 15:53 /home/desktop/.minikube/cache/linux/v1.19.2/kubectl

Pour une utilisation plus facile, copiez la commande vers le répertoire /usr/local/bin/ :

desktop@serverXX:~$ sudo cp /home/desktop/.minikube/cache/linux/v1.19.2/kubectl /usr/local/bin
[sudo] password for desktop: 

Vérifiez ensuite que la commande est disponible :

desktop@serverXX:~$ which kubectl
/usr/local/bin/kubectl

2.5 - Mettre à jour Minikube

Vérifiez maintenant si une mise à jour de minikube est disponible :

desktop@serverXX:~$ minikube update-check
CurrentVersion: v1.14.2
LatestVersion: v1.15.1

Pour mettre à jour minikube, arrêtez celui-ci et supprimer le cluster Kebernetes ainsi que la machine virtuelle :

desktop@serverXX:~$ minikube stop
✋  Stopping node "minikube"  ...
🛑  1 nodes stopped.
desktop@serverXX:~$ minikube delete
🔥  Deleting "minikube" in virtualbox ...
💀  Removed all traces of the "minikube" cluster

La configuration de minikube est stockée dans le répertoire ~/.minikube/ :

desktop@serverXX:~$ ls -l .minikube/
total 64
drwxrwxr-x 2 desktop desktop 4096 Nov 13 15:23 addons
drwxrwxr-x 5 desktop desktop 4096 Nov 13 15:53 cache
-rw-r--r-- 1 desktop desktop 1111 Nov 13 15:35 ca.crt
-rw------- 1 desktop desktop 1675 Nov 13 15:35 ca.key
-rwxrwxr-x 1 desktop desktop 1078 Nov 25 11:37 ca.pem
-rwxrwxr-x 1 desktop desktop 1123 Nov 25 11:37 cert.pem
drwxrwxr-x 2 desktop desktop 4096 Nov 13 15:34 certs
drwxrwxr-x 2 desktop desktop 4096 Nov 13 15:26 config
drwxrwxr-x 2 desktop desktop 4096 Nov 13 15:23 files
-rwxrwxr-x 1 desktop desktop 1679 Nov 25 11:37 key.pem
-rw-r--r-- 1 desktop desktop   29 Nov 25 10:22 last_update_check
drwxrwxr-x 2 desktop desktop 4096 Nov 13 15:23 logs
drwxrwxr-x 2 desktop desktop 4096 Nov 28 17:34 machines
drwxrwxr-x 2 desktop desktop 4096 Nov 28 17:34 profiles
-rw-r--r-- 1 desktop desktop 1119 Nov 13 15:35 proxy-client-ca.crt
-rw------- 1 desktop desktop 1679 Nov 13 15:35 proxy-client-ca.key

Supprimez ce répertoire :

desktop@serverXX:~$ rm -rf .minikube

Téléchargez la nouvelle version de minikube :

desktop@serverXX:~$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 53.5M  100 53.5M    0     0  10.1M      0  0:00:05  0:00:05 --:--:-- 10.8M
desktop@serverXX:~$ sudo install minikube-linux-amd64 /usr/local/bin/minikube
[sudo] password for desktop: 

Configurez minikube comme indique précédement :

desktop@serverXX:~$ minikube config set vm-driver virtualbox
❗  These changes will take effect upon a minikube delete and then a minikube start
desktop@serverXX:~$ minikube config set memory 4000
❗  These changes will take effect upon a minikube delete and then a minikube start

Démarrez la nouvelle verstion de minikube :

desktop@serverXX:~$ minikube start
😄  minikube v1.15.1 on Ubuntu 16.04
✨  Using the virtualbox driver based on user configuration
💿  Downloading VM boot image ...
    > minikube-v1.15.0.iso.sha256: 65 B / 65 B [-------------] 100.00% ? p/s 0s
    > minikube-v1.15.0.iso: 181.00 MiB / 181.00 MiB [ 100.00% 10.49 MiB p/s 17s
👍  Starting control plane node minikube in cluster minikube
💾  Downloading Kubernetes v1.19.4 preload ...
    > preloaded-images-k8s-v6-v1.19.4-docker-overlay2-amd64.tar.lz4: 486.35 MiB
🔥  Creating virtualbox VM (CPUs=2, Memory=4000MB, Disk=20000MB) ...
🐳  Preparing Kubernetes v1.19.4 on Docker 19.03.13 ...
🔎  Verifying Kubernetes components...
🌟  Enabled addons: default-storageclass, storage-provisioner
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

Vérifiez la version de minikube :

desktop@serverXX:~$ minikube version
minikube version: v1.15.1
commit: 23f40a012abb52eff365ff99a709501a61ac

Téléchargez le binaire kubectl :

desktop@serverXX:~$ minikube kubectl -- get pods -A
    > kubectl.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s
    > kubectl: 41.01 MiB / 41.01 MiB [----------------] 100.00% 8.45 MiB p/s 5s
NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
kube-system   coredns-f9fd979d6-tb259            1/1     Running   0          73s
kube-system   etcd-minikube                      0/1     Running   0          72s
kube-system   kube-apiserver-minikube            1/1     Running   0          72s
kube-system   kube-controller-manager-minikube   0/1     Running   0          72s
kube-system   kube-proxy-plnnh                   1/1     Running   0          73s
kube-system   kube-scheduler-minikube            0/1     Running   0          72s
kube-system   storage-provisioner                1/1     Running   0          78s

Contrôlez la version de kubectl qui a été installée :

desktop@serverXX:~$ minikube kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.4", GitCommit:"d360454c9bcd1634cf4cc52d1867af5491dc9c5f", GitTreeState:"clean", BuildDate:"2020-11-11T13:17:17Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.4", GitCommit:"d360454c9bcd1634cf4cc52d1867af5491dc9c5f", GitTreeState:"clean", BuildDate:"2020-11-11T13:09:17Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"}

Important : La sortie de cette commande indique une version 1.19.4 de Kubernetes.

La version de kubectl installée par minikube se trouve dans le répertoire /home/desktop/.minikube/cache/linux/v1.19.4/ :

desktop@serverXX:~$ ls -l /home/desktop/.minikube/cache/linux/v1.19.4/kubectl
-rwxr-xr-x 1 desktop desktop 43003904 Nov 28 17:56 /home/desktop/.minikube/cache/linux/v1.19.4/kubectl

Pour une utilisation plus facile, copiez la commande vers le répertoire /usr/local/bin/ :

desktop@serverXX:~$ sudo rm -f /usr/local/bin/kubectl 
[sudo] password for desktop: 
desktop@serverXX:~$ sudo cp /home/desktop/.minikube/cache/linux/v1.19.4/kubectl /usr/local/bin

Vérifiez ensuite que la commande est disponible :

desktop@serverXX:~$ which kubectl
/usr/local/bin/kubectl

2.6 - La Commande minikube dashboard

Minikube embarque l'application Kubernetes Dashboard. Pour consulter le Dashboard, ouvrez une connexion à votre serveur cloud en mode graphique. Naviguez au site https://wiki.x2go.org/doku.php/download:start et téléchargez le client X2Go pour votre architecture (Linux, Window™ ou macOS™):

Installez le client, ouvrez l'application et créez une nouvelle session en remplaçant la valeur XX par le numéro du serveur qui vous a été communiqué par votre formateur :

Vous verrez apparaître une boîte represantant votre nouvelle connexion à droite de l'écran :

Cliquez sur cette boîte puis renseignez le mot de passe de votre serveur dans le cloud et cliquez sur le bouton ok :

A l'issu de quelques minutes vou aurez accès à votre serveur dans le cloud en mode graphique :

Ouvrez un terminal en mode graphique et exécutez la commande minikube dashboard :

desktop@serverXX:~$ minikube dashboard
* Verifying dashboard health ...
* Launching proxy ...
* Verifying proxy health ...
* Opening http://127.0.0.1:44979/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...

Le navigateur Firefox sera lancé vous donnant accès à Kubernetes Dashboard :

Revenez à la fenêtre de connexion en SSH à votre serveur.

2.7 - La Commande minikube addons

Minikube utilise des modules. Ces modules sont appelés des addons. Pour consulter les addons installés ainsi que leurs statuts, utilisez la commande minikube addons list :

desktop@serverXX:~$ minikube addons list
|-----------------------------|----------|--------------|
|         ADDON NAME          | PROFILE  |    STATUS    |
|-----------------------------|----------|--------------|
| ambassador                  | minikube | disabled     |
| csi-hostpath-driver         | minikube | disabled     |
| dashboard                   | minikube | enabled ✅   |
| default-storageclass        | minikube | enabled ✅   |
| efk                         | minikube | disabled     |
| freshpod                    | minikube | disabled     |
| gcp-auth                    | minikube | disabled     |
| gvisor                      | minikube | disabled     |
| helm-tiller                 | minikube | disabled     |
| ingress                     | minikube | disabled     |
| ingress-dns                 | minikube | disabled     |
| istio                       | minikube | disabled     |
| istio-provisioner           | minikube | disabled     |
| kubevirt                    | minikube | disabled     |
| logviewer                   | minikube | disabled     |
| metallb                     | minikube | disabled     |
| metrics-server              | minikube | disabled     |
| nvidia-driver-installer     | minikube | disabled     |
| nvidia-gpu-device-plugin    | minikube | disabled     |
| olm                         | minikube | disabled     |
| pod-security-policy         | minikube | disabled     |
| registry                    | minikube | disabled     |
| registry-aliases            | minikube | disabled     |
| registry-creds              | minikube | disabled     |
| storage-provisioner         | minikube | enabled ✅   |
| storage-provisioner-gluster | minikube | disabled     |
| volumesnapshots             | minikube | disabled     |
|-----------------------------|----------|--------------|

Pour activer le module metrics-server, utilisez la commande minikube addons enable :

desktop@serverXX:~$ minikube addons enable metrics-server
🌟  The 'metrics-server' addon is enabled

Vérifiez maintenant la prise en compte de la commande précédente :

desktop@serverXX:~$ minikube addons list
|-----------------------------|----------|--------------|
|         ADDON NAME          | PROFILE  |    STATUS    |
|-----------------------------|----------|--------------|
| ambassador                  | minikube | disabled     |
| csi-hostpath-driver         | minikube | disabled     |
| dashboard                   | minikube | enabled ✅   |
| default-storageclass        | minikube | enabled ✅   |
| efk                         | minikube | disabled     |
| freshpod                    | minikube | disabled     |
| gcp-auth                    | minikube | disabled     |
| gvisor                      | minikube | disabled     |
| helm-tiller                 | minikube | disabled     |
| ingress                     | minikube | disabled     |
| ingress-dns                 | minikube | disabled     |
| istio                       | minikube | disabled     |
| istio-provisioner           | minikube | disabled     |
| kubevirt                    | minikube | disabled     |
| logviewer                   | minikube | disabled     |
| metallb                     | minikube | disabled     |
| metrics-server              | minikube | enabled ✅   |
| nvidia-driver-installer     | minikube | disabled     |
| nvidia-gpu-device-plugin    | minikube | disabled     |
| olm                         | minikube | disabled     |
| pod-security-policy         | minikube | disabled     |
| registry                    | minikube | disabled     |
| registry-aliases            | minikube | disabled     |
| registry-creds              | minikube | disabled     |
| storage-provisioner         | minikube | enabled ✅   |
| storage-provisioner-gluster | minikube | disabled     |
| volumesnapshots             | minikube | disabled     |
|-----------------------------|----------|--------------|

LAB #3 - Création du Cluster Kubernetes avec kind

3.1 - Présentation de kind

kind est un outil utilisé pour exécuter un cluster Kubernetes localement en utilisant des conteneurs Docker en tant que nœuds. kind a été développé pour tester Kubernetes lui-même mais peut aussi être utilisé pour du développement local.

Le site web de kind est https://kind.sigs.k8s.io/docs/user/quick-start/. Le lien du projet sur github est https://github.com/kubernetes-sigs/kind.

3.2 - Installation de Docker-CE dans la VM Debian_10

Commencez par augmenter la RAM de la machine virtuelle Debian_10 :

desktop@serverXX:~$ VBoxManage modifyvm Debian_10 --memory 8192

Configurez ensuite la redirection de port pour le service ssh :

desktop@serverXX:~$ VBoxManage modifyvm "Debian_10" --natpf1 "Debian_10,tcp,,9022,,22"

Démarrez la machine virtuelle Debian_10 :

desktop@serverXX:~$ VBoxManage startvm Debian_10 --type headless
Waiting for VM "Debian_10" to power on...
VM "Debian_10" has been successfully started.

Patientez 2 minutes puis connectez-vous à la machine virtuelle :

desktop@serverXX:~$ ssh -l trainee localhost -p 9022
trainee@localhost's password: 
Linux debian10 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u2 (2019-11-11) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Nov 30 15:50:01 2020 from 10.0.2.2

Installez ensuite Docker-CE :

trainee@debian10:~$ su -
Password: fenestros
root@debian10:~# 

root@debian10:~# apt-get update && apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg2
...
root@debian10:~# curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
...
root@debian10:~# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
...
root@debian10:~# apt-get update && apt-get install -y containerd.io=1.2.13-2 docker-ce=5:19.03.11~3-0~debian-$(lsb_release -cs) docker-ce-cli=5:19.03.11~3-0~debian-$(lsb_release -cs)
...
root@debian10:~# vi /etc/docker/daemon.json
root@debian10:~# cat /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
root@debian10:~# mkdir -p /etc/systemd/system/docker.service.d
root@debian10:~# systemctl daemon-reload
root@debian10:~# systemctl restart docker
root@debian10:~# docker version
Client: Docker Engine - Community
 Version:           19.03.11
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        42e35e61f3
 Built:             Mon Jun  1 09:12:44 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.11
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       42e35e61f3
  Built:            Mon Jun  1 09:11:17 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

3.3 - Installation de kubelet, kubeadm et kubectl

Ajoutez la clef GPG pour le dépôt Kubernetes :

root@debian10:~# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
OK

Ajoutez le dépôt de Kubernetes :

root@debian10:~# echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | tee -a /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main

Procédez à l'installation de kubeadm, kubelet et kubectl :

root@debian10:~# apt-get update && apt-get install -y kubeadm kubelet kubectl

Bloquez les mises-à-jour de kubeadm, kubelet et kubectl :

root@debian10:~# apt-mark hold kubelet kubeadm kubectl
kubelet set on hold.
kubeadm set on hold.
kubectl set on hold.

3.4 - Installation de kind et Démarrage du Cluster

Installez kind :

root@debian10:~# curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.9.0/kind-linux-amd64
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    97  100    97    0     0    339      0 --:--:-- --:--:-- --:--:--   337
100   642  100   642    0     0   1414      0 --:--:-- --:--:-- --:--:--  1414
100 7247k  100 7247k    0     0  3549k      0  0:00:02  0:00:02 --:--:-- 9522k
root@debian10:~# chmod +x ./kind
root@debian10:~# mv kind /usr/local/bin/
root@debian10:~# which kind
/usr/local/bin/kind

Re-démarrez la machine virtuelle :

root@debian10:~# shutdown -r now

Connectez-vous à la machine virtuelle Debian_10 :

desktop@serverXX:~$ ssh -l trainee localhost -p 9022
trainee@localhost's password: trainee
Linux debian10 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2+deb10u2 (2019-11-11) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Nov 30 13:47:09 2020 from 10.0.2.2

Devenez root et créez le fichier config.yaml :

trainee@debian10:~$ su -
Password: fenestros
root@debian10:~# vi config.yaml
root@debian10:~# cat config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
kubeadmConfigPatches:
- |
  apiVersion: kubelet.config.k8s.io/v1beta1
  kind: KubeletConfiguration
  evictionHard:
    nodefs.available: "0%"
kubeadmConfigPatchesJSON6902:
- group: kubeadm.k8s.io
  version: v1beta2
  kind: ClusterConfiguration
  patch: |
    - op: add
      path: /apiServer/certSANs/-
      value: my-hostname
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker

Créez un cluster avec kind :

root@debian10:~# kind create cluster --config config.yaml
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.19.1) 🖼 
 ✓ Preparing nodes 📦 📦 📦 📦  
 ✓ Writing configuration 📜 
 ✓ Starting control-plane 🕹️ 
 ✓ Installing CNI 🔌 
 ✓ Installing StorageClass 💾 
 ✓ Joining worker nodes 🚜 
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/

<html> <DIV ALIGN=“CENTER”> Copyright © 2020 Hugh Norris. </div> </html>

Menu