【问题标题】:How to configure nginx deployment to pass traffic to front end deployment in Google Kubernetes Engine?如何配置 nginx 部署以将流量传递到 Google Kubernetes Engine 中的前端部署?
【发布时间】:2020-05-25 08:50:45
【问题描述】:

刚接触 GKE 和 kubernetes,只是想启动和运行一个简单的项目。以下是我在 GKE 中尝试在单个集群、单个节点池和单个命名空间中完成的任务:

LoadBalancer 服务后面的 nginx 部署在端口 80 上接受 Http 流量,将其通过端口 8000 传递到

ClusterIP 服务后面的前端部署(python Django)接受端口 8000 上的流量。

前端已经与运行 Postgres 数据库的 StatefulSet 成功通信。在我将其服务从 LoadBalancer 切换到 ClusterIP 之前,可以看到前端成功地服务于 Http (gunicorn)。

我不知道如何正确设置 Nginx 配置以将流量传递到 ClusterIP 服务以进行前端部署。我所拥有的不起作用。

任何意见/建议将不胜感激。以下是设置文件:

nginx - etc/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
---

【问题讨论】:

标签: nginx google-kubernetes-engine gke-networking


【解决方案1】:

最好使用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

【讨论】:

    【解决方案2】:

    Kubernetes 入口是解决此问题的方法。 GKE 在后台使用 Google 云负载均衡器来配置您的 Kubernetes 入口资源;因此,当您创建 Ingress 对象时,GKE 入口控制器会创建一个 Google Cloud HTTP(S) 负载平衡器,并根据 Ingress 及其关联服务中的信息对其进行配置。

    通过这种方式,您可以访问来自 Google 的一些自定义资源类型,例如 ManagedCertificatesstaticIP 地址,它们可以与 kubernetes 中的入口相关联,以实现服务之间或客户端与服务之间的负载平衡。

    按照此处的文档了解如何使用 GKE 使用 K8s 入口设置 HTTP(s) 负载平衡 - https://cloud.google.com/kubernetes-engine/docs/concepts/ingress

    这个教程也很有帮助 -

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

    【讨论】:

    • 感谢您提供信息丰富的帖子。我还有一个问题是如何处理 nginx 将为我服务的静态文件。我知道一种方法是静态文件的存储桶,但是我在使用这种方法访问某些文件时遇到了困难;尽管我尝试授予服务帐户所有权限。所以现在我在与提供静态文件的前端容器相同的 pod 中使用 nginx。这是正常/正常的吗?或者我应该为仅提供静态文件的 nginx 设置另一个服务?还是我应该让云存储正常运行?
    • 老实说,我会让云存储正常运行。此外,有关为什么需要 Nginx 提供这些静态文件的更多信息也会有所帮助。如果您想实现类似 CDN 的功能,那么只需使用 firebase 部署您的前端应用程序即可为您带来地理定位和证书的好处。使用 kubernetes 为前端应用程序提供服务是一种矫枉过正,但是,如果你有类似 Meteor 的东西在运行,而你的静态文件和服务都由相同的代码库提供服务,我建议使用 docker 分离服务并仅部署它k8s
    猜你喜欢
    • 1970-01-01
    • 2020-09-24
    • 2020-06-19
    • 2019-08-19
    • 2016-09-20
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多