【发布时间】:2021-01-25 21:23:09
【问题描述】:
我有一个使用 kubernetes ingress controller 部署到 kubernetes 的 Angular 应用程序。一种是单节点集群,另一种是多节点集群。两种设置都会出现 MIME 类型问题,但单节点可以非常快速地解决它,而在多节点上延迟是不可接受的。
在多节点集群上,第一个字节的时间大约需要 5 秒:
- 对 example.com 的初始调用
- runtime-es2015.js
- polyfills-es2015.js
- appConfig.json(自定义配置文件)
- favicon.ico
- 各种 png/svg 文件
在正常时间范围内有效的是:
- main-es2015.js
- scripts.js
- styles.css
- ng-validate.js
我的集群设置如下:
- 2 个控制平面节点
- 2 个工作节点
- 与运河的集群网络
- 集群是使用 RKE 设置的(如果重要的话)
Angular 应用中的index.html 包含:
<base href="/">
多节点入口:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: multi-node-ingress
namespace: non-default-namespace
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: example.com
http:
paths:
- path: /?(.*)
backend:
serviceName: ng-app-name
servicePort: 80
在我的 DNS 提供商处,我向两个工作节点添加了 A 条目,以将所有流量直接转发给它们。第 4 层没有进行负载平衡。
在来自 Open Shift 的 tutorial 的帮助下,我能够获得 .pcap 捕获,我可以在wireshark 中进行分析。 Content-Type 是 text/html 用于调用例如http://example.com/favicon.svg,这导致404 Not Found。然而,大约 5 秒后(永远不会低于该阈值),它有时会得到解决。
我的容器的 nginx-config 如下所示:
user nginx;
worker_processes auto;
...
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
server {
listen 80;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
gzip on;
}
}
我注意到,如果我删除 include /etc/nginx/mime.types; 行,页面加载将完全失败,并出现 Wrong MIME-Type 错误。但如果它存在,它需要大约 5.02 到 5.15 秒(从不低于 5 秒)才能找到资源。
github 上有一个issue 可能与我的问题有关,但问题是根本没有加载任何内容(错误的 MIME 类型)。我确实加载了页面,只是速度很慢。
上述 Github 问题的一个建议是添加自定义类型 module,这是我使用 Config Map 所做的:
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-configuration
namespace: ingress-nginx
data:
http-snippet: |
types {
text/javascript .js;
module .js;
}
default-type: application/octet-stream
类型被添加到入口控制器的 nginx.conf 中,但没有效果。
default-type 没有被拾取,仍然是text/html。
版本:
- Kubernetes 1.18
- 角 10
- nginx:1.19.3-alpine 用于在容器内托管 Angular 应用程序
【问题讨论】:
标签: angular nginx kubernetes nginx-ingress