阿里云使用Docker部署单Kong+多Consul集群,图文结合
操作系统
操作系统:Centos7.6
Consul集群地址(阿里云按量计费):
IP |
Node |
外网IP |
172.18.221.120 |
server1 |
118.31.173.29 |
172.18.221.121 |
server2 |
118.178.84.137 |
172.18.221.122 |
server3 |
47.99.180.118 |
Kong地址(阿里云按量计费):
IP |
外网IP |
172.18.221.123 |
116.62.10.11 |
关闭防火墙
四台都要关闭
#关闭防火墙
[root@localhost consul.d]# systemctl stop firewalld.service
#关闭开机启动
[root@localhost consul.d]# systemctl disable firewalld.service
#查看防火墙状态
[root@localhost consul.d]# firewall-cmd --state
安装Docker
四台都要安装
#yum安装Docker
[root@localhost ~]# yum install -y docker
#修改docker镜像加速器
[root@localhost ~]# vi /etc/docker/daemon.json
使用下面内容替换原先内容,保存并退出。“ggdG”命令全选内容并删除
{
"registry-mirrors": ["https://njrds9qc.mirror.aliyuncs.com"]
}
#刷新daemon
[root@localhost ~]# systemctl daemon-reload
#设置开机启动
[root@localhost ~]# systemctl enable docker
#重启docker
[root@localhost ~]# systemctl restart docker
安装Consul集群
添加docker挂载卷
三台Consul都要操作
#创建consul的数据目录卷
[root@localhost ~]# mkdir /app/consul/data -p
#创建consul的配置目录卷
[root@localhost ~]# mkdir /app/consul/conf -p
安装Consul集群
#172.18.221.120执行:
[root@localhost ~]# docker run --network=host -d -p 8500:8500 --restart=always -v /app/consul/data:/consul/data -v /app/consul/conf:/consul/config --privileged=true --name=server1 consul \
agent -server -bootstrap-expect=3 -ui -node=server1 -client='0.0.0.0' -bind=0.0.0.0 -data-dir /consul/data -config-dir /consul/config -datacenter=dc1 -advertise=172.18.221.120
#172.18.221.121执行:
[root@localhost ~]# docker run --network=host -d -p 8500:8500 --restart=always -v /app/consul/data:/consul/data -v /app/consul/conf:/consul/config --privileged=true --name=server2 consul \
agent -server -ui -node=server2 -client='0.0.0.0' -bind=0.0.0.0 -data-dir /consul/data -config-dir /consul/config -datacenter=dc1 -advertise=172.18.221.121 -join=172.18.221.120
#172.18.221.122执行:
[root@localhost ~]# docker run --network=host -d -p 8500:8500 --restart=always -v /app/consul/data:/consul/data -v /app/consul/conf:/consul/config --privileged=true --name=server3 consul \
agent -server -ui -node=server3 -client='0.0.0.0' -bind=0.0.0.0 -data-dir /consul/data -config-dir /consul/config -datacenter=dc1 -advertise=172.18.221.122 -join=172.18.221.120
查看集群状态
#server1对应172.18.221.120,所以需要在这台下面执行
[root@localhost ~]# docker exec server1 consul operator raft list-peers
验证结果
浏览器输入:http://118.31.173.29:8500
安装Kong
以下都是在172.18.221.123上操作
启动数据库
[root@localhost ~]# docker run -d --name kong-database \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kong" \
--restart always \
postgres:11.10
注意postgres数据库的版本,我这里选用的是11.10
使用临时Kong容器初始化数据库
[root@localhost ~]# docker run --rm \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=172.18.221.123" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
kong:latest kong migrations bootstrap
启动kong
[root@localhost ~]# docker run -d --name kong \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=172.18.221.123" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
--restart always \
-v /app/kong/kong.conf:/etc/kong/kong.conf \
kong:latest
说明:如果想让kong默认监听80端口,那么需要将上面的
-p 8000:8000 \
改为
-p 80:8000 \
如果没有/app/kong/kong.conf怎么办?可以先把启动参数中这行去掉,启动kong。成功后从容器拷贝到该位置,然后再删除容器并重新启动。
[root@localhost consul.d]# mkdir /app
[root@localhost data]# cd /app
[root@localhost data]# docker ps
[root@localhost data]# docker cp [容器ID]:/etc/kong/ .
#配置DNS
[root@localhost kong]# mv /app/kong/kong.conf.default /app/kong/kong.conf
[root@localhost kong]# vi /app/kong/kong.conf
设置dns_resolver = 172.18.221.120:8600,172.18.221.121:8600,172.18.221.122:8600
删除现有的kong容器,再重新创建。
[root@localhost data]# docker rm -f [容器ID]
重新启动,命令省略
验证结果
浏览器输入:http://116.62.10.11:8001/,如果返回一大堆json格式的数据,说明安装成功。
安装konga
初始化Konga 数据库
[root@localhost ~]# docker run --rm pantsel/konga:latest -c prepare -a postgres -u postgresql://kong:kong@172.18.221.123:5432/konga_db
运行Konga
[root@localhost ~]# docker run -p 1337:1337 \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=172.18.221.123" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
-e "DB_DATABASE=konga_db" \
-e "KONGA_HOOK_TIMEOUT=120000" \
--name konga \
pantsel/konga
验证结果
浏览器输入:http://116.62.10.11:1337,如果出现创建账号页面,表示成功。
测试konga
创建账号并登录
账号:admin
密码:subendong111
设置kong的连接
左侧菜单栏点击CONNECTIONS
Name:kong
Kong Admin URL:http://192.168.1.11:8001
激活连接
点击激活按钮进行激活,激活之后才能代理或做负载
查看dns_resolver
可以看到三台resolver都已经绑定成功。
测试代理-实操
部署Nginx应用
在172.18.221.120上创建2个nginx配置文件。
#进入consul的配置目录
[root@localhost ~]# cd /app/consul/conf
#配置文件如下:
nginx1.json和nginx2.json,内容分别如下:
{ "services": [ { "address": "172.18.221.123", "id": "dn1", "name": "nginx", "port": 9000, "tags": [ "nginx service discovery" ], "checks": [ { "http": "http://172.18.221.123:9000", "interval": "1s" } ] } ] }
和
{ "services": [ { "address": "172.18.221.123", "id": "dn2", "name": "nginx", "port": 9001, "tags": [ "nginx service discovery" ], "checks": [ { "http": "http://172.18.221.123:9001", "interval": "1s" } ] } ] }
重启172.18.221.120上的consul,不然后来加的ningx1.json和nginx2.json无效。
在172.18.221.123上操作:
#拉取nginx镜像
[root@localhost ~]# docker pull registry.cn-hangzhou.aliyuncs.com/songlou/nginx:1.19.1
#创建nginx容器,2个,分别暴漏9000和9001端口
[root@localhost nginx]# docker run -d --name=nginx-1 -p 9000:80 -v /app/data/nginx/html1/:/usr/share/nginx/html/ registry.cn-hangzhou.aliyuncs.com/songlou/nginx:1.19.1
[root@localhost nginx]# docker run -d --name=nginx-2 -p 9001:80 -v /app/data/nginx/html2/:/usr/share/nginx/html/ registry.cn-hangzhou.aliyuncs.com/songlou/nginx:1.19.1
说明:使用-v进行目录挂载的时候,-v不能写在镜像后面。
#创建2个容器挂载目录
[root@localhost ~]# mkdir -p /app/data/nginx/html1
[root@localhost ~]# mkdir -p /app/data/nginx/html2
然后分别在这两个目录里面创建index.html文件,保持文件有差异。可以创建index.html文件,内容分别为“.....nginx1”和“nginx2”。
#如果不设置会报错:403 forbidden
[root@localhost ~]# chcon -Rt svirt_sandbox_file_t /app/data/nginx/html1/
[root@localhost ~]# chcon -Rt svirt_sandbox_file_t /app/data/nginx/html2/
参考地址:https://blog.csdn.net/suo082407128/article/details/83348639
原因是CentOS7中的安全模块selinux把权限禁掉了,主要是挂载的目录没有权限的问题。
解决办法:添加selinux规则,改变要挂载的目录的安全性文本。
#查看容器日志(遇到容器创建失败再看,成功无需看)
[root@localhost ~]# docker container logs [OPTIONS] CONTAINER
#浏览器访问
创建代理
设置service
设置route
浏览器输入:http://116.62.10.11:8000/nginx
随机会看到不同的内容,因为部署了2个nginx应用,每个内容都不一样
说明:记得重启172.18.221.120上的consul,不然后来加的ningx1.json和nginx2.json无效。