使用路径指向不同的服务名称时遇到一些问题,我的入口资源如下所示
nginx-static service是一个nginx容器,它有静态的内容...我必须在调用服务-1 时加载此静态内容,因为 nginx-static 和服务-1 但我无法保持相同的主机路径......请建议如何更正以下入口资源...
请注意静态内容有很多文件(csv,js,html,目录,文件等(
kind: Ingress
metadata:
name: myingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- path: "/"
backend:
serviceName: nginx-static
servicePort: 80
- path: "/"
backend:
serviceName: service1
servicePort: 8989
- path: "/test1"
backend:
serviceName: service2
servicePort: 9001
任何专家的帮助都值得赞赏!!
不幸的是,最初问题的要求并不明确,也没有给出额外的澄清。但是,我想详细说明Burak Serdar的答案并补充说,Kubernetes Ingress允许您为多个服务列出相同的路径广告端口,前提是您为不同的主机列出这些路径。
foo.bar.com --| |-> foo.bar.com nginx-static:80
| 178.91.123.132 |
bar.foo.com --| |-> bar.foo.com service1:8989
您可以使用以下配置实现该方案:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: name-virtual-host-ingress
spec:
rules:
- host: foo.bar.com
http:
paths:
- backend:
serviceName: nginx-static
servicePort: 80
- host: bar.foo.com
http:
paths:
- backend:
serviceName: service2
servicePort: 8989
但是,这只有在您可以在两个主机之间拆分网站时才有效。
希望有帮助。 您可以在 K8s 文档中查看有关入口的更多信息。
不能有指向不同后端资源的相同路径。您必须将静态文件或服务放入不同的路径,并重写URL,例如:
重写注释:
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: rewrite
namespace: default
路径:
- backend:
serviceName: nginx-statix
servicePort: 80
path: /static(/|$)(.*)
- backend:
path: /
serviceName: service1
这样,您的静态内容将在/static/
下公开,并且所有/static/name
都将被入口重写为/name
。
更多信息在这里: https://kubernetes.github.io/ingress-nginx/examples/rewrite/
我假设 service1 就像一个后端,而 nginx-static 是客户端,在这种情况下,它要么你使用
- 基于主机名的路由将请求使用相同的路径路由到不同的服务,您只需告诉您的静态内容将请求发送到主机名nginx将检查主机并基于此路由请求。
- 您可以在nginx入口中使用if条件路由来路由基于Referer的请求,您可以为此检查请求标头。
基于主机名的路由示例
- host: foo.bar.com
http:
paths:
- backend:
service:
name: foo
port:
number: 8080
path: /
pathType: Prefix
- host: bar.foo.com
http:
paths:
- backend:
service:
name: bar
port:
number: 8080
path: /
pathType: Prefix
如果条件路由
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: <name>
namespace: <namespace>
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
if ($http_referer ~ ^http?://foo) { proxy_pass http://foo:8080; }
if ($http_referer ~ ^http?://bar) { proxy_pass http://bar:8080; }
spec:
ingressClassName: <ingress class name>
defaultBackend:
service:
name: <default backend>
port:
number: 8080
请注意,代理传递应该是服务名称,上述服务foo和bar的代理与入口位于同一命名空间中