Protéger les sites k3s avec Let’s Encrypt
Le protocole HTTP, simple et efficace, a cependant un énorme défaut : toutes les informations envoyées sont “en clair”. Donc cela signifie qu’elles peuvent être interceptées et modifiées par des personnes plus ou moins bien intentionnées (pirates, gouvernements, fournisseurs d’accès…)
Pourquoi passer vos sites en HTTPS
Le protocole HTTPS, lui, résout ce problème en encryptant les données avec le TLS (Transport Layer Security). C’est pourquoi Google a décidé en 2014 de mettre en avant les sites hébergés en HTTPS dans ses algorithmes de calcul des SERP.
Installer Helm
Helm est un package manager soutenu et recommandé par Kubernetes. Helm permet de déployer des applications ou des stacks complètes en utilisant un système de templating et de dépendances.
Un package Kubernetes est appelé Charts dans Helm. Ces Charts contiennent les informations nécessaires pour créer une instance d’application Kubernetes. Ces informations sont stockées dans des configs. Une fois instancié sur un cluster son occurrence s’appelle une release.
Installer Helm sur Ubuntu:
Rien de plus simple avec snap:
sudo snap install helm --classic
Tiller est préinstallé dans k3s, il est donc inutile de l’installer. Il suffit juste de l’initialiser :
kubectl create serviceaccount tiller --namespace=kube-systemhelm repo updatekubectl create clusterrolebinding tiller-admin --serviceaccount=kube-system:tiller --clusterrole=cluster-adminhelm repo updatehelm init --service-account=tiller
Quelques commandes utiles
Voici quelques commandes de bases pour Helm :
helm install my-chart
Instancie un release de votre chart : my-chart avec comme nom de release aléatoire dans votre cluster kuberneteshelm upgrade my-release my-chart
Permet d’upgrade notre release avec une nouvelle version.helm ls``` ou ```helm list
Permet de lister les Charts installés sur votre Clusterhelm delete my-release
Permet de désinstaller la release my-release de kubernetes
Installation de Cert-manager sur k3s
Cert-manager est une stack complète permettant de créer à la volée vos certificats :
helm repo add jetstack https://charts.jetstack.io && helm repo updatekubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/v0.8.1/deploy/manifests/00-crds.yamlkubectl create namespace cert-managerkubectl label namespace cert-manager certmanager.k8s.io/disable-validation=truehelm install --name cert-manager --namespace cert-manager --version v0.8.1 jetstack/cert-manager --set ingressShim.defaultIssuerName=letsencrypt-prod --set ingressShim.defaultIssuerKind=ClusterIssuer
Création d’un certificate issuer
Copier ces lignes en modifiant les infos <a changer>
avec les vôtres dans un
fichier lets-encrypt-issuer.yml :
apiVersion: certmanager.k8s.io/v1alpha1kind: ClusterIssuermetadata: labels: name: letsencrypt-prod name: letsencrypt-prodspec: acme: email: EMAIL-ADDRESS http01: {} privateKeySecretRef: name: letsencrypt-prod server: https://acme-v02.api.letsencrypt.org/directory
Appliquons-le maintenant :
kubectl apply -f lets-encrypt-issuer.yml
Intégration dans vos ingress
Ajouter les informations suivantes au metadata
:
annotations: kubernetes.io/ingress.class: "traefik" certmanager.k8s.io/issuer: "letsencrypt-prod" certmanager.k8s.io/acme-challenge-type: http01 traefik.ingress.kubernetes.io/frontend-entry-points: http,https traefik.ingress.kubernetes.io/redirect-entry-point: https traefik.ingress.kubernetes.io/redirect-permanent: "true"
Ajouter également le certificat à la partie spec
en faisant attention à mettre
un secret unique si vous héberger plusieurs sites :
tls: - hosts: - www.stephane-robert.info secretName: secret-tls-www
Ce qui donne par exemple :
apiVersion: extensions/v1beta1kind: Ingressmetadata: annotations: certmanager.k8s.io/acme-challenge-type: http01 certmanager.k8s.io/issuer: letsencrypt-prod kubernetes.io/ingress.class: traefik traefik.ingress.kubernetes.io/frontend-entry-points: http,https traefik.ingress.kubernetes.io/redirect-entry-point: https traefik.ingress.kubernetes.io/redirect-permanent: "true" name: www-ingress namespace: defaultspec: rules: - host: www.stephane-robert.info http: paths: - backend: serviceName: blog servicePort: webport path: / tls: - hosts: - www.stephane-robert.info secretName: secret-tls-www
Il faut attendre un peu de temps que cert-manager génère le certificat. Vous pouvez vérifier les logs du pod :
kubectl -n cert-manager logs -f cert-manager-xxxxxxxxx-xxxxxx
En cas d’upgrade
Il vaut mieux tout rincer, car sinon lors de l’upgrade vous aurez des erreurs dans les logs et ça ne fonctionnera pas !
helm delete --purge cert-managerkubectl delete namespace cert-managerkubectl delete -f https://raw.githubusercontent.com/jetstack/cert-manager/v0.8.1/deploy/manifests/00-crds.yaml