Kubernetes:某些资产的 502 Bad Gateway - 使用 Nginx Ingress

Kubernetes:某些资产的 502 Bad Gateway - 使用 Nginx Ingress

我配置了一个 Kubernetes 集群,如下所示:

  • Webapp pod(每个容器内都有一个 Vue.js 和一个 API)
  • Nginx 入口配置(使用 default-http-backend)
  • 数据库 pod(这似乎不是这里的问题)
  • Kube lego(用于 SSL,位于单独的命名空间中)

无论如何,在我完成设置后,前端应用程序(即 Vue.js)没有加载任何样式,只有纯 HTML + JS。从 Firefox 打开“网络”选项卡时,我看到 CSS 文件中出现“502”错误。

仅供参考,这是我的 Vue.js 的 Dockerfile:

FROM node:lts-alpine

RUN npm install http-server -g

WORKDIR /app

# copy both 'package.json' and 'package-lock.json' (if available)
COPY package*.json ./

# install project dependencies
RUN npm install

# copy project files and folders to the current working directory (i.e. 'app' folder)
COPY . .
RUN npm run build

EXPOSE 8000
CMD [ "http-server", "dist", "-c-1", "-p", "8000" ]

以下是 Nginx Controller 的日志(来自kubectl logs [nginx-controller-pod]):https://pastebin.com/tBfPXJns(无法在这里发布因为它据称是垃圾邮件)。

大多数情况下,只有 CSS 和 .png 请求返回 502,而所有 JS 请求都会到达前端服务器。

我的入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx
  annotations:
    kubernetes.io/tls-acme: "true"
    kubernetes.io/ingress.class: "nginx"    
    nginx.ingress.kubernetes.io/proxy-body-size: 200m                        
    nginx.ingress.kubernetes.io/rewrite-target: /    
    nginx.ingress.kubernetes.io/server-snippet: |
      add_header 'Access-Control-Expose-Headers' 'access-token,expiry,token-type,uid,client,Access-Token,Expiry,Token-Type,Uid,Client';                                                                

spec:
  tls:
    - hosts:
        ~all-hosts~
      secretName: birthplace-ssl        
  rules:
    - host: api.example.com.br
      http:
        paths:         
         - path: /
           backend:
             serviceName: example-backend-service
             servicePort: 9292         
    - host: example.com.br
      http: &default
        paths:      
          - path: /
            backend:
              serviceName: example-frontend-service
              servicePort: 8000             
    - host: painel.example.com
      http: *default        
    - host: admin.example.com
      http: *default

我的部署 YAML 已针对这两项服务正确配置(即使用端口 8000 和 9292)

但奇怪的是,我可以通过正常的 GET(外部)请求访问这些资产中的任何一个。

附言 在原木上……

10.24.0.40 是 default-http-backend 的集群 IP。

10.24.1.3 是我的 Web 应用程序的 IP。

答案1

正如评论中提到的,您应该使用注释nginx.ingress.kubernetes.io/service-upstream: "true"

来自 nginx-ingress 文档:

服务上游

默认情况下,NGINX 入口控制器使用 NGINX 上游配置中的所有端点(Pod IP/端口)的列表。

nginx.ingress.kubernetes.io/service-upstream 注释禁用该行为,而是使用 NGINX 中的单个上游,即服务的集群 IP 和端口。

这对于零停机部署等情况来说可能是理想的,因为它减少了 Pod 启动和关闭时重新加载 NGINX 配置的需要。请参阅问题 #257。

这里是一个具有有效配置运行的 github 问题。

相关内容