Comment installer Kubernetes Cert-Manager et configurer Let’s Encrypt
Cert-Manager automatise le provisionnement des certificats au sein des clusters Kubernetes. Il fournit un ensemble de ressources personnalisées pour émettre des certificats et les attacher aux services.
L’un des cas d’utilisation les plus courants est la sécurisation des applications Web et des API avec des certificats SSL de Let’s Encrypt. Voici comment ajouter Cert-Manager à votre cluster, configurer un émetteur de certificat Let’s Encrypt et acquérir un certificat pour les pods exposés via une entrée.
Sommaire
Installation de Cert-Manager
Cert-Manager est le plus simple à installer avec Helm. Helm est un gestionnaire de packages Kubernetes qui vous permet d’ajouter des applications à votre cluster à l’aide de référentiels de graphiques prédéfinis. Assurez-vous que Helm est installé et configuré avec une connexion à votre cluster Kubernetes.
Commencez par ajouter le référentiel Jetstack à votre installation Helm. Jetstack a initialement développé Cert-Manager avant qu’il ne soit donné à la CNCF.
helm repo add jetstack https://charts.jetstack.io helm repo update
Installez maintenant Cert-Manager dans votre cluster :
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.5.3 --set installCRDs=true
Remplacez le numéro de version indiqué ci-dessus par la dernière version indiquée dans la documentation Cert-Manager.
La commande installera Cert-Manager dans un nouvel espace de noms Kubernetes appelé cert-manager
. Les installCRDs
Ce paramètre ajoutera les ressources Kubernetes personnalisées de Cert-Manager lors de l’installation. Cela ne fonctionne qu’avec la version 3.2 et plus récente de Helm – si vous utilisez une version plus ancienne, vous devez ajouter manuellement les définitions de ressources avec Kubectl :
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.crds.yaml
Ajout du plugin Kubectl
Cert-Manager dispose d’un plugin Kubectl qui simplifie certaines tâches de gestion courantes. Il vous permet également de vérifier si Cert-Manager est opérationnel et prêt à traiter les demandes.
Installez le plugin en téléchargeant son archive et en l’extrayant dans le bon répertoire :
curl -L -o kubectl-cert-manager.tar.gz https://github.com/jetstack/cert-manager/releases/latest/download/kubectl-cert_manager-linux-amd64.tar.gz tar xzf kubectl-cert-manager.tar.gz sudo mv kubectl-cert_manager /usr/local/bin
Utilisez maintenant le plugin pour vérifier que votre installation de Cert-Manager fonctionne :
kubectl cert-manager check api
Vous devriez voir la sortie suivante :
The cert-manager API is ready
Vous êtes maintenant prêt à ajouter un émetteur pour obtenir des certificats de Let’s Encrypt.
Création d’un émetteur de certificat
Les émetteurs et les émetteurs de cluster sont des ressources qui fournissent des certificats à votre cluster. L’installation de base de Cert-Manager créée jusqu’à présent est incapable d’émettre des certificats. L’ajout d’un émetteur configuré pour utiliser Let’s Encrypt vous permet d’acquérir dynamiquement de nouveaux certificats pour les services de votre cluster.
Créez un fichier YAML dans votre répertoire de travail et nommez-le issuer.yml
. Ajoutez le contenu suivant :
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-staging spec: acme: server: https://acme-staging-v02.api.letsencrypt.org/directory email: example@example.com privateKeySecretRef: name: letsencrypt-staging solvers: - http01: ingress: class: nginx
Vous devez remplacer l’adresse e-mail par votre propre e-mail de contact. Cela sera inclus dans vos certificats. Let’s Encrypt peut également vous envoyer un e-mail à l’adresse s’il a besoin de vous envoyer des alertes concernant vos certificats.
Nous créons un ClusterIssuer
car ils sont disponibles pour toutes les ressources de votre cluster, quel que soit l’espace de noms. Une référence Issuer
est une ressource d’espace de noms qui ne peut fournir des certificats que dans son propre espace de noms.
Notre configuration d’émetteur demande à Cert-Manager d’obtenir des certificats du serveur intermédiaire Let’s Encrypt. C’est une bonne idée d’utiliser l’environnement de transfert pendant que vous configurez votre intégration pour éviter d’atteindre les limites de taux de production strictes de Let’s Encrypt.
Utilisation kubectl
pour ajouter l’émetteur à votre cluster :
kubectl create -f issuer.yml
Obtenir un certificat
Vous pouvez désormais utiliser votre émetteur pour acquérir un certificat pour un service exposé via une ressource Ingress. Cert-Manager surveille automatiquement les ressources Ingress et crée des certificats en utilisant la configuration dans leur tls
champ. Il vous suffit d’ajouter une annotation qui nomme l’émetteur ou l’émetteur de cluster que vous souhaitez utiliser.
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: wordpress:latest ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: port: 80 --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: my-ingress annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: letsencrypt-staging spec: rules: - host: example.com http: paths: - path: / backend: serviceName: my-service servicePort: 80 tls: - hosts: - example.com
Ce fichier YAML définit un pod, un service et une entrée exposant le service. Il suppose l’utilisation de nginx-ingress
en tant que contrôleur d’entrée. Le Pod exécute un conteneur WordPress qui sera accessible via HTTPS à example.com
.
La présence du cert-manager.io/cluster-issuer
l’annotation dans la ressource Ingress sera détectée par Cert-Manager. Il utilisera le letsencrypt-staging
émetteur de cluster créé précédemment pour acquérir un certificat couvrant les noms d’hôtes définis dans l’Ingress’ tls.hosts
champ.
Utilisation de Let’s Encrypt en production
Une fois que vous avez acquis avec succès un certificat intermédiaire, vous pouvez migrer vers les serveurs de production Let’s Encrypt. Les certificats de mise en scène sont valides mais ne sont pas approuvés par les navigateurs, vous devez donc obtenir un remplacement de production avant de mettre votre site en ligne.
Il est préférable d’ajouter un émetteur de cluster distinct pour le serveur de production. Vous pouvez ensuite référencer l’émetteur approprié dans chacune de vos ressources Ingress, selon qu’elles sont prêtes pour la production.
Copiez la configuration de l’émetteur indiquée ci-dessus et modifiez le name
champs à letsencrypt-production
. Ensuite, remplacez l’URL du serveur par la valeur indiquée ci-dessous :
https://acme-v02.api.letsencrypt.org/directory
Créez le nouvel émetteur dans votre cluster :
kubectl create -f issuer-production.yml
Mettez à jour votre ressource Ingress pour demander un certificat de production en modifiant la valeur de cert-manager.io/cluster-issuer
annotation à letsencrypt-production
(ou le nom que vous avez attribué à votre propre émetteur de production). Utilisation kubectl
pour appliquer le changement :
kubectl apply -f my-ingress.yaml
Vous devriez maintenant avoir activé le HTTPS entièrement fonctionnel pour votre ressource Ingress. Cert-Manager gérera automatiquement vos certificats et les renouvellera avant leur expiration.
Mise à niveau de Cert-Manager
Les versions de Cert-Manager prennent généralement en charge les mises à niveau sur place avec Helm :
helm repo update helm upgrade --version <new version> cert-manager jetstack/cert-manager
Les certificats restent disponibles pendant les mises à niveau, mais le processus de renouvellement sera interrompu.
Bien que les mises à niveau soient maintenant normalement simples, vous devez toujours consulter les notes de version pour identifier les modifications potentielles que vous devez apporter. Ceci est particulièrement important si vous mettez à niveau Kubernetes ou passez à travers plusieurs versions de Cert-Manager. Si vous utilisez toujours une ancienne version de Kubernetes, vous utilisez peut-être une version obsolète de Cert-Manager qui nécessite une intervention manuelle importante pour être mise à jour.
Sommaire
Let’s Encrypt s’ajoute facilement à un cluster Kubernetes à l’aide de Cert-Manager. Vous devez installer Cert-Manager avec Helm, créer un émetteur qui utilise l’API Let’s Encrypt, puis référencer cet émetteur dans vos ressources Ingress.
Vous pouvez fournir à Cert-Manager votre propre configuration pour des cas d’utilisation plus avancés. Vous pouvez spécifier une durée de vie de certificat (utilisez le cert-manager.io/duration
Ingress annotation), déclarez manuellement le nom commun du certificat (cert-manager.io/common-name
) et utilisez les défis DNS au lieu de HTTP. Cette dernière option peut être utile dans des scénarios spécifiques, par exemple lorsque vous souhaitez acquérir un certificat générique.
Une utilisation simple pour protéger les applications Web et les API doit fonctionner en l’état en utilisant les ressources indiquées ci-dessus. La vérification HTTP fonctionne en manipulant le contrôleur d’entrée pour fournir un .well-known
URL à laquelle Let’s Encrypt peut accéder. Si votre domaine fournit la valeur correcte à cette URL, Let’s Encrypt estime que vous avez le contrôle et émet le certificat.