Как настроить развертывание nginx для передачи трафика на развертывание внешнего интерфейса в Google Kubernetes Engine?

новичок в GKE и kubernetes, просто пытаясь запустить и запустить простой проект. Вот что я пытаюсь выполнить в GKE в одном кластере, пуле одного узла и одном пространстве имен:

Развертывание nginx за службой LoadBalancer, принимающей Http-трафик на порт 80, передавая его на порт 8000 на

внешнее развертывание (python Django) за службой ClusterIP, принимающей трафик на порт 8000.

Интерфейс уже успешно взаимодействует с StatefulSet, на котором запущена база данных Postgres. Интерфейс был замечен успешно обслуживающим Http (gunicorn) до того, как я переключил его службу с LoadBalancer на ClusterIP.

Я не знаю, как правильно настроить конфигурацию Nginx для передачи трафика службе ClusterIP для внешнего развертывания. То, что у меня есть, не работает.

Любые советы / предложения будут оценены. Вот установочные файлы:

nginx - и т.д. / nginx / conf.d / nginx.conf

upstream front-end {
    server front-end:8000;
}

server {

    listen 80;
    client_max_body_size 2M;

    location / {
        proxy_pass http://front-end;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location /static/ {
        alias /usr/src/app/static/;
    }

}

развертывание / обслуживание nginx

---
apiVersion: v1
kind: Service
metadata:
  name: "web-nginx"
  labels:
    app: "nginx"
spec:
  type: "LoadBalancer"
  ports:
  - port: 80
    name: "web"
  selector:
    app: "nginx"
---
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
  name: "nginx"
  namespace: "default"
  labels:
    app: "nginx"
spec:
  replicas: 1
  selector:
    matchLabels:
      app: "nginx"
  template:
    metadata:
      labels:
        app: "nginx"
    spec:
      containers:
      - name: "my-nginx"
        image: "us.gcr.io/my_repo/my_nginx_image"  # this is nginx:alpine + my staicfiles & nginx.conf
        ports:
        - containerPort: 80
        args:
        - /bin/sh 
        - -c
        - while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g "daemon off;"

внешнее развертывание / обслуживание

---
apiVersion: v1
kind: Service
metadata:
  name: "front-end"
  labels:
    app: "front-end"
spec:
  type: "ClusterIP"
  ports:
  - port: 8000
    name: "django"
    targetPort: 8000
  selector:
    app: "front-end"
---
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
  name: "front-end"
  namespace: "default"
  labels:
    app: "front-end"
spec:
  replicas: 1
  selector:
    matchLabels:
      app: "front-end"
  template:
    metadata:
      labels:
        app: "front-end"
    spec:
      containers:
      - name: "myApp"
        image: "us.gcr.io/my_repo/myApp"
        ports:
        - containerPort: 8000
        args:
          - /bin/sh 
          - -c
          - python manage.py migrate && gunicorn smokkr.wsgi:application --bind 0.0.0.0:8000
---

person konkrer    schedule 10.02.2020    source источник
comment
Взгляните на контроллеры Ingress kubernetes.io/docs/concepts/services- сети / не ограничивайте себя входящими данными по умолчанию. На мой взгляд, вам следует проверить как минимум контроллер входящего трафика Nginx cloud.google.com/community / tutorials / nginx-ingress-gke, Traefik containo.us/traefik и Istio istio.io. Кроме того, эта статья может быть полезной medium.com / @ vdboor /   -  person Serhii Rohoza    schedule 11.02.2020


Ответы (2)


Было бы лучше использовать ingress для перенаправления трафика на сервис в Kubernetes.

Дополнительную документацию можно найти здесь: https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nginx-ingress-with-cert-manager-on-digitalocean-kubernetes

В официальном документе Kubernetes: https://kubernetes.io/docs/concepts/services-networking/ingress/

Просто разверните контроллер nginx и примените правило nginx в бэкэнде, разверните nginx и преобразуйте правило YAML в nginx conf.

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /testpath
        backend:
          serviceName: test
          servicePort: 80
person Harsh Manvar    schedule 10.02.2020

Kubernetes Ingress - способ решить эту проблему. GKE за кулисами использует облачный балансировщик нагрузки Google для предоставления вашего входящего ресурса Kubernetes; поэтому, когда вы создаете объект Ingress, контроллер входа GKE создает балансировщик нагрузки Google Cloud HTTP (S) и настраивает его в соответствии с информацией в Ingress и связанных с ним службах.

Таким образом, вы получаете доступ к некоторым настраиваемым типам ресурсов от Google, таким как адреса ManagedCertificates и staticIP, которые могут быть связаны с входом в кубернетах для достижения балансировки нагрузки между службами или между клиентами и службами.

Следуйте документации здесь, чтобы понять, как настроить балансировку нагрузки HTTP (ов) с помощью GKE с использованием входящего трафика K8s - https://cloud.google.com/kubernetes-engine/docs/concepts/ingress

Этот учебник тоже действительно полезен -

https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer

person automaticAllDramatic    schedule 10.02.2020
comment
Спасибо за информативный пост. У меня все еще есть вопрос, как работать со статическими файлами, которые nginx собирался мне обслуживать. Я знаю, что одним из способов может быть ведро для хранения статических файлов, но я столкнулся с трудностями при доступе к некоторым файлам с помощью этого метода; хотя я пытался предоставить учетной записи службы все разрешения. Итак, теперь я использую nginx в том же модуле, что и мои внешние контейнеры, обслуживающие статические файлы. Это что-то нормально / нормально? Или мне следует настроить другую службу для nginx, просто обслуживающую статические файлы? Или мне просто нужно заставить работать облачное хранилище? - person konkrer; 11.02.2020
comment
Я бы честно добился того, чтобы облачное хранилище работало. Кроме того, может помочь дополнительная информация о том, почему вам нужно, чтобы Nginx обслуживал эти статические файлы. Если вы хотите достичь чего-то вроде CDN, то простое использование firebase для развертывания вашего внешнего приложения даст вам преимущества геолокации и сертификатов. Использование кубернетов для обслуживания внешнего приложения является излишним, однако, если у вас работает что-то вроде Meteor, где и ваши статические файлы, и ваша служба обслуживаются одной и той же базой кода, я бы предложил разделить службу с помощью докера и развернуть только это на k8s - person automaticAllDramatic; 14.02.2020