环境

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)相关推荐

  1. 高性能微服务网关.NETCore客户端Kong.Net开源发布

    前言 项目地址:https://github.com/lianggx/Kong.Net 你的支持使我们更加强大,请单击 star 让更多的 .NETCore 认识它. 拥抱开源的脚步,我们从来都是一直 ...

  2. spring cloud gateway 网关_微服务网关Spring Cloud Gateway全搞定

    一.微服务网关Spring Cloud Gateway 1.1 导引 文中内容包含:微服务网关限流10万QPS.跨域.过滤器.令牌桶算法. 在构建微服务系统中,必不可少的技术就是网关了,从早期的Zuu ...

  3. 云原生微服务网关 Kong 和Kong 管理UI Konga快速安装攻略

    前言 在微服务架构中,由于系统和服务的细分,导致系统结构变得非常复杂, 为了跨平台,为了统一集中管理api,同时为了不暴露后置服务.甚至有时候需要对请求进行一些安全.负载均衡.限流.熔断.灰度等中间操 ...

  4. kong(微服务网关的简单部署)(一)

    kong接口的搭建部署 1.简介 2.kong的安装部署 2.0 直接安装 2.1 使用yum仓库安装(下载最新版本) 2.2 docker安装kong 2.2.1 安装docker 2.2.2 安装 ...

  5. Kong 优雅实现微服务网关鉴权,登录场景落地实战篇

    目录 登录实现 B 端登录之后,浏览器存 cookie 登录代码实现细节,cookie设计 网关介绍 API 网关是什么 为什么需要网关 从技术角度来看,什么是Kong? 为什么使用 Kong Kon ...

  6. 容器云平台、灰度发布系统、微服务网关的高可用实践

    http://www.sohu.com/a/227223771_355140 系统高可用是互联网企业系统架构的基础要求之一,一个好的高可用架构可以以最低的成本.更灵活的方式,满足企业用户需求.相反,糟 ...

  7. 个推微服务网关架构实践

    作者:个推应用平台基础架构高级研发工程师 阿飞 在微服务架构中,不同的微服务可以有不同的网络地址,各个微服务之间通过互相调用完成用户请求,客户端可能通过调用N个微服务的接口完成一个用户请求.因此,在客 ...

  8. 微服务网关Ocelot

    微服务网关是微服务架构中的核心组件,它是客户端请求的门户,它是调用具体服务端的桥梁.下面我们将使用开源项目Ocelot(https://github.com/geffzhang/Ocelot)搭建一款 ...

  9. SpringCloud 微服务网关Gateway介绍及简单路由配置

    概述:什么是微服务网关?为了解决用户客户端在调用微服务系统中的多个消费者工程接口时,需要维护非常多的消费者应用接口地址等信息,以及可能存在不同应用见的调用跨域等问题,微服务网关组件随即出现.网关作为用 ...

最新文章

  1. 【BZOJ2326】【HNOI2011】数学作业 [矩阵乘法][DP]
  2. 树莓派DVR猫眼监控,贴广告的人看你往哪跑!
  3. Linux 安装卸载软件及管理软件仓库
  4. arduinopn532模块_树莓派使用libnfc驱动ITEAD NFC PN532模块
  5. Rman--状态管理命令
  6. VMware-workstation安装
  7. php 在模板中赋值数组变量,PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例...
  8. 两万字深入解密 Go 语言接口的那些事儿 | 技术头条
  9. 替代密码的c语言程序,替代密码及置换密码的C语言实现.doc
  10. 关于数据库主键和外键(终于弄懂啦)
  11. linux手机刷机包制作工具_安卓10刷机包
  12. 电脑端查看CAD图纸也能非常方便
  13. Qt简单实现UDP通信
  14. Battle接口测试训练系统的1分钟快速说明
  15. 找不到移动硬盘解决办法
  16. Android开发之使用Web Service进行网络编程
  17. java文字水印换行_Java实现图片水印文字换行、平铺、旋转效果-Go语言中文社区...
  18. MATLAB——textscan
  19. Android 全埋点方案盘点
  20. 如何成为一个高情商的员工(附全书思维导图)

热门文章

  1. 阿里云化身“智能云管”,助力中国联通首次实现大规模平台自主运维
  2. 国际上进行盲源分离研究的主要学者及其研究方向
  3. 2019-2021届蓝桥杯——java真题集锦
  4. Linux 磁盘配额与VDO技术
  5. 网站关键词排名,如何快速提升?
  6. 2020 ICM Weekend 1 Problem E: Drowning in Plastic
  7. Linux下Socket编程之UDP原理
  8. 解决C盘存储空间不足
  9. VC++游戏编程----游戏画面特效制作2
  10. Ubuntu更改密码及hostname步骤