Aller au contenu principal

Kubernetes from scratch

Objectifs

  • intro kube
  • déployer des workloads/jobs/cronjobs sur l'infra
  • débugger ses workloads

Notes

La partie CI/CD/github-actions/docker ne sont pas abordés dans ce workshop.

Prérequis

⚠️ pour lancer k9s : k9s --context dev --namespace mon-namespace. Pour connaitre les namespaces auxquels vous avez accès, rdv sur rancher

Les outils

  • rancher : webapp de supervision de cluster
  • k9s : rancher en CLI
  • grafana : supervision technique et logs (loki)
  • kubectl : CLI pour communiquer avec une API kube, configuré par ~/.kube/config
  • Lens Desktop : un GUI pour superviser des clusters Kube

Étapes

Intro

Kube c'est un peu comme React, mais pour les déploiements : vous décrivez les ressources souhaitées (Déploiements, volumes, cronjobs, jobs...) dans des manifests (YAML ou JSON) qui respectent l'API kubernetes et les appliquez sur votre cluster, lequel se chargera de mettre en place vos services et de les maintenir en l'état. Lorsqu'on met à jour des manifests, Kube calcule un "diff" sur les ressources et "optimise" leur éventuel déploiement.

kubectl est le couteau-suisse standard qui permet d'interragir avec l'API de votre cluster :

# afficher les pods de mon namespace
kubectl --context dev --namespace my-ns get pods

# afficher les ressources d'un namespace
kubectl --context dev --namespace my-ns get deploy,pod,ingress,sealedsecret,secret,service,configmap

# logs d'un pod
kubectl --context dev --namespace my-ns logs [pod-name]

# appliquer des manifests
kubectl apply --context dev --namespace my-ns -f manifests.yaml

Chaque ressource kubernetes est définie par un manifeste particulier qu'on peut récupérer en ajoutant -ojson ou -oyaml à la commande kubectl.

Certains manifests sont chargés de créer d'autres manifests à la demande de kube. Par exemple, un SealedSecret génère un Secret, un Deployment génère un ou plusieurs Pod, et un CronJob déclenche des Job.

Pouvoir avoir un endoint HTTP accessible il faut à minima 3 manifests :

  • Ingress : routing HTTP, rate-limit, redirects, SSL...
  • Service : expose vos containers sur le réseau du cluster
  • Deployment : déploie un ou plusieurs containers sur le cluster

Exemple des manifests d'une app

Rancher permet d'inspecter le cluster via une web UI et k9s via un CLI.

👉 TODO : Explorer sur les deux clients

👉 TODO : Analyser les ressources disponibles

deploy d'un pod nu en pur kubernetes

Avant de pouvoir créer un pod, il faut déjà un créer un namespace sur le cluster :

Il est important de positionner la variable projectId en fonction de votre projet Rancher.

namespace.yml

apiVersion: v1
kind: Namespace
metadata:
name: my-namespace
annotations:
field.cattle.io/projectId: "c-gjtkk:p-z6nmd" # important pour les droits

Le projectId correspond à l'ID de votre projet dans rancher.

kubectl --context dev create -f namespace.yml

Un pod peut contenir un ou plusieurs containers et initContainers.

pod.yml

apiVersion: v1
kind: Pod
metadata:
name: rss-site
labels:
app: web
spec:
containers:
- name: pod1
image: nginx
ports:
- containerPort: 80

Ensuite on peut lui envoyer des ressources :

kubectl --context dev apply --namespace my-namespace -f pod.yml

Ajouter un service + ingress

service.yml

apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: web

ingress.yml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
labels:
app: web
name: my-ingress
spec:
rules:
- host: my-ingress.dev.fabrique.social.gouv.fr
http:
paths:
- backend:
service:
name: my-service
port:
name: http
path: /
pathType: Prefix
tls:
- hosts:
- my-ingress.dev.fabrique.social.gouv.fr
secretName: wildcard-crt
kubectl --context dev apply --namespace my-namespace -f service.yml
kubectl --context dev apply --namespace my-namespace -f ingress.yml

=> online sur https://my-ingress.dev.fabrique.social.gouv.fr/

NB: l'ingress peut recevoir nombre d'annotations (headers, sécu, rate-limit...) https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/

NB: Dans Kube, un Pod doit être géré par un Deployment qui gère son cycle de vie, replicas...

👉 TODO : Suivre la création du namespace

👉 TODO : Suivre la création du pod

👉 TODO : Ouvrir un shell sur le container

👉 TODO : regarder les logs et la perf dans grafana