Exécuter Kubernetes localement

Le nom de kind provient de l'outil de base dind ou Docker dans Docker. De fait kind signifie en réalité Kubernetes dans Docker. Il s'agit d'un outil similaire à Minikube ou encore à Docker for Mac, permettant de simuler un environnement local de Kubernetes pour vos tests.

Commençons à être gentil.

Cet outil peut provisionner un cluster en moins d’une minute et est destiné à effectuer des tests d’intégration et de CI dans le cadre de votre pipeline de construction. Il peut toutefois être utile de faire en sorte que Kubernetes valide rapidement un chart Helm. La CLI est excellente, mais pour accéder aux clusters créés, vous devez copier les fichiers de configuration Kubernetes et utiliser les ports exposés sur la machine locale.  

Pré-requis

Contrairement aux environnements de développement précédents pour Kubernetes tels que Docker pour Mac ou Minikube, Docker est la seule exigence nécessaire sur votre système. Vous pouvez donc l'installer presque partout où vous pouvez installer Docker.  

C'est également une bonne expérience pour les développeurs car c'est la même chose sur MacOS, Linux et Windows.  Sur un hôte Linux ou une machine virtuelle Linux, saisissez

$ curl -sLS https://get.docker.com | sudo sh.  

Téléchargez Docker Desktop pour Windows ou Mac.  

Créez votre cluster

Installer kubectl

La commande kubectl est la CLI principale nécessaire au fonctionnement de Kubernetes.  Installer et configurer kubectl.

Installez Kind

Rendez-vous sur https://github.com/kubernetes-sigs/kind et suivez les instructions d'installation.

A savoir installer Kind avec Go via la commande :

MBP-de-admin:~ admin$ go get sigs.k8s.io/kind && kind create cluster
Creating cluster 'kind-1' ...
 ✓ Ensuring node image (kindest/node:v1.12.3) 🖼 
 ✓ [control-plane] Creating node container 📦 
 ✓ [control-plane] Fixing mounts 🗻 
 ✓ [control-plane] Starting systemd 🖥
 ✓ [control-plane] Waiting for docker to be ready 🐋 
 ✓ [control-plane] Pre-loading images 🐋 
 ✓ [control-plane] Creating the kubeadm config file ⛵ 
 ✓ [control-plane] Starting Kubernetes (this may take a minute) ☸ 
Cluster creation complete. You can now use the cluster with:

export KUBECONFIG="$(kind get kubeconfig-path --name="1")"
kubectl cluster-info

On installe donc Kind avec la commande :

go get sigs.k8s.io/kind

Et on crée un cluster avec :

kind create cluster --name xxx

Maintenant, il y a quelque chose que vous ne devez pas oublier si vous travaillez avec d'autres clusters distants. Toujours, toujours changer de contexte dans votre nouveau cluster avant d'apporter des modifications.

MBP-de-admin:~ admin$ export KUBECONFIG="$(kind get kubeconfig-path --name="1")"

Pour voir tous les clusters que vous avez créés, vous pouvez utiliser la commande get clusters.  Par exemple, supposons que vous créez deux clusters:

$ kind create cluster # Default cluster context name is "1".
...
$ kind create cluster --name 2

Lorsque vous listez vos clusters, vous verrez quelque chose comme ce qui suit:

$ kind get clusters
2
1

Ces deux clusters auront un fichier kubeconfig pour les accompagner:

$ kind get kubeconfig-path
/home/user/.kube/kind-config-1

$ kind get kubeconfig-path --name 2
/home/user/.kube/kind-config-2

Si vous avez créé un cluster avec kind create cluster, la suppression est également simple:  

$ kind delete cluster

Construire des images

Kind exécute un cluster Kubernetes local en utilisant les conteneurs Docker en tant que "nodes".

Kind utilise l'image de node pour exécuter des artefacts Kubernetes, tels que kubeadm ou kubelet. L'image de nœud est à son tour construite à partir de l'image de base, qui installe toutes les dépendances nécessaires à l'exécution de Docker et de Kubernetes dans un conteneur.

Actuellement, kind supporte trois manières différentes de construire une image de node: via apt, ou si vous avez la source Kubernetes sur votre machine hôte ($ GOPATH/src/k8s.io/kubernetes), en utilisant docker ou bazel.

Pour spécifier le type de construction, utilisez l'indicateur --type. kind utilisera par défaut le type de construction docker si aucun n'est spécifié.  

$ kind build node-image --type apt 

