Kubernetes 内置 DNS

Kubernetes 内置 DNS

也许我很笨,也许我只是没有使用好词,但我在 Stackexchange 或整个网络上的任何地方都找不到一个答案。

我创建过很多网站,大部分是用 Wordpress、Drupal 等创建的
(最近,我开始尝试使用 Scala 和 Go,尝试创建一个网站来了解这些语言)。
我的 DNS 提供商大多是DNSMadeEasy

起初,我只使用一台大型专用服务器在 Debian 下,我的不同网站位于不同的文件夹中,Nginx、PHP-FPM 等为我的所有网站提供服务。传统设置。

几年前,我切换到 Docker 设置,仍然在一台主机上,每个网站有一个 Nginx 容器、一个 PHP-FPM 容器、一个 MySQL 容器……。
在所有内容前面有一个 nginx 反向代理容器,用于将网站 example.com 的访问者重定向到 example.com 容器。

无论是使用传统设置还是基于 Docker 的设置,我都会分配我的主机的 IP 地址到我的不同网站的 A 记录在 DNSMadeEasy 中,瞧,一切都会按预期工作。

现在,我想从单主机设置切换到多主机(又称集群)设置,使用 Docker Swarm(1.12 Swarm)或 Kubernetes,以便能够更轻松地扩展,因为这正是最初切换到 Docker 的目的。
这样,我不同网站的容器将分布在我的集群的不同主机上。

我计划使用运行在 OpenStack 上的欧洲云,因为我不能(<>隐私法)并且不想使用(<>太贵)美国云,如 Google Cloud Engine 或 AWS EC2(<>爱国者法案<>欧洲数据),所以请不要告诉我使用这些云。 我已经能够在这个 Openstack 云中设置一个 Kubernetes 集群和一个 Docker Swarm 集群。

我的问题:我不明白的是,您如何将您的网站动态地指向自动创建的新服务和吊舱?

假设我有 4 个主机(1 个主服务器和 3 个从服务器)。
如果我这样做循环 DNS 解析,将我的四个主机的所有四个 IP 都放入我的网站的 A 记录中,这样它就可以访问这四个主机中的任何一个,这将是恶梦并且完全混乱,包括缓存头和所有内容。 此外,DNSMadeEasy有一个可以自动添加和删除记录的API,所以我认为应该可以自动更新网站的A记录或CNAME记录,就像这个插件对AWS Route53所做的那样:https://github.com/wearemolecule/route53-kubernetes(我们可以看到,这使用了外部 LoadBalancer,所以如果我应该遵循该解决方案,我想我的设置也需要一个外部 lb?)

我知道 Kubernetes 和 Docker Swarm 都使用 DNS 进行服务发现,使用 etcd/consul 进行注册和选举。
但据我所知,这是一个内部 DNS 系统,而不是外部 DNS 系统,不是吗?

或者我应该将 NS 指向我的主机并使用我的主机而不是 DnsMadeEasy !!??

我遗漏了什么吗?我做错了吗?

请有人帮帮我,我开始为试图理清事情而头痛不已:)

答案1

带有 swarm-mode 的 Docker 1.12 带有内置负载平衡。

就您而言,这样做的主要好处是您不必根据特定容器最终在哪个主机上运行来动态更新您的 DNS(由于 DNS ttl 和缓存,这很可能会导致灾难)。

比如说你运行了:

docker service create --name nginx -p 80:80 nginx

这将创建一个具有一个副本的 nginx 服务,因此单个容器将在您的集群中的随机主机上启动。但内置的负载平衡将路由端口 80 上的请求任何集群主机到容器运行的主机。同样,如果你使用以下方式扩展服务:

docker service scale nginx=2

这是一个非常简单的设置:

  1. 使用DNSMadeEasy 循环功能并为您的群中的所有主机 IP 添加 A 记录。
  2. 使用以下方式部署您的应用docker service create
  3. 利润

从你的问题来看,你似乎想在你的 Swarm 上运行多个站点,例如,多个应用程序都监听端口 80 和端口 443。正如 @Flippy 指出的那样,要做到这一点,你目前必须运行第 7 层负载均衡器,如 HAProxy 或 nginx,以检查请求主机头并适当转发请求。使用 Docker 1.12 Swarm 模式也很容易做到这一点,这是一个良好的入门指南

答案2

Kubernetes 内置 DNS

从 Kubernetes 1.3 开始,DNS 是使用插件管理器集群插件自动启动的内置服务。DNS Pod 和服务将在集群上安排,并且 kubelet 将配置为告诉各个容器使用 DNS 服务的 IP 来解析 DNS 名称。

集群中定义的每个服务(包括 DNS 服务器本身)都会被分配一个 DNS 名称。默认情况下,客户端 Pod 的 DNS 搜索列表将包括 Pod 自己的命名空间和集群的默认域。以下示例可以最好地说明这一点:

假设 Kubernetes 命名空间 bar 中有一个名为 foo 的服务。在命名空间 bar 中运行的 Pod 只需对 foo 执行 DNS 查询即可查找此服务。在命名空间 quux 中运行的 Pod 只需对 foo.bar 执行 DNS 查询即可查找此服务。

如需了解更多信息,请查看Kubernetes 文档

NGINX 负载均衡

负载平衡的默认配置:

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

如需了解更多信息,请查看NGINX 文档

DNS REST API

然后,您可以根据需要创建自定义脚本来与您的 DNS 提供商 API 进行交互。

有关详细信息,请查看 DNSMadeEasyREST API 文档

相关内容