Kubernetes est le système d'orchestration de conteneurs le plus tendance qui puisse être utilisé pour automatiser le déploiement, la mise à l'échelle et la gestion des applications. Mais vous ne pouvez pas déployer Kubernetes facilement, cela peut être très coûteux. MicroK8s est un déploiement Kubernetes en amont qui vous permet d'exécuter Kubernetes dans Snap. MicroK8s est un package unique qui s'exécute sur tous les principaux systèmes d'exploitation basés sur Linux. Il est livré avec un registre Docker afin que vous puissiez facilement créer, pousser et déployer des conteneurs sur votre système. Microk8s est rapide, léger et exécute tous les services Kubernetes en mode natif.  

Dans ce didacticiel, nous allons apprendre à installer MicroK8 et à faire fonctionner votre cluster Kuberenetes.  

Exigences

  • Un serveur cloud fonctionnant avec Ubuntu 18.04 et 4 Go de RAM.
  • Un mot de passe root configuré sur votre serveur cloud vps.

Démarrage

Tout d'abord, mettez à jour votre serveur vers la dernière version avec la commande suivante:  

# apt-get update -y
# apt-get upgrade -y

Une fois votre serveur mis à jour, redémarrez-le pour appliquer toutes les modifications.

Installer MicroK8s

Tout d'abord, vous devrez installer Snap pour installer ensuite les MicroK8. Vous pouvez installer Snap avec la commande suivante:

# apt-get install snapd -y

Une fois Snap installé, vous pouvez installer MicroK8 à l'aide de la commande Snap comme indiqué ci-dessous:

# snap install microk8s --classic

Une fois MikroK8s installé, vous pouvez vérifier les informations MicroK8s avec la commande suivante:

# snap info microk8s

Ce qui donne :

snap info microk8s
name:      microk8s
summary:   Kubernetes for workstations and appliances
publisher: Canonical✓
store-url: https://snapcraft.io/microk8s
contact:   https://github.com/ubuntu/microk8s
license:   unset
description: |
  MicroK8s is a small, fast, secure, single node Kubernetes that installs on
  just about any Linux box. Use it for offline development, prototyping,
  testing, or use it on a VM as a small, cheap, reliable k8s for CI/CD. It's
  also a great k8s for appliances - develop your IoT apps for k8s and deploy
  them to MicroK8s on your boxes.

Vous pouvez également vérifier l'état de déploiement de MicroK8 avec la commande suivante:

# microk8s.status

Vous pouvez vérifier l'état de MicroK8 avec les addons disponibles dans le résultat suivant:

microk8s is running
addons:
cilium: disabled
dashboard: disabled
dns: disabled
fluentd: disabled
gpu: disabled
helm3: disabled
helm: disabled
ingress: disabled
istio: disabled
jaeger: disabled
juju: disabled
knative: disabled
kubeflow: disabled
linkerd: disabled
metallb: disabled
metrics-server: disabled
prometheus: disabled
rbac: disabled
registry: disabled
storage: disabled

Pour vérifier les informations du cluster, vous pouvez le faire avec la commande suivante:

# microk8s.kubectl cluster-info
Kubernetes master is running at https://127.0.0.1:16443

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Pour diagnostiquer et déboguer les éventuels problèmes de cluster, utilisez ‘kubectl cluster-info dump’.

Travailler avec MicroK8s

Vous pouvez également répertorier les nœuds MicroK8 avec la commande suivante:

root@vps774209:~#  microk8s.kubectl get nodes
NAME        STATUS   ROLES    AGE   VERSION
vps774209   Ready    <none>   23h   v1.17.3

Ou avec la commande suivante:

root@vps774209:~# microk8s.kubectl get nodes -o wide
NAME        STATUS   ROLES    AGE     VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
vps774209   Ready    <none>   3d21h   v1.18.0   51.77.146.64   <none>        Ubuntu 18.04.4 LTS   4.15.0-91-generic   containerd://1.2.5

MicroK8s est livré avec beaucoup d'addons intégrés. Vous pouvez les activer ou les désactiver selon vos besoins:  Vous pouvez activer les addons DNS à partir du tableau de bord avec la commande :

# microk8s.enable dashboard dns

Ce qui va donner :

