【问题标题】:Route traffic to a service in a different namespace with Traefik and Kubernetes使用 Traefik 和 Kubernetes 将流量路由到不同命名空间中的服务
【发布时间】:2018-05-01 08:18:39
【问题描述】:

使用 Traefik 作为入口控制器(在 GCP 中的 kube 集群上)。 是否可以创建使用来自不同命名空间的后端服务的入口规则?

我们为每个“主要”版本的代码都有一个命名空间。

1-service.com -> 1-service ns 中的 1-service.com 入口 -> 相同 ns 中的 1-service svc

2-service.com -> 2-service ns 中的 2-service.com 入口... 以此类推

我还希望“未版本化”命名空间中的另一个入口规则将流量路由到主要版本之一。

service.com -> "service" ns 中的 service.com 入口 -> X-service 命名空间中的 X-service

我想在 k8s 中使用版本化主机名(1-service.com 等)将主要版本分开,但仍然有一个指向最新版本的“最新”。

我相信 voyager 可以跨命名空间入口 -> svc。 Traefik 也可以这样做吗?

【问题讨论】:

  • 对此有何动静?我很好奇你最终是如何解决这个问题的。我目前正在寻找使用 Traefik 从“入口”命名空间路由到多个子命名空间的方法,但还没有找到最好的方法。

标签: kubernetes traefik


【解决方案1】:

您可以使用这样的解决方法:

  1. 当您想要创建入口时,在您的命名空间中创建一个类型为 ExternalName 的服务:
apiVersion: v1
kind: Service
metadata:
  name: service-1
  namespace: unversioned
spec:
  type: ExternalName
  externalName: service-1.service-1-ns.svc.cluster.local
  ports:
  - name: http
    port: 8080
    protocol: TCP
  1. 创建一个指向此服务的入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: traefik
  name: ingress-to-other-ns
  namespace: service-1-ns
spec:
  rules:
  - host: latest.example.com
    http:
      paths:
      - backend:
          serviceName: service-1
          servicePort: 8080
        path: /

【讨论】:

  • 太棒了!您的解决方案为我节省了很多时间!正如我在文档中阅读的那样,我试图在不生成中间服务的情况下完成这个技巧,足以使用以下符号 my-service.my-ns 创建入口。但是没有用:(你知道原因吗?非常感谢!
【解决方案2】:

刚刚在 EKS 上使用以下示例进行了测试。 Traefik 部署在 default 命名空间中。这是用于 k8s 服务的配置:

---
apiVersion: v1
kind: Service
metadata:
  name: 1-service
  namespace: 1-service
  labels:
    app: 1-service
spec:
  selector:
    app: 1-service
  ports:
    - name: http
      port: 80
      targetPort: 80

这是用于 Traefik 服务的配置,它将请求发送到不同的命名空间:

      services:
        1-service:
          loadBalancer:
            servers:
               - url: http://1-service.1-service.svc.cluster.local:80
               # - url: http://1-service.1-service:80 # This should work perfectly as well, didn't test it explicitly

您可能已经知道了,您可以使用SERVICE.NAMESPACE 表示法而不是SERVICE 来引用来自不同命名空间的服务,这会自动假定您正在从当前命名空间引用服务。

【讨论】:

    猜你喜欢
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    相关资源
    最近更新 更多