也许我的春天终于来了。。。

小说:也许我的春天终于来了。。。作者:宗侯安海更新时间:2019-03-22字数:92772

薛师长说得没错,到了战场上,对面的枪弹和炮弹可不长眼睛的,哪管你是长官还是小兵?

拯救地球的美国大片,你看过哪些?

天空中异香飘下,一个手持莲花的天女落了下来,她骑的是一头金色的大猪,头上现出宝塔佛光。
不仅仅是冬衣上有了微妙的变化,很多细心的民众都发现了另一个有趣的现象,那就是长安街头不少马匹的个头都明显地变得高大,和矮小瘦弱的中原马完全不同,这是从安西引入的伊犁马,不过这些只是普通挽马,而不是优秀的战马,安西军对西域优良战马控制得极严,决不准像大宛马和阿拉伯马之类的种马流入河北,防止被安禄山用来改良骑兵马。

“柔和刚吗宁”刘皓沉思了一会,他己经基本确立了第四重功法会是怎么样的,所以看到两股不同真气带着两种不同的气劲不断冲夹,立刻想观察一下了。

前面我们已经通过jenkins+docker搭建了基本的持续集成环境,实现了服务的自动构建和部署,但是,我们遇到一个问题,jenkins构建出来的镜像部署后,需要通过ip:port去访问,有什么更好的方法吗?肯定是通过域名啊!前提是你注册一个域名,或者修改机器hosts文件。
本文介绍通过引入etcd+confd实现部署服务的自动注册,自动生成nginx配置文件,实现每个服务独立域名访问。

配置域名

假设你的域名是: example.com,那么我们可以规划

  • dev.$servicename.example.com作为开发环境,
  • test.$servicename.example.comz作为服务的测试环境。