root@vps774209:~#  microk8s.enable dashboard dns
Applying manifest
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
service/monitoring-grafana created
service/monitoring-influxdb created
service/heapster created
deployment.apps/monitoring-influxdb-grafana-v4 created
serviceaccount/heapster created
clusterrolebinding.rbac.authorization.k8s.io/heapster created
configmap/heapster-config created
configmap/eventer-config created
deployment.apps/heapster-v1.5.2 created

If RBAC is not enabled access the dashboard using the default token retrieved with:

token=$(microk8s kubectl -n kube-system get secret | grep default-token | cut -d " " -f1)
microk8s kubectl -n kube-system describe secret $token

In an RBAC enabled setup (microk8s enable RBAC) you need to create a user with restricted
permissions as shown in:
https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md

Enabling DNS
Applying manifest
serviceaccount/coredns created
configmap/coredns created
deployment.apps/coredns created
service/kube-dns created
clusterrole.rbac.authorization.k8s.io/coredns created
clusterrolebinding.rbac.authorization.k8s.io/coredns created
Restarting kubelet
DNS is enabled

Si RBAC n'est pas activé, accédez au tableau de bord à l'aide du jeton prédéterminé récupéré avec:

# token=$(microk8s.kubectl -n kube-system get secret | grep default-token | cut -d " " -f1)
# microk8s.kubectl -n kube-system describe secret $token

Dans une configuration activée pour RBAC (microk8s.enable RBAC), vous devez créer un utilisateur avec des autorisations restreintes affichées sur : https://github.com/kubernetes/dashboard/wiki/Creating-sample-user

  Enabling DNS
  Applying manifest
  serviceaccount/coredns created
  configmap/coredns created
  deployment.apps/coredns created
  service/kube-dns created
  Restarting kubelet
  DNS is enabled

Pour activer les extensions de stockage, faites-le avec la commande suivante:

root@vps774209:~# microk8s.enable storage
Enabling default storage class
deployment.apps/hostpath-provisioner created
storageclass.storage.k8s.io/microk8s-hostpath created
serviceaccount/microk8s-hostpath created
clusterrole.rbac.authorization.k8s.io/microk8s-hostpath created
clusterrolebinding.rbac.authorization.k8s.io/microk8s-hostpath created
Storage will be available soon

Tout voir, ce qui équivaut à l'utilisation de kubectl dans un cluster k8s classique :

microk8s.kubectl get all --all-namespaces
NAMESPACE     NAME                                                  READY   STATUS    RESTARTS   AGE
kube-system   pod/coredns-588fd544bf-45b68                          1/1     Running   0          20h
kube-system   pod/dashboard-metrics-scraper-db65b9c6f-j6ccc         1/1     Running   0          20h
kube-system   pod/heapster-v1.5.2-58fdbb6f4d-rv5kd                  4/4     Running   0          20h
kube-system   pod/hostpath-provisioner-75fdc8fccd-bvb4j             1/1     Running   0          27m
kube-system   pod/kubernetes-dashboard-67765b55f5-85rp7             1/1     Running   0          20h
kube-system   pod/monitoring-influxdb-grafana-v4-6dc675bf8c-9jvq2   2/2     Running   0          20h

NAMESPACE     NAME                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes                  ClusterIP   10.152.183.1     <none>        443/TCP                  4d21h
kube-system   service/dashboard-metrics-scraper   ClusterIP   10.152.183.212   <none>        8000/TCP                 20h
kube-system   service/heapster                    ClusterIP   10.152.183.2     <none>        80/TCP                   20h
kube-system   service/kube-dns                    ClusterIP   10.152.183.10    <none>        53/UDP,53/TCP,9153/TCP   20h
kube-system   service/kubernetes-dashboard        ClusterIP   10.152.183.177   <none>        443/TCP                  20h
kube-system   service/monitoring-grafana          ClusterIP   10.152.183.37    <none>        80/TCP                   20h
kube-system   service/monitoring-influxdb         ClusterIP   10.152.183.70    <none>        8083/TCP,8086/TCP        20h

