What Kong是什么

一个网关,可以把它简单地看成是一个带管理界面的OpenResty

Why为什么选择它

  • 配置共享。所有的Kong实例可以使用同一份配置,这样你就不用一份文件到处复制,修改好几次。
  • UI 官方提供了Kong Manager,可以直接使用Web来添加管理配置文件
  • 丰富的插件系统,官方提供许多丰富的插件,可以全局使用也可以指定服务使用。
  • 虽然使用了数据库,但是会缓存当前配置,这样即使后端数据库挂了,当前也能正常运行,(曾经被这个坑坑死过,现在看到这个特性修复了,重新又入坑了)。

How如何使用

Installation 避(官方)坑指南

因为默认的kong Manager请求Kong AdminAPI与它自身不在一个端口上,因此会导致跨域而无法正常显示。因此在它前面加一层代理来解决。

  • app.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
server {
        listen       8001;
        server_name  _;

        location /manager/ {
            proxy_pass http://kong-gateway:8002/manager/;
        }

        location / {
          proxy_pass http://kong-gateway:8001;
        }
}
  • docker-compose.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
version: '3'

networks:
  kong-net:
    driver: bridge

services:
  kong-admin:
    image: nginx:alpine
    container_name: kong-admin
    restart: always
    ports:
    - 8001:8001
    environment:
    - TZ=Asia/Shanghai
    volumes:
    - .app.conf:/etc/nginx/conf.d
    networks:
    - kong-net
    
  kong-db:
    image: postgres:13
    container_name: kong-db
    restart: always
    privileged: true
    ports:
    - 5432:5432
    restart: always # on-failure
    volumes:
    - ./db_data:/var/lib/postgresql/data
    environment:
    - TZ=Asia/Shanghai
    - POSTGRES_USER=kong
    - POSTGRES_DB=kong
    - POSTGRES_PASSWORD=kongpass
    networks:
    - kong-net

  kong-gateway:
    image: kong/kong-gateway:3.6
    container_name: kong
    restart: always
    privileged: true
    ports:
    - 8000:8000 #http
    # - 8001:8001 #admin,Current the kong-manaer need a proxy.because it will directly access the admin api
    - 8443:8443
    - 8444:8444
    - 8445:8445
    # - 8002:8002 #manager use nginx proxy,so can't export the port
    - 8003:8003
    - 8004:8004
    environment:
      TZ: Asia/Shanghai
      KONG_DATABASE: postgres
      KONG_PG_HOST: kong-db
      KONG_PG_USER: kong
      KONG_PG_PASSWORD: kongpass
      # 自定义日志格式,同样适用于Kong Ingress Controller
      KONG_NGINX_HTTP_LOG_FORMAT: main '{"time":"$$time_iso8601", "request":"$$request", "status":$$status}'
      KONG_PROXY_ACCESS_LOG: syslog:server=128.0.255.10:514 main
      KONG_ADMIN_ACCESS_LOG: /dev/null
      KONG_ADMIN_LISTEN: 0.0.0.0:8001
      KONG_ADMIN_GUI_PATH: /manager
      KONG_ADMIN_GUI_URL: http://0.0.0.0:8002/manager
    networks:
    - kong-net

  db-init:
    image: kong/kong-gateway:3.6
    container_name: db-init
    restart: on-failure
    depends_on:
    - kong-db
    environment:
    - KONG_DATABASE=postgres
    - KONG_PG_HOST=kong-db
    - KONG_PG_USER=kong
    - TZ=Asia/Shanghai
    - KONG_PG_PASSWORD=kongpass
    - KONG_PASSWORD=test
    networks:
    - kong-net
    command: 
      kong migrations bootstrap && kong migrations finish

以上使用DB模式,用于存储共享的配置信息

访问http://localhost:8001进入Kong Manager,注意,默认它没有验证

The Conception of Kong 关键概念

  • Upstream

    对应NGINX中定义的upstream

  • Gateway Service

    一句话理解就是将upstream抽象成服务,后续给到Router引用。

  • Router

    路由器,它将Gateway ServiceUpstream以及对外的请求路径关联起来。

Tips

  • 在添加过程中,从upstream–>Gateway Service—>Router这样加,好理解

  • 添加upstream时,如果后端使用了虚拟主机,那么每个upstream都要添加上对应的Host Header,否则Kong404

  • 在添加Gateway Service时,有一栏Host,这个是upstream的名称,如你定义了一个upstream名称为upstream-name,那么这个Host就填upstream-name.