第 25 篇 : Marathon集群部署docker服务
说明
- 在151-155机器上部署docker服务以及蓝绿发布
- 克隆1台新的机器156, 配置为1核2G
1. 在所有机器上安装docker
参考之前的文章, 或根据此网址安装相应版本docker
2. 启动zookeeper集群(151-155)
zookeeper
cd /usr/local/src/zookeeper-3.7.1/bin
./zkServer.sh start
3. 启动mesos
3.1 清空主节点数据(151-153)
cd /var/lib
rm -rf mesos-master
rm -rf mesos-master-log
mkdir mesos-master
mkdir mesos-master-log
3.2 清空从节点数据(154-155)
cd /var/lib
rm -rf mesos-agent
rm -rf mesos-agent-log
mkdir mesos-agent
mkdir mesos-agent-log
3.3 主节点启动(151-153), 只有–ip不一样
cd /usr/local/src/mesos-1.11.0/build
./bin/mesos-master.sh --ip=192.168.109.151 --work_dir=/var/lib/mesos-master --zk=zk://192.168.109.151:2181,192.168.109.152:2181,192.168.109.153:2181,192.168.109.154:2181,192.168.109.155:2181/mesos --quorum=1 --log_dir=/var/lib/mesos-master-log --logging_level=WARNING
3.4 从节点启动(154-155)
cd /usr/local/src/mesos-1.11.0/build
./bin/mesos-agent.sh --master=zk://192.168.109.151:2181,192.168.109.152:2181,192.168.109.153:2181,192.168.109.154:2181,192.168.109.155:2181/mesos --work_dir=/var/lib/mesos-agent --log_dir=/var/lib/mesos-agent-log --containerizers=docker,mesos --logging_level=WARNING
4. 启动Marathon集群(151-153)
cd /usr/local/src/marathon-1.8.222
./bin/marathon --master zk://192.168.109.151:2181,192.168.109.152:2181,192.168.109.153:2181,192.168.109.154:2181,192.168.109.155:2181/mesos --zk zk://192.168.109.151:2181,192.168.109.152:2181,192.168.109.153:2181,192.168.109.154:2181,192.168.109.155:2181/marathon --http_port 6060 --logging_level warn
在mesos可以看到主节点是151, 访问151 访问152 访问153
5. 在156机器上安装Nginx
5.1 下载nginx-1.24.0
5.2 安装&配置
cd /usr/local/src
上传下载好的Nginx文件到上述目录
tar -zxvf nginx-1.24.0.tar.gz
rm -rf nginx-1.24.0.tar.gz
cd nginx-1.24.0
./configure
make
make install
cd /usr/local/nginx/conf
vi nginx.conf
把整个server全部删除(包括示例的注释), 替换成下面的内容
server {
listen 80;
server_name www.mesos.com;
location / {
proxy_pass http://192.168.109.151:5050;
}
}
server {
listen 80;
server_name www.marathon.com;
location / {
proxy_pass http://192.168.109.151:6060;
}
}
创建软链接
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
nginx -v
当然, 也可只使用一个域名(例如公司域名), 再通过二级域名去匹配location跳转到指定界面, 即1个server, 2个location
5.3 启动
cd /usr/local/nginx/sbin
./nginx
后续可通过 nginx -s signal 操作nginx, signal的值有: stop, quit, reopen, reload
6. 修改本机hosts文件&通过域名访问mesos和marathon
在文件地址栏输入 C:\Windows\System32\drivers\etc\hosts, 最后一行增加如下内容
192.168.109.156 www.mesos.com
192.168.109.156 www.marathon.com
7. 在154机器上, 制作docker镜像
参考第 24 篇, 做出my-project:v1和my-project:v2, jar包顺便改了下返回, 最终效果如下
docker images
docker run -d -p 8971:8888 my-project:v1
docker run -d -p 8972:8888 my-project:v2
docker ps
curl http://localhost:8971/docker/status
curl http://localhost:8972/docker/status
没啥问题就可以停止服务了
docker kill XXX
8. 在154机器上, 通过Marathon启动docker
8.1 编写2个文件: v1.json、v2.json, 以v1.json为例, v2.json镜像改为v2
cd ~
vi v1.json
内容
{
"id": "my-project",
"cpus": 0.2,
"mem": 64,
"networks": [ { "mode": "container/bridge" } ],
"container": {
"type": "DOCKER",
"docker": {
"image": "my-project:v1"
},
"portMappings": [
{ "containerPort": 8888, "hostPort": 0}
]
}
}
8.2 通过API启动服务
curl -X POST http://192.168.109.151:6060/v2/apps -d @v1.json -H "Content-type: application/json"
我这里的mesos先在155机器上启动失败(因为就没镜像, 第 9 步解决), 继而转到154机器上执行, 成功
在任意一台服务上请求, 注意看端口
curl http://192.168.109.154:31443/docker/status
8.3 蓝绿发布
curl -X PUT http://192.168.109.151:6060/v2/apps/my-project -d @v2.json -H "Content-type: application/json"
可以看到, 原来的服务已经被kill, 服务已升级到my-project:v2, 没啥问题可以把服务停掉了
9. 创建阿里云docker仓库-个人版
暂时先用阿里云, 虽然有限, 但目前够用了, 后续会搭建 Harbor
9.1 命名空间 hahashou
9.2 镜像仓库 docker-test
第二步选择本地仓库, 创建即可, 后续可以看到很多命令
9.3 在154和155机器上登录自己的阿里云镜像仓库, 远程镜像拉取权限参考
docker login --username=XXX registry.cn-hangzhou.aliyuncs.com
cat ~/.docker/config.json
cd ~
tar -czf docker.tar.gz .docker
tar -tvf ~/docker.tar.gz
cp docker.tar.gz /etc/
9.4 在154机器上, 新作镜像my-project:v3, 将v1, v2, v3都上传到仓库
修改一下项目中的返回
docker images
依次推送v1, v2, v3
docker tag [镜像ID] registry.cn-hangzhou.aliyuncs.com/hahashou/docker-test:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/hahashou/docker-test:[镜像版本号]
删除本地镜像
docker rm $(docker ps -a -q)
docker rmi -f $(docker images -q)
9.5 通过marathon直接启动远程镜像(154)
cd ~
vi test-v1.json
内容
{
"id": "docker-test",
"cpus": 0.2,
"mem": 64,
"networks": [ { "mode": "container/bridge" } ],
"container": {
"type": "DOCKER",
"docker": {
"image": "registry.cn-hangzhou.aliyuncs.com/hahashou/docker-test:v1"
},
"portMappings": [
{ "containerPort": 8888, "hostPort": 0}
]
},
"fetch": [
{
"uri": "file:///etc/docker.tar.gz"
}
]
}
启动
curl -X POST http://192.168.109.151:6060/v2/apps -d @test-v1.json -H "Content-type: application/json"
这样, 就可以不依赖本地的docker镜像启动服务。无论服务往任何从节点部署, 都不会出现找不到镜像的问题了, 亦可参考此处, 将镜像拉取到本地, “forcePullImage”: true
注意看155服务上对应的端口
curl http://192.168.109.155:31680/docker/status
9.6 蓝绿发布自行测试
10. 写到这里的总结
- 配置Nginx, 使N个域名同时指向一个IP, 由Nginx实现转发
- 通过gitlab创建前后端项目, 拉取代码, 新建分支dev、uat、prd, dev commit and push, merge到uat, 再到prd。uat手动build, prd配置自动build流水线
- 迁移前端src和后端jar包到指定DockerFile文件中, 由此生成docker前后端镜像, 推送到阿里云docker仓库
- 在mesos集群运行marathon集群, 由zookeeper实现高可用。 通过marathon API启动远程的前后端docker服务, 当前端服务的IP发生变化时, 更新Nginx中的转发的IP地址
- 增加网关, 将前端的请求全部请求到网关。网关启动时, 同时监听marathon上的服务, 维持最新的前端到后端的映射
- 可以手写工具类, 将前后端所需要的CPU、内存等信息存储起来, 当marathon启动服务前, 增加一层mesos资源校验, 判断agent的CPU、内存、磁盘容量等是否满足当前服务
版权声明:
本文为[哼唧兽0921]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qiezi__/article/details/131832494