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

Date de la dernière mise à jour : 06/04/2020

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

Courte 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éployer le contrôleur d'entrée NGINX et l'exposer en tant que service NodePort
  3. Créer un objet d'entrée pour le contrôleur d'entrée de l'équilibreur de charge d'application qui transmet toutes les demandes au contrôleur d'entrée NGINX, déployé antérieurement à l'aide d'un fichier manifeste
  4. Déployer le tableau de bord Kubernetes
  5. Créer une entrée pour le contrôleur d'entrée NGINX

Voici comment le processus se déroule :

  1. L'équilibreur de charge d'application transmet tout le trafic entrant au contrôleur d'entrée NGINX.
  2. Le contrôleur d'entrée NGINX examine le chemin de la demande entrante (par exemple, /custom-path/additonalcustompath).
  3. Le contrôleur d'entrée NGINX remplace l'URL par /additonalcustompath avant de transmettre la demande au service kubernetes-dashboard.

Solution

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

Si vous souhaitez utiliser un certificat ACM existant avec l'équilibreur de charge d'application, vous pouvez ignorer les étapes de cette section.

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

1.    Générez une clé privée à l'aide d'OpenSSL :

openssl genrsa 2048 > kube-dash-private.key

2.    Créez un certificat à l'aide de la clé générée à l'étape 1 :

openssl req -new -x509 -nodes -sha1 -days 3650 -extensions v3_ca -key kube-dash-private.key > kube-dash-public.crt

Important : assurez-vous de spécifier un domaine complet dans le champ Nom commun, dans la mesure où l'équilibreur de charge d'application autorise uniquement l'association de certificats ACM comportant des noms de domaine complets à l'écouteur 443.

Le résultat doit être 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' interface en ligne de commande AWS et configurez les identifiants.

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

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

Remarque : remplacez us-east-1 par 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é.

Astuce : si le nom de domaine n'apparaît pas dans la console ACM, recréez 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.    Déployez le contrôleur d'entrée NGINX :

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

2.    Pour exposer le contrôleur d'entrée NGINX en tant que service NodePort, créez un fichier ingress-controller-service.yaml en vous basant sur les éléments suivants :

kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  # this setting is to make sure the source IP address is preserved.
  type: NodePort
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: https

3.    Appliquez le fichier manifeste :

kubectl apply -f ingress-controller-service.yaml

Création d'un objet d'entrée pour le contrôleur d'entrée de l'équilibreur de charge d'application qui transmet toutes les demandes au contrôleur d'entrée NGINX, déployé antérieurement à l'aide d'un fichier manifeste

1.    Déployez le contrôleur d'entrée de l'équilibreur de charge d'application.

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

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: "alb-ingress"
  namespace: "ingress-nginx"
  annotations:
    kubernetes.io/ingress.class: alb
    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/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:
  rules:
    - http:
        paths:
          - path: /*
            backend:
              serviceName: ssl-redirect
              servicePort: use-annotation
          - path: /*
            backend:
              serviceName: "ingress-nginx"
              servicePort: 80

Remarque : remplacez la valeur « alb.ingress.kubernetes.io/certificate-arn » par l'ARN de votre certificat ACM.

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

A) L'annotation « alb.ingress.kubernetes.io/scheme » permet de créer un équilibreur de charge d'application sur Internet.
B) L'annotation « alb.ingress.kubernetes.io/certificate-arn » permet d'associer l'ARN du certificat ACM à l'écouteur 443 de l'équilibreur de charge d'application.
C) L'annotation « alb.ingress.kubernetes.io/listen-ports » permet de créer les écouteurs pour les ports 80 et 443.
D) L'annotation « alb.ingress.kubernetes.io/actions.ssl-redirect » permet de rediriger toutes les demandes transmises aux ports 80 à 443.

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

kubectl apply -f alb-ingress.yaml

Déploiement du tableau de bord Kubernetes

Pour déployer le tableau de bord Kubernetes, suivez les instructions du didacticiel Déploiement de l'interface Web Kubernetes (tableau de bord).

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: extensions/v1beta1
kind: Ingress
metadata:
  name: dashboard
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  namespace: kubernetes-dashboard
spec:
  rules:
  - http:
      paths:
      - path: /dashboard(/|$)(.*)
        backend:
          serviceName: kubernetes-dashboard
          servicePort: 443

Remarque : l'annotation « nginx.ingress.kubernetes.io/rewrite-target » permet de réécrire l'URL avant de transmettre la demande aux pods du serveur principal. Dans le chemin /dashboard(/|$)(.*), (.*) 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.

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

kubectl apply -f ingress-dashboard.yaml

3.    Vérifiez l'URL de l'équilibreur de charge d'application dans le champ ADDRESS 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/.

Important : pour que le tableau de bord soit accessible aux utilisateurs, ajoutez une barre oblique de fin à l'URL.

Remarque : les cibles de l'équilibreur de charge d'application signalent une anomalie dans la mesure où, par défaut, les vérifications de l'état de celui-ci sont effectuées via le chemin « / ». En outre, le code 200 est attendu. Cependant, le contrôleur d'entrée NGINX renvoie le code 404 car seul le chemin /dashboard(/|$)(.*) a été configuré. Les demandes sont toujours acheminées vers les cibles, ces dernières présentant toutes une anomalie.

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

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

kubectl delete -f ingress-dashboard.yaml

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 metrics-server-$DOWNLOAD_VERSION/deploy/1.8+/

3.    Supprimez les composants alb-ingress et alb-ingress-controller :

kubectl delete -f alb-ingress.yaml

kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.4/docs/examples/alb-ingress-controller.yaml

kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.4/docs/examples/rbac-role.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 service NodePort et le contrôleur d'entrée NGINX :

kubectl delete -f ingress-controller-service.yaml

kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

5.    Si vous avez créé un certificat ACM et que vous souhaitez le supprimer, 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.


Cet article vous a-t-il été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d’aide ?