Installer un executor kubernetes Gitlab sur un microk8s

Lecture 6 min. ‱


Table des matiĂšres

Bonjour à tous 😀

Aujourd’hui on va faire de l’automatisation et un peu de gitops; un chouille.

Je vous propose d’installer un runner gitlab en autoscale sur un cluster kubernetes via la distribution microk8s.

Il y a 12 mille mots incomprĂ©hensible lĂ , c’est quoi Gitlab ?

Gitlab est ce que je considùre comme une plateforme de gitops


Mais c’est quoi gitops?

Le gitops est un paradigme de travail qui s’appuie sur le merveilleux outils qu’est git (je vous ferai pas l’affront de vous expliquer git). Il permet au moyen d’observation d’évĂšnements relatifs Ă  git (push, merge, 
) d’automatiser des tĂąches, ce qui est Ă  la base de l’intĂ©gration continue (CI) et du dĂ©ploiement continue(CD).

L’idĂ©e est de rendre les choses les plus simples possibles aux dĂ©veloppeurs. Ils poussent leur code et des robots bossent pour s’assurer de la qualitĂ© du boulot et d’envoyer en production si les critĂšres de qualitĂ© sont respectĂ©s.

Sauf que pour ça il faut des robots, et bien les gitlab runners sont ces robots. Ils vont prendre les tĂąches et les rĂ©aliser. Il existe tout un tas de façons d’installer un runner (il peut d’ailleurs ĂȘtre local Ă  la machine du dev).

C’est bien mais ça a un dĂ©faut: ça ne s’adapte pas Ă  la charge de travail, si vous avez 3 tĂąches Ă  rĂ©aliser, il vous faudra 3 runners qui tournent quelque part. C’est pas pratique :/

C’est ici qu’entre en scĂšne l’exĂ©cutor kubernetes gitlab, il va prendre en charge la crĂ©ation et la destruction des runners aprĂšs utilisation, ce qui 
.

Oh! Doucement Simone! C’est quoi kubernetes ? Et t’as parlĂ© de microk8s dans le titre c’est quoi encore ça ?

Kubernetes est un produit initialement lancĂ© par google qui a fini par faire consensus dans la communautĂ© des dĂ©veloppeurs pour devenir la maniĂšre standard d’orchestrer des containers.

Vu que tu vas me poser la question, un container est une maniĂšre d’isoler un processus au sein d’un OS. Non ça n’a rien Ă  voir avec une VM. C’est plus une cage logiciel qu’autre chose. (pardon pour les puristes, je ferai un article plus dĂ©taillĂ© un jour).

Kubernetes va avoir pour rÎle de gérer le cycle de vie des ses containers et toutes ses I/O (systÚme de fichiers, réseaux).

On va donc faire tourner nos runners gitlab sous la forme de containers orchestrés par Kubernetes.

Mais Kubernetes c’est un peu comme linux, il y a plein de distributions faites par des Ă©diteurs diffĂ©rents. Pour le tuto on va utiliser une distribution appellĂ©e microk8s gĂ©rĂ©e par Canonical, la sociĂ©tĂ© derriĂšre Ubuntu.

C’est bon le titre est expliquĂ© ?

Ouais ça va, mais je te tiens à l’oeil 👀

Fantastique, on peut attaquer ! đŸ”„

Installer microk8s

Avant de faire quoi que se soit il nous faut une machine, j’ai choisi une Ubuntu 20.04 dans une droplet Digital Ocean.

Une fois connecté en ssh avec droits root.

snap install microk8s --classic

Puis

microk8s status --wait-ready

Si tout se passe bien vous devriez avoir en premiĂšre ligne:

microk8s is running

Si c’est bon, vous avez votre kubernetes, sinon vous reporter à la FAQ de microk8s.

On va démarrer plusieurs services sur notre cluster:

microk8s enable dashboard dns rbac

Petite explication:

Vous pouvez vérifier que tout marche avec

microk8s kubectl get all

Ce qui devrait renvoyer quelque chose comme:

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.152.183.1   <none>        443/TCP   6m47s

Maintenant on va configurer le dashboard.

Lors de l’installation des services une indication est apparue Ă  l’écran disant de se rendre Ă  l’adresse.

Et bien faisons ce qui est dit.

D’abord l’account service:

# L'utilisateur root
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
---
# Puis le cluster role binding qui va nous accorder les droits root sur le cluster.
apiVersion: rbac.authorization.k8s.io/v1
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

Vous enregistrez ceci dans fichier admin-dashbord.yml par exemple.

