设为首页 收藏本站
查看: 1151|回复: 0

[经验分享] saltstack与docker结合构建高可用和自动发现服务

[复制链接]

尚未签到

发表于 2018-5-30 10:24:43 | 显示全部楼层 |阅读模式
  最近看了刘天斯大哥的文章《构建一个高可用及自动发现docker基础架构》,觉得高大上,他的架构基于etcd+confd+docker+haproxy构建的。至于优势,刘天斯大哥已经说的很清楚。
  我这里想说的是我自己基于saltstack+docker+haproxy构建的架构,所有操作都只要在salt-master上执行即可。
  

  架构说明:管理员在salt-master端使用python程序启动容器,向redis注册信息,包括容器名字、IP、端口等。master端会根据这个信息实时生成pillar数据,再根据相应的states文件,就能定期更新haproxy配置和reload服务。
   DSC0000.jpg
  流程:管理员在master端通过python程序远程启动容器,并将信息注册到redis,master开启一个crontab,根据pillar数据和states定期维护haproxy配置并reload。

  
DSC0001.jpg

  

  服务部署
  接入层 是基于CentOS 6.2搭建。
  存储层 是基于CentOS 6.5搭建。
  应用层 是基于Ubuntu 13.04搭建。
角色IP服务
接入层192.168.79.51
salt-minion haproxy
存储层192.168.79.55salt-master redis
应用层192.168.79.44salt-minion docker
  关于服务的安装可以查看官网安装,这里不再描述。
  

  79.55
  /srv/salt/haproxy目录有三个文件:docker_nginx_manage.py、haproxy.cfg、haproxy.sls。
  /srv/pillar目录有两个文件:haproxy.sls、top.sls。
  

  操作步骤
  将docker_nginx_manage.py统一同步到应用主机/opt/bin目录下。
salt -L '192.168.79.44,' cp.get_file salt://haproxy/docker_nginx_manage.py /opt/bin/docker_nginx_manage.py, 这里可以定义一个应用组,使用-N参数  刷新下pillar
salt '*' saltutil.refresh_pillar  添加crontab
*/1 * * * * /usr/bin/salt  -L '192.168.79.51,' state.sls haproxy.haproxy &>/dev/null &  启动一个容器
salt '192.168.79.44' cmd.run 'python /opt/bin/docker_nginx_manage.py run nginx'  一分钟后会执行crontab任务,修改haproxy并reload。
  

  docker_nginx_manage.py代码
  我这里只是测试,代码写的比较简单,实际情况需要考虑异常、容器名字唯一等情况。
#!/usr/bin/env python
# coding:utf-8
import sys
import docker
import redis
import subprocess
import re
cli = docker.Client(base_url='unix://var/run/docker.sock')
conn = redis.StrictRedis(host='192.168.79.55', port=2001)  # 根据实际情况修改
def delete_redis(key):
        conn.delete(key)
def insert_redis(key,value):
        conn.set(key,value)
def get_ip():
        out = subprocess.Popen(
                '/sbin/ip addr show eth0',
                shell=True,
                close_fds=True,
                stdout=subprocess.PIPE,
                stderr=subprocess.STDOUT).communicate()[0]
        info = re.compile(r'inet\s*(.*?)/\d+\s*brd\s*').search(out)
        ip = info.group(1)
        return ip
def get_info(container):
        info = cli.inspect_container(container)
        ip = get_ip()
        port = info['NetworkSettings']['Ports']['80/tcp'][0]['HostPort']
        name = info['Name'][1:]
        return name,ip+':'+port

def stop_container(container):
        name,value = get_info(container)
        cli.stop(container)
        delete_redis(name)
def start_container(container):
        cli.start(container,publish_all_ports=True)
        name,value = get_info(container)
        insert_redis(name,value)
def create_container(image):
        container_id = cli.create_container(image=image)
        start_container(container_id)
def check_args():
        if len(sys.argv) != 3 or sys.argv[1] not in ['run','start','stop']:
                print '\nUsage: %s run <image name>:<version>' % sys.argv[0]
                print ' %s start <container name or id>'  % sys.argv[0]
                print ' %s stop <container name or id>\n'       % sys.argv[0]
                sys.exit(1)
def main():
        check_args()
        if sys.argv[1] == 'run':
                create_container(sys.argv[2])
        elif sys.argv[1] == 'stop':
                stop_container(sys.argv[2])
        elif sys.argv[1] == 'start':
                start_container(sys.argv[2])
        else:
                check_args()
if __name__ == "__main__":
        main()  

  haproxy.cfg模版配置

global  
        log 127.0.0.1 local3  
        maxconn 5000  
        uid 99  
        gid 99  
        daemon
defaults  
        log 127.0.0.1 local3  
        mode http  
        option dontlognull  
        retries 3  
        option redispatch  
        maxconn 2000  
        timeout connect  5000  
        timeout client 50000  
        timeout server 50000
listen frontend 0.0.0.0:80  
        mode http  
        balance roundrobin  
        maxconn 2000  
        option forwardfor
        {% for i in pillar.haproxy -%}
        server `i` {{pillar.haproxy}} check inter 5000 fall 1 rise 2
        {% endfor -%}
        stats enable  
        stats uri /admin-status  
        stats auth admin:123456  
        stats admin if TRUE  

  haproxy.sls文件

create_conf:
  file.managed:
    - name: /etc/haproxy/haproxy.cfg
    - source: salt://haproxy/haproxy.cfg
    - template: jinja

reload_haproxy:
  service.running:
    - name: haproxy
    - enable: True
    - reload: True
    - watch:
      - file: create_conf  

  pillar数据
  haproxy.sls

#!py
import redis
def run():
        haproxy = {}
        haproxy['haproxy'] = {}
        conn = redis.StrictRedis(host='192.168.79.55', port=2001)
        keys = conn.keys('*')
        keys.sort()
        for key in keys:
                haproxy['haproxy'][key] = conn.get(key)
        return haproxy  top.sls

base:
  '*':   # 根据具体情况修改
    - haproxy  

  我们可以打开http://192.168.79.51/admin-status监控变化
DSC0002.jpg

  

  直接打开http://192.168.79.51/ 可以看到信息
  
DSC0003.jpg

  

  参考地址
  http://blog.liuts.com/post/242/
  http://www.saltstack.com/
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-482958-1-1.html 上篇帖子: Docker容器管理之Kubernetes 下篇帖子: docker基础入门
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表