Comment puis-je accéder au tableau de bord Kubernetes via un chemin personnalisé dans Amazon EKS ?

Lecture de 7 minute(s)
0

Je souhaite accéder au tableau de bord Kubernetes via un chemin personnalisé dans Amazon Elastic Kubernetes Service (Amazon EKS).

Brève description

Pour accéder au tableau de bord Kubernetes, vous devez effectuer les opérations suivantes :

1.    Créer ou utiliser un certificat auto-signé existant, puis le charger dans AWS Certificate Manager (ACM).

2.    Déploiement du contrôleur d'entrée NGINX et exposition de celui-ci en tant que service NodePort

3.    Créer un objet d'entrée pour le contrôleur d'entrée de l'Application Load Balancer. Demandez à l'objet Ingress de transmettre toutes les demandes provenant de l'équilibreur de charge d'application au NGINX Ingress Controller que vous déployez à l'aide d'un fichier manifeste.

4.    Déploiement du tableau de bord Kubernetes.

5.    Créer une entrée pour le contrôleur d'entrée NGINX.

Voici comment fonctionne la résolution :

1.    L'Application Load Balancer transmet tout le trafic entrant au contrôleur d'entrée NGINX.

2.    Le contrôleur d'entrée NGINX examine le modèle de chemin de la demande entrante (par exemple /custom-path/additionalcustompath).

3.    Le contrôleur d'entrée NGINX remplace l'URL par /additionalcustompath avant de transmettre la demande au service kubernetes-dashboard.

Remarque : Cette solution ne fonctionne pas sur les clusters exécutant des versions de kubernetes antérieures à 1.19.

Solution

Création ou utilisation d'un certificat auto-signé existant, puis chargement de celui-ci dans ACM

Si votre Application Load Balancer utilise un certificat ACM existant avec l'Application Load Balancer, passez à la section « Déploiement du contrôleur d'entrée NGINX et exposition de celui-ci en tant que service NodePort ».

Remarque : les étapes suivantes s'appliquent à l'Amazon Machine Image (AMI) Amazon Linux version 2018.03.

1.    Générez un certificat auto-signé à l'aide d'OpenSSL :

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout kube-dash-private.key -out kube-dash-public.crt

Important : fournissez un domaine complet qualifié pour Common Name. (nom commun) Application Load Balancer autorise uniquement l'attachement de certificats ACM comportant des noms de domaines complets à l'écouteur 443.

Le résultat est similaire à ce qui suit :

Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:kube-dashboard.com     ==>This is important
Email Address []:

3.    Installez l'AWS Command Line Interface (AWS CLI) et configurez les informations d'identification.

Remarque : si vous recevez des erreurs lors de l'exécution de commandes AWS CLI, assurez-vous d'utiliser la version la plus récente de l'AWS CLI.

4.    Chargez la clé privée et le certificat dans ACM dans votre région AWS :

aws acm import-certificate --certificate fileb://kube-dash-public.crt --private-key fileb://kube-dash-private.key --region us-east-1

Remarque : remplacez us-east-1 par le nom de votre région AWS.

Le résultat doit être similaire à ce qui suit :

{
"CertificateArn": "arn:aws:acm:us-east-1:your-account:certificate/your-certificate-id"
}

5.    Ouvrez la console ACM, puis vérifiez que le nom de domaine apparaît dans votre certificat ACM importé.

Remarque : si le nom de domaine n'apparaît pas dans la console ACM, la meilleur pratique consiste à recréer le certificat à l'aide d'un nom de domaine complet valide.

Déploiement du contrôleur d'entrée NGINX et exposition de celui-ci en tant que service NodePort

1.    Créez l'espace de noms ingress-nginx :

kubectl create ns ingress-nginx

2.    Installez Helm version 3.

3.    Utilisez Helm pour déployer le contrôleur d'entrée NGINX :

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --set controller.service.type=NodePort

Remarque : pour que le contrôleur nginx-ingress s'exécute sur des nœuds Fargate, définissez allowPrivilegeEscalation : false dans le déploiement « nginx-ingress-nginx-controller »

Créer un objet d'entrée pour le contrôleur d'entrée de l'Application Load Balancer

Créez un objet Ingress à l'aide d'un fichier manifeste. Demandez à l'objet Ingress de transmettre toutes les demandes du contrôleur d'entrée de l'équilibreur de charge d'application au contrôleur d'entrée NGINX que vous avez déployé précédemment.

1.    Déployez le contrôleur d'entrée de l'Application Load Balancer .

2.    Créez un objet d'entrée pour le contrôleur d'entrée de l'Application Load Balancer en vous basant sur le fichier alb-ingress.yaml suivant :

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: "alb-ingress"
  namespace: "ingress-nginx"
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:your-region:your-account-id:certificate/XXXX-XXXX-XXXX-XXXX-XXXXX
    alb.ingress.kubernetes.io/healthcheck-path: /dashboard/
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
  labels:
    app: dashboard
