Как создать конечную точку https в Google Cloud с сервера на основе http для Kubernetes Engine? - PullRequest
1 голос
/ 10 марта 2020

Я пытался создать конечную точку HTTPS в среде Google Cloud K8s.

Я создал приложение flask в Python, которое работает в рабочей среде официанток через порт 5000.

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

Я создал файл docker и отправил его в облачный репозиторий Google. Затем создал кластер Kubernetes с одной рабочей нагрузкой, содержащей этот образ. После этого я показал это через внешний IP, создав LoadBalancer. (После отправки изображения в репозиторий Google все управляется через Google Cloud Console. У меня нет файла конфигурации, он должен быть через Google Cloud Console.)

Теперь у меня есть незащищенный IP и номер порта для доступа к моему приложению. Допустим, этот IP-адрес и порт: 11.111.11.222:1111. Теперь я могу получить доступ к этому IP через Почтальон и получить результат.

Моя цель состоит в том, чтобы реализовать, если это возможно, выставлять этот IP-адрес также через HTTPS, используя любые облачные ресурсы Google. (перенаправление, создание входа и т. д. c)

Итак, в конце я хочу обратиться к приложению через http://11.111.11.222:111 и https://11.111.11.222:111

Есть предложения?

Ответы [ 3 ]

0 голосов
/ 11 марта 2020

С точки зрения GKE вы можете попытаться настроить Ingress ресурс с включенным HTTPS:

Шаги:

  • Создать базу c flask приложение внутри модуля (только для примера)
  • Предоставление приложения через объект службы типа nodePort
  • Создание сертификата
  • Создание ресурса Ingress
  • Тест
  • Дополнительная информация (добавлено EDIT)

Создание приложения basi c flask внутри модуля (только для примера)

Ниже приведен скрипт flask, который будет отвечать <h1>Hello!</h1>:

from flask import Flask

app = Flask(__name__)
@app.route("/")

def index():
    return "<h1>Hello!</h1>"

if __name__ == "__main__":
    from waitress import serve
    serve(app, host="0.0.0.0", port=8080)

По умолчанию он будет отвечать на порт 8080.

Ссылка на ответ с приведенным выше сценарием.

Предоставление приложения через сервисный объект типа nodePort

Предполагая, что развертывание настроено правильно с работающим приложением внутри, вы можете предоставить его через сервисный объект типа nodePort со следующим YAML определение:

apiVersion: v1
kind: Service
metadata:
  name: flask-service
spec:
  type: NodePort
  selector:
    app: ubuntu
  ports:
  - name: flask-port 
    protocol: TCP
    port: 80
    targetPort: 8080 

Убедитесь, что:

  • selector настроен правильно
  • targetPort указывает на порт, на котором запущено приложение на

Создание сертификата

Для Ingress объекта для работы с HTTPS вам потребуется предоставить сертификат. Вы можете создать его с помощью официальной документации GKE по адресу: Cloud.google.com: управляемые сертификаты

Имейте в виду, что для этого вам потребуется доменное имя.

Создание ресурса Ingress

Ниже приведен пример ресурса Ingress, который будет направлять ваши запросы в ваше приложение flask:

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

Пожалуйста, укажите c посмотрите часть определения YAML ниже и измените соответственно вашему случаю:

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

Пожалуйста, подождите, пока все настроится правильно.

После этого у вас будет доступ к вашему приложению по domain.name с портами:

  • 80(http)
  • 443(https)

В настоящее время Ingress поддерживает только один порт TLS, 443, и предполагает завершение TLS.

- Kubernetes.io: Ingress TLS

Тест

Вы можете проверить, правильно ли сконфигурированы вышеупомянутые шаги:

  • , введя https://DOMAIN.NAME в вашем веб-браузере и проверив если он отвечает Hello с включенным HTTPS
  • с помощью инструмента curl -v https://DOMAIN.NAME.

Пожалуйста, дайте мне знать, если это решение работает для вас.

Дополнительная информация (добавлено EDIT)

Вы можете попытаться настроить объект службы типа LoadBalancer, который будет работать на уровне 4, как сказал @Florian в своем ответе.

Пожалуйста, обратитесь к официальной документации: Kubernetes.io: Создать внешний балансировщик нагрузки

Вы также можете использовать Nginx Ingress контроллер и либо:

0 голосов
/ 13 марта 2020

После исследования я нашел ответ в Google Cloud Run. Развернуть в контейнере приложение flask на основе HTTP очень просто. Как serve(app, host='0.0.0.0', port=5000, ipv6=False, threads=30) (в этой части нет необходимости в самосертификации или HTTPS, просто убедитесь, что приложение HTTP работает), а затем pu sh it Cloud Run.

Настройте параметры службы, в зависимости от того, сколько ресурсов вам нужно для ее запуска. В настройках машины укажите порт, который вы используете в контейнере docker для отображения. например, в моем случае это 5000. Когда вы создаете сервис, Google предоставляет вам адрес домена с HTTPS. Вы можете использовать этот URL и получить доступ к своим ресурсам.

Вот и все!

Для получения дополнительной информации о Cloud Run: https://cloud.google.com/serverless-options

Различия между вычислительными платформами: https://www.signalfx.com/blog/gcp-serverless-comparison/

0 голосов
/ 10 марта 2020

LoadBalancer переводит на балансировщик сетевой нагрузки. Для этого можно настроить несколько портов, например, 80 и 443. Затем ваше приложение должно обрабатывать часть TLS.

Входной ресурс создает HTTP (S) LB

...