2

环境:我有一个 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

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

如果我只有一个公开的服务和一个命名空间,这似乎可行,因为我只有生产环境的 DNS 主机名,并且想将服务的单个 IP 地址用于其他环境,我不知道如何为没有主机名的服务指定入口规则。

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

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

4

1 回答 1

4

我现在希望能够支持所有应用程序的多个版本(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 地址。

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

于 2018-03-26T09:52:34.297 回答