docker深入2-基于 swarm mode 的服务发现和注册

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker深入2-基于 swarm mode 的服务发现和注册相关的知识,希望对你有一定的参考价值。

docker深入2-基于 swarm mode 的服务发现和注册

2017/9/4


注:【未完待续】标签,表明现在没空继续研究,后续再补上,现在先分享出来,或许有朋友正需要思路和帮助。

一、前言
1、目的
1)研究基于 swarm mode 的服务发现和注册
2)熟悉使用 go 和 python 来写 agent 调用 docker api/sdk 来达到上述目的。
3)docker api/sdk 参考
 * docker api and sdk exp
 * api ref: https://docs.docker.com/engine/api/v1.3
 * sdk go: https://godoc.org/github.com/moby/moby/client

 * [howto]
 * # curl -s --unix-socket /var/run/docker.sock http:/v1.30/nodes |jq . |more
 * # curl -s --unix-socket /var/run/docker.sock http:/v1.30/services |jq . |more
 * # curl -s --unix-socket /var/run/docker.sock http:/v1.30/tasks |jq . |more

4)示例参考
https://github.com/opera443399/ops/blob/master/doc/Go/src/abc.com/demo/docker_api_exp/app.go
https://github.com/sergkh/docker-etcd-registrator/blob/master/register.py



2、数据流
docker service -> swarm mode manager -> my_test_etcd_registrator -> net_etcd -> LB+confd


3、示例 sergkh 的解决方案
4、参考示例后,自己的解决方案



二、示例 sergkh 的解决方案
1、创建独立的网络
docker network create --driver overlay net_etcd

注1:使用默认的 overlay 网络时,通过服务名无法互相ping通
注2:但通过 docker compose 创建 service 时,默认会创建一个独立的 overlay 网络


2、启动一个 etcd 服务
docker service create --name my_test_etcd     --network net_etcd     --publish 2379:2379     --publish 2380:2380     --detach=true     --constraint ‘node.role == manager‘     quay.io/coreos/etcd:latest etcd      --advertise-client-urls http://my_test_etcd:2379      --listen-client-urls http://0.0.0.0:2379

    
    
3、测试 etcd 服务是否工作
curl 127.0.0.1:2379/v2/keys/
curl -X PUT 127.0.0.1:2379/v2/keys/services -d key1=‘value1‘
curl 127.0.0.1:2379/v2/keys/services


4、服务注册
docker service create --name my_test_etcd_registrator     --network net_etcd     --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock     --env ETCD_HOST="my_test_etcd"     --env ETCD_PORT="2379"     --env BASE_DIR="/service"     --env UPDATE_INTERVAL="30"     --env RUN_ONCE="False"     --detach=true     --constraint ‘node.role == manager‘     sergkh/docker-etcd-registrator
    
    
5、服务发现
(未完待续,后续有空实现后再更新)


6、问题
1)sergkh 的 docker-etcd-registrator 服务中 python 脚本提取的内容可能不符合我的需求,后续将 fork 后改成自己需要的版本。
https://github.com/sergkh/docker-etcd-registrator/blob/c294b60cfb49a5213d9942b2ef4f99827435c182/register.py#L30
                descr[‘address‘] = ‘{0}:{1}‘.format(service.name, ports[0][‘TargetPort‘])
                
这里使用的是 TargetPort 而我需要的是 PublishedPort




三、参考示例后,自己的解决方案
(有时间实现后再补充)
1、TODO
实现一个服务注册的 agent 
实现一个服务发现的 agent








    
    
ZYXW、参考
1、https://github.com/sergkh
https://github.com/sergkh/docker-etcd-registrator
https://hub.docker.com/r/sergkh/nginx-autoproxy/
2、docker api
https://docs.docker.com/engine/api/v1.3
3、docker sdk go
https://godoc.org/github.com/moby/moby/client


以上是关于docker深入2-基于 swarm mode 的服务发现和注册的主要内容,如果未能解决你的问题,请参考以下文章

Docker Swarm 和Swarm mode 是两个概念!

Docker Swarm Mode无法增加管理节点

Docker Swarm Mode 入门实践

centos7下安装docker(25docker swarm---replicated mode&global mode)

Docker Swarm Mode简介与核心概念

比拼Mesos/Marathon?基于Docker 1.12 Swarm集群管理深度实践