image de mise en avant pour l'article Kubernetes créer un secret TLS avec un certificat Letsencrypt

Kubernetes créer un secret TLS avec un certificat Letsencrypt

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!!!

Partagez l'article:
FacebookTwitterEmailLinkedIn

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.