1
votes

Comment créer un point de terminaison https dans Google Cloud à partir d'un serveur basé sur http pour Kubernetes Engine?

J'ai essayé de créer un point de terminaison HTTPS dans l'environnement Google Cloud K8s.

J'ai créé une application flask en Python qui sert sur l'environnement de production des serveuses via le port 5000.

serve(app, host='0.0.0.0', port=5000, ipv6=False, threads=30)


0 commentaires

3 Réponses :


0
votes

Un LoadBalancer se traduit par un équilibreur de charge réseau. Vous pouvez configurer plusieurs ports pour cela, par exemple 80 et 443. Ensuite, votre application doit gérer la partie TLS.

La ressource d'entrée crée un HTTP (S) LB


0 commentaires

0
votes

Du point de vue de GKE, vous pouvez essayer de configurer la ressource Ingress avec HTTPS activé:

Étapes:

  • Créer une application flask de base dans un pod (à titre d'exemple uniquement)
  • Exposez une application via un objet de service de type nodePort
  • Créer un certificat
  • Créer une ressource Ingress
  • Test
  • Informations supplémentaires (ajoutées par EDIT)

Créez une application flask basique dans un pod (à titre d'exemple uniquement)

Voici un script flask qui répondra par

Hello!

:

    networking.gke.io/managed-certificates: flask-certificate 
    kubernetes.io/ingress.global-static-ip-name: flask-static-ip

Par défaut, il répondra sur le port 8080 .

Lien vers une réponse avec le script ci-dessus.

Exposez une application via un objet de service de type nodePort

En supposant que le déploiement est configuré correctement avec l'application de travail à l'intérieur, vous pouvez l'exposer via le type d'objet de service de nodePort avec la définition YAML suivante:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: flask-ingress
  annotations:
    networking.gke.io/managed-certificates: flask-certificate 
    kubernetes.io/ingress.global-static-ip-name: flask-static-ip
spec:
  rules:
  - host: DOMAIN.NAME
    http:
      paths:
      - path: /
        backend:
          serviceName: flask-service
          servicePort: flask-port

Veuillez vous assurer que:

  • Le sélecteur est correctement configuré
  • targetPort pointe vers le port sur lequel l'application s'exécute

Créer un certificat

Pour que l'objet Ingress fonctionne avec HTTPS , vous devrez fournir un certificat. Vous pouvez le créer avec la documentation officielle de GKE sur: Cloud.google. com: Certificats gérés

Sachez que vous aurez besoin d'un nom de domaine pour ce faire.

Créer une ressource Ingress

Voici un exemple de ressource Ingress qui dirigera vos requêtes vers votre application flask:

apiVersion: v1
kind: Service
metadata:
  name: flask-service
spec:
  type: NodePort
  selector:
    app: ubuntu
  ports:
  - name: flask-port 
    protocol: TCP
    port: 80
    targetPort: 8080 
  • 80(http)
  • 443(https)

Actuellement, Ingress ne prend en charge qu'un seul port TLS, 443, et suppose une terminaison TLS.

- Kubernetes.io: Ingress TLS p>

Test

Vous pouvez vérifier si les étapes ci-dessus sont correctement configurées par:

  • saisissez https://DOMAIN.NAME dans votre navigateur Web et vérifiez s'il répond par Bonjour avec HTTPS activé
  • à l'aide d'un outil curl -v https://DOMAIN.NAME .

Veuillez me faire savoir si cette solution fonctionne pour vous.

Informations supplémentaires (ajoutées par EDIT)

Vous pouvez essayer de configurer un objet de service de type LoadBalancer qui fonctionnera à la couche 4 comme @Florian l'a dit dans sa réponse.

Veuillez vous référer à la documentation officielle: Kubernetes.io: Créez un équilibreur de charge externe

Vous pouvez également utiliser contrôleur Nginx Ingress et soit:


5 commentaires

Je n'ai pas de nom de domaine. J'ai créé le certificat auto-signé juste pour reproduire la certification. J'ai changé toute mon application, fonctionnant sur gunicorn avec des paramètres de certificat. Lorsque j'exécute localement l'image docker (via l'adresse IP de ma machine), j'ai la connexion https et je peux obtenir la réponse. Mais lorsque je pousse la même image sur google., Il la convertit automatiquement en HTTP (j'utilise LoadBalancer pour l'exposer). Une idée pourquoi?


Vous pouvez essayer de déployer votre propre contrôleur Nginx Ingress en suivant: Nginx Installation d'entrée . Vous devrez modifier votre ressource Ingress pour ajouter kubernetes.io/ingress.class: "nginx et faire référence à: Nginx Ingress: SSL Passthrough


Revenons au problème avec LoadBalancer . Cela vous obligerait à publier des définitions YAML de tout ce qui est connecté à votre cas d'utilisation (déploiement, équilibrage de charge).


@Sojimanatsu J'ai mis à jour ma réponse. Jetez-y un œil. J'ai mis plus d'options pour exposer votre application.


Salut, @Dawid Kruk, j'ai trouvé une solution en changeant le serveur en gunicorn au lieu de serveuse et en ajoutant simplement un certificat auto-signé. Cependant, mon problème est que l'interface utilisateur donne une erreur pour l'erreur ERR_CERT_COMMON_NAME_INVALID. Merci pour votre aide et vos efforts, mais je n'ai pas utilisé votre solution. Google génère déjà ces fichiers YAML et je ne sais pas comment les modifier ou même devrais-je les modifier.



0
votes

Après mes recherches, j'ai trouvé la réponse dans Google Cloud Run. Il est très simple de déployer une application flask basée sur HTTP dans le conteneur. Comme serve (app, host = '0.0.0.0', port = 5000, ipv6 = False, threads = 30) (pas besoin d'auto-certificat ou HTTPS dans cette partie, assurez-vous simplement que le HTTP application fonctionne), puis poussez-le Cloud Run.

Ajustez les paramètres du service en fonction de la quantité de ressources dont vous avez besoin pour l'exécuter. Dans les paramètres de la machine, définissez le port que vous utilisez dans le conteneur Docker à mapper. par exemple, dans mon cas, c'est 5000 . Lorsque vous créez le service, Google vous fournit une adresse de domaine avec HTTPS. Vous pouvez utiliser cette URL et accéder à vos ressources.

C'est tout!

Pour plus d'informations sur Cloud Run: https://cloud.google.com/serverless-options

Les différences entre les plates-formes informatiques: https: / /www.signalfx.com/blog/gcp-serverless-comparison/


0 commentaires