Docker 主机是否可以重定向到Kubernetes中的服务路径?

Docker 主机是否可以重定向到Kubernetes中的服务路径?,docker,kubernetes,google-compute-engine,devops,Docker,Kubernetes,Google Compute Engine,Devops,我尝试将主机地址与服务路径匹配,例如,让我们假设我有一个nginx pod服务于站点:site1和site2。让我们考虑一个名为my nginx service的服务,它将我的两个站点作为路径提供服务: -我的nginx服务(178.123.55.37:80) -/site1 -/site2 有一种方法可以将其映射到以下内容: -主机:site-one.mydomain.com http: 路径: -后端: 服务名称:nginx服务 服务端口:80 服务路径:/site2 -主持人:site-

我尝试将主机地址与服务路径匹配,例如,让我们假设我有一个nginx pod服务于站点:site1和site2。让我们考虑一个名为my nginx service的服务,它将我的两个站点作为路径提供服务:

-我的nginx服务(178.123.55.37:80)
-/site1
-/site2

有一种方法可以将其映射到以下内容:

-主机:site-one.mydomain.com
http:
路径:
-后端:
服务名称:nginx服务
服务端口:80
服务路径:/site2
-主持人:site-two.mydomain.com
http:
路径:
-后端:
服务名称:nginx服务
服务端口:80
服务路径:/site2

??我在文档中没有找到任何关于它的信息。或者也许我对他们不太了解


非常感谢您抽出时间

您可以从下面的
kubectl explain
输出中看到,上面的
servicePath
字段不存在(至少在版本1.9.3上)

kubectl解释入口.spec.rules.http.path.backend

...
FIELDS:
   serviceName  <string> -required-
     Specifies the name of the referenced service.

   servicePort  <string> -required-
     Specifies the port of the referenced service.
...
。。。
领域:
serviceName-必需-
指定引用的服务的名称。
servicePort-必需-
指定引用服务的端口。
...

您需要在以下字段中指定路径:
ingres.spec.rules.http.paths.path
,以便在命中该路径时,使用在
ingres.spec.rules.http.paths.backend.serviceName
中指定的服务路由请求。如果您使用的是nginx或trafficserver ingress,则注释
nginx.ingress.kubernetes.io/rewrite-target://
可用于将请求重定向到
/

,您可以从
kubectl的以下输出中看到
解释
上面的
servicePath
字段不存在(至少在版本1.9.3上)

kubectl解释入口.spec.rules.http.path.backend

...
FIELDS:
   serviceName  <string> -required-
     Specifies the name of the referenced service.

   servicePort  <string> -required-
     Specifies the port of the referenced service.
...
。。。
领域:
serviceName-必需-
指定引用的服务的名称。
servicePort-必需-
指定引用服务的端口。
...
您需要在以下字段中指定路径:
ingres.spec.rules.http.paths.path
,以便在命中该路径时,使用在
ingres.spec.rules.http.paths.backend.serviceName
中指定的服务路由请求。如果您使用的是nginx或trafficserver ingress,则注释
nginx.ingress.kubernetes.io/rewrite-target://
可用于将请求重定向到
/
您尝试执行的操作(如果我理解正确)是不可能的,因为服务不知道主机名。通过修改pod中的nginx配置,您可能能够达到您想要的效果,但这不是K8s方法

您需要做的是添加入口资源。入口知道主机名。它们在服务之间进行负载平衡。因此,/site1将转到一个服务,而/site2将转到另一个服务

入口应该是这样的:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
spec:
  rules:
  - host: site-one.mydomain.com
    http:
      paths:
      - backend:
          serviceName: nginx-service1
          servicePort: 80
  - host: site-two.mydomain.com
    http:
      paths:
      - backend:
          serviceName: nginx-service2
          servicePort: 80
正如您所看到的,site1和site2将在不同的部署中运行,并有不同的服务针对它们。Ingress是L7负载平衡器,它能够检查主机名并将请求转发到正确的服务,最终将命中正确的pod

您还可以向每个主机添加路径,以便将site-one.mydomain.com/path1、site-one.mydomain.com/path2和site-two.mydomain.com/path1(例如)转发到不同的服务

入口yaml文件如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
spec:
  rules:
  - host: site-one.mydomain.com
    http:
      paths:
      - path: /path1
        backend:
          serviceName: nginx-service1
          servicePort: 80
      - path: /path2
        backend:
          serviceName: nginx-service2
          servicePort: 8080
      - path: /
        backend:
          serviceName: nginx-service3
          servicePort: 80
  - host: site-two.mydomain.com
    http:
      paths:
      - path: /path1
        backend:
          serviceName: nginx-service1
          servicePort: 80
我知道这不是你想要的,但这是实现你想要的正确方法

您试图做的事情(如果我理解正确的话)是不可能的,因为服务不知道主机名。通过修改pod中的nginx配置,您可能能够达到您想要的效果,但这不是K8s方法

您需要做的是添加入口资源。入口知道主机名。它们在服务之间进行负载平衡。因此,/site1将转到一个服务,而/site2将转到另一个服务

入口应该是这样的:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
spec:
  rules:
  - host: site-one.mydomain.com
    http:
      paths:
      - backend:
          serviceName: nginx-service1
          servicePort: 80
  - host: site-two.mydomain.com
    http:
      paths:
      - backend:
          serviceName: nginx-service2
          servicePort: 80
正如您所看到的,site1和site2将在不同的部署中运行,并有不同的服务针对它们。Ingress是L7负载平衡器,它能够检查主机名并将请求转发到正确的服务,最终将命中正确的pod

您还可以向每个主机添加路径,以便将site-one.mydomain.com/path1、site-one.mydomain.com/path2和site-two.mydomain.com/path1(例如)转发到不同的服务

入口yaml文件如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
spec:
  rules:
  - host: site-one.mydomain.com
    http:
      paths:
      - path: /path1
        backend:
          serviceName: nginx-service1
          servicePort: 80
      - path: /path2
        backend:
          serviceName: nginx-service2
          servicePort: 8080
      - path: /
        backend:
          serviceName: nginx-service3
          servicePort: 80
  - host: site-two.mydomain.com
    http:
      paths:
      - path: /path1
        backend:
          serviceName: nginx-service1
          servicePort: 80

我知道这不是你想要的,但这是实现你想要的正确方法

也许我没有正确地解释自己。我希望能够从kubernetes主机访问服务的路径,因此如果我要公开我的服务,那么到端点的路由将是:IP:80/site1。但是我想把这个路径映射到一个入口主机,比如siteone.mydomain.com。我认为您所说的是将服务映射到入口路径,这不是我想要的情况,但谢谢!啊,很抱歉,是的,我想我误解了这个问题,也许我没有正确地解释我自己。我希望能够从kubernetes主机访问服务的路径,因此如果我要公开我的服务,那么到端点的路由将是:IP:80/site1。但是我想把这个路径映射到一个入口主机,比如siteone.mydomain.com。我认为您所说的是将服务映射到入口路径,这不是我想要的情况,但谢谢!啊,很抱歉,是的,我想我误解了这个问题好吧,非常感谢,也许我的思维结构不正确,因为我是这种技术的新手。最好的!好的,非常感谢,也许我的想法是