2021年8月,闲人老师找了一些老朋友,整个部门一起入职了一份新工作,工作内容比较轻松,闲人老师在团队中是前端身份。
2022年1月,离新年还有一个月,闲人老师基本完成了整年的工作,手上比较闲,又正好公司买了台新服务器,闲人老师就花时间在新服务器上搭建了一个微型集群系统,为以后的系统扩容建立一个架构基础。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
采用官方说明安装docker,一般CentOS
系统执行命令如下
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
注:最好将docker命令设置为无sudo前缀以方便使用
首先建立docker用户组sudo groupadd docker
让后将当前用户加入docker用户组sudo usermod -aG docker 当前用户
最后重新链接服务器
传送门:安装文档、设置无sudo运行
Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。
执行初始化命令:docker swarm init --advertise-addr=广播IP地址
执行后返回以工作节点模式加入集群所需的令牌:docker swarm join-token worker
执行后返回以管理节点模式加入集群所需的令牌:docker swarm join-token manager
执行后将节点加入现有集群:docker swarm join --token 你的TOKEN 管理节点广播IP地址
准备统一网络:docker network create --driver overlay app
准备工作目录:mkdir /data & cd /data
传送门:集群文档
Portainer是用来管理容器的一个GUI项目
提前下载汉化包curl -sL https://github.com/eysp/public/archive/public.tar.gz | tar xz
按需新建portainer堆栈文件vim portainer-agent-stack.yml
version: '3.7'
services:
agent:
image: portainer/agent:2.11.0
volumes:
- /var/run/docker.sock:/var/run/docker.sock # docker管道代理
- /var/lib/docker/volumes:/var/lib/docker/volumes # docker数据代理
networks:
- app
deploy:
mode: global
placement:
constraints: [node.platform.os == linux] # 只部署到linux环境下
portainer:
image: portainer/portainer-ce:2.11.0
command: -H tcp://tasks.agent:9001 --tlsskipverify
ports:
- "8080:9000" # 映射页面端口到8080
volumes:
- /data/public:/public # 映射汉化文件夹
- portainer:/data
networks:
- app
deploy:
mode: replicated
replicas: 1 # 只部署一份
placement:
constraints: [node.role == manager] # 只部署到管理节点
networks:
app:
external: true # 使用已经创建好的网络
volumes:
portainer: # 使用名为portainer的数据文件夹
部署服务堆栈docker stack deploy -c portainer-agent-stack.yml portainer
打开portainer管理界面http://集群管理服务器ip:8080
新建管理员账户与密码,为了安全,请注意账户密码复杂度
传送门:堆栈、Portainer、汉化
Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,所以它可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。
打开Portainer地址,选择管理节点,进入储存卷管理,新建全局卷:acme和postgres
打开Portainer地址,选择管理节点,进入堆栈管理,按需新建堆栈:gateway
version: "3.7"
networks:
app:
external: true
volumes:
acme:
external: true
postgres:
external: true
services:
postgres: # kong数据服务
image: postgres:9.6
restart: always
networks:
- app
volumes:
- postgres:/var/lib/postgresql/data
environment:
- POSTGRES_USER=postgres
- POSTGRES_DB=postgres
- POSTGRES_PASSWORD=postgres
migration: # kong数据表初始化服务
image: kong:2.7.0-alpine
command: "kong migrations bootstrap"
networks:
- app
restart: on-failure
environment:
- KONG_DATABASE=postgres
- KONG_PG_HOST=postgres
- KONG_PG_DATABASE=postgres
- KONG_PG_USER=postgres
- KONG_PG_PASSWORD=postgres
depends_on:
- postgres # 在数据库启动后启动
core: # kong核心服务
image: kong:2.7.0-alpine
restart: always
networks:
- app
environment:
- KONG_DATABASE=postgres
- KONG_PG_HOST=postgres
- KONG_PG_DATABASE=postgres
- KONG_PG_USER=postgres
- KONG_PG_PASSWORD=postgres
- KONG_PROXY_ACCESS_LOG=/dev/stdout
- KONG_ADMIN_ACCESS_LOG=/dev/stdout
- KONG_PROXY_ERROR_LOG=/dev/stderr
- KONG_ADMIN_ERROR_LOG=/dev/stderr
- KONG_ADMIN_LISTEN=0.0.0.0:8001
- LUA_SSL_TRUSTED_CERTIFICATE=system
ports:
- "80:8000"
- "443:8443"
depends_on:
- postgres # 在数据库启动后启动
admin: # konga管理界面
image: pantsel/konga:0.14.9
restart: always
networks:
- app
environment:
- NODE_ENV=development
- DB_ADAPTER=postgres #mongo,mysql,postgres
- DB_HOST=xxxxxxxx
- DB_PORT=xxxx
- DB_USER=xxxxxx
- DB_PASSWORD=xxxxxxxx
- DB_DATABASE=xxxxxx
ports:
- "8081:1337"
acme: # 用来生成SSL证书
image: neilpang/acme.sh
networks:
- app
volumes:
- acme:/acme.sh
command: daemon
environment:
- KONG_URL=http://core:8001
- Ali_Key=xxxxxxxx
- Ali_Secret=xxxxxxxx
打开konga管理界面http://集群管理服务器ip:8081
新建管理员账户与密码,为了安全,请注意账户密码复杂度
传送门:Kong、Konga、acme.sh
打开Konga地址,进入SERVICES,新建各个服务(ADD NEW SERVICE)
注:此处对应Portainer中的各个需要被访问的服务
容器管理服务
,Url:http://portainer:9000
网关管理服务
,Url:http://gateway_admin:1337
选择相应服务,进入Routes子项,新建对外访问路由(ADD ROUTE)
注:此处对应外网访问的各个具体域名路径,本文dev.abc.com
都需要更改为你自己的域名
容器管理服务
,Hosts:portainer.dev.abc.com
网关管理服务
,Hosts:konga.dev.abc.com
acme服务将会自动将生成过的证书进行续期更新,所以我们的工作只有手动执行一次证书生成。
acme.sh --issue --dns dns_ali -d dev.abc.com -d *.dev.abc.com
acme.sh --deploy -d dev.abc.com --deploy-hook kong
dev.abc.com
,增加匹配规则(ADD SNI)*.dev.abc.com
用来自动对证书进行模糊匹配注:闲人老师使用阿里云域名,其它域名的生成方式请参考acme.sh的Wiki。传送门
注:如果需要强制Https,则修改Konga中的路由设置的Https redirect status code为301, 302, 307 或 308
, 并删除Protocols中的HTTP,使其只有HTTPS一项
为了使服务更加安全,在采用了强制SSL后,最好选择性关闭对外的8080和8081端口,使服务更加安全
关闭后,相应服务将只能通过域名访问,并且强制加载SSL证书
到上面为止,我们就部署了一个基本的swarm集群,带有容器管理工具和网关。
所有业务内容,都可以通过服务进行部署,由于篇幅原因,本章就不再进行讲解了。
下一章将会讲解如何部署一套自动构建的项目环境,欢迎关注。
也可以加闲人老师的QQ群互相学习:1033245535