Temps de lecture estimé: 3 minutes
Je continue sur ma lancée avec mes test pour revoir mon infra en utilisant Kubernetes. Mon cluster est installé et fonctionnel, j’ai un dashboard simple et efficace et j’ai appréhendé les bases de Kubernetes.
Maintenant pour aller un peu plus loin j’aimerais faire gérer mes certificats ssl tls Letsencrypt pour ensuite les injecter dans les pods de mes applications. dans cet article je vais donc créer un secret TLS avec un certificat Letsencrypt.
Généralités
Donc pour générer des certificats en bonne et due forme, j’utilise Letsencrypt.
après quelques recherches, Kubernetes permet de gérer en automatique avec Letsencrypt et cert-manager.
Ça a plusieurs avantages dont celui d’être automatique d’une part, d’injecter automatiquement les certificats, mais surtout, si j’ai bien compris, de recharger les pods automatiquement lorsque les certificats sont actualisés. (à confirmer, mais si j’en crois et si je comprends la documentation, ça serait aussi le cas avec une gestion manuelle)
plutôt pratique, mais…. je verrai plus tard dans un second temps.
Sur la documentation Letsencrypt des clients compatible, il y a aussi kcert. Mais idem que ci-dessus, je verrai, éventuellement plus tard.
Pourquoi? Tout d’abord pour ne pas rajouter directement une couche de complexité parce que j’aime comprendre ce qu’il se passe avant d’éventuellement automatiser et parce que cert-manager et kcert utilisent le challenge HTTP, qui ne permet pas d’avoir des certificats wildcards. sur mon serveur de production actuel, j’utilisais Letsencrypt avec un challenge DNS. Ce qui me permet de créer des certificats wildcard, valables pour mes domaines et tous leurs sous-domaines. Et j’ai aussi besoin des fichiers certificats pour d’autres utilisations. Donc, au moins dans un premier temps, je vais gérer mes certificats en dehors de l’écosystème Kubernetes et les injecter manuellement.
Réinstallation du client letsencrypt Certbot sur un nœud
mes certificats sont actuellement sur mon autre serveur. Je vais donc remettre en place la génération des certificats sur un de mes nœuds. Pour ça, j’en avais déjà parlé dans un précédent l’article Mise en place de certificat wildcard avec Letsencrypt et OVH.
voilà, maintenant que mes certificats sont générés et dispo dans /etc/letsencrypt/live/anthony-jacob.com/fullchain.pem et /etc/letsencrypt/live/anthony-jacob.com/privkey.pem
secret TLS kubernetes
pour « injecter » le certificat dans l’écosystème Kubernetes, il faut créer un secret.
pour plus de détail sur les secrets Kubernetes, ça se passe ici et pour connaitre les types de secrets possible, il y a une section Types of Secret (la documentation est aussi disponible en français, mais moins complète )
créer un secret TLS Kubernetes avec un certificat Letsencryp en ligne de commande
mes certificats ne sont pas accessibles à mon utilisateur, je dois donc utiliser sudo (donc utilisateur root, donc il doit avoir un fichier de config kubernetes /root/.kube/config pour accéder correctement au cluster)
sinon, c’est simple ça ressemble à
kubectl create secret tls my-tls-secret \
--cert=path/to/cert/file \
--key=path/to/key/file
et dans mon cas
sudo kubectl create secret tls anthony-jacob.com \
--key="/etc/letsencrypt/live/anthony-jacob.com/privkey.pem" \
--cert="/etc/letsencrypt/live/anthony-jacob.com/fullchain.pem"
le secret est bien créer, on peut le lister avec
kubectl get secret
ou avoir un peu plus d’info avec
kubectl describe secret anthony-jacob.com
et bien sûr pour le supprimer
kubectl delete secret anthony-jacob.com
Créer un secret TLS Kubernetes avec un certificat Letsencrypt avec un fichier de spécification Yaml
comme pour toutes les ressources Kubernetes, il est aussi possible de créer le secret TLS avec un fichier de spécification yaml.
apiVersion: v1
kind: Secret
metadata:
name: secret-tls
type: kubernetes.io/tls
data:
# the data is abbreviated in this example
tls.crt: |
MIIC2DCCAcCgAwIBAgIBATANBgkqh ...
tls.key: |
MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ ...
tls.crt et tls.key doivent être encodés en base64. dans mon cas je peux faire
sudo base64 /etc/letsencrypt/live/anthony-jacob.com/cert.pem
et ensuite copier coller le résultat.
ou plus simplement c’est de lancer là commande en spécifiant que c’est un essai –dry-run=client et en spécifiant le format de sortie yaml -o=yaml
sudo kubectl create secret tls anthony-jacob.com --key="/etc/letsencrypt/live/anthony-jacob.com/privkey.pem" --cert="/etc/letsencrypt/live/anthony-jacob.com/fullchain.pem" -n=certificates --dry-run=client -o=yaml
apiVersion: v1
data:
tls.crt: LS0tLS…
tls.key: LS0tLS…
kind: Secret
metadata:
name: anthony-jacob.com
namespace: certificates
type: kubernetes.io/tls
(j’en ai profité pour le placer dans un namespace que j’ai préalablement créé)
Voilà, mon certificat est maintenant créé dans mon cluster Kubernetes. Je n’aurais plus qu’à les injectés dans mes déploiements pour servir des applications sécurisées.
en attendant je te dis à bientôt dans de nouvelles aventures!!!
Bonjour,
Je suis dans la même démarche que toi (sous k3s) mais j’ai rapidement laissé la gestion par défaut et pris le parti de laisser mon load balancer gérer tout ça, permettant par la même occasion de mettre une VIP en place pur gérer un accès en fault tolérance sur chacun des noeuds et garder mon reverse vers mes services qui ne sont pas sur kub.
Bref comment gères tu le renouvellent du certificats sur ton secret et tes pods ?
Salut,
au final il y a eu les vacances et d’autre part j’ai dû avancer sur d’autres sujets.
Du coup je ne suis pas allé jusque là et j’ai migré plus rapidement tout sur Docker.
je n’ai pas pu expérimenter mais il y a ce point là
https://kubernetes.io/fr/docs/concepts/configuration/secret/#les-secrets-mont%C3%A9s-sont-mis-%C3%A0-jour-automatiquement