Puis vous appliquez les modifications au cluster.

microk8s kubectl apply -f admin-dashboard.yml

Et ça vous répond:

serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created

Il nous faut ensuite le token d’authentification associĂ© Ă  l’admin-user:

microk8s kubectl -n kube-system get secret $(microk8s kubectl -n kube-system get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"

Cela va vous cracher une chaine de caractĂšres:

eyJH.........

Stockez quelques part en sĂ©curitĂ© et pas en publique. Ce token est la clef pour faire n’importe quoi sur le cluster !!!

On démarre le dashboard:

microk8s dashboard-proxy

Rendez vous à l’IP de votre machine port 10443. https://localhost:10443 par exemple.

Choisissez bien jeton, rentrez le token de l’admin-user et connexion.

Si vous voyez ça:

Félicitations vous avez un cluster tout beau tout propre ! :D

Installer l’executor Gitlab sur le cluster

Si vous n’avez pas de compte sur Gitlab, vous pouvez en crĂ©er un c’est gratos.

Pour l’exemple je vais crĂ©er un projet et dedans dĂ©finir un fichier .gitlab-ci.yml.

Ce fichier permet de dĂ©clarer les opĂ©rations de gitops dont on parlait tout Ă  l’heure.

On va faire des choses stupides mais c’est pour la dĂ©mo.

image: busybox

stages:
- step1
- step2

job1:
    stage: step1
    script:
        - sleep 10

job2:
    stage: step2
    script:
        - sleep 10

job2:
    stage: step2
    script:
        - sleep 10

job3:
    stage: step2
    script:
        - sleep 10

job4:
    stage: step2
    script:
        - sleep 10

Tout d’abord on va dĂ©sactiver les runners partagĂ©s et ajouter notre cluster Kubernetes

Ignorez la pub, notre cluster est mieux 😝

On rĂ©cupĂšre d’abord le port de connexion de l’API de Kubernetes.

microk8s kubectl cluster-info | grep -E 'Kubernetes master|Kubernetes control plane' | awk '/http/
{print $NF}'

Ici j’ai le 16443

Dans le champ de “API URL”, vous allez donc par exemple mettre:

https://localhost:16443

Ensuite il nous faut un certificat que l’on va extraire des secrets du cluster.

microk8s kubectl get secrets

l’un d’eux devrait se nommer:

default-token-xxxx

Faites ensuite:

microk8s kubectl get secret <default-token-xxxx> -o jsonpath="{['data']['ca\.crt']}" | base64 --decode

ça devrait renvoyer un certificat:

-----BEGIN CERTIFICATE-----
MIID........
-----END CERTIFICATE-----

Copiez ce certificat dans le champ “CA Certificate”

On va ensuite se créer un deuxiÚme utilisateur admin pour gitlab:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: gitlab
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: gitlab-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: gitlab
    namespace: kube-system

Je l’ai enregistrĂ© dans gitlab-admin-service-account.yaml.

Appliquez les modifications.

microk8s kubectl apply -f gitlab-admin-service-account.yaml
serviceaccount/gitlab created
clusterrolebinding.rbac.authorization.k8s.io/gitlab-admin created

On récupÚre le token

microk8s kubectl -n kube-system get secret $(microk8s kubectl -n kube-system get sa/gitlab -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"

Et ce token vous le mettez dans le “Service Token”.

Le reste vous le laissez tel quel.

Puis “Add Kubernetes cluster” !

ça y est Gitlab et votre Cluster parlent ensemble!

Installons l’éxĂ©cutor Gitlab dessus.

Ceci ce fait dans l’onglet “Applications”

Descendez un peu vous verrez l’application “Gitlab Runner”. Cliquez sur “Install”

Au bout d’un petit moment ça aura fini de mouliner.

Rendez vous dans votre dashboard kubernetes.

Dans les espaces de noms vous devriez voir “gitlab-manages-apps”, si c’est le cas, FĂ©licitations c’est bon.

Et le runner gilab en lui mĂȘme.

Si vous retournez dans la définition des runners, vous allez le retrouver :)

Si vous lancez un pipeline, vous devriez voir quelque chose comme cela.

Tous les jobs de la “step2” sont en parallùles et vous n’avez qu’à mettre les pieds sous la table ! :D

Et voilĂ  !!

Conclusion

Beaucoup de configurations dans cet article!

J’espĂšre que vous avez pris autant de plaisir Ă  le lire que moi Ă  l’écrire.

Merci de m’avoir lu et à la prochaine <3