天天看點

mesos入門(四)——docker應用的部署

簡易的docker應用部署以及修改了部分啟動腳本的bug

bug修改

在啟動了marathon後,我在mesos的webUI上發現marathon一直處于inactive狀态,後來想了想,marathon是放在啟動master的腳本中了,當它啟動時,slave/agent還未啟動,是以才會導緻framework呈現未激活的狀态,是以将在mesos上運作的framework的啟動單獨做成一個啟動腳本,問題解決

修改如下:

原start_master/tasks/main.yml

---

- name: get ip
  shell: ip addr|grep eth1|grep inet|awk '{print $2}'| cut -d / -f 1
  register: local_ip

- name: start zookeeper
  shell: "{{remote_dir}}/zookeeper/bin/zkServer.sh start"


- name: start mesos master
  shell: "{{remote_dir}}/mesos/sbin/mesos.sh start_master --hostname {{local_ip['stdout']}} --advertise_ip {{local_ip['stdout']}} --quorum {{quorum}} --zk {{mesos_zk}}"

- name: start marathon
  shell: "{{remote_dir}}/marathon/bin/marathon.sh start --master {{master}} --zk {{marathon_zk}} --libmesos_path {{remote_dir}}/mesos/lib/libmesos.so --hostname {{local_ip['stdout']}}"

           

現start_master/tasks/main.yml

---

- name: get ip
  shell: ip addr|grep eth1|grep inet|awk '{print $2}'| cut -d / -f 1
  register: local_ip

- name: start zookeeper
  shell: "{{remote_dir}}/zookeeper/bin/zkServer.sh start"


- name: start mesos master
  shell: "{{remote_dir}}/mesos/sbin/mesos.sh start_master --hostname {{local_ip['stdout']}} --advertise_ip {{local_ip['stdout']}} --quorum {{quorum}} --zk {{mesos_zk}}"
           

同時添加start_framework/tasks/main.yml

---

- name: get ip
  shell: ip addr|grep eth1|grep inet|awk '{print $2}'| cut -d / -f 1
  register: local_ip

- name: start marathon
  shell: "{{remote_dir}}/marathon/bin/marathon.sh start --master {{master}} --zk {{marathon_zk}} --libmesos_path {{remote_dir}}/mesos/lib/libmesos.so --hostname {{local_ip['stdout']}}"
           

docker應用部署

我前兩章提出了一個問題,關于能否在mesos進行Dockerfile的build這件事,我暫時好像沒有找到有效的解決方法,是以目前還是以拉取鏡像部署為場景

  • 應用場景

一個項目托管在github或者私人的gitlab上,當遠端倉庫有push時,就會觸發webhook,将資訊post給一個CI服務,CI将項目clone下來并進行鏡像的build,并将鏡像push到私有docker倉庫,随後用API接口調用marathon進行部署

  • 簡單的應用

這裡我們編寫了一個簡單的測試服務及其Dockerfile,我們在這裡并沒有用到ci,docker私有鏡像則采用阿裡雲的

app.py

from flask import Flask, jsonify


app = Flask(__name__)


@app.route('/test')
def hello():
    return jsonify({'msg': 'hello'})


if __name__ == '__main__':
    app.run(host='0.0.0.0')
           

Dockerfile

FROM python:

COPY ["./", "/var/test_server"]

WORKDIR /var/test_server

RUN pip3 install -r requirements.txt -i https://pypi.douban.com/simple/

CMD ["python3", "app.py"]
           

marathon的部署配置

{
  "id": "mesos-learn",
  "cpus": ,
  "mem": ,
  "networks": [ { "mode": "container/bridge" } ],
  "container": {
    "type": "DOCKER",
    "docker": {
      "forcePullImage": false,
      "image": "xxxx:xxxx"
    },
    "portMappings": [
      {
        "containerPort": ,
        "hostPort": ,
        "protocol": "tcp",
        "servicePort": 
      }
    ]
  }
}
           

tips: slave上的docker都需要配置你的私有倉庫才可以

寫了一個添加私有docker倉庫的子產品

add_docker_registry.py

import json
import os
from ansible.module_utils.basic import AnsibleModule


def add_registry(uri, auth, docker_home):
    if not os.path.isfile(docker_home+'/config.json'):
        with open(docker_home+'/config.json', 'w') as f:
            json.dump({}, f)
    with open(docker_home+'/config.json') as f:
        d = json.load(f)
        if d.get('auths') is None:
            d['auths'] = {}
        d['auths'][uri] = {}
        d['auths'][uri]['auth'] = auth
    with open(docker_home+'/config.json', 'w') as f:
        json.dump(d, f)


def main():
    module = AnsibleModule(
        argument_spec=dict(
            uri=dict(),
            auth=dict(),
            docker_home=dict(type='str', default='~/.docker')
        )
    )
    uri, auth, docker_home = module.params['uri'], module.params['auth'], module.params['docker_home']
    if uri.strip() == '':
        module.fail_json(msg='uri could not be None')
    if auth.strip() == '':
        module.fail_json(msg='auth could not be None')
    docker_home = docker_home.replace('~', os.path.expanduser('~'))
    if not os.path.isdir(docker_home):
        os.mkdir(docker_home)
    add_registry(uri, auth, docker_home)
    module.exit_json(
        uri=uri,
        docker_home=docker_home,
        msg='success'
    )


if __name__ == '__main__':
    main()
           

Usage

- name: add private registry
  add_docker_registry: uri=xxx auth=xxx
           

auth就是username:passwordbase64編碼後的字元串,其中username和password需要替換成你自己的值

具體項目: https://github.com/ncuwaln/mesos-learn

繼續閱讀