寻求服务发现方案


内部使用 Marathon Mesos 集群方案;采用 Project Calico 来解决网络问题;但是对于服务发现这块总感觉有各种问题。

先说说我内部的需求,抛开 Marathon 和 Mesos;采用 Calico 主要是因为它能实现多网段共存,提供 DHCP 以及能固定容器 IP,还有其强大的 ACL 功能能够完全胜任我的场景。所以,我规划了如下配置:

$ docker network inspect calico1
[
{
    "Name": "calico1",
    "Id": "c447ecd51ddb84f5f61ebbab7a2cad003a0a26621d7cac6603a378f5b07de3e5",
    "Scope": "global",
    "Driver": "calico",
    "EnableIPv6": false,
    "IPAM": {
        "Driver": "calico-ipam",
        "Options": {},
        "Config": [
            {
                "Subnet": "192.168.0.0/16"
            }
        ]
    },
    "Internal": false,
    "Containers": {},
    "Options": {},
    "Labels": {}
}
]

$ docker network inspect calico2
[
{
    "Name": "calico2",
    "Id": "9763d3d810b6461dba0e3d9ed6d956e1543a128798eb79ab5a4457a3e213fc92",
    "Scope": "global",
    "Driver": "calico",
    "EnableIPv6": false,
    "IPAM": {
        "Driver": "calico-ipam",
        "Options": {},
        "Config": [
            {
                "Subnet": "10.1.0.0/16"
            }
        ]
    },
    "Internal": false,
    "Containers": {},
    "Options": {},
    "Labels": {}
}
]

$ cat /var/lib/mesos/cni/config/calico-cni.conf 
{
"name": "calico_cni",
"type": "calico",
"ipam": {
    "type": "calico-ipam",
    "assign_ipv4": "true",
    "assign_ipv6": "false",
    "ipv4_pools": ["192.168.0.0/16", "10.1.0.0/16"]
},
"etcd_endpoints": "http://172.30.30.5:2379,http://172.30.30.6:2379,http://172.30.30.11:2379"
}

$ calicoctl get ippool -o yaml
- apiVersion: v1
kind: ipPool
metadata:
cidr: 10.1.0.0/16
spec:
ipip:
  enabled: true
  mode: cross-subnet
nat-outgoing: true
- apiVersion: v1
kind: ipPool
metadata:
cidr: 192.168.0.0/16
spec:
ipip:
  enabled: true
  mode: cross-subnet
nat-outgoing: true
- apiVersion: v1
kind: ipPool
metadata:
cidr: fd80:24e2:f998:72d6::/64
spec:
nat-outgoing: true

  1. 让 192.168 网段做动态分配
  2. 让 10.1 网段用作固定 IP 分配


因为内部还是有一部分的容器需要固定 IP 的,例如(一部分)

marathon-1.png


marathon-2.png


前期工作做的非常好,也非常顺利,容器都能正常启动,健康检查也都正常。当到了服务发现这块就头疼了;最开始我使用 marathon-lb,他是使用 servicePort 对外提供服务的,所以只能用于 BRIDGE 模式,对于我的 Calico 网络根本起不了作用;

随后我了解了下 Consul、Consul-Registrator 以及 Consul-Template;这里又有问题了,Consul 和 Etcd 都是同类型的键值存储,而 Calico 支持的后端存储只有 etcd 和 Kubernetes(试验),不支持 Consul;而 consul-registrator 虽然支持 etcd 的后端存储,但是 consul-template 却不支持从 etcd 中拿取数据,所以,同时使用 etcd 和 consul 个人感觉会有点浪费资源(个人观点),这是其一;其二,我测试了容器自动获取 IP(192.168 网段 calico1)、容器固定 IP(10.1 网段 calico2)以及桥接和 HOST 网络模式,后两者是 docker 自带的(都没问题),但是对于 calico 网络,consul-registrator 也是注册不了,而且有时候注册的信息很乱,其 IP 和端口都是错乱的,很让人无解。

然后之前在某本书看到了 singularity(HubSpot 开发的一个Mesos框架)。它提供了跟 Marathon 一样的部署服务的能力,以及类似 Chronos 的重复性作业和一次性作业的功能等,最主要的是集成了 Baragon,这是个服务发现和代理的工具(集成HAProxy,Nginx以及ELB);其功能介绍无比强大。但最后还是放弃了,原因(抛开其稳定性及广泛程度)是需要放弃marathon,然后又得花费很多时间去研究其 API 和框架,另一个是使用人数不多,社区也不怎么活跃;GitHub 官网。下面是它的截图:

singularity_1.png


singularity_2.png


