web-dev-qa-db-fra.com

Kubernetes EKS Ingress et TLS

J'essaie d'accomplir une tâche TRÈS courante pour une application:

Attribuez un certificat et sécurisez-le avec TLS/HTTPS.

J'ai passé près d'une journée à parcourir la documentation et à essayer plusieurs tactiques différentes pour que cela fonctionne, mais rien ne fonctionne pour moi.

Initialement, j'ai configuré nginx-ingress sur EKS en utilisant Helm en suivant les documents ici: https://github.com/nginxinc/kubernetes-ingress . J'ai essayé de faire fonctionner l'exemple d'application (café) en utilisant la configuration suivante:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: cafe-ingress
spec:
  tls:
  - hosts:
    - cafe.example.com
    secretName: cafe-secret
  rules:
  - Host: cafe.example.com
    http:
      paths:
      - path: /tea
        backend:
          serviceName: tea-svc
          servicePort: 80
      - path: /coffee
        backend:
          serviceName: coffee-svc
          servicePort: 80

L'entrée et tous les services/déploiements pris en charge ont bien fonctionné, mais il manque une chose importante: l'entrée n'a pas d'adresse/ELB associée:

NAME           HOSTS                 ADDRESS   PORTS     AGE
cafe-ingress   cafe.example.com                80, 443   12h

Service LoadBalancers crée des ressources ELB, à savoir:

testnodeapp    LoadBalancer   172.20.4.161     a64b46f3588fe...   80:32107/TCP     13h

Cependant, Ingress ne crée pas d'adresse. Comment puis-je obtenir un contrôleur Ingress exposé en externe sur EKS pour gérer TLS/HTTPS?

9
Ken J

J'ai répliqué toutes les étapes nécessaires pour être opérationnel sur EKS avec une entrée sécurisée. J'espère que cela aide quiconque souhaite obtenir sa candidature sur EKS rapidement et en toute sécurité.

Pour être opérationnel sur EKS:

  1. Déployez EKS en utilisant le modèle CloudFormation ici : Gardez à l'esprit que j'ai restreint l'accès avec le CidrIp: 193.22.12.32/32. Modifiez cela en fonction de vos besoins.

  2. Installez les outils client. Suivez le guide ici .

  3. Configurez le client. Suivez le guide ici .
  4. Activez les nœuds de travail. Suivez le guide ici .

Vous pouvez vérifier que le cluster est opérationnel et vous le pointez en exécutant:

kubectl get svc

Vous lancez maintenant une application de test avec l'entrée nginx.

REMARQUE: Tout est placé sous l'espace de noms ingress-nginx. Idéalement, ce modèle devrait être construit sous différents espaces de noms, mais pour les besoins de cet exemple, cela fonctionne.

Déployez nginx-ingress:

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

Récupérez rbac.yml dans ici . Courir:

kubectl apply -f rbac.yml

Ayez un certificat et une clé prêts pour le test. Créez le secret nécessaire comme ceci:

kubectl create secret tls cafe-secret --key mycert.key --cert mycert.crt -n ingress-nginx

Copiez coffee.yml de ici . Copiez coffee-ingress.yml de ici . Mettez à jour le domaine sous lequel vous souhaitez l'exécuter. Exécutez-les comme ça

kubectl apply -f coffee.yaml
kubectl apply -f coffee-ingress.yaml

Mettez à jour le CNAME de votre domaine pour pointer vers l'ADRESSE pour:

kubectl get ing -n ingress-nginx -o wide

Actualisez le cache DNS et testez le domaine. Vous devriez obtenir une page sécurisée avec les statistiques de demande. J'ai répliqué cela plusieurs fois, donc si cela ne fonctionne pas pour vous, vérifiez les étapes, la configuration et le certificat. Vérifiez également les journaux du module nginx-ingress-controller *.

kubectl logs pod/nginx-ingress-controller-*********** -n ingress-nginx

Cela devrait vous donner une idée de ce qui ne va pas.

13
Ken J

Pour faire fonctionner un ressource Ingress , le cluster doit avoir un contrôleur Ingress configuré.

Ceci est différent des autres types de contrôleurs, qui s'exécutent généralement dans le cadre du binaire kube-controller-manager, et qui sont généralement démarrés automatiquement dans le cadre de la création d'un cluster.

Pour EKS avec barre , vous pouvez essayer:

helm registry install quay.io/coreos/alb-ingress-controller-helm

Ensuite, configurez la ressource Ingress:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: 'true'
spec:
  rules:
  - Host: YOUR_DOMAIN
    http:
      paths:
      - path: /
        backend:
          serviceName: ingress-example-test
          servicePort: 80
  tls:
  - secretName: custom-tls-cert
    hosts:
    - YOUR_DOMAIN

Appliquez la config:

kubectl create -f ingress.yaml

Ensuite, créez le secret avec les certificats TLS:

kubectl create secret tls custom-tls-cert --key /path/to/tls.key --cert /path/to/tls.crt

et référence à eux dans la définition Ingress:

tls:
  - secretName: custom-tls-cert
    hosts:
    - YOUR_DOMAIN

L'exemple de configuration suivant montre comment configurer le contrôleur Ingress:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  labels:
    k8s-app: nginx-ingress-controller
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: nginx-ingress-controller
  template:
    metadata:
      labels:
        k8s-app: nginx-ingress-controller
    spec:
      # hostNetwork makes it possible to use ipv6 and to preserve the source IP correctly regardless of docker configuration
      # however, it is not a hard dependency of the nginx-ingress-controller itself and it may cause issues if port 10254 already is taken on the Host
      # that said, since hostPort is broken on CNI (https://github.com/kubernetes/kubernetes/issues/31307) we have to use hostNetwork where CNI is used
      # like with kubeadm
      # hostNetwork: true
      terminationGracePeriodSeconds: 60
      containers:
      - image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.17.1
        name: nginx-ingress-controller
        readinessProbe:
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
        livenessProbe:
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          initialDelaySeconds: 10
          timeoutSeconds: 1
        ports:
        - containerPort: 80
          hostPort: 80
        - containerPort: 443
          hostPort: 443
        env:
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
        args:
        - /nginx-ingress-controller
        - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
        - --publish-service=$(POD_NAMESPACE)/nginx-ingress-lb

Ensuite, appliquez la configuration ci-dessus, puis vous pouvez vérifier les services pour les IP externes exposées:

kubectl get service nginx-controller -n kube-system

L'IP externe est une adresse qui se termine à l'un des nœuds Kubernetes tel que configuré par des mécanismes de routage configurés en externe. Lorsqu'il est configuré dans une définition de service, une fois qu'une demande atteint un nœud, le trafic est redirigé vers un point de terminaison de service.

Documentation de Kubernetes fournit plus d'exemples.

0
d0bry