Aller au contenu

Création d'Ingress avec traefik/k3s

logo

Certaines des applications de mon Home Lab Devops sont installées sur le cluster k3s mono-noeud et nécessitent donc de créer des Ingress pour y accéder. Nous allons voir comment les créer avec les certificats autosignés créés avec mkcert.

Nous allons prendre comme exemple celui permettant d’accéder à AWX.

Création du certificat wildcard avec mkcert

Plutôt que de créer autant de certificats que d’applications je vais utiliser un certificat wildcard, c’est-à-dire avec une ’*’. L’astuce, c’est de mettre le nom de domaine entre quote :

Terminal window
mkcert "*.robert.local"
Created a new certificate valid for the following names 📜
- "*.robert.local"
Reminder: X.509 wildcards only go one level deep, so this won't match a.b.robert.local ℹ️
The certificate is at "./_wildcard.robert.local.pem" and the key at "./_wildcard.robert.local-key.pem" ✅

Création du secret sur le cluster k3s.

Maintenant passons à la création du secret qui sera utilisé par les ingress.

Terminal window
kubectl config set-context --current --namespace=awx
kubectl create secret tls wildcard-tls-cert --key=_wildcard.robert.local+3-key.pem --cert=_wildcard.robert.local+3.pem

Création de l’ingress pour AWX

Passage du service en type ClusterIP

Dans ma première version d’installation j’utilisais des services avec un type NodePort, mais il faut les passer en type ClusterIP. Si AWX est déjà installé il suffit d’éditer l’opérateur et de modifier le service_type :

Terminal window
kubectl config set-context --current --namespace=awx
kubectl edit awxs.awx.ansible.com
route_tls_termination_mechanism: Edge
service_type: clusterip
task_privileged: false

Au bout de quelques secondes le service devrait être modifié avec le bon type :

Terminal window
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
awx-service ClusterIP 10.43.242.167 <none> 80/TCP 11d

Création de l’ingress

Créer un fichier awx-ingress.yml et déposez ce contenu :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
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: awx-ingress
namespace: awx
spec:
rules:
- host: awx.robert.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: awx-service
port:
number: 80
tls:
- hosts:
- awx.robert.local
secretName: wildcard-tls-cert

Changer le nom de domaine avec le vôtre. On applique :

Terminal window
kubectl apply -f awx-ingress.yml
ingress.networking.k8s.io/awx-ingress configured

Test dans un navigateur

Avant :

  • il faut ajouter le nom de domaine qui pointe sur l’adresse IP ou tourne k3s :

    • sur votre serveur DNS
    • dans le fichier hosts de la machine
  • il faut ajouter le certificat sur le poste pour cela allez dans le billet sur mkcert

Allez sur l’adresse https://aws.robert.local et vérifiez le certificat.

mkcert certificat ingress k3

Cool ça fonctionne.