spec:
  ingressClassName: alb
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: ssl-redirect
            port:
              name: use-annotation
      - path: /
        pathType: Prefix
        backend:
          service:
            name: "nginx-ingress-nginx-controller"
            port:
              number: 80

Remarque : remplacez alb.ingress.kubernetes.io/certificate-arn par l'Amazon Resource Name (ARN) de votre certificat ACM. Pour Fargate, ajoutez « alb.ingress.kubernetes.io/target-type : ip » dans les annotations

Le fichier manifeste précédent comporte les annotations suivantes :

L'annotation « alb.ingress.kubernetes.io/scheme » permet de créer un Application Load Balancer accessible sur Internet. L'annotation « alb.ingress.kubernetes.io/certificate-arn » permet d'associer l'ARN du certificat ACM à l'écouteur 443 de l'Application Load Balancer. L'annotation « alb.ingress.kubernetes.io/listen-ports » permet de créer les écouteurs pour les ports 80 et 443. L'annotation « alb.ingress.kubernetes.io/actions.ssl-redirect » permet de rediriger toutes les demandes transmises aux ports 80 à 443. L'annotation « alb.ingress.kubernetes.io/healthcheck-path » permet de définir le chemin de vérification de l'état sur /dashboard/.

3.    Appliquez le fichier manifeste créé à l'étape 2 ci-dessus :

kubectl apply -f alb-ingress.yaml

Déploiement du tableau de bord Kubernetes

Pour déployer le tableau de bord Kubernetes, consultez Didacticiel : Déployer le tableau de bord Kubernetes (interface utilisateur Web).

Création d'une entrée pour le contrôleur d'entrée NGINX

1.    Créez une entrée pour le contrôleur d'entrée NGINX en vous basant sur le fichier ingress-dashboard.yaml suivant :

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dashboard
  namespace: kubernetes-dashboard
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite ^(/dashboard)$ $1/ redirect;
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /dashboard(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 443

Remarque : l'annotation « nginx.ingress.kubernetes.io/rewrite-target » permet de réécrire l'URL avant de transmettre la demande aux pods du backend. Dans le chemin /dashboard(/|$)(.*) pourpath, (.*), permet de stocker l'URL dynamique qui est générée lors de l'accès au tableau de bord Kubernetes. L'annotation « nginx.ingress.kubernetes.io/rewrite-target » permet de remplacer les données capturées dans l'URL avant de transmettre la demande au service kubernetes-dashboard. L'annotation « nginx.ingress.kubernetes.io/configuration-snippet » permet de réécrire l'URL pour ajouter une barre oblique de fin (« / ») uniquement si vous accédez à ALB-URL/dashboard.

2.    Appliquez le fichier manifeste ingress-dashboard.yaml :

kubectl apply -f ingress-dashboard.yaml

3.    Vérifiez l'URL de l'Application Load Balancer dans le champ ADDRESS (Adresse) du fichier alb-ingress que vous avez créé précédemment :

kubectl get ingress alb-ingress -n ingress-nginx

Vous pouvez désormais accéder au tableau de bord Kubernetes à l'aide de l'adresse ALB-URL/dashboard/. Si vous accédez à ALB-URL/dashboard, une barre oblique de fin (« / ») est automatiquement ajoutée à l'URL.

Suppression des ressources que vous avez créées précédemment

1.    Supprimez l'entrée pour le contrôleur d'entrée NGINX :

helm uninstall nginx -n ingress-nginx

2.    Supprimez les composants du tableau de bord Kubernetes et Metrics Server :

kubectl delete -f eks-admin-service-account.yaml
kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
kubectl delete -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml>

3.    Supprimez alb-ingress :

kubectl delete -f alb-ingress.yaml

Remarque : si vous avez créé des ressources AWS Identity and Access Management (IAM), vous pouvez supprimer le rôle IAM et la stratégie IAM.

4.    Supprimez le contrôleur de l'équilibreur de charge AWS :

helm uninstall aws-load-balancer-controller -n kube-system

5.    Supprimez l'espace de noms ingress-nginx :

kubectl delete ns ingress-nginx

6.    Pour supprimer le certificat ACM que vous avez créé, exécutez la commande suivante :

aws acm delete-certificate \
    --certificate-arn arn:aws:acm:us-east-1:your-account-id:certificate/XXXX-XXXX-XXXX-XXXX-XXXXX \
    --region us-east-1

Remarque : remplacez certificate-arn par l'ARN de votre certificat. Remplacez us-east-1 par votre région AWS. Remplacez your-account-id par l'ID de votre compte.


AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an