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)
3 Réponses :
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
Du point de vue de GKE, vous pouvez essayer de configurer la ressource Ingress avec HTTPS activé:
Étapes:
nodePort 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.
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:
sélecteur est correctement configuré targetPort pointe vers le port sur lequel l'application s'exécute 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.
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.
Vous pouvez vérifier si les étapes ci-dessus sont correctement configurées par:
Bonjour avec HTTPS activé curl -v https://DOMAIN.NAME . Veuillez me faire savoir si cette solution fonctionne pour vous.
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:
SSL Passthrough configuré comme suit: Kubernetes.github.io: Ingress nginx: Ssl passthrough 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.
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/