Démarrer notre cluster kubernetes
Vous ne comprenez pas d'où vient ce billet ? Retrouvez sa première partie !
Configurez le master
Le master, c'est la machine qui va gérer le cluster. Pour ce tutoriel, nous n'allons utiliser qu'un seul master. Pas la peine de s'ennuyer à aller plus loin pour le moment. Sachez tout de même que c'est une mauvaise pratique : s'il se casse la figure, vous êtes dans la mouise.
Initialisation
Pour initialiser le master (k8smaster), pour faire comprendre à la VM que c'est elle la cheffe, tapez la commande suivante :
kubeadm init --pod-network-cidr=10.244.0.0/16
Elle va initialiser le cluster et lui assigner une plage d'IP privée.
Si vous avez bien suivi la première partie de ce tuto, vous devriez voir afficher les choses (tronquées) suivantes :
root@k8smaster:/home/dada# kubeadm init --pod-network-cidr=10.244.0.0/16
[init] using Kubernetes version: v1.12.2
[preflight] running pre-flight checks
[preflight/images] Pulling images required for setting up a Kubernetes cluster
[preflight/images] This might take a minute or two, depending on the speed of your internet connection
[preflight/images] You can also perform this action in beforehand using 'kubeadm config images pull'
[..]
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
Your Kubernetes master has initialized successfully!
Le message affirmant que le master est bien initialisé parle de lui-même : on est bon ! Ou presque. Il faut faire ce que la suite du message vous demande.
Configurez l'utilisateur qui aura le droit de jouer avec k8s
Notez que jongler entre k8s et docker peut-être épuisant : certaines commandes se jouent en root et d'autres en simple utilisateur. Pensez à changer d'utilisateur si rien ne se passe ou si le terminal vous insulte.
On enchaîne donc avec :
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
Je vous laisse placer le fichier de configuration du cluster dans la home de votre utilisateur classique.
Configurer le réseau du cluster
La suite du message d'initialisation :
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/
k8s se sert d'un pod pour gérer son réseau. Il en existe plusieurs et celui que j'ai réussi à faire marcher du premier coup s'appelle Flannel.
Pour l'installer :
dada@k8smaster:~$ kubectl apply -f https://github.com/coreos/flannel/raw/master/Documentation/kube-flannel.yml
Et le retour qui confirme que tout va bien :
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created
Il est temps de vous montrer une première commande k8s que vous allez passer votre vie à utiliser :
kubectl get pods --all-namespaces -o wide
Elle vous afficher le namespace, le nom, la quantité, le statut, l'âge, le node hôte, etc, des pods de votre cluster. Exemple :
dada@k8smaster:~$ kubectl get pods --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
kube-system coredns-576cbf47c7-84x8w 1/1 Running 0 11m 10.244.0.8 k8smaster <none>
kube-system coredns-576cbf47c7-v88p4 1/1 Running 0 11m 10.244.0.9 k8smaster <none>
kube-system etcd-k8smaster 1/1 Running 0 79s 192.168.0.19 k8smaster <none>
kube-system kube-apiserver-k8smaster 1/1 Running 0 79s 192.168.0.19 k8smaster <none>
kube-system kube-controller-manager-k8smaster 1/1 Running 0 79s 192.168.0.19 k8smaster <none>
kube-system kube-flannel-ds-amd64-vzrx8 1/1 Running 0 90s 192.168.0.19 k8smaster <none>
kube-system kube-proxy-nn7p2 1/1 Running 0 11m 192.168.0.19 k8smaster <none>
kube-system kube-scheduler-k8smaster 1/1 Running 0 78s 192.168.0.19 k8smaster <none>
Comme seul le master est actif, vous ne voyez pour le moment que les pods system (les trucs de base) de votre cluster sur le node master. Normal.
Ajouter un node dans le cluster
Votre cluster n'a qu'un master. Chiant. Est-on certain de n'avoir qu'un seul node dans ce cluster ?
dada@k8smaster:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster Ready master 23m v1.12.2
Oui, la commande get nodes le confirme. Ajoutons un peu d'action dans tout ça en lisant la fin du message d'initialisation :
You can now join any number of machines by running the following on each node
as root:
kubeadm join 192.168.0.19:6443 --token wdjnql.rm60fa90l0o9qv49 --discovery-token-ca-cert-hash sha256:ede807fb6f732c00acb8d40a891c436aedd3ed88f915135df252c033d55b2e10
Note : ne perdez pas la dernière ligne ! Il faudra reset votre cluster et ainsi tout perdre si vous ne la sauvegardez pas !
Allez lancer une autre VM, disons le k8snode1, et exécutez la commande de join. Si tout va bien, vous devriez avoir le message suivant :
root@k8snode1:/home/dada# kubeadm join 192.168.0.19:6443 --token wdjnql.rm60fa90l0o9qv49 --discovery-token-ca-cert-hash sha256:ede807fb6f732c00acb8d40a891c436aedd3ed88f915135df252c033d55b2e10Retournez taper la commande get nodes sur le master :
[preflight] running pre-flight checks
[discovery] Trying to connect to API Server "192.168.0.19:6443"
[discovery] Created cluster-info discovery client, requesting info from "https://192.168.0.19:6443"
[discovery] Requesting info from "https://192.168.0.19:6443" again to validate TLS against the pinned public key
[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "192.168.0.19:6443"
[discovery] Successfully established connection with API Server "192.168.0.19:6443"
[kubelet] Downloading configuration for the kubelet from the "kubelet-config-1.12" ConfigMap in the kube-system namespace
[kubelet] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[preflight] Activating the kubelet service
[tlsbootstrap] Waiting for the kubelet to perform the TLS Bootstrap...
[patchnode] Uploading the CRI Socket information "/var/run/dockershim.sock" to the Node API object "k8snode1" as an annotation
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 master to see this node join the cluster.
dada@k8smaster:~$ kubectl get nodesVous êtes deux !
NAME STATUS ROLES AGE VERSION
k8smaster Ready master 26m v1.12.2
k8snode1 Ready <none> 3m20s v1.12.2
Amusons-nous à voir ce qu'il vient de se passer au niveau des pods :
dada@k8smaster:~$ kubectl get pods --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
kube-system coredns-576cbf47c7-84x8w 1/1 Running 0 29m 10.244.0.8 k8smaster <none>
kube-system coredns-576cbf47c7-v88p4 1/1 Running 0 29m 10.244.0.9 k8smaster <none>
kube-system etcd-k8smaster 1/1 Running 0 19m 192.168.0.19 k8smaster <none>
kube-system kube-apiserver-k8smaster 1/1 Running 0 19m 192.168.0.19 k8smaster <none>
kube-system kube-controller-manager-k8smaster 1/1 Running 0 19m 192.168.0.19 k8smaster <none>
kube-system kube-flannel-ds-amd64-6qm8n 1/1 Running 0 6m57s 192.168.0.30 k8snode1 <none>
kube-system kube-flannel-ds-amd64-vzrx8 1/1 Running 0 19m 192.168.0.19 k8smaster <none>
kube-system kube-proxy-nn7p2 1/1 Running 0 29m 192.168.0.19 k8smaster <none>
kube-system kube-proxy-phfww 1/1 Running 0 6m57s 192.168.0.30 k8snode1 <none>
kube-system kube-scheduler-k8smaster 1/1 Running 0 19m 192.168.0.19 k8smaster <none>
Des pods se sont installés sur le k8snode1 ! Vous n'êtes plus seul avec votre master. Vous avez un copain !
Motivé ? Vous pouvez ajouter le node k8snode2 précédemment préparé dans le cluster, histoire de ne pas l'avoir fait chauffer pour rien. Si vous avez bien réussi votre coup, get nodes devrait vous répondre ceci :
dada@k8smaster:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster Ready master 41m v1.12.2
k8snode1 Ready <none> 18m v1.12.2
k8snode2 Ready <none> 6s v1.12.
Bien joué !
Ça ne marche pas comme prévu ?
Très rapide abécédaire des commandes que vous pouvez utiliser si ça coince :
- kubeadm reset -f : elle supprime toute la configuration du cluster du node sur laquelle elle est exécutée. Ça permet de repartir de zéro.
- kubectl delete node <nomdunode> : supprime le node passé en paramètre du cluster, en gardant sa configuration.
La suite ?
Affichez le dashboard de k8s, parce que de la couleur et une interface, c'est mieux.