Kubernetes mono-node avec ingress ☸️
Pour un ami, j’avais codé un bot Telegram et conteneurisé l’appli avec Docker. En réalité, c’était le début d’un long calvaire pour garder uniquement Docker et configurer un reverse proxy, car je suis trop mauvais pour ça.
À la place, j’ai installé k3s qui m’a permis d’avoir Kubernetes en single-node, c’est-à-dire sur une seule VM. Kubernetes permet d’orchestrer les conteneurs, et donc de résoudre pas mal de mes soucis.
Bannière "k3s" générée par Flux avec Perplexity
Comment s’y prendre
Ce tutoriel n’a rien de mirobolant. Mais j’ai fait ce tutoriel car k3s n’arrive pas avec toutes les fonctionnalités dont j’ai eu besoin. Voici comment faire.
- Avoir une VM sous Linux. 2 CPU et 2Go de RAM minimum feront l’affaire
- Avoir les ports 80 et 443 ouverts en TCP en inbound (NSG, firewall, iptables, ufw, en fonction de ce que vous avez)
- Installer Docker (sauf si containerD vous suffit)
- Installer k3s :
curl -sfL https://get.k3s.io | sh -
- Activer k3s au prochain redémarrage avec
sudo systemctl enable k3s
- Ajouter la ligne
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
à votre fichier “rc” (.bashrc, .zshrc, que sais-je)- Note : en cas de problème, vous pouvez agrandir les permissions du fichier k3s avec
sudo chmod 644 /etc/rancher/k3s/k3s.yaml
(pas recommandé)
- Note : en cas de problème, vous pouvez agrandir les permissions du fichier k3s avec
- Installer ingress-nginx pour vos ressources ingress (ici si vous passez par un cloud provider)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.3/deploy/static/provider/cloud/deploy.yaml
- Installer cert-manager pour activer HTTPS par la suite avec
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.1/cert-manager.yaml
- Installer MetalLB pour créer des LoadBalancer/Ingresses avec
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml
.yaml
qui suivent, vous pourrez les appliquer avec la commande kubectl apply -f monfichier.yaml
Configurer MetalLB
MetalLB doit pouvoir créer des LoadBalancer grâce à une liste d’IPs disponibles. Pour déterminer quelle rangée utiliser :
- lancer
hostname -I
- prendre une liste d’adresses qui ne touche pas les IPs listées.
Créer et appliquer le fichier metallb.yaml
:
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses:
- 10.0.0.240-10.0.0.250 # à adapter selon votre réseau
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2-advert
namespace: metallb-system
spec:
ipAddressPools:
- first-pool
Configurer Let’s Encrypt
Let’s Encrypt doit pouvoir certifier que vos noms de domaines vous appartiennent. Créer un fichier clusterissuer-letsencrypt.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: timothe@chauvet.cloud # à remplacer
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: traefik # remplacez si vous voulez nginx
Comme ça, si vous avez besoin d’un certificat, vous pourrez en créer un avec un fichier certificate-yourls.yaml
par exemple :
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: yourls-tls
namespace: default
spec:
secretName: yourls-tls
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- tmth.fr
Héberger mes applis
Mon bot Telegram
Pour mon bot Telegram, c’était plutôt simple car il n’a pas besoin de recevoir des requêtes HTTP. Un simple déploiement a suffi
apiVersion: apps/v1
kind: Deployment
metadata:
name: telebot
spec:
replicas: 1
selector:
matchLabels:
app: telebot
template:
metadata:
labels:
app: telebot
spec:
restartPolicy: Always
containers:
- name: telebot
image: ghcr.io/timothechauvet/telebot:latest
env:
- name: TELEGRAM_BOT_TOKEN
valueFrom:
secretKeyRef:
name: telebot-secrets
key: TELEGRAM_BOT_TOKEN
imagePullSecrets:
- name: ghcr-secret
Une appli HTTP
J’avais envie d’un racourcisseur d’URLs. Vous l’avez d’ailleurs sûrement inauguré en cliquant sur tmth.fr/k3s pour venir ici ! Yourls, que j’ai utilisé pour ça, a besoin d’une base MySQL. C’est ce qui a été le plus compliqué à mettre en place pour moi.
Pour Yourls, j’ai eu besoin de
- Un ConfigMap avec config.php
- Un Certificate pour mon domaine tmth.fr
- Un Ingress Traefik (je préfère ça car Nginx est fait pour les gens intelligents) 😭
- Le Service pour mapper avec l’Ingress
- Un PersistentVolume et son claim pour la base MySQL
- Le déploiement, bien évidemment.
Je pense que le plus important ici est l’Ingress qui crée les règles lorsqu’une requête vers tmth.fr est reçue
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: yourls-ingress
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
traefik.ingress.kubernetes.io/router.entrypoints: "web,websecure"
spec:
ingressClassName: traefik
tls:
- hosts:
- tmth.fr
secretName: yourls-tls
rules:
- host: tmth.fr
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: yourls
port:
number: 80
Je ne vais évidemment pas décrire ici TOUTES mes configurations.
Cependant !!
J’ai pris la peine de publier mes configurations que vous pouvez retrouver sur mon GitHub. Donc n’hésitez pas à les prendre comme exemple !
Si vous avez des questions ou des suggestions, n’hésitez pas à me contacter par mail, sur LinkedIn ou directement en envoyant une issue sur GitHub