Skip to content

Latest commit

 

History

History
178 lines (144 loc) · 5.4 KB

TP15.md

File metadata and controls

178 lines (144 loc) · 5.4 KB

Ingress Controler en HTTP et HTTPS

Ce TP se déroule sur un cluster DigitalOcean.

Sommaire

But du TP

Manipuler l'objet Ingress Controler pour publier en HTTP et HTTPS nos services internes. Nous utiliserons l'implémentation de NGINX qui fait référence. Cilium propose depuis récemment sa propre implémentation.

Etape 0 : Initialisation du numero de groupe

Positionner une variable qui contient votre numéro de groupe :

GRP=X
echo $GRP
X

Bien sûr utiliser la bonne valeur de X

Etape 1 : Installation d'un Ingress Controler via Helm

Commençons par installer localement le repo ingress-nginx

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

NB : si et seulement si helm n'est pas installé dans votre environnement, vous pouvez l'installer par :

wget -qO- https://get.helm.sh/helm-v3.14.2-linux-amd64.tar.gz | tar xvz -C /home/vscode/.local/bin/

Créeons le NameSpace dédié :

kubectl create namespace ingress-nginx

Puis déployons l'Ingress Controller, en précisant des annotations relaitves à DigitalOcean :

helm install ingress-nginx ingress-nginx/ingress-nginx \
  --namespace ingress-nginx \
  --set controller.publishService.enabled=true \
  --set-string controller.service.annotations."service\.beta\.kubernetes\.io/do-loadbalancer-name"="lb-groupe${GRP}"

Vous devez obtenir :

$ kubectl get service ingress-nginx-controller --namespace ingress-nginx
NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)                      AGE
ingress-nginx-controller   LoadBalancer   10.245.70.241   144.126.246.212   80:30343/TCP,443:31042/TCP   3m47s

NB : Un Load-Balancer frontal est toujours nécessaire, sa création est souvent implicite.

Etape 2 : Deploiement d'une règle Ingress (routage HTTP)

Déployons maintenant notre service de type ClusterIP qui pointe sur un Pod NGINX-DEMO, et la règle d'Ingress (Attention de bien modifier le nom du host dans le fichier ingress.yaml avec le bon numéro de groupe) :

sed "s/GRP/$GRP/" sol/ingress.tpl > sol/ingress.yaml
kubectl apply -f sol/ingress.yaml

Vérifions :

$ kubectl get ingress
NAME           CLASS   HOSTS               ADDRESS         PORTS   AGE
demo-ingress   nginx   groupeX.randco.eu   a.b.c.d   80      39s

Par ailleurs, assurons que la résolution DNS du site web soit correcte (tâche du formateur):

ping groupeX.randco.eu

Si tout est OK, la consultation du site http://groupeX.randco.eu doit être fonctionnelle : HTTP

Etape 3 : Publication en HTTPS

Ajoutons un générateur de certificats TLS motorisé par Let'sEncrypt, Cert-Manager:

helm repo add jetstack https://charts.jetstack.io

helm repo update

helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.12.0 \
  --set installCRDs=true

Maintenant, instançions CertManager:

## issuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: [email protected]
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
      - http01:
          ingress:
            ingressClassName: nginx
kubectl apply -f issuer.yaml

Modifions le fichier ingress.yaml (ne pas oublier de le ré-appliquer) en ajoutant :

  • une annotation relative au certificat issuer
  • en fin de fichier le nom TLS et le secret associé

**!! Attention à bien adapter le groupeX **

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  ingressClassName: nginx
  rules:
    - host: groupeX.randco.eu
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: demo-service
                port:
                  number: 80
  tls:
    - hosts:
       - groupeX.randco.eu
      secretName: groupeX.randco.eu-tls

Il ne reste plus qu'à visiter https://groupeX.randco.eu

HTTPS

Pour les plus curieux, voici quelques commandes qui permettent d'inspecter les états :

kubectl get clusterissuer
kubectl get certificate
kubectl get certificaterequests
kubectl get order
kubectl get challenge

Si vous souhaitez visualiser le contenu du secret (c-a-d la clé privée du certificat TLS) :

kubectl  get  secrets/letsencrypt-prod -ncert-manager -o json | jq '.data | map_values(@base64d)'

Revenir au sommaire | TP Suivant