这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
1. 前言
Kong是在Nginx中运行的Lua应用程序,可以通过lua-nginx模块实现.Kong是一个Api Gateway,通过插件的形式提供负载均衡,日志记录,身份验证,速率限制,转换等功能。Kong可以很轻松扩展功能,模块化,可以运行在任何基础设施上。
当我们新添加一个微服务实例的时候,微服务就会将自己的 ip 与 port 发送到Consul注册中心,在注册中心里面记录起来。当 API gateway 需要访问某些微服务的时候,就会去注册中心取到相应的 ip 与 port。从而实现自动化操作。
我们需要Kong来负载均衡到每个web服务,这就需要Consul提供的DNS来协助完成。
2. 安装
Kong部署在Nginx和Apache Cassandra或PostgreSQL等可靠技术之上,并提供了易于使用的RESTful API来操作和配置系统。
2.1 安装数据库
docker run -d --name kong-database \
--network=kong-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kong" \
postgres:9.6
对kong数据库初始化化工作。
KONG_DATABASE=postgres指定kong的数据库为prostgres
docker run --rm --network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_PASSWORD=kong" \
kong kong migrations bootstrap
测试数据库的连接是否正确
2.2 centos安装
根据官方文档安装
配置
database = postgres
pg_host = 192.168.123.150
pg_port = 5432
pg_timeout = 5000
pg_user = kong
pg_password = kong
pg_database = kong
dns_resoler = 192.168.123.150:8600
admin_listren = 0.0.0.0:8001
proxy_list = 0.0.0.0:8000
启动
kong start -c 配置文件的地址
2.2 Docker安装
创建kong-net的自定义网络
docker network create kong-net
安装kong
docker run -d --name kong --network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_PASSWORD=kong" \
-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" \
-e "KONG_ADMIN_GUI_URL=http://192.168.123.150:8002" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
-p 8002:8002 \
-p 8445:8445 \
-p 8003:8003 \
-p 8004:8004 \
kong
配置kong
把容器中的配置文件copy到宿主机:docker cp d757590012e9:/etc/kong/ .表示会把kong目录下的所有文件都copy到当前目录。
修改配置文件
mv /app/kong/kong.conf.default /app/kong/kong.conf
vi /app/kong/kong.conf
#添加
dns_resolver = 127.0.0.1:8600
在运行image的时候加上
-v /app/kong/kong.conf:/etc/kong/kong.conf
2.3 测试连接
curl -i -X GET --url http://192.168.123.150:8001/services
出现下面图片表示安装成功
端口说明
代理
- 8000:监听客户端传入的HTTP流量,并将其转发至上游服务(上线后修改成80)
- 8443:与8000类似,监听HTTPS(上线后修改成443)
管理API
这些端口暴露出来是Kong用于管理API,如果在生产环境请使用防火墙保护,防止未经授权的访问:
- 8001:可用于操作Kong的 Admin API
- 8444:与8001类似,使用HTTPS
KONG_ADMIN_GUI_URL 为管理界面的地址,根据实际情况来进行设定
2.4 安装可视化管理页面konga及使用
docker run -d -p 1337:1337 \
--network kong-net \
--name konga \
-e "TOKEN_SECRET=kongtoken" \
-e "DB_ADAPTER=postgres" \
-e "DB_HOST=kong-database" \
-e "DB_USER=kong" \
-e "DB_PASSWORD=kong" \
pantsel/konga
- 页面进行访问: http://{HOSTNAME}:1337
kong密码设置为:m9wMrHUdpmwMrdF
根据提示配置连接:
这里需要注意一下kong和konga是独立的。konga可以管理多个kong,可以在connections中配置
3. 基本的路由转发配置
3.1 添加服务
配置
3.2 配置路由
这样就可以通过kong的IP来转发到服务的IP
4. 结合Consul实现服务发现和负载均衡
上面的service的IP和post是固定。这样做不了负载均衡
kong如何去Consul来服务发现?
Consul会为每一个服务生成DNS,只需要将service配置成name.service.consul如下图
运行流程
- 后端服务启动,根据注册中心consul的地址(1.1.1.1:8500),将自己注册到注册中心
- 客户端访问域名,根据解析找到kong网关地址(2.2.2.2:8000)
- kong网关根据客户端传过来的服务名匹配到对应的Routes,再根据Routes找到对应的Service details
- 然后拿着Service details里面配置Host,去找consul地址(1.1.1.1:8600)
- 根据名称查询consul的dns表,进而找到对应的ip+端口
- 找到对应的服务,然后通信
总结
介绍了Kong的安装以及注意事项以及Kong和Consul的结合使用。