Loading search data...

Deployer automatiquement 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 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 version non sécurisé, pour pousser une image dessus il faudra sur les machines qui poussent vos images créer un fichier /etc/docker/daemon.json et y mettre ceci en remplacant devbox par le nom de votre machine ou est installé cette registry :

{
  "insecure-registries": [
  "devbox:5000"
  ]
}

Faites un essai en poussant une image (en changeant le nom du serveur) :

docker pull alpine
docker tag alpine:latest devbox:5000/alpine:latest
docker push devbox:5000/alpine:latest

Il vous 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/skaffold
cd 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 lancer la commande skaffold init –force (pour surcharger le fichier existant)

Editez le et ajoutez le nom du serveur de la registry ainsi:

apiVersion: skaffold/v2beta10
kind: Config
metadata:
  name: ruby
build:
  artifacts:
  - image: devbox:5000/ruby-example
    context: backend
    docker:
      dockerfile: Dockerfile
deploy:
  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.345243407s
Press Ctrl+C to exit
Watching 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 lancer les commandes kubectl get pod -A vous devriez voir les pods sur votre cluster :

default       svclb-ruby-st54m                          1/1     Running     0          3s
default       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:

image: docker
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 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 ?


Alimenter un blog comme celui-ci est aussi passionnant que chronophage. En passant votre prochaine commande (n'importe quel autre article) via ce lien, je receverai une petite commission sans que cela ne vous coûte plus cher. Cela ne me permet pas de gagner ma vie, mais de couvrir les frais inhérents au fonctionnement du site. Merci donc à vous!

Mots clés :

devops, k3s, tutorials, kubernetes,

Autres Articles