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.
Installation de Cert-Manager
Cert-Manager est 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 de Cert-Manager.
La commande installera Cert-Manager dans un nouvel espace de noms Kubernetes appelé cert-manager
. Les installCRDs
ajoutera les ressources Kubernetes personnalisées de Cert-Manager lors de l'installation. Cela ne fonctionne qu'avec la version 3.2 de Helm et les versions ultérieures. 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 à répondre aux 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 Cert-Manager fonctionne :
kubectl cert-manager check api
Vous devriez voir le résultat suivant :
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: [email protected] 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 doit 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. Un Issuer
standard est une ressource à 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 staging pendant que vous configurez votre intégration pour éviter d'atteindre les limites de taux de production strictes de Let's Encrypt.
Utilisez 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
domaine. Il vous suffit d'ajouter une annotation qui nomme l'émetteur ou l'émetteur du 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 sur 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 le tls.hosts
d'Ingress champ.
Utilisation de Let's Encrypt en production
Une fois que vous avez réussi à acquérir un certificat intermédiaire, vous pouvez migrer vers les serveurs de production Let's Encrypt. Les certificats intermédiaires sont valides mais non 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 ou non 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). Utilisez kubectl
pour appliquer la modification :
kubectl apply -f my-ingress.yaml
Vous devriez maintenant avoir activé HTTPS entièrement fonctionnel pour votre ressource Ingress. Cert-Manager gérera automatiquement vos certificats et les renouvellera avant leur expiration.
Mettre à niveau 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 désormais 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 si vous passez par 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 la mettre à jour.
Résumé
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 devrait fonctionner telle quelle en utilisant les ressources indiquées ci-dessus. La vérification HTTP fonctionne en manipulant le contrôleur Ingress pour fournir un .well-known
temporaire URL à laquelle Let's Encrypt peut accéder. Si votre domaine fournit la valeur correcte à cette URL, Let's Encrypt considère que vous avez le contrôle et émet le certificat.