Deployer sur k3s avec skaffold
Il y a quelques mois, je vous montrais comment mettre en place un cluster kubernetes avec la version k3s de rancher. Je vous propose ici un tutoriel pour intégrer skaffold dans votre CI afin de publier automatiquement toutes modifications poussées dans votre repository gitlab.
Skaffold
-
Skaffold ↗ est avant tout un outil en ligne de commande qui permet à un développeur de gagner du temps en :
-
Construisant automatiquement les images Docker
-
Poussant les artefacts dans votre registries
-
En publiant le tout dans votre cluster Kubernetes
-
Détectant les changements de source pendant le développement
Vous pouvez utiliser directement Skaffold sur votre **poste de travail, et ce, sans aucune modification à apporter à votre cluster k3s.
Installation des prérequis
Dans un premier temps il vous faut un cluster k3s c’est par là : Installer un cluster Kubernetes avec sa version ultra-light K3S de Rancher
Il faut également une registry docker. Vous pouvez la mettre sur le premier nœud de votre cluster. C’est assez simple :
Si vous débutez sur docker je vous propose de lire ce billet : Introduction à Docker
docker run -d -p 5000:5000 --restart=always --name registry registry:2
Comme il s’agit d’une registry non sécurisée, pour pousser une image dessus il faudra sur les machines qui poussent vos images créer un fichier /etc/docker/daemon.json. Ajoutez ces lignes en remplaçant devbox par le nom de votre machine où est installé votre registry :
{ "insecure-registries": [ "devbox:5000" ]}
Faites un essai en poussant une image (en changeant le nom du serveur) :
docker pull alpinedocker tag alpine:latest devbox:5000/alpine:latestdocker push devbox:5000/alpine:latest
Il faut installer également sur votre poste de développement kubectl :
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
Installation de Skaffold
Comme pour kubectl c’est assez simple :
curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64 && \sudo install skaffold /usr/local/bin/
Un exemple
On va récupérer un exemple sur le repo du projet :
git clone https://github.com/GoogleCloudPlatform/skaffoldcd skaffold/examples/ruby
Pour prendre en main la déclaration skaffold, je vous conseille de parcourir tous les exemples fournis dans le dossier d’exemples.
Dans un premier temps lancez la commande skaffold init —force (pour surcharger le fichier existant)
Éditez-le et ajoutez le nom du serveur de la registry ainsi :
apiVersion: skaffold/v2beta10kind: Configmetadata: name: rubybuild: artifacts: - image: devbox:5000/ruby-example context: backend docker: dockerfile: Dockerfiledeploy: kubectl: manifests: - k8s/deployment.yaml
Dans la partie deploy on voit qu’il a trouvé le manifest kubernetes qu’il va falloir éditer pour modifier le nom de l’image. Comme auparavant on ajoute le nom de notre repository (ligne 28).
13 apiVersion: apps/v1 14 kind: Deployment 15 metadata: 16 name: ruby 17 spec: 18 selector: 19 matchLabels: 20 app: ruby 21 template: 22 metadata: 23 labels: 24 app: ruby 25 spec: 26 containers: 27 - name: ruby 28 image: devbox:5000/ruby-example
Vous pouvez lancer la commande suivante skaffold dev
.
Au bout d’un moment vous devriez avoir un message indiquant que le déploiement est stabilisé :
Deployments stabilized in 2.345243407sPress Ctrl+C to exitWatching for changes...- [ruby] Puma starting in single mode...- [ruby] * Version 4.3.5 (ruby 2.7.2-p137), codename: Mysterious Traveller- [ruby] * Min threads: 0, max threads: 16- [ruby] * Environment: development- [ruby] * Listening on tcp://0.0.0.0:9292- [ruby] Use Ctrl-C to stop
Si vous lancez les commandes kubectl get pod -A vous devriez voir les pods sur votre cluster :
default svclb-ruby-st54m 1/1 Running 0 3sdefault ruby-69d7fff547-fmtfk 1/1 Running 0 3s
Faites une simple modification dans un des fichiers de l’arborescence, skaffold le détecte et relance toute la chaîne.
Si vous faites control-C skaffold fais le ménage et les pods sont détruits. Si
on lance la commande skaffold run
il va lancer le build et le provisionnement
sans la partie debug. On va se servir de cela pour notre CI gitlab
Intégrer skaffold dans votre CI Gitlab
Il suffit de créer une tache de la manière suivante :
services: - docker:dind
stages: - build-mkdocs
build-mkdocs: tags: - devops stage: build-mkdocs script: - mkdir -p ${HOME}/.kube - echo ${KUBE_CONFIG} | base64 -d > config > ${HOME}/.kube/config - apk add --update --no-cache curl git - curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl - chmod +x ./kubectl - mv ./kubectl /usr/local/bin/kubectl - curl -Lo skaffold https://storage.googleapis.com/skaffold/builds/latest/skaffold-linux-amd64 - chmod +x skaffold - ./skaffold run --insecure-registry=clct02srv999p:5000 --cache-artifacts=false -d clct02srv999p:5000
Il vous faut juste un runner gitlab en mode docker sur lequel on accorde les privilèges et on monte le socket docker :
- [[runners]]... executor = "docker" [runners.custom_build_dir] [runners.cache] [runners.cache.s3] [runners.cache.gcs] [runners.cache.azure] [runners.docker] tls_verify = false image = "docker" privileged = true disable_entrypoint_overwrite = false oom_kill_disable = false disable_cache = false volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"] shm_size = 0
Magique non ?