Kubernetes 库伯内特斯入口酒店

Kubernetes 库伯内特斯入口酒店,kubernetes,Kubernetes,我在做一些关于入口的研究,似乎我必须为每个名称空间创建一个新的入口资源。对吗 我刚刚在GKE集群的不同名称空间中创建了两个独立的入口资源,但它似乎使用了相同的LB in(这对于成本来说是非常好的),但我认为可能会有冲突。(使用相同路径时)。我刚刚试过,我创建的第一个仍然在路径上工作,同一路径上的另一个新的不工作 有人能给我解释一下入口的正确设置吗?冲突入口路由的行为未定义且依赖于实现。在大多数情况下,这只是最后一个写入程序获胜。冲突入口路由的行为未定义且依赖于实现。在大多数情况下,这只是最后一个

我在做一些关于入口的研究,似乎我必须为每个名称空间创建一个新的入口资源。对吗

我刚刚在GKE集群的不同名称空间中创建了两个独立的入口资源,但它似乎使用了相同的LB in(这对于成本来说是非常好的),但我认为可能会有冲突。(使用相同路径时)。我刚刚试过,我创建的第一个仍然在路径上工作,同一路径上的另一个新的不工作


有人能给我解释一下入口的正确设置吗?

冲突入口路由的行为未定义且依赖于实现。在大多数情况下,这只是最后一个写入程序获胜。

冲突入口路由的行为未定义且依赖于实现。在大多数情况下,这只是最后一个写入程序获胜。

当Kubernetes工作时,ingress controller不会将数据包传递给与ingress资源位于不同命名空间中的服务。因此,如果在默认名称空间中创建入口资源,则所有服务也必须在默认名称空间中

这是不会改变的。曾经几年前就有一个特性请求,kubernetes团队宣布这不会发生。当入口控制器能够传输名称空间时,它引入了一个安全漏洞

现在,我们在这些情况下所做的实际上是相当整洁的。您必须执行以下操作:

  • 假设您在所需的名称空间中有2个服务。e、 g.
    service1.foo
    service2.bar
  • 在与入口资源相同的命名空间中,创建2个无头服务(不带选择器)和2个指向服务
    service1.foo
    service2.bar
    的IP地址的
    Endpoint
    对象。不带选择器的headless服务将强制kube dns(或coreDNS)搜索
    ExternalName
    类型服务或
    端点
    对象。现在,这里唯一的要求是您的headless服务和
    Endpoint
    对象必须具有相同的名称
  • 创建指向无头服务的入口资源
  • 它应该是这样的(对于1个服务):

    假设
    service1.foo
    的IP地址是
    10.10.10.10
    。您的无头服务和
    端点
    对象将是:

    apiVersion: v1
    kind: Service
    metadata:
      name: bait-svc
    spec:
      clusterIP: None
      ports:
      - name: http
        port: 80
        targetPort: 80
    
    ---
    
    apiVersion: v1
    kind: Endpoints
    metadata:
      name: bait-svc
    subsets:
    - addresses:
      - ip: 10.10.10.10
      ports:
      - port: 80
        protocol: TCP
    
    入口
    资源:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: ingress
      annotations:
        kubernetes.io/ingress.class: "nginx"
    spec:
      tls:
      - secretName: ssl-certs 
      rules:
      - host: site1.training.com
        http:
          paths:
          - path: /
            backend:
              serviceName: bait-svc
              servicePort: 80
    
    因此,
    incres
    指向
    bait svc
    bait svc
    指向
    service1.foo
    。您将为每个服务执行此操作

    更新

    我现在在想,它可能不适用于GKE Ingress Controller,因为在GKE上,HTTP负载平衡器需要一个
    NodePort
    类型的服务来访问该服务。如您所见,在我的示例中,我使用了nginx入口控制器


    不管它是否工作,我都建议使用其他入口控制器。并不是说GKE IC不好。它非常健壮,但几乎总是会遇到一些限制。其他IC更灵活。

    随着Kubernetes的工作,ingress controller不会将数据包传递给与ingress资源位于不同命名空间中的服务。因此,如果在默认名称空间中创建入口资源,则所有服务也必须在默认名称空间中

    这是不会改变的。曾经几年前就有一个特性请求,kubernetes团队宣布这不会发生。当入口控制器能够传输名称空间时,它引入了一个安全漏洞

    现在,我们在这些情况下所做的实际上是相当整洁的。您必须执行以下操作:

  • 假设您在所需的名称空间中有2个服务。e、 g.
    service1.foo
    service2.bar
  • 在与入口资源相同的命名空间中,创建2个无头服务(不带选择器)和2个指向服务
    service1.foo
    service2.bar
    的IP地址的
    Endpoint
    对象。不带选择器的headless服务将强制kube dns(或coreDNS)搜索
    ExternalName
    类型服务或
    端点
    对象。现在,这里唯一的要求是您的headless服务和
    Endpoint
    对象必须具有相同的名称
  • 创建指向无头服务的入口资源
  • 它应该是这样的(对于1个服务):

    假设
    service1.foo
    的IP地址是
    10.10.10.10
    。您的无头服务和
    端点
    对象将是:

    apiVersion: v1
    kind: Service
    metadata:
      name: bait-svc
    spec:
      clusterIP: None
      ports:
      - name: http
        port: 80
        targetPort: 80
    
    ---
    
    apiVersion: v1
    kind: Endpoints
    metadata:
      name: bait-svc
    subsets:
    - addresses:
      - ip: 10.10.10.10
      ports:
      - port: 80
        protocol: TCP
    
    入口
    资源:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: ingress
      annotations:
        kubernetes.io/ingress.class: "nginx"
    spec:
      tls:
      - secretName: ssl-certs 
      rules:
      - host: site1.training.com
        http:
          paths:
          - path: /
            backend:
              serviceName: bait-svc
              servicePort: 80
    
    因此,
    incres
    指向
    bait svc
    bait svc
    指向
    service1.foo
    。您将为每个服务执行此操作

    更新

    我现在在想,它可能不适用于GKE Ingress Controller,因为在GKE上,HTTP负载平衡器需要一个
    NodePort
    类型的服务来访问该服务。如您所见,在我的示例中,我使用了nginx入口控制器


    不管它是否工作,我都建议使用其他入口控制器。并不是说GKE IC不好。它非常健壮,但几乎总是会遇到一些限制。其他IC更灵活。

    您是否对两个入口使用相同的主机名?啊,是的(只是*),可能是因为它使用相同的LB?我们不能使用相同的主机名创建多个入口,如果我们这样做,将会发生冲突。因此,我建议为每个入口配置不同的主机名(而不是*)。好的,我必须为每个名称空间的每个主机名创建一个入口?没错。入口是命名空间级别的对象。如果您的K8s版本>1.18.*您可以使用一个通配符作为主机名。您是否对两个入口使用相同的主机名?啊,是的(只是*),可能是因为它使用相同的LB?我们不能