voi*_*aft 1 nginx kubernetes kubernetes-ingress nginx-config nginx-ingress
我有一个问题,我正在 [主机名]/product/console 上部署一个应用程序,但是从 [主机名]/product/static 请求 .css .js 文件,因此它们没有被加载,我得到 404。
我已经尝试过nginx.ingress.kubernetes.io/rewrite-target:但没有成功。
我也尝试使用:nginx.ingress.kubernetes.io/location-snippet: |
location = /product/console/ {
proxy_pass http://[hostname]/product/static/;
}
但后者似乎根本没有被 nginx 控制器接收到。这是我的 ingress.yaml
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-resource
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/enable-rewrite-log: "true"
# nginx.ingress.kubernetes.io/rewrite-target: /$1
nginx.ingress.kubernetes.io/location-snippet: |
location = /product/console/ {
proxy_pass http://[hostname]/product/static/;
}
spec:
rules:
- host: {{.Values.HOSTNAME}}
http:
paths:
- path: /product/console
backend:
serviceName: product-svc
servicePort: prod ##25022
- path: /product/
backend:
serviceName: product-svc
servicePort: prod #25022
Run Code Online (Sandbox Code Playgroud)
-- 可以请教一下吗?我一直在尝试用谷歌搜索并尝试一些不同的变体,但我似乎做错了一些事情。谢谢!
长话短说
要诊断出现错误 404 的原因,您可以检查nginx-ingress控制器 Pod 日志。您可以使用以下命令来完成此操作:
kubectl logs -n ingress-nginx INGRESS_NGINX_CONTROLLER_POD_NAME
您应该得到与此类似的输出(取决于您的用例):
CLIENT_IP - - [12/May/2020:11:06:56 +0000] "GET / HTTP/1.1" 200 238 "-" "REDACTED" 430 0.003 [default-ubuntu-service-ubuntu-port] [] 10.48.0.13:8080 276 0.003 200
CLIENT_IP - - [12/May/2020:11:06:56 +0000] "GET /assets/styles/style.css HTTP/1.1" 200 22 "http://SERVER_IP/" "REDACTED" 348 0.002 [default-ubuntu-service-ubuntu-port] [] 10.48.0.13:8080 22 0.002 200
Run Code Online (Sandbox Code Playgroud)
通过上述日志,您可以检查控制器是否正确处理请求nginx-ingress以及请求发送到的位置。
您还可以检查Kubernetes.github.io: ingress-nginx: Ingress-path-matching。这是一个描述如何Ingress将路径与正则表达式匹配的文档。
Ingress您可以通过以下示例进行实验:
nginx-ingress控制器pod和一个serviceIngress资源nginx-ingress控制器nginx-ingress您可以按照官方文档部署您的控制器:
Kubernetes.github.io:Ingress-nginx
pod和一个service下面是一个 pod 和附加到它的服务的示例定义,它将用于测试目的:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ubuntu-deployment
spec:
selector:
matchLabels:
app: ubuntu
replicas: 1
template:
metadata:
labels:
app: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu
command:
- sleep
- "infinity"
---
apiVersion: v1
kind: Service
metadata:
name: ubuntu-service
spec:
selector:
app: ubuntu
ports:
- name: ubuntu-port
port: 8080
targetPort: 8080
nodePort: 30080
type: NodePort
Run Code Online (Sandbox Code Playgroud)
我创建了一个 basic index.htmlwith onecss来模拟请求过程。您需要在 pod 内创建此文件(手动或将它们复制到 pod)。
文件树如下所示:
索引.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="assets/styles/style.css">
<title>Document</title>
</head>
<body>
<h1>Hi</h1>
</body>
Run Code Online (Sandbox Code Playgroud)
请具体看一下一行:
<link rel="stylesheet" href="assets/styles/style.css">
Run Code Online (Sandbox Code Playgroud)
样式.css:
h1 {
color: red;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令运行上面的页面python:
$ apt update && apt install -y python3$ python3 -m http.server 8080index.html和assets文件夹的存储位置。Ingress资源Ingress下面是配置为使用控制器的示例资源nginx-ingress:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-ingress-example
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host:
http:
paths:
- path: /
backend:
serviceName: ubuntu-service
servicePort: ubuntu-port
Run Code Online (Sandbox Code Playgroud)
应用以上资源后就可以开始测试了。
您可以转到浏览器并输入与您的Ingress资源关联的外部 IP 地址。
正如我上面所说,您可以检查控制器 Pod 的日志nginx-ingress来检查控制器如何处理请求。
如果您运行前面提到的命令,python3 -m http.server 8080您也会收到日志:
$ python3 -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
10.48.0.16 - - [12/May/2020 11:06:56] "GET / HTTP/1.1" 200 -
10.48.0.16 - - [12/May/2020 11:06:56] "GET /assets/styles/style.css HTTP/1.1" 200 -
Run Code Online (Sandbox Code Playgroud)
我编辑了Ingress资源,向您展示路径重写的示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-ingress-example
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host:
http:
paths:
- path: /product/(.*)
backend:
serviceName: ubuntu-service
servicePort: ubuntu-port
Run Code Online (Sandbox Code Playgroud)
对线路进行了更改:
nginx.ingress.kubernetes.io/rewrite-target: /$1
Run Code Online (Sandbox Code Playgroud)
和:
- path: /product/(.*)
Run Code Online (Sandbox Code Playgroud)
脚步:
/product//product/并将其重写为//来自控制器。来自控制器的日志nginx-ingress:
CLIENT_IP - - [12/May/2020:11:33:23 +0000] "GET /product/ HTTP/1.1" 200 228 "-" "REDACTED" 438 0.002 [default-ubuntu-service-ubuntu-port] [] 10.48.0.13:8080 276 0.001 200 fb0d95e7253335fc82cc84f70348683a
CLIENT_IP - - [12/May/2020:11:33:23 +0000] "GET /product/assets/styles/style.css HTTP/1.1" 200 22 "http://SERVER_IP/product/" "REDACTED" 364 0.002 [default-ubuntu-service-ubuntu-port] [] 10.48.0.13:8080 22 0.002 200
Run Code Online (Sandbox Code Playgroud)
来自 Pod 的日志:
10.48.0.16 - - [12/May/2020 11:33:23] "GET / HTTP/1.1" 200 -
10.48.0.16 - - [12/May/2020 11:33:23] "GET /assets/styles/style.css HTTP/1.1" 200 -
Run Code Online (Sandbox Code Playgroud)
如果您对此有任何疑问,请告诉我。
| 归档时间: |
|
| 查看次数: |
7176 次 |
| 最近记录: |