簡易的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