Comment configurer Kubernetes en mode light avec MicroK8s et Snap sur Ubuntu 18.04

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 :
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