技术文章

第 25 篇 : Marathon集群部署docker服务

哼唧兽0921

An editor at Blogzine


  • 2023-08-02
  • 52天前
  • 5668
  • 36 Views
  • 100

说明

  1. 在151-155机器上部署docker服务以及蓝绿发布
  2. 克隆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

Mesos集群

mesos集群启动

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
marathon主节点

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;
        }
    }

Nginx的配置文件
创建软链接

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

访问mesos 访问marathon

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机器上执行, 成功

154执行成功
marathon启动成功
在任意一台服务上请求, 注意看端口

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

阿里docker镜像仓库
第二步选择本地仓库, 创建即可, 后续可以看到很多命令

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

最新docker镜像列表
依次推送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机器上启动
注意看155服务上对应的端口

curl http://192.168.109.155:31680/docker/status

9.6 蓝绿发布自行测试

10. 写到这里的总结

  1. 配置Nginx, 使N个域名同时指向一个IP, 由Nginx实现转发
  2. 通过gitlab创建前后端项目, 拉取代码, 新建分支dev、uat、prd, dev commit and push, merge到uat, 再到prd。uat手动build, prd配置自动build流水线
  3. 迁移前端src和后端jar包到指定DockerFile文件中, 由此生成docker前后端镜像, 推送到阿里云docker仓库
  4. 在mesos集群运行marathon集群, 由zookeeper实现高可用。 通过marathon API启动远程的前后端docker服务, 当前端服务的IP发生变化时, 更新Nginx中的转发的IP地址
  5. 增加网关, 将前端的请求全部请求到网关。网关启动时, 同时监听marathon上的服务, 维持最新的前端到后端的映射
  6. 可以手写工具类, 将前后端所需要的CPU、内存等信息存储起来, 当marathon启动服务前, 增加一层mesos资源校验, 判断agent的CPU、内存、磁盘容量等是否满足当前服务
    我的手画

版权声明:

本文为[哼唧兽0921]所创,转载请带上原文链接,感谢

https://blog.csdn.net/qiezi__/article/details/131832494


评论数 0



留下回复

如果您是个网络喷子或者键盘侠,那么建议您多看少说。