De même que pour la commande base-image, vous pouvez spécifier le nom et la balise de l’image de nœud obtenue à l’aide de la balise --image.  Si vous avez précédemment changé le nom et la balise de l'image de base, vous pouvez utiliser ici le drapeau --base-image pour spécifier le nom et la balise que vous avez utilisés.

Test in situ :

MBP-de-admin:~ admin$ kind build node-image --type apt
Warning: apt-key output should not be parsed (stdout is not a terminal)
OK
Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:2 https://download.docker.com/linux/ubuntu bionic InRelease [64.4 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security InRelease [83.2 kB]
Get:5 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages [3436 B]
Get:6 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:7 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Get:8 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [308 kB]
Get:9 http://archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages [13.5 kB]
Get:10 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1344 kB]
Get:4 https://packages.cloud.google.com/apt kubernetes-xenial InRelease [8993 B]
Get:11 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [138 kB]
Get:12 https://packages.cloud.google.com/apt kubernetes-xenial/main amd64 Packages [22.7 kB]
Get:13 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [1365 B]
Get:14 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [11.3 MB]
Get:15 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [186 kB]
Get:16 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [6933 B]
Get:17 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [905 kB]
Get:18 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [634 kB]
Get:19 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [10.7 kB]
Get:20 http://archive.ubuntu.com/ubuntu bionic-backports/universe amd64 Packages [3655 B]
Fetched 15.5 MB in 13s (1153 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  cri-tools kubernetes-cni
The following NEW packages will be installed:
  cri-tools kubeadm kubectl kubelet kubernetes-cni
0 upgraded, 5 newly installed, 0 to remove and 34 not upgraded.
Need to get 45.5 MB of archives.
After this operation, 263 MB of additional disk space will be used.
Get:1 https://packages.cloud.google.com/apt kubernetes-xenial/main amd64 cri-tools amd64 1.12.0-00 [5343 kB]
Get:2 https://packages.cloud.google.com/apt kubernetes-xenial/main amd64 kubernetes-cni amd64 0.6.0-00 [5910 kB]
Get:3 https://packages.cloud.google.com/apt kubernetes-xenial/main amd64 kubelet amd64 1.13.2-00 [19.0 MB]
Get:4 https://packages.cloud.google.com/apt kubernetes-xenial/main amd64 kubectl amd64 1.13.2-00 [7847 kB]
Get:5 https://packages.cloud.google.com/apt kubernetes-xenial/main amd64 kubeadm amd64 1.13.2-00 [7362 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 45.5 MB in 1min 11s (640 kB/s)
Selecting previously unselected package cri-tools.
(Reading database ... 8619 files and directories currently installed.)
Preparing to unpack .../cri-tools_1.12.0-00_amd64.deb ...
Unpacking cri-tools (1.12.0-00) ...
Selecting previously unselected package kubernetes-cni.
Preparing to unpack .../kubernetes-cni_0.6.0-00_amd64.deb ...
Unpacking kubernetes-cni (0.6.0-00) ...
Selecting previously unselected package kubelet.
Preparing to unpack .../kubelet_1.13.2-00_amd64.deb ...
Unpacking kubelet (1.13.2-00) ...
Selecting previously unselected package kubectl.
Preparing to unpack .../kubectl_1.13.2-00_amd64.deb ...
Unpacking kubectl (1.13.2-00) ...
Selecting previously unselected package kubeadm.
Preparing to unpack .../kubeadm_1.13.2-00_amd64.deb ...
Unpacking kubeadm (1.13.2-00) ...
Setting up kubernetes-cni (0.6.0-00) ...
Setting up cri-tools (1.12.0-00) ...
Setting up kubelet (1.13.2-00) ...
Created symlink /etc/systemd/system/multi-user.target.wants/kubelet.service → /lib/systemd/system/kubelet.service.
Setting up kubectl (1.13.2-00) ...
Setting up kubeadm (1.13.2-00) ...
Pulling: k8s.gcr.io/kube-apiserver:v1.13.2
Pulling: k8s.gcr.io/kube-controller-manager:v1.13.2
Pulling: k8s.gcr.io/kube-scheduler:v1.13.2
Pulling: k8s.gcr.io/kube-proxy:v1.13.2
Pulling: k8s.gcr.io/pause:3.1
Pulling: k8s.gcr.io/etcd:3.2.24
Pulling: k8s.gcr.io/coredns:1.2.6
sha256:d331101286a1e2639eedfb1a9ae9d09a6681e8b728ef83e46efcf1ae3f8c0390