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/