阿里云使用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

阿里云使用Docker部署单Kong+多Consul集群,图文结合

验证结果

浏览器输入:http://116.62.10.11:1337,如果出现创建账号页面,表示成功。

测试konga

创建账号并登录

账号:admin

邮箱:admin@126.com

密码:subendong111

设置kong的连接

左侧菜单栏点击CONNECTIONS

Name:kong

Kong Admin URL:http://192.168.1.11:8001

激活连接

点击激活按钮进行激活,激活之后才能代理或做负载

阿里云使用Docker部署单Kong+多Consul集群,图文结合

查看dns_resolver

阿里云使用Docker部署单Kong+多Consul集群,图文结合

可以看到三台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

 

#浏览器访问

http://116.62.10.11:9000/

http://116.62.10.11:9001/

创建代理

设置service

阿里云使用Docker部署单Kong+多Consul集群,图文结合

设置route

阿里云使用Docker部署单Kong+多Consul集群,图文结合

浏览器输入:http://116.62.10.11:8000/nginx

随机会看到不同的内容,因为部署了2个nginx应用,每个内容都不一样

说明:记得重启172.18.221.120上的consul,不然后来加的ningx1.json和nginx2.json无效。

 

上一篇:API网关Kong


下一篇:微服务网关除了zuul、spring cloud gateway还有更出色的