Redirection Ingress

Outils

Controller nginx

Un controller nginx peut être déployé comme n’importe quel autre déploiement dans k8s.
Il s’agit d’une version spéciale de nginx, construite spécialement pour être utilisée en tant que contrôleur dans k8s.
Notons que déployer un contrôleur se fait typiquement via Helm, la liste des étapes présentées ci-dessous ne sont que pour mieux comprendre ce qu’il se passe.

  1. Créer un namespace
    Pour isoler tous les objets ingress

    $ k create namespace ingress-nginx
    namespace/ingress-nginx created
    
  2. Créer un configmap
    Même s’il ne contient rien dans un premier temps, il permettra à terme de modifier les configurations de nginx si nécessaire — comme l’emplacement des logs d’erreur.

    $ k create configmap ingress-nginx-controller -n ingress-nginx
    configmap/ingress-nginx-controller created
    
  3. Créer deux comptes service
    Le contrôleur surveille le cluster k8s pour configurer le serveur nginx lorsque quelque chose change.
    Mais qu’il puisse le faire, il a besoin d’un compte service avec les bonnes permissions pour accéder à tous ces objets.

    $ k create serviceaccount ingress-nginx -n ingress-nginx
    serviceaccount/ingress-nginx created
    
    $ k create serviceaccount ingress-nginx-admission -n ingress-nginx
    serviceaccount/ingress-nginx-admission created
    

    Il est également nécessaire d’y associer les bons Roles, RoleBindings, ClusterRoles et ClusterRoleBindings

    $ k get roles -n ingress-nginx
    NAME                      CREATED AT
    ingress-nginx             2024-01-31T08:06:16Z
    ingress-nginx-admission   2024-01-31T08:06:16Z
    
    $ k get rolebindings -n ingress-nginx
    NAME                      ROLE                           AGE
    ingress-nginx             Role/ingress-nginx             2m9s
    ingress-nginx-admission   Role/ingress-nginx-admission   2m9s
    
  4. Créer le controller

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-ingress-controller
      namespace: ingress-nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          name: nginx-ingress
      template:
        metadata:
          labels:
            name: nginx-ingress
        spec:
          serviceAccountName: ingress-nginx
          containers:
            - name: nginx-ingress-controller
             image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.21.0
          args:
            - /nginx-ingress-controller
            - --configmap=${POD_NAMESPACE}/nginx-configuration
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE            
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          ports:
            - name: http
              containerPort: 80
            - name: https
              containerPort: 443
    
  5. Créer un service
    Pour exposer le controller au monde extérieur

    apiVersion: v1
    kind: Service
    metadata:
     name: ingress-nginx-controller
     namespace: ingress-nginx
    spec:
      type: NodePort
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
        name: http
      - port: 443
        targetPort: 443
        protocol: TCP
        name: https
      selector:
        name: nginx-ingress
    

Installation with Manifests


Ressources Ingress

Fichier de définition

Créer

Lister

$ k get ingress --all-namespaces
NAMESPACE   NAME                 CLASS    HOSTS   ADDRESS        PORTS   AGE
app-space   ingress-wear-watch   <none>   *       10.104.68.81   80      2m31s

Inspecter

$ k describe ingress -n app-space
Name:             ingress-wear-watch
Labels:           <none>
Namespace:        app-space
Address:          10.104.68.81
Ingress Class:    <none>
Default backend:  <default>
Rules:
 Host        Path  Backends
 ----        ----  --------
 *           
             /wear    wear-service:8080 (10.244.0.4:8080)
             /watch   video-service:8080 (10.244.0.5:8080)
Annotations:  nginx.ingress.kubernetes.io/rewrite-target: /
             nginx.ingress.kubernetes.io/ssl-redirect: false
Events:
 Type    Reason  Age                  From                      Message
 ----    ------  ----                 ----                      -------
 Normal  Sync    43s (x3 over 2m55s)  nginx-ingress-controller  Scheduled for sync

Exemple