Kubernetes为不同的应用程序提供服务

时间:2016-02-25 07:55:24

标签: kubernetes

我正在使用Kubernetes开发应用程序部署环境,我希望能够基于主要Web应用程序的Git引用来启动整个应用程序堆栈的副本,​​例如: "主"和"我的话题分支"。我希望应用程序堆栈的这些副本在同一个集群中共存。我可以使用" gitRef"创建Kubernetes服务,复制控制器和pod。标签将彼此隔离堆栈,但堆栈中的一些pod相互依赖(通过Kubernetes服务),我没有看到一种简单,干净的方式来限制暴露给pod的服务

有几种方法可以实现,我可以想到,但两者都不理想:

  • 将每个堆栈放在单独的Kubernetes命名空间中。这提供了最干净的隔离,因为没有资源名称冲突,应用程序可以拥有它们依赖于硬编码的服务的DNS主机名,但似乎违反了文档中关于命名空间:< / p>

      

    没有必要使用多个名称空间来分隔略有不同的资源,例如同一软件的不同版本:使用标签来区分同一名称空间中的资源。

    这是有道理的,因为将应用程序堆栈放在不同的资源中会否定标签选择器的所有用处。我只是使用Git参考命名命名空间,并且根本不需要过滤所有其他资源。

  • 为应用程序堆栈的每个副本创建每个服务的副本,例如: &#34; MySQL的主&#34;和&#34; mysql-my-topic-branch&#34;。这具有以下优点:所有app堆栈可以在相同的命名空间中共存,但缺点是不能在需要它们的应用程序中对服务的DNS主机名进行硬编码,例如,有一个Web应用程序目标主机名&#34; mysql&#34;无论它实际解析为哪个MySQL Kubernetes服务实例。我需要使用一些机制将正确的主机名注入pod中,或者让它们以某种方式自行解决。

基本上我想要的是一种告诉Kubernetes的方式,&#34;将此服务的主机名仅显示给具有给定标签的pod,并使用给定的主机名&#34;将其暴露给它们。对于特定的服务。这将允许我使用第二种方法,而无需使用应用程序级逻辑来确定要使用的正确主机名。

实现我之后的最佳方式是什么?

[†] http://kubernetes.io/v1.1/docs/user-guide/namespaces.html

1 个答案:

答案 0 :(得分:8)

我认为将不同版本放在不同命名空间中的文档有点不正确。事实上,命名空间就像这样完全分开。你应该把每个&#34;跟踪&#34;的完整版本。或将应用程序部署到其自己的命名空间中。

然后,您可以使用硬编码的服务名称 - &#34; http://myservice/&#34; - 因为DNS将默认解析为本地命名空间。

对于入口我已经从GitHub问题中复制了我的答案,关于跨命名空间的入口。

您应该使用我们小组用于Ingress的方法。

将Ingress视为LoadBalancer,而不仅仅是指定URL和服务在同一名称空间中的某些映射的文档。

一个例子,来自我们使用的真实文档:

  apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    name: ingress
    namespace: dev-1
  spec:
    rules:
    - host: api-gateway-dev-1.faceit.com
      http:
        paths:
        - backend:
            serviceName: api-gateway
            servicePort: 80
          path: /
    - host: api-shop-dev-1.faceit.com
      http:
        paths:
        - backend:
            serviceName: api-shop
            servicePort: 80
          path: /
    - host: api-search-dev-1.faceit.com
      http:
        paths:
        - backend:
            serviceName: api-search
            servicePort: 8080
          path: /
    tls:
    - hosts:
      - api-gateway-dev-1.faceit.com
      - api-search-dev-1.faceit.com
      - api-shop-dev-1.faceit.com
      secretName: faceitssl

我们为每个轨道的每个命名空间创建其中一个。

然后,我们有一个带有Ingress Controller的命名空间,它运行自动配置的NGINX pod。另一个AWS Load平衡器指向这些在NodePort上运行的pod,它们使用DaemonSet最多运行,并且至少在群集中的每个节点上运行一个。

因此,流量将被路由:

互联网 - &gt; AWS ELB - &gt; NGINX(节点上) - &gt;荚

我们在使用Ingress时保持名称空间之间的隔离。使用一个入口来命中多个名称空间是不正确甚至是明智的。鉴于它们的设计方式,它没有意义。解决方案是使用每个命名空间的一个入口和一个实际进行路由的集群范围入口控制器。

所有Ingress都是Kubernetes是一个包含一些数据的对象。它可以由Ingress Controller进行路由。

有关Ingress控制器的详细信息,请参阅文档here