入口资源中具有不同服务名称的相同路径



使用路径指向不同的服务名称时遇到一些问题,我的入口资源如下所示

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 是客户端,在这种情况下,它要么你使用

  1. 基于主机名的路由将请求使用相同的路径路由到不同的服务,您只需告诉您的静态内容将请求发送到主机名nginx将检查主机并基于此路由请求。
  2. 您可以在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的代理与入口位于同一命名空间中

相关内容

  • 没有找到相关文章

最新更新