微型集群系统搭建

项目启动

2021年8月,闲人老师找了一些老朋友,整个部门一起入职了一份新工作,工作内容比较轻松,闲人老师在团队中是前端身份。
2022年1月,离新年还有一个月,闲人老师基本完成了整年的工作,手上比较闲,又正好公司买了台新服务器,闲人老师就花时间在新服务器上搭建了一个微型集群系统,为以后的系统扩容建立一个架构基础。

搭建过程

1. 安装Docker基础

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运行

2. 初始化Swarm集群

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

传送门:集群文档

3. 部署Portainer服务

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、汉化

4. 部署Kong网关堆栈

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

5. 设置管理界面路由

打开Konga地址,进入SERVICES,新建各个服务(ADD NEW SERVICE)
:此处对应Portainer中的各个需要被访问的服务

  1. Name:容器管理服务,Url:http://portainer:9000
  2. Name:网关管理服务,Url:http://gateway_admin:1337

选择相应服务,进入Routes子项,新建对外访问路由(ADD ROUTE)
:此处对应外网访问的各个具体域名路径,本文dev.abc.com都需要更改为你自己的域名

  1. Name:容器管理服务,Hosts:portainer.dev.abc.com
  2. Name:网关管理服务,Hosts:konga.dev.abc.com
生成SSL证书,并使用HTTPS访问

acme服务将会自动将生成过的证书进行续期更新,所以我们的工作只有手动执行一次证书生成。

  • 打开Portainer中的容器管理,找到acme.sh的唯一容器,进入服务器控制台。
  • 运行命令生成证书acme.sh --issue --dns dns_ali -d dev.abc.com -d *.dev.abc.com
  • 部署证书到kongacme.sh --deploy -d dev.abc.com --deploy-hook kong
  • 进入Konga管理页面,选择证书管理(CERTIFICATES),找到证书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

你可能感兴趣的:(架构,docker,容器,php集群,微服务架构)