使用Traefik和Kubernetes将流量路由到不同命名空间中的服务

时间:2017-11-17 14:12:31

标签: kubernetes traefik

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

我们的每个" major"都有一个名称空间。代码版本。

1-service.com - > 1-服务进入1服务ns - >同一ns中的1服务svc

2-service.com - > 2-service.com进入2服务中......等等

我还想在"无版本"中找到另一个入口规则。将流量路由到其中一个主要版本的命名空间。

service.com - > service.com进入"服务" ns - > X-service命名空间中的X-service

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

我相信voyager可以进行跨命名空间入口 - > SVC。 Traefik能做同样的事吗??

2 个答案:

答案 0 :(得分:0)

您可以使用以下解决方法:

  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: /

答案 1 :(得分:0)

刚刚在 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 来引用来自不同命名空间的服务,<note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> <item id='my-img' href='images/dp.jpg' media-type='image/jpeg'/ > </note> 会自动假定您正在引用当前命名空间中的服务.