En quelques années, Kubernetes est devenu un incontournable pour l’orchestration de containers sous Linux, mais reste assez complexe à prendre en main. Le but de cet article est de montrer comment installer facilement son propre cluster Kubernetes sur une ferme de serveurs sous Debian 9 (stretch), grâce à kubeadm et flannel.

Prérequis

Pour ce tutorial, j’ai installé un cluster Kubernetes (version 1.9.3) sur 2 machines virtuelles chez OVH, de type VPS SSD 1, c’est-à-dire l’entrée de gamme avec 1 vCore, 2 GB de RAM et 10 GB de disque SSD.

Chaque VM tourne sous Debian 9 (stretch), sans aucune dépendance particulière installée. La procédure devrait fonctionner à l’identique sur des serveurs physiques, ou n’importe quel type de VM.

Le but est de configurer un noeud Kubernetes de type master (sur la VM vps01) et un noeud de type worker (sur la VM vps02), mais on peut très facilement rajouter autant de workers que nécessaire.

Installation de Doker

Sur les 2 machines, installer d’abord Docker en suivant la documentation officielle (commandes à lancer en root):

# apt-get install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common
# curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | # apt-key add -
# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian stretch stable"
# apt-get update
# apt-get install -y docker-ce

Installation de Kubernetes

Ensuite, il faut installer kubeadm sur chaque VM:

# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
# add-apt-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
# apt-get update
# apt-get install -y kubelet kubeadm kubectl

Puis sur la machine vps01, lancer kubeadm init pour initialiser le master, en choisissant l’adresse du réseau à utiliser pour les pods:

# kubeadm init --pod-network-cidr=10.244.0.0/16

Si tout se passe bien, vous devriez voir le message suivant:

You can now join any number of machines by running the following on each node
as root:

    kubeadm join --token 184...

Notez cette commande kubadm join ..., qui servira plus tard à ajouter les noeuds worker au cluster.

Pour pouvoir utiliser kubectl, copiez la configuration Kubernetes dans le HOME de votre compte utilisateur (pas root):

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

Pour finir la configuration du cluster, il faut installer un plugin pour configurer le réseau virtual utilisé par les pods. J’ai utilisé flannel, que l’on peut déployer comme ceci:

debian@vps001:~$ kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml

Si tout s’est bien passé, le cluster devrait être opérationnel en quelques minutes maximum:

debian@vps001:~$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                READY     STATUS    RESTARTS   AGE
kube-system   etcd-vps001                         1/1       Running   0          18m
kube-system   kube-apiserver-vps001               1/1       Running   0          18m
kube-system   kube-controller-manager-vps001      1/1       Running   0          18m
kube-system   kube-dns-6a4cd2bdf-df76v            3/3       Running   0          19m
kube-system   kube-flannel-ds-zrsw9               1/1       Running   0          1m
kube-system   kube-proxy-mhkh2                    1/1       Running   0          19m
kube-system   kube-scheduler-vps001               1/1       Running   0          18m

A ce stade, il suffit de lancer la commande kubeadm join --token ... notée précédemment sur les autres machines, pour ajouter les noeuds worker au cluster.

Installation du dashboard Kubernetes

Pour installer le dashboard:

debian@vps001:~$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

Puis créer un utilisateur admin-user:

debian@vps001:~$ cat admin-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system

debian@vps001:~$ kubectl create -f admin-user.yaml

debian@vps001:~$ cat admin-role.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system

debian@vps001:~$ kubectl apply -f admin-role.yaml

Pour vous connecter au dashboard, vous aurez besoin d’un token, que l’on peut afficher comme ceci:

debian@vps001:~$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
Name:         admin-user-token-vqsw4
...
Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsInR5cCI6....

Par défaut, le dashboard n’est pas accessible depuis l’extérieur, mais il est possible de s’y connecter en lançant un proxy dans un terminal:

debian@vps001:~$ kubectl proxy

Le proxy écoute sur 127.0.0.1:8001, donc vous pouvez par exemple créer un tunnel SSH pour vous y connecter depuis votre propre ordinateur:

$ ssh -L 8001:127.0.0.1:8001 debian@vps001

Et le dashboard est accessible à l’URL http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

Recopiez ensuite le token récupéré précédemment pour vous connecter. Et voilà !

Configurer le noeud master comme un worker

Par défaut Kubernetes ne lance pas de pod (autres que les pods système) sur le noeud master.

Il est possible de désactiver cette restriction avec la commande suivante:

debian@vps001:~$ kubectl taint nodes vps001 node-role.kubernetes.io/master-

Pour revenir au comportement par défaut:

debian@vps001:~$ kubectl taint nodes vps001 node-role.kubernetes.io/master=:NoSchedule

Configurer le monitoring avec Heapster

Heapster fournit un monitoring complet de votre cluster Kubernetes, grâce à InfluxDB et Grafana.

Pour installer Heapster:

debian@vps001:~$ git clone https://github.com/kubernetes/heapster.git
debian@vps001:~$ kubectl apply -f heapster/deploy/kube-config/influxdb/
debian@vps001:~$ kubectl apply -f heapster/deploy/kube-config/rbac/heapster-rbac.yaml

Et le dashboard est accessible à travers le proxy avec l’URL suivante: http://127.0.0.1:8001/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy/