Aller au contenu principal

Création d'Ingress avec traefik/k3s

· 3 minutes de lecture
Stéphane ROBERT

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 :

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.

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 :

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 :

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 :

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.