Nginx 复制时使用Http 504/502

Nginx 复制时使用Http 504/502,nginx,kubernetes,Nginx,Kubernetes,当我在多个pod上复制应用程序时,web应用程序将在使用NGINX负载平衡器时返回Http 504 NGINX负载平衡器位于K8集群之外,充当反向代理+负载平衡器。因此,NGINX将请求转发到一个节点,该节点承载web应用程序容器。重要提示:我不希望NGINX主机成为集群的一部分。(只要可以预防) 仅当且仅当应用程序已发布到1.1.1.1节点时,此配置才起作用。如果我也将web应用程序复制到2.2.2.2,那么上面的代码片段将导致504,即使2.2.2.2仍然被注释掉。评论中的2.2.2.2不会

当我在多个pod上复制应用程序时,web应用程序将在使用NGINX负载平衡器时返回Http 504

NGINX负载平衡器位于K8集群之外,充当反向代理+负载平衡器。因此,NGINX将请求转发到一个节点,该节点承载web应用程序容器。重要提示:我不希望NGINX主机成为集群的一部分。(只要可以预防)

仅当且仅当应用程序已发布到1.1.1.1节点时,此配置才起作用。如果我也将web应用程序复制到2.2.2.2,那么上面的代码片段将导致504,即使2.2.2.2仍然被注释掉。评论中的2.2.2.2不会改变任何东西

据我所知,NodePort是一个公共可用端口,映射到一个内部端口。(称为端口)因此,NodePort 30300将转发到2000,这也是web应用程序侦听的目标端口。复制后,第二个pod还将承载web应用(+微服务),并将自身暴露给NodePort 30300。所以我们在k8网络中有两个节点报告30300,我想这可能会导致混乱和路由问题

apiVersion: apps/v1
kind: Deployment
metadata:
  name: swiper-web
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: swiper

  template:
    metadata:
      labels:
        app: swiper
    spec:
      containers:
 
      - name: swiper-web-app-example
        image: docker.example.com/swiper.web.app.webapp:$(Build.BuildId)
        ports:
        - containerPort: 2000
        resources:
          limits:
            memory: "2.2G"
            cpu: "0.6"


      - name: swiper-web-api-oauth
        image: docker.example.com/swiper.web.api.oauth:$(Build.BuildId)
        ports:
        - containerPort: 2010
        resources:
          limits:
            memory: "100M"
            cpu: "0.1"

      imagePullSecrets:
      - name: regcred

      dnsPolicy: "None"
      dnsConfig:
        nameservers:
        - 8.8.8.8

---

apiVersion: v1
kind: Service
metadata:
  name: swiper-web-service
  namespace: default
spec:
  type: NodePort
  selector:
    app: swiper
  ports:
  - name: swiper-web-app-example
    port: 2000
    nodePort: 30300

  - name: swiper-web-api-oauth
    port: 2010

编辑:


externalTrafficPolicy:Local
添加到swiper web服务解决了这个问题。现在可以访问两个端点。但是其他微服务的负载平衡现在被禁用。

否…在为您的服务公开的所有k8s节点上只有一个nodePort 30300。你如何复制你的第二个吊舱?您是在部署时将副本设置为2还是以其他方式


在部署中将复制副本设置为2后。它将提供另一个吊舱。确保pod在单独的节点上运行,而不是所有的pod都在同一个k8s节点上运行。

问题非常简单。应用程序使用信号器按需获取数据。每个数据请求都可能在不同的节点上结束,从而导致中断连接状态。(HTTP 504/502)swiper web服务缺少sessionAffinity配置。将swiper web服务调整为以下内容可修复此问题

apiVersion: v1
kind: Service
metadata:
  name: swiper-web-service
  namespace: default
spec:
  type: NodePort
  selector:
    app: swiper
  ports:
  - name: swiper-web-app-example
    port: 2000
    nodePort: 30300

  - name: swiper-web-api-oauth
    port: 2010

  sessionAffinity: ClientIP
  externalTrafficPolicy: Cluster

我在部署中将副本设置为2,以便kubectl get service-l提供以下信息:
NodePort:swiper web app example 30300/TCP端点:10.244.1.23:2000,10.244.2.21:2000
每个节点都有一个pod,应用程序实例正在运行。我更新了yaml以避免进一步的误解。它是否可以直接访问?是的,但仅当副本设置为1时。如果将其设置为2,则会收到HTTP 504错误消息。更清楚地说,如果我将其设置为副本1,ofc将只能访问一个节点。(1.1.1.1或2.2.2.2)运行此命令以确认服务保留两个端点-kubectl Descripte svc swiper web service命令的输出
kubectl Descripte svc swiper web service
是我第一次到您的帖子<代码>10.244.1.23:2000,10.244.2.21:2000
apiVersion: v1
kind: Service
metadata:
  name: swiper-web-service
  namespace: default
spec:
  type: NodePort
  selector:
    app: swiper
  ports:
  - name: swiper-web-app-example
    port: 2000
    nodePort: 30300

  - name: swiper-web-api-oauth
    port: 2010

  sessionAffinity: ClientIP
  externalTrafficPolicy: Cluster