Aller au contenu principal

Création d'Ingress avec traefik/k3s

· 3 minutes de lecture
Stéphane ROBERT
Consultant DevOps

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.

Cool ça fonctionne.