Kong和Consul结合使用 | 青训营笔记

893 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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安装

根据官方文档安装

docs.konghq.com/gateway/2.6…

配置

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
  1. 页面进行访问: 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如下图

运行流程

  1. 后端服务启动,根据注册中心consul的地址(1.1.1.1:8500),将自己注册到注册中心
  2. 客户端访问域名,根据解析找到kong网关地址(2.2.2.2:8000)
  3. kong网关根据客户端传过来的服务名匹配到对应的Routes,再根据Routes找到对应的Service details
  4. 然后拿着Service details里面配置Host,去找consul地址(1.1.1.1:8600)
  5. 根据名称查询consul的dns表,进而找到对应的ip+端口
  6. 找到对应的服务,然后通信

总结

介绍了Kong的安装以及注意事项以及Kong和Consul的结合使用。

参考

www.cnblogs.com/subendong/p…

blog.csdn.net/u013013790/…

developer.hashicorp.com/consul/docs