如何在Kubernetes中设置2个不同的容器以在2个不同的DNS名称上运行?

时间:2016-11-15 06:55:27

标签: nginx dns kubernetes google-cloud-platform

所以我在一个 Kubernetes部署中将我的后端和前端作为单独的容器。

目前我不得不访问前端和前端。通过不同的端口后端。

E.g example.com:5000 = frontend& example.com:7000 = backend

我想知道如何设置我的前端容器以便在www.example.com&我的后端容器在api.example.com

上运行

我正在使用gcp(谷歌云),正确设置我的dns&我必须使用我分配给他们的端口访问服务(网络应用程序)(5000 =前端,7000 =后端)。

我正在考虑一个可能的手动解决方案,但我想知道 Kubernetes 中是否有内置功能。这个解决方案是:

我在我的Kubernetes集群中设置了一个可以在端口80上运行的nginx容器,因此任何通过的请求都会被重定向到相应的端口:

E.g我可以api.example.com point to <my_cluster_ip>/backend&amp;对于我的前端<my_cluster_ip>/frontend也是如此,让nginx指向/后端到端口5000 和/前端到端口7000

我希望我可以使用kubernetes内置的东西?这是我的部署配置:

{
  "apiVersion": "extensions/v1beta1",
  "kind": "Deployment",
  "metadata": {
    "name": "my_container"
  },
  "spec": {
    "replicas": 1,
    "template": {
      "metadata": {
        "labels": {
          "app": "my_app"
        }        
      },
      "spec": {
        "containers": [
          {
            "name": "backend",
            "image": "backend_url",
            "ports": [
              {
                "containerPort": 7000
              }
            ],
            "imagePullPolicy": "Always",
            "env": [
              {
                "name": "NODE_PORT",
                "value": "7000"
              },
              {
                "name": "NODE_ENV",
                "value": "production"
              }
            ]
          },
          {
            "name": "frontend",
            "image": "frontend_url",
            "ports": [
              {
                "containerPort": 5000
              }
            ],
            "imagePullPolicy": "Always",
            "env": [
              {
                "name": "PORT",
                "value": "5000"
              },
              {
                "name": "NODE_ENV",
                "value": "production"
              }
            ]
          }
        ]
      }
    }
  }
}

2 个答案:

答案 0 :(得分:3)

嗯,对于初学者,您不应该基于部署公开您的服务。为此,您应该使用服务覆盖部署。请阅读http://kubernetes.io/docs/user-guide/services/

当您完成讲座时,您可能会注意到完全可以设置两个匹配相同支持窗格(端点)但在不同端口上的服务(即前端:80-> 5000 api:80-&gt; ; 7000)。问题是,它仍然只在k8s集群内暴露你的工作。要在外部发布它,您可以使用NodePort或LoadBalancer类型的服务(第一个具有使用高端口向公众公开您的服务的缺点,第二个将是每个服务单独的LB(因此IP)。)

我个人更喜欢公开展示服务的是使用Ingress / IngressController http://kubernetes.io/docs/user-guide/ingress/

最后,当您使用两个服务(front / api)拆分解决方案时,您将看到没有真正的理由将它们放在一个部署/ pod中。如果将它们分成两个不同的部署,您将获得更灵活的架构,并对您的解决方案进行更细粒度的控制。

答案 1 :(得分:1)

使用nginx将请求路由到k8s IP地址是不必要的。为了使其工作,您需要拥有包含其IP地址的pod DNS名称。如果缩放该窗格,则需要每次使用新的主机名/ DNS名称修改nginx配置。如果您的pod被杀,无法保证,重启后它们将获得相同的IP。所以基本上,这不是一个好方法。

可能更好的设计是将前端与后端分开。这样您就可以独立部署它们。后端可能会耗费更多资源,当您扩展它时,您不需要携带前端并与之共享资源。

如果您选择分开服务,请查看k8s services。它们易于理解且设置快速。在为前端和后端创建k8s服务后,您可以将DNS名称解析为您自动提供服务的名称(并在您的代码中使用它)。

由于您使用的是gke,因此可以使用k8s ingress

通过负载均衡器将这些服务(或仅前端)公开给全世界