Kubernetes基于路径的多个名称空间路由

时间:2018-03-26 07:30:01

标签: kubernetes google-cloud-platform kubernetes-ingress

环境:我有一个kubernetes集群,其中包含“dev”,“sit”和“prod”的命名空间。在每个命名空间,我有类型的多个服务:负载平衡器指定一dockerised应用程序(我有多个应用程序),所以我可以通过只使用我想任何一个命名空间服务的暴露IP地址来访问其中的每一个具体部署。示例服务看起来很简单:

apiVersion: v1
kind: Service
metadata:
  name: application1
spec:
  ports:
  - port: 80
    targetPort: 3000
    protocol: TCP
    name: http
  type: LoadBalancer
  selector:
    app: application1

问题:我现在希望能够支持所有应用程序的多个版本(ip:/ v1 / ,ip:/ v2 / 等)以允许用户在准备就绪时迁移到新版本,并且我一直在尝试在guide之后实现基于路径的路由。我已经设法重构我的架构,以便我有一个ReplicationControllers和一个入口,它查看路由规则以路由到正确的服务。

如果我只有一个公开的服务和一个命名空间,这似乎有效,因为我只有生产环境的DNS主机名,并且想要在其他环境中使用服务的单个IP地址,我无法想象如何为没有主机名的服务指定入口规则。

我可以对各种环境负载均衡器,并使用基于路径路由路由到每个不同的服务,为开发和坐这并不理想,因为访问任何服务,我们不得不现在用这样的IP /应用1和ip / application2而不是直接使用每个应用程序的服务ip地址。但我最大的问题是,当我按照指南并在我的SIT命名空间中创建了入口,replicationController和服务时,它开始影响我的其他两个环境中的loadbalancer服务(据我所知,kubernetes有时会尝试使用nginx控制器我的DEV服务上的SIT环境因此会失败,有时它会使用GCE默认配置并且可以工作)。

我尝试添加arg“ - --watch-namespace = sit”来限制入口控制器的范围仅影响坐,但它似乎不起作用。

1 个答案:

答案 0 :(得分:2)

我现在希望能够支持所有应用程序的多个版本(ip:/ v1 /,ip:/ v2 /等)

这正是Ingress可以做的,但问题是你想使用IP地址进行路由,但Ingress正在使用DNS名称。

我认为实现此目的的最佳方法是使用将处理请求的Ingress。在GCE上Ingress使用HTTP(S)负载均衡器。是的,您需要一个DNS名称,但它可以帮助您创建所需的路由 另外,我强烈建议对连接使用TLS加密 您可以查看LetsEncrypt以获取免费的SSL证书。

所以,解决方案应该如下:

1。使用“ClusterIP”类型而不是“LoadBalancer”部署服务。您可以为应用程序提供多个Service对象,以便与当前配置并行执行 2.选择任何命名空间(甚至是特殊命名空间),例如 - “ingress-ns”。我们需要在那里创建Service对象,这些对象将指向其他命名空间中的服务。以下是服务示例(让新DNS名称为“my.shiny.new.domain”):

kind: Service
apiVersion: v1  
  metadata:
    name: service-v1
    namespace: ingress-ns
 spec:  
   type: ExternalName
   externalName: <service>.<namespace>.svc.cluster.local # here is a service name and namespace of your service with version v1.
  ports:
    - port: 80 

3。现在,我们有一个带有多个服务的命名空间,这些服务指向不同命名空间中应用程序的不同版本。现在,我们可以创建一个Ingress对象,它将在GCE上使用基于路径的路由创建HTTP(S)负载均衡器:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: test
 namespace: ingress-ns
spec:
 rules:
 - host: my.shiny.new.domain
   http:
     paths:
     - path: /v1
       backend:
         serviceName: service-v1
         servicePort: 80
     - path: /v2
       backend:
         serviceName: service-v2
         servicePort: 80

Kubernetes将使用您在Ingress对象中设置的规则创建新的HTTP(S)平衡器,并且您将拥有一个具有跨命名空间路径的路由的入口点,并且您不必使用多个IP地址为了那个原因。

实际上,您还可以通过该入口管理您的应用程序的主要版本,并使用带有“/”路径的主域来处理对生产版本的请求。