Aller au contenu

Kind et Registry privé

logo kubernetes

Voici un petit billet, qui est plus un pense-bête, permettant de régler les problèmes de récupération d’images depuis une registry docker privé dans un cluster kubernetes monté avec kind.

Création du cluster

Avant de lancer la création du cluster, il faut créer ce fichier de configuration :

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
# This option mounts the host docker registry folder into
# the control-plane node, allowing containerd to access them.
extraMounts:
- containerPath: /usr/local/share/ca-certificates/mon-autorite.crt
hostPath: ./mon-autorite.crt
- containerPath: /etc/docker/certs.d/artefacts.robert.local/mon-autorite.crt
hostPath: ./mon-autorite.crt

En clair, on copie le certificat de mon autorité de certification dans le répertoire de config de docker et dans celui ou se fait l’ajout des certificats dans une distribution Ubuntu. Je n’ai trouvé dans la documentation de kind comment lancer une commande au moment de l’initialisation du cluster.

On peut enfin lancer la création du cluster. Au préalable, on installe kind avec asdf :

Terminal window
asdf plugin add kind
asdf install kind latest
asdf global kind latest
kind create cluster --config=cluster.yml
Creating cluster "kind" ...
Ensuring node image (kindest/node:v1.21.1) 🖼
Preparing nodes 📦
Writing configuration 📜
Starting control-plane 🕹️
Installing CNI 🔌
Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-kind

Maintenant, on doit lancer la mise à jour des certificats. Pour cela, on se connecte au conteneur kind :

Terminal window
docker exec -it kind-control-plane bash
root@kind-control-plane:/# update-ca-certificates
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
root@kind-control-plane:/#
exit

On applique un déploiement utilisant une image présente dans votre registry docker privé :

Terminal window
kubectl apply -f app-deployment.yml

On vérifie que tout se passe bien :

Terminal window
kubectl get events --all-namespaces --sort-by='.metadata.creationTimestamp'
default 14m Normal SuccessfulCreate replicaset/monimage-app-f9d65c69c Created pod: monimage-app-f9d65c69c-np8ff
default 14m Normal Scheduled pod/monimage-app-f9d65c69c-np8ff Successfully assigned default/monimage-app-f9d65c69c-np8ff to kind-control-plane
default 14m Normal Pulling pod/monimage-app-f9d65c69c-np8ff Pulling image "artefacts.robert.local/monimage-app:0.1"
default 14m Normal Scheduled pod/monimage-app-f9d65c69c-7h82p Successfully assigned default/monimage-app-f9d65c69c-7h82p to kind-control-plane
default 13m Normal Created pod/monimage-app-f9d65c69c-7h82p Created container monimage-app
default 13m Normal Started pod/monimage-app-f9d65c69c-7h82p Started container monimage-app
default 13m Normal Created pod/monimage-app-f9d65c69c-np8ff Created container monimage-app
default 13m Normal Pulled pod/monimage-app-f9d65c69c-7h82p Successfully pulled image "artefacts.robert.local/monimage-app:0.1" in 26.644923865s
default 13m Normal Started pod/monimage-app-f9d65c69c-np8ff Started container monimage-app
default 13m Normal Pulled pod/monimage-app-f9d65c69c-np8ff Successfully pulled image "artefacts.robert.local/monimage-app:0.1" in 26.204999781s

On installe k9s avec asdf et on vérifie que nos pods sont bien montés :

Terminal window
asdf plugin add k9s
asdf install k9s latest
asdf global k9s latest

Et voilà plus de soucis avec la registry privé :)