Skip to content

Instantly share code, notes, and snippets.

@setekhid
Created June 22, 2017 03:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save setekhid/d58349e9a590f3cc4c6bca7bed8e4225 to your computer and use it in GitHub Desktop.
Save setekhid/d58349e9a590f3cc4c6bca7bed8e4225 to your computer and use it in GitHub Desktop.
blog@terminus: dcos-network-components-overview

DC/OS 1.8 网络组件介绍

本 overview 有效期有限,据 slack 上一位兄弟言,1.8的 VIPs 由 dcos-minuteman 实现,1.9为 dcos-navstar ,暂不清楚。

[toc]

DNS

DC/OS 提供三层 DNS 服务,主要用于对集群内部进行服务发现。

Mesos-DNS

Mesos-DNS 是 DC/OS 中负责进行服务 DNS 解析的组件,能够将诸如 hello-service.marathon-framework.mesos 的域名通过标准 DNS 查询,解析为服务的 IP 地址(A Record)和服务的端口(SRV Record)。

mesos-dns-stream

上图来自 mesosphere,描述了 Mesos-DNS 项目的内部结构。Record Generator 扮演 fetcher 的角色,定时从 MesosMaster 拉取集群信息及任务信息,解析后生成相应的 DNS 记录。DNS Resolver 响应 DNS 查询请求。

Mesos-DNS 部署在 DC/OS 集群的所有 Master 节点上。

Navstar-DNS

Navstar-DNS 负责进行对 Mesos-DNS 进行代理查询,并对内提供 DNS 域名动态注册服务。

Spartan

由于 Mesos-DNS 要定时从 Mesos Master 拉取集群信息,部署实例数不能随 DC/OS 集群规模增长。此时 DNS 查询需要一个本地代理,将公共 DNS 的查询工作从 Mesos-DNS 中分离出去。

Spartan 产生的另一个原因是需要对 Mesos-DNS 进行并发查询,避免查询超时。

Spartan 对外暴露一个健康检查的 DNS 记录,名为 ready.spartan,供其他服务进行健康检查。

DC/OS 常见部署中,除了一个名为 dcos-spartan.service 的服务,还有一个 dcos-spartan-watchdog.service 的服务,对 Spartan 定时做健康检查,并负责修改 /etc/resolv.conf 文件,保证 Spartan 不可达时,公网域名依旧可以正常解析。

一次完整的 DNS 查询会产生类似下图的一张时序图,

one-dns-query

Spartan 会选择性并发查询 DC/OS 内部 DNS 或者外部 DNS 服务器。

overlay 网络

overlay 网络实现了 IP-per-container。保证网络应用移植的透明性。

ip-allocation

上图取自 dcos.io,DC/OS 的 overlay 网络实现为 VxLAN 机制。VxLAN 相关封包方式及报文结构可以参考cisco 的这篇文章

在 DC/OS 配置文件中,使用 dcos_overlay_network 参数规划 overlay 网络。subnet 参数规划了该集群可以容纳 agent 节点个数,及每个节点能够分配到的子网号。prefix 规划了每个 agent 节点能够容纳的所有容器个数。其中主机位最高一位为0的 IP 分配给 Mesos Container,为1的 IP 分配给 Docker Container,即两类 Container 平分地址池。

overlay-network-sequence

以上为 Agent 启动时 IP 子网分配过程。

DC/OS 中 container2container 的通信方式比较值得一提,由 Mesos Master 的 overlay module 向 Mesos Slave 的 overlay module 发放容器子网的拥有者 Agent。其他部分如图所示,CNI 提供 Mesos Container 的网络实现。Navstar 进行网络编排……

DC/OS 内部及外部负载均衡

Minuteman 通过检测 Mesos 的 task.port 结构体中的 label,匹配 VIP_$IDX 字段相同的服务作为后端服务。

Minuteman 使用 IPVS 技术,通过在 iptables 的 raw 表中接入 filter,将匹配相应 IP 的数据包放入 NFQueue。Minuteman 通过监听 NFQueue,截获报文,匹配端口信息,适当修改为 DNat/SNat 后重新传入内核进行路由。

# iptables -vL -t raw
Chain PREROUTING (policy ACCEPT 27M packets, 8170M bytes)
 pkts bytes target     prot opt in     out     source               destination         
    3   180 NFQUEUE    tcp  --  any    any     anywhere             anywhere             match-set minuteman dst,dst tcp flags:FIN,SYN,RST,ACK/SYN NFQUEUE balance 50:58

Chain OUTPUT (policy ACCEPT 27M packets, 7898M bytes)
 pkts bytes target     prot opt in     out     source               destination         
    7   420 NFQUEUE    tcp  --  any    any     anywhere             anywhere             match-set minuteman dst,dst tcp flags:FIN,SYN,RST,ACK/SYN NFQUEUE balance 50:58

marathon-lb 通过定时拉取 Marathon 的 task 信息,生成 HAProxy 的配置文件进行负载均衡。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment