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

标签 nginx dns kubernetes google-cloud-platform

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

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

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

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

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

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

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

例如我可以有api.example.com point to <my_cluster_ip>/backend对于我的前端来说也是如此 <my_cluster_ip>/frontend让nginx将/backend指向端口5000,将/frontend指向端口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"
              }
            ]
          }
        ]
      }
    }
  }
}

最佳答案

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

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

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

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

关于nginx - 如何设置 2 个不同的容器在 Kubernetes 中的 2 个不同的 DNS 名称上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40603789/

相关文章:

nginx - 简单的 nginx 反向代理似乎剥离了一些 header

php - 如何在本地机器上使用 nginx 和 php7-fpm 增加 docker 的加载时间

python - 仅匹配域名中最左边的通配符 - Python

nginx - 在 kubernetes pod 中重新加载 nginxconf

nginx - Varnish + nginx和压缩的SVG

python - 读取上游时 nginx 权限被拒绝 - 即使以 root 身份运行

PHP/ curl : namelookup_time/dns slowing requests

ruby-on-rails - Heroku + Rails : How to allow my Users to add their own Custom Domains

kubernetes - 如何终止 Kubernetes 命名空间?

kubernetes - 命名空间 "stuck"作为终止,我如何删除它