我还听说了一个关于 bamboo 的服务发现工具,它也是自动配置 haproxy,它从 Mesos,Marathon 中读取相应的应用信息,然后用户通过 API 定义来依据不同的 URL 或 hostname 将用户请求转发至后端,并且看介绍还可以设置路由规则,GitHub 官网。但是....
[root@example ~]# docker search bamboo
INDEX       NAME                                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/cptactionhank/atlassian-bamboo   Atlassian Confluence wrapped in a Docker i...   20                   [OK]
docker.io   docker.io/hwuethrich/bamboo-server         Deploy and maintain your Bamboo server wit...   17                   [OK]
docker.io   docker.io/nkatsaros/atlassian-bamboo       Continuous integration, deployment, and re...   9                    [OK]
docker.io   docker.io/gregory90/bamboo                                                                 3                    [OK]
docker.io   docker.io/hwuethrich/bamboo-agent          Easily scale your Atlassian Bamboo infrast...   3                    [OK]
docker.io   docker.io/milk/bamboo                      https://github.com/QubitProducts/bamboo         3                    [OK]
docker.io   docker.io/jjworren/atlassian-bamboo        Bamboo with mysql driver                        2                    [OK]
docker.io   docker.io/matisq/bamboo-server             Bamboo Server                                   2                    [OK]
docker.io   docker.io/amitshlo/bamboo-agent            An agent image for Atlassian Bamboo, built...   1                    [OK]
docker.io   docker.io/descoped/bamboo                  Atlassian Bamboo CI                             1                    [OK]
docker.io   docker.io/ffquintella/docker-bamboo        Altassian bamboo installation using puppet...   1                    [OK]
docker.io   docker.io/goellnerit/bamboo-docker         bamboo server                                   1                    [OK]
docker.io   docker.io/jacekkow/bamboo-agent-rich       Remote agent for Atlassian Bamboo, customi...   1                    [OK]
docker.io   docker.io/matisq/bamboo-agent              Bamboo Agent                                    1                    [OK]
docker.io   docker.io/mrbobbytables/bamboo             QubitProducts/bamboo                            1                    [OK]
docker.io   docker.io/tommylau/bamboo                                                                  1                    [OK]
docker.io   docker.io/tommylau/bamboo-aosp             Bamboo agent - AOSP                             1                    [OK]
docker.io   docker.io/andrewrothstein/bamboo           mesos marathon qubit products bamboo            0                    [OK]
docker.io   docker.io/bitweb/bamboo                    Bamboo                                          0                    [OK]
docker.io   docker.io/brodkinca/bamboo-trigger-php     Notify Bamboo when Nginx core is updated. ...   0                    [OK]
docker.io   docker.io/cmays/bamboo                     Qubit Bamboo with custom haproxy_template.cfg   0                    [OK]
docker.io   docker.io/fanfoni/bamboo                   Atlassian Bamboo with docker tasks support      0                    [OK]
docker.io   docker.io/ibandrea/bamboo                  bamboo image                                    0                    [OK]
docker.io   docker.io/redmatter/bamboo                 Atlassian Bamboo with minor changes and tu...   0                    [OK]
docker.io   docker.io/redmatter/bamboo-backup          Bamboo DIY backup scripts, dockerised.          0                    [OK]
[root@example ~]# docker pull docker.io/milk/bamboo
Using default tag: latest
Trying to pull repository docker.io/milk/bamboo ... 
Pulling repository docker.io/milk/bamboo
Tag latest not found in repository docker.io/milk/bamboo
[root@example ~]# 


Tag latest not found in repository docker.io/milk/bamboo............ 这是什么意思????看 DESCRIPTION 就是这个啊,难道我下错了??

无奈..............官方也没有明确说明其 tag 或版本;看来有时间得自行编译安装了,哎……

另外一个就是 mesos-dns,它跟 marathon-lb 差不多,只不过是它是通过监听 mesos 事件来生成 DNS 记录的,并且提供标准的 DNS 协议查询接口。其实我很不想使用它,个人觉得,所有网络服务中,DNS 解析是最慢最慢最慢最慢的(个人观点,不喜勿喷,欢迎指正),目前还没有使用,接下来应该会尝试下它吧...

---

到目前为止,我相信有很多的成功案例,但终究不知道服务发现这块要怎么做,希望能有高人能指点一下。

另外,上面书写如有错误,欢迎指正;如有异议,请不吝赐教。
已邀请:

wisen

赞同来自:


bamboo+haproxy(记得在bamboo+haproxy节点安装calico),不过需要修改haproxy配置模板,默认和marathon-lb一样,只用于bridge模式。

tangjiaxing669 - Tom

赞同来自:


周末问题都没人看了呀....

geeks - geek

赞同来自:


提供了基于域名的服务发现的基础上,做基于 iptables的透明 RPC 分发( 无需在程序中访问注册中心获取成员列表进行软负载均衡;无需内网负载均衡层次增加网络开销)。比如,服务 A访问服务 B的虚拟 IP VIP,利用 iptables 做 DNAT,转成 B中的所有成员,服务 A可以直接并利用 probability特性按权重分发请求,比域名做轮转的负载均衡效果要好,因为 iptables可控,域名不可控。

qiujch

赞同来自:


当容器能使用固定IP通信时就不需要NAT了,但服务发现却是个问题,求解。

要回复问题请先登录注册