NAMESPACE     NAME                                             READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   deployment.apps/coredns                          1/1     1            1           20h
kube-system   deployment.apps/dashboard-metrics-scraper        1/1     1            1           20h
kube-system   deployment.apps/heapster-v1.5.2                  1/1     1            1           20h
kube-system   deployment.apps/hostpath-provisioner             1/1     1            1           27m
kube-system   deployment.apps/kubernetes-dashboard             1/1     1            1           20h
kube-system   deployment.apps/monitoring-influxdb-grafana-v4   1/1     1            1           20h

NAMESPACE     NAME                                                        DESIRED   CURRENT   READY   AGE
kube-system   replicaset.apps/coredns-588fd544bf                          1         1         1       20h
kube-system   replicaset.apps/dashboard-metrics-scraper-db65b9c6f         1         1         1       20h
kube-system   replicaset.apps/heapster-v1.5.2-58fdbb6f4d                  1         1         1       20h
kube-system   replicaset.apps/hostpath-provisioner-75fdc8fccd             1         1         1       27m
kube-system   replicaset.apps/kubernetes-dashboard-67765b55f5             1         1         1       20h
kube-system   replicaset.apps/monitoring-influxdb-grafana-v4-6dc675bf8c   1         1         1       20h
root@vps774209:~# 

Accèder au dashboard

Ensuite, vous devez vous connecter au service de tableau de bord. Alors que le composant logiciel MicroK8s aura une adresse IP sur votre réseau local (l'IP du cluster du service kubernetes-dashboard), vous pouvez également accéder au tableau de bord en transférant son port vers un port sur votre hôte avec:  

microk8s kubectl port-forward -n kube-system service/kubernetes-dashboard 10443:443

Vous pouvez ensuite accéder au tableau de bord sur l'adresse :

https://127.0.0.1:10443  

Si vous exécutez MicroK8 dans une machine virtuelle et que vous devez exposer le tableau de bord à d'autres hôtes, vous devez également utiliser l'option --address [IP_address_that_your_browser's_host_has]. Définissez cette option sur --address 0.0.0.0 pour rendre le tableau de bord public.

Par exemple:  

microk8s kubectl port-forward -n kube-system service/kubernetes-dashboard 10443: 443 --address 0.0.0.0

et :

La commande inspect peut s'avèrer utile en cas de bug :

# microk8s.inspect
Inspecting services
  Service snap.microk8s.daemon-cluster-agent is running
  Service snap.microk8s.daemon-flanneld is running
  Service snap.microk8s.daemon-containerd is running
  Service snap.microk8s.daemon-apiserver is running
  Service snap.microk8s.daemon-apiserver-kicker is running
  Service snap.microk8s.daemon-proxy is running
  Service snap.microk8s.daemon-kubelet is running
  Service snap.microk8s.daemon-scheduler is running
  Service snap.microk8s.daemon-controller-manager is running
  Service snap.microk8s.daemon-etcd is running
  Copy service arguments to the final report tarball
Inspecting AppArmor configuration
Gathering system information
  Copy processes list to the final report tarball
  Copy snap list to the final report tarball
  Copy VM name (or none) to the final report tarball
  Copy disk usage information to the final report tarball
  Copy memory usage information to the final report tarball
  Copy server uptime to the final report tarball
  Copy current linux distribution to the final report tarball
  Copy openSSL information to the final report tarball
  Copy network configuration to the final report tarball
Inspecting kubernetes cluster
  Inspect kubernetes cluster

Hébergez votre premier service Kubernetes

Nous commençons par créer un déploiement de microbots avec deux pods via le kubectl cli:

microk8s.kubectl create deployment microbot --image=dontrebootme/microbot:v1
microk8s.kubectl scale deployment microbot --replicas=2

Pour exposer notre déploiement, nous devons créer un service:  

microk8s.kubectl expose deployment microbot --type=NodePort --port=80 --name=microbot-service

Après quelques minutes, notre cluster ressemble à ceci:

microk8s.kubectl get all --all-namespaces
NAMESPACE     NAME                                                  READY   STATUS    RESTARTS   AGE
default       pod/kubernetes-bootcamp-6f6656d949-p6w6j              1/1     Running   0          8m6s
default       pod/microbot-6d97548556-hn54j                         1/1     Running   0          30s
default       pod/microbot-6d97548556-qsd89                         1/1     Running   0          21s
default       pod/nginx                                             1/1     Running   0          11m
kube-system   pod/coredns-588fd544bf-45b68                          1/1     Running   0          21h
kube-system   pod/dashboard-metrics-scraper-db65b9c6f-j6ccc         1/1     Running   0          21h
kube-system   pod/heapster-v1.5.2-58fdbb6f4d-rv5kd                  4/4     Running   0          21h
kube-system   pod/hostpath-provisioner-75fdc8fccd-bvb4j             1/1     Running   0          67m
kube-system   pod/kubernetes-dashboard-67765b55f5-85rp7             1/1     Running   0          21h
kube-system   pod/monitoring-influxdb-grafana-v4-6dc675bf8c-9jvq2   2/2     Running   0          21h

NAMESPACE     NAME                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes                  ClusterIP   10.152.183.1     <none>        443/TCP                  4d22h
default       service/microbot-service            NodePort    10.152.183.87    <none>        80:30866/TCP             8s
kube-system   service/dashboard-metrics-scraper   ClusterIP   10.152.183.212   <none>        8000/TCP                 21h
kube-system   service/heapster                    ClusterIP   10.152.183.2     <none>        80/TCP                   21h
kube-system   service/kube-dns                    ClusterIP   10.152.183.10    <none>        53/UDP,53/TCP,9153/TCP   21h
kube-system   service/kubernetes-dashboard        ClusterIP   10.152.183.177   <none>        443/TCP                  21h
kube-system   service/monitoring-grafana          ClusterIP   10.152.183.37    <none>        80/TCP                   21h
kube-system   service/monitoring-influxdb         ClusterIP   10.152.183.70    <none>        8083/TCP,8086/TCP        21h

NAMESPACE     NAME                                             READY   UP-TO-DATE   AVAILABLE   AGE
default       deployment.apps/kubernetes-bootcamp              1/1     1            1           8m7s
default       deployment.apps/microbot                         2/2     2            2           30s
kube-system   deployment.apps/coredns                          1/1     1            1           21h
kube-system   deployment.apps/dashboard-metrics-scraper        1/1     1            1           21h
kube-system   deployment.apps/heapster-v1.5.2                  1/1     1            1           21h
kube-system   deployment.apps/hostpath-provisioner             1/1     1            1           67m
kube-system   deployment.apps/kubernetes-dashboard             1/1     1            1           21h
kube-system   deployment.apps/monitoring-influxdb-grafana-v4   1/1     1            1           21h

NAMESPACE     NAME                                                        DESIRED   CURRENT   READY   AGE
default       replicaset.apps/kubernetes-bootcamp-6f6656d949              1         1         1       8m6s
default       replicaset.apps/microbot-6d97548556                         2         2         2       30s
kube-system   replicaset.apps/coredns-588fd544bf                          1         1         1       21h
kube-system   replicaset.apps/dashboard-metrics-scraper-db65b9c6f         1         1         1       21h
kube-system   replicaset.apps/heapster-v1.5.2-58fdbb6f4d                  1         1         1       21h
kube-system   replicaset.apps/hostpath-provisioner-75fdc8fccd             1         1         1       67m
kube-system   replicaset.apps/kubernetes-dashboard-67765b55f5             1         1         1       21h
kube-system   replicaset.apps/monitoring-influxdb-grafana-v4-6dc675bf8c   1         1         1       21h

Tout en haut, nous avons les pods de microbot, le service microbot-service est le deuxième dans la liste des services. Notre service dispose d'un ClusterIP à travers lequel nous pouvons y accéder. Notez cependant que notre service est de type NodePort. Cela signifie que notre déploiement est également disponible sur un port de la machine hôte; ce port est sélectionné au hasard et dans ce cas, il se trouve être 30866.

Tout ce que nous devons faire est de pointer notre navigateur vers http://ipduserveur:30866.

Si vous souhaitez effacer MicroK8s, effacez d'abord le déploiement et le service Nginx avec la commande suivante:  

# microk8s.kubectl delete deployment xxxx 
# microk8s.kubectl delete service xxx

Ensuite, supprimez complètement MicroK8 de votre système avec la commande suivante:  

# microk8s.reset 
# snap remove microk8s