所以我在一个 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"
}
]
}
]
}
}
}
}
答案 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
通过负载均衡器将这些服务(或仅前端)公开给全世界