2016-11-15 94 views
1

所以我有我的后端和前端作为单独的容器在Kubernetes部署如何设置两个不同的容器在Kubernetes中的两个不同的DNS名称上运行?

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

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

我不知道如何我可以设置我的前端容器上www.example.com &我的后端容器中运行对api.example.com

我使用GCP运行(谷歌云) ,已经设置我的DNS正确&我必须使用我分配给他们每个端口(5000 =前端,7000 =后端)的端口访问服务(网络应用程序)。

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

我最好安装在我的Kubernetes集群的nginx的容器,将80端口上运行,这样来通过将被重定向到相应的端口的任何请求:

如我能有api.example.com point to <my_cluster_ip>/backend &同为我的前端<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

嗯,首先,你不应该立足于部署暴露你的服务。为此,您应该使用服务覆盖您的部署。请阅读http://kubernetes.io/docs/user-guide/services/

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

我个人比较喜欢什么用入口/ IngressController http://kubernetes.io/docs/user-guide/ingress/

最后公开揭露的服务,当你有两个服务(前/ API)划分的解决方案,你会看到,有没有真正的理由,让他们在一起在一个部署/吊舱。如果您将它们分为两个不同的部署,您将获得更灵活的架构,并对您的解决方案进行更细致的控制。

+0

是的,我喜欢这个解决方案比我现在的更好。我最初会这样做,但我想要带着宝贝步骤,因为我刚刚开始与kubernetes! – James111

+0

1问题:假设您在两种不同的服务中有后端和前端,您是否会通过'cluster ip'调用后端(这不会更快,因为它们是本地的?)或'hostname'(例如'api.example.com')? – James111

+1

你可以通过集群IP来调用它,但是这需要一些发现,在kubernetes的情况下kube-dns提供了这种发现。所以实际上你应该通过DNS连接。如果你在同一个命名空间中运行两个部署/服务,就足够通过它的名字来调用服务,比如'backend'或者通过像'backend.default.svc.cluster.local'这样的FQDN来调用服务(如果你处于'default'命名空间)。这些域名将解析为ClusterIP - 在大多数情况下都是一样的,但如果您明确删除并重新创建服务,它可能会更改。 –

0

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

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

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

由于您使用GKE,您可以通过负载均衡器通过使用公开这些服务(或仅前端)世界k8s ingress

相关问题