配置步骤:

  • 首先将*.example.com 指向一台nginx服务器
  • 增加vhost配置文件,假设86.6,86.8,86.11 是docker swarm集群中的机器,服务的名称为allinoneservice,那么我们可以增加一个配置文件nginx_vhosts/service.conf:
    upstream test_service_allinoneservice {
        server 192.168.86.11:10091;
        server 192.168.86.6:10091;
        server 192.168.86.8:10091;
    }

    server {
        listen       80;
        server_name test.allinoneservice.example.com;
        location / {
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_read_timeout 300;
            proxy_set_header X-Real-IP $http_x_forwarded_for;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://test_service_allinoneservice;
        }
    }
  • 修改nginx配置文件nginx.conf,在最后一个大括号前,将刚新建的配置文件包含进去:

    include nginx_vhosts/*.conf;
  • 重启nginx,就可以通过test.allinoneservice.example.com访问服务了

通过服务注册自动生成配置文件

第一步里,我们需要手动编写配置文件,有更好的方式吗?答案是通过服务注册+confd,自动生成配置文件。

docker 安装etcd集群

首先,docker安装etcd作为注册中心,我们安装一个包含3个实例的集群,编写docker-compose.yml:

version: "3"
services:
  etcd0:
    image: 192.168.86.8:5000/etcd
    ports:
      - "2379:2379"
    volumes:
      - etcd0:/etcd_data
    command:
      - /usr/local/bin/etcd
      - -name
      - etcd0
      - --data-dir
      - /etcd_data
      - -advertise-client-urls
      - http://etcd0:2379
      - -listen-client-urls
      - http://0.0.0.0:2379
      - -initial-advertise-peer-urls
      - http://etcd0:2380
      - -listen-peer-urls
      - http://0.0.0.0:2380
      - -initial-cluster
      - etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
  etcd1:
    image: 192.168.86.8:5000/etcd
    ports:
      - "2380:2379"
    volumes:
      - etcd1:/etcd_data
    command:
      - /usr/local/bin/etcd
      - -name
      - etcd1
      - --data-dir
      - /etcd_data
      - -advertise-client-urls
      - http://etcd1:2379
      - -listen-client-urls
      - http://0.0.0.0:2379
      - -initial-advertise-peer-urls
      - http://etcd1:2380
      - -listen-peer-urls
      - http://0.0.0.0:2380
      - -initial-cluster
      - etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
  etcd2:
    image: 192.168.86.8:5000/etcd
    ports:
      - "2381:2379"
    volumes:
      - etcd2:/etcd_data
    command:
      - /usr/local/bin/etcd
      - -name
      - etcd2
      - --data-dir
      - /etcd_data
      - -advertise-client-urls
      - http://etcd2:2379
      - -listen-client-urls
      - http://0.0.0.0:2379
      - -initial-advertise-peer-urls
      - http://etcd2:2380
      - -listen-peer-urls
      - http://0.0.0.0:2380
      - -initial-cluster
      - etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
volumes:
  etcd0:
  etcd1:
  etcd2:

注意,上面的image: 192.168.86.8:5000/etcd 是用的私有仓库,大家可以使用官方版本quay.io/coreos/etcd

然后启动etcd:

docker stack deploy -c docker-compose.yml etcd

服务注册

etcd注册就简单了,可以通过etcd的rest api,例如:

curl http://192.168.86.11:2379/v2/keys/services/test/allinoneservice/service1 -XPUT -d value="192.168.86.8:10091"

所以,我们修改一下jenkins里的docker部署脚本,服务部署后自动向etcd注册,由于是swarm集群,因此我们可以注册多个ip。

echo "start remove old service"
docker service rm  ${service_name}-${env}
echo "start create new service with latest builded image"
docker service create --name ${service_name}-${env} --replicas ${replicas} --publish ${service_port}:${docker_expose_port} 192.168.86.8:5000/${service_name}-${env}
echo "publish service to nginx"
curl http://192.168.86.11:2379/v2/keys/services/${env}/${service_name}/service1 -XPUT -d value="192.168.86.8:${service_port}"
curl http://192.168.86.11:2379/v2/keys/services/${env}/${service_name}/service2 -XPUT -d value="192.168.86.11:${service_port}"
curl http://192.168.86.11:2379/v2/keys/services/${env}/${service_name}/service3 -XPUT -d value="192.168.86.6:${service_port}"

注意,上面的service_name是jenkins参数化构建里定义的参数:

jenkins参数化构建

通过confd生成nginx配置文件

confd 是一个配置文件生成工具,可以从etcd、consul等注册中心读取数据根据模板生成配置文件,并在配置发生变化后自动更新配置文件,还能自动重启服务,是服务自动发现的居家必备良药。

首先讲下怎么安装,根据官方文档:

wget https://github.com/kelseyhightower/confd/releases/download/v0.14.0/confd-0.14.0-linux-amd64
mkdir -p /opt/confd/bin
mv confd-0.14.0-linux-amd64 /opt/confd/bin/confd
chmod +x /opt/confd/bin/confd
export PATH="$PATH:/opt/confd/bin"

为了方便使用,最好修改下/etc/profile,加入export PATH="$PATH:/opt/confd/bin",然后source /etc/profile让配置生效。

然后编写confd配置文件/etc/confd/conf.d/myapp-nginx.toml:

[template]
src = "nginx.conf.tmpl"
dest = "/opt/third_party/nginx_vhosts/service.conf"
keys = [
    "/services/dev",
    "/services/test",
]
reload_cmd = "/opt/third_party/sbin/nginx -s reload"

上面配置了,会读取的keys,以及dest目标配置文件地址,和配置文件更新后的reload_cmd,用于重启nginx

接着编写模板文件

{{range $dir := lsdir "/services/test"}}
upstream test_service_{{base $dir}} {
    {{$custdir := printf "/services/test/%s/*" $dir}}{{range getvs $custdir}}
    server {{.}};
    {{end}}
}

server {
    listen       80;
    server_name test.{{base $dir}}.iflyresearch.com;
    location / {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_read_timeout 300;
        proxy_set_header X-Real-IP $http_x_forwarded_for;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://test_service_{{base $dir}};
    }
}
{{end}}

上面的模板比较简单,通过lsdir指令读取服务列表,然后通过range getvs获取服务对应的负载地址。

然后启动confd,需要指定etcd的地址:

nohup confd -backend etcd -node http://192.168.86.11:2379 &

搞定!

延伸阅读

Jenkins+Docker 搭建持续集成环境:

  • Docker+Jenkins持续集成环境(1)使用Docker搭建Jenkins+Docker持续集成环境
  • Docker+Jenkins持续集成环境(2)使用docker+jenkins构建nodejs前端项目
  • Docker+Jenkins持续集成环境(3)集成PMD、FindBugs、Checkstyle静态代码检查工具并邮件发送检查结果

作者:Jadepeng
出处:jqpeng的技术记事本--http://www.cnblogs.com/xiaoqi
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

编辑:安乙成

发布:2019-03-22 00:10:33

当前文章:http://emigration.net.cn/news/2019012289972/index.html

宝宝皮肤过敏怎么办 【情感问答】借男友的钱要还吗 怎么和我人生的部分情形惊人相似? 你还这么年轻,不必活得好像历经沧桑 想失去一个心爱的女人,你需要怎么做 终于找到适合自己的学习方法 又到层林尽染时,你觉得哪里的枫叶最漂亮? 名正则言顺,言顺则运通,运通则事成

12069 19582 57072 40369 89687 96446 88667 71927 30478 70896 52344 64557 15344 47626 47230 85278 48283 52437 10705 60709

我要说两句: (0人参与)

发布