TP - Installer l'operateur Certmanager pour les certificats HTTPS
Nous aimerions héberger des sites proprement en HTTPS, mais pour cela nous avons besoin de pouvoir:
-
Exposer nos applications en HTTP sur des noms de domaines adéquats comme dans le TP monsterstack.
-
Configurer HTTPS pour authentifier et chiffrer la connection à nos applications. Pour cette partie nous avons besoin de générer des certificats d’authentification délivrés pas une authorité dont la plus pratique pour nous est letsencrypt qui permet de réclamer un certificat via un challenge automatique. Cette configuration est souvent réaliser dans kubernetes via l’opérateur Certmanager
A noter que vos serveurs VNC qui sont aussi désormais des clusters k3s ont déjà plusieurs sous-domaines configurés: <votrelogin>.<soudomaine>.dopl.uk et *.<votrelogin>.<soudomaine>.dopl.uk. Le sous domaine argocd.<login>.<soudomaine>.dopl.uk pointe donc déjà sur le serveur (Wildcard DNS).
Ce nom de domaine va nous permettre de générer un certificat HTTPS pour notre application web argoCD grâce à un ingress nginx, le cert-manager de k8s et letsencrypt (challenge HTTP101).
Si nécessaire : installer le ingress NGINX
Section titled “Si nécessaire : installer le ingress NGINX”Les TPs de ce supports utilisant cert-manager supposent que vous avez l’ingress nginx installé. Ils peuvent cependant fonctionner avec d’autres ingress directement ou avec de petites modifications.
Si ce n’est pas encore fait vous pouvez installer le ingress nginx selon votre plateforme
Dans le lab kube_tofu / hobby-kube
https://github.com/hobby-kube/guide#ingress-controller-setup
Dans k3s
Vérifier si le ingress nginx est déjà installé avant d’exécuter la ligne suivante.
-
Installer l’ingress nginx avec la commande:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.0/deploy/static/provider/cloud/deploy.yaml(pour autres méthodes ou problèmes voir : https://kubernetes.github.io/ingress-nginx/deploy/) -
Vérifiez l’installation avec
kubectl get svc -n ingress-nginx ingress-nginx-controller: le serviceingress-nginx-controllerdevrait avoir une IP externe
Installer Cert-manager
Section titled “Installer Cert-manager”-
Pour installer cert-manager lancez :
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.16.1/cert-manager.yaml -
Il faut maintenant créer une ressource de type
ClusterIssuerpour pourvoir émettre (to issue) des certificats. -
Créez une ressource comme suit (soit dans Lens avec
+soit dans un fichier à appliquer ensuite aveckubectl apply -f):
apiVersion: cert-manager.io/v1kind: ClusterIssuermetadata: name: letsencrypt-prodspec: acme: # You must replace this email address with your own. # Let's Encrypt will use this to contact you about expiring # certificates, and issues related to your account. email: cto@nomail.fr server: https://acme-v02.api.letsencrypt.org/directory privateKeySecretRef: # Secret resource that will be used to store the account's private key. name: letsencrypt-prod-account-key # Add a single challenge solver, HTTP01 using nginx solvers: - http01: ingress: class: nginxD’autres Issuers
Section titled “D’autres Issuers”Pour utiliser l’issuer précédent (challenge HTTP01 de letsencrypt) il faut que le cluster soit joignable sur une IP publique et que l’ingress nginx soit bien configuré.
Pour générer des certificats si ces requirements ne sont pas vérifiés on peut utiliser des certificats autosignés ou un challenge DNS letsrencrypt.
Self signed
Section titled “Self signed”Certificats autosignés créez la resource suivante:
apiVersion: cert-manager.io/v1kind: ClusterIssuermetadata: name: selfsignedspec: selfSigned: {}Challenge DNS avec l’api DigitalOcean
Section titled “Challenge DNS avec l’api DigitalOcean”Pour utiliser cet exemple tel que il faut un compte chez le fournisseur de cloud DigitalOcean et que le nom de domaine qu’on veut manipuler dans nos ingress avec certificats soit géré par DigitalOcean (ce qui est le cas d’un des auteurs de ce supports pour les TPs).
Pour utiliser d’autre formes de DNS challenges avec d’autres fournisseurs allez voir la documentation officielle de Cert Manager.
Créer un token dédié au DNS dans DigitalOcean et ajoutez à un secret comme suit (encodé avec base64 --encode "token")
apiVersion: v1kind: Secretmetadata: name: digitalocean-token namespace: cert-managerdata: # insert your DO access token here encoded in base64 access-token: "Y2hhlmdlX21lX3dphGhfdG9rZw4K"Ensuite on peut créer un Issuer ou ClusterIssuer avec
apiVersion: cert-manager.io/v1kind: ClusterIssuermetadata: name: acme-dns-issuer-prodspec: acme: # You can replace this email address with your own. # Let's Encrypt will use this to contact you about expiring # certificates, and issues related to your account. email: trucmuche@bidule.fr server: https://acme-v02.api.letsencrypt.org/directory privateKeySecretRef: # Secret resource that will be used to store the account's private key. name: letsencrypt-prod-account-key # Add a single challenge solver, HTTP01 using nginx solvers: - dns01: digitalocean: tokenSecretRef: name: digitalocean-token key: access-token