微服务网关搭建(podman+kong+konga)
环境
AlmaLinux 9.0 Podman
注意事项:
1. podman通过https_proxy 环境变量来设置代理配置
export https_proxy=http://ip:port
2. podman创建容器后会将代理配置带入容器中并将导致应用网络异常,
请先pull镜像后,务必删除代理配置
unset https_proxy
准备工作:
## 代理配置, 如已连通外网,则忽略 export https_proxy=http://ip:port## 下载镜像 docker pull postgres:9.6 docker pull pantsel/konga docker pull kong## 解除代理 unset https_proxy## 建立专用网络, 用于内部的管理 podman network create kong-net ##创建名称为kong-net的内部网络
数据库:PostgreSQL
##数据库存储专用目录,以便于持久化数据,提高性能 podman volume create postgres-vol##创建postgreSQL数据库,请使用9.6版本, ## network: 内部网络名称(选配),用于docker应用内部互联 ## POSTGRES_DB: 初始化建立的数据库名称 ## POSTGRES_USER: 数据库初始化用户 ## POSTGRES_PASSWORD: 数据库初始密码 podman run -d --name=postgres \ --network=kong-net -p 5432:5432 \ -v postgres-volume:/var/lib/postgresql/data \ -e POSTGRES_PASSWORD=mypwd \ -e POSTGRES_DB=kong \ -e POSTGRES_USER=postgres \ postgres:9.6
Konga
Kong服务的前端管理界面,管理微服务
##运行konga ##DB_HOST: postgres数据库地址,IP或者主机名,postgres 为上一步中kong-net网络的主机名 ##DB_User: postgres数据库用户 ##DB_PASSWORD: postgres数据库密码 podman run -d --name konga \ --network=kong-net -p 1337:1337 \ -e "TOKEN_SECRET=mypwd" \ -e "DB_ADAPTER=postgres" \ -e "DB_HOST=postgres" \ -e "DB_USER=postgres" \ -e "DB_PASSWORD=mypwd" \ pantsel/konga
Kong
Kong 的核心是nginx,通过lua脚本语言来支持其微服务的管理能力和扩展能力,支持了流量管理,身份校验,日志管理等微服务等公共管理特性。
## 初始化kong 数据库结构 ## 环境准备: PostgreSQL数据库已建立kong的数据库对象,不然初始化阶段将报错 ## KONG_DATABASE: 数据库类型 ## KONG_PG_HOST: 数据库地址: IP或者Host ## KONG_PG_USER: 数据库用户 ## KONG_PG_PASSWORD: 数据库密码docker run --rm \ --network=kong-net \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=postgres" \ -e "KONG_PG_USER=postgres" \ -e "KONG_PG_PASSWORD=mypwd" \ kong kong migrations bootstrap##创建kong实例 ## 服务端口8000 映射到主机80端口 ## kong管理端口8001 不开放至主机网络,仅在kong-net内部网络开放流通, 防止外部非法链接进入 ## 注意:如将8001端口映射至主机端口,firewalld防火墙策略将不能阻止外部非法访问 ## konga 通过内部网络kong-net 连接kong服务,konga则配置了用户名和密码,从而建立基础的安全能力 ## 修改了http-log插件,日志增加了http请求内容和响应内容,详见后文描述 docker run -d --privileged --name kong \ --network=kong-net -p 80:8000 \ -v /home/docker/kong/handler.lua:/usr/local/share/lua/5.1/kong/plugins/http-log/handler.lua \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=postgres" \ -e "KONG_PG_USER=postgres" \ -e "KONG_PG_PASSWORD=mypwd" \ -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" \ kong:latest
防火墙配置
firewall-cmd --permanent --add-port=5432/tcp firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=1337/tcp firewall-cmd --reload
Konga使用
创建kong的连接,注意:请使用其kong-net的host名称
具体如何配置相关的service,route等详细参考其他博客
Http-log日志
目前该插件官方不提供http请求和响应报文,导入ELK日志服务缺乏关键信息。在参考http-log-with-body插件(目前最新版本已失效),改造http-log官方插件,在access阶段记录request的请求内容,并开启response的缓存,用于log阶段获取响应报文,同时对gzip压缩过的响应报文进行解压缩。
修改 /usr/local/share/lua/5.1/kong/plugins/http-log/handler.lua
-- gzip local utils = require "kong.tools.utils" local inflate_gzip = utils.inflate_gzip-- 实现access接口,报文请求报文,并开启响应缓存 function HttpLogHandler:access(conf)--缓存响应数据,便于响应内容保存至日志kong.service.request.enable_buffering()--获取请求内容至当前环境local ctx = kong.ctx.plugin;ctx.requestBody = kong.request.get_raw_body(); endfunction HttpLogHandler:log(conf)if conf.custom_fields_by_lua thenlocal set_serialize_value = kong.log.set_serialize_valuefor key, expression in pairs(conf.custom_fields_by_lua) doset_serialize_value(key, sandbox(expression, sandbox_opts)())endend-- begin add 增加请求和响应的报文local responseBody=kong.service.response.get_raw_body()local encoding = kong.response.get_header("Content-Encoding")if encoding == "gzip" thenresponseBody = inflate_gzip(responseBody)endlocal ctx = kong.ctx.plugin;local jsonObj=kong.log.serialize()jsonObj.request.body= ctx.requestBodyjsonObj.response.body=responseBodylocal entry = cjson.encode(jsonObj)--end adddlocal queue_id = get_queue_id(conf)local q = queues[queue_id]if not q then-- batch_max_size <==> conf.queue_sizelocal batch_max_size = conf.queue_size or 1local process = function(entries)local payload = batch_max_size == 1and entries[1]or json_array_concat(entries)return send_payload(self, conf, payload)endlocal opts = {retry_count = conf.retry_count,flush_timeout = conf.flush_timeout,batch_max_size = batch_max_size,process_delay = 0,}local errq, err = BatchQueue.new(process, opts)if not q thenkong.log.err("could not create queue: ", err)returnendqueues[queue_id] = qendq:add(entry) end
ELK日志服务
ElasticSearch: 日志存储和搜索
Kibana: 可视化
Filebeat: http日志收集并上传至ElasticSearch
微服务网关搭建(podman+kong+konga)相关推荐
- 高性能微服务网关.NETCore客户端Kong.Net开源发布
前言 项目地址:https://github.com/lianggx/Kong.Net 你的支持使我们更加强大,请单击 star 让更多的 .NETCore 认识它. 拥抱开源的脚步,我们从来都是一直 ...
- spring cloud gateway 网关_微服务网关Spring Cloud Gateway全搞定
一.微服务网关Spring Cloud Gateway 1.1 导引 文中内容包含:微服务网关限流10万QPS.跨域.过滤器.令牌桶算法. 在构建微服务系统中,必不可少的技术就是网关了,从早期的Zuu ...
- 云原生微服务网关 Kong 和Kong 管理UI Konga快速安装攻略
前言 在微服务架构中,由于系统和服务的细分,导致系统结构变得非常复杂, 为了跨平台,为了统一集中管理api,同时为了不暴露后置服务.甚至有时候需要对请求进行一些安全.负载均衡.限流.熔断.灰度等中间操 ...
- kong(微服务网关的简单部署)(一)
kong接口的搭建部署 1.简介 2.kong的安装部署 2.0 直接安装 2.1 使用yum仓库安装(下载最新版本) 2.2 docker安装kong 2.2.1 安装docker 2.2.2 安装 ...
- Kong 优雅实现微服务网关鉴权,登录场景落地实战篇
目录 登录实现 B 端登录之后,浏览器存 cookie 登录代码实现细节,cookie设计 网关介绍 API 网关是什么 为什么需要网关 从技术角度来看,什么是Kong? 为什么使用 Kong Kon ...
- 容器云平台、灰度发布系统、微服务网关的高可用实践
http://www.sohu.com/a/227223771_355140 系统高可用是互联网企业系统架构的基础要求之一,一个好的高可用架构可以以最低的成本.更灵活的方式,满足企业用户需求.相反,糟 ...
- 个推微服务网关架构实践
作者:个推应用平台基础架构高级研发工程师 阿飞 在微服务架构中,不同的微服务可以有不同的网络地址,各个微服务之间通过互相调用完成用户请求,客户端可能通过调用N个微服务的接口完成一个用户请求.因此,在客 ...
- 微服务网关Ocelot
微服务网关是微服务架构中的核心组件,它是客户端请求的门户,它是调用具体服务端的桥梁.下面我们将使用开源项目Ocelot(https://github.com/geffzhang/Ocelot)搭建一款 ...
- SpringCloud 微服务网关Gateway介绍及简单路由配置
概述:什么是微服务网关?为了解决用户客户端在调用微服务系统中的多个消费者工程接口时,需要维护非常多的消费者应用接口地址等信息,以及可能存在不同应用见的调用跨域等问题,微服务网关组件随即出现.网关作为用 ...
最新文章
- 【BZOJ2326】【HNOI2011】数学作业 [矩阵乘法][DP]
- 树莓派DVR猫眼监控,贴广告的人看你往哪跑!
- Linux 安装卸载软件及管理软件仓库
- arduinopn532模块_树莓派使用libnfc驱动ITEAD NFC PN532模块
- Rman--状态管理命令
- VMware-workstation安装
- php 在模板中赋值数组变量,PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例...
- 两万字深入解密 Go 语言接口的那些事儿 | 技术头条
- 替代密码的c语言程序,替代密码及置换密码的C语言实现.doc
- 关于数据库主键和外键(终于弄懂啦)
- linux手机刷机包制作工具_安卓10刷机包
- 电脑端查看CAD图纸也能非常方便
- Qt简单实现UDP通信
- Battle接口测试训练系统的1分钟快速说明
- 找不到移动硬盘解决办法
- Android开发之使用Web Service进行网络编程
- java文字水印换行_Java实现图片水印文字换行、平铺、旋转效果-Go语言中文社区...
- MATLAB——textscan
- Android 全埋点方案盘点
- 如何成为一个高情商的员工(附全书思维导图)