首页 文章

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

提问于
浏览
0

The environment: 我有一个kubernetes集群,其中包含"dev","sit"和"prod"的名称空间 . 在每个这些命名空间中,我有多种类型的服务:LoadBalancer,它针对dockerised应用程序的特定部署(我有多个应用程序),所以我可以通过使用我想要的任何命名空间的服务的公开IP地址来访问其中的每一个 . 示例服务看起来很简单:

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

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

这似乎有用,如果我只有一个公开的服务和一个命名空间,因为我只有 生产环境 环境的DNS主机名,并希望使用服务的个人IP地址为其他环境,我无法弄清楚如何为没有主机名的服务指定入口规则 .

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

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

1 回答

  • 1

    我现在希望能够支持所有应用程序的多个版本(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) balancer 器,并且您将拥有一个具有跨命名空间路径的路由的入口点,并且您不必为此使用多个IP地址 .

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

相关问题