我配置了一个 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 问题。