一、安裝Kong
1. 構(gòu)建 Kong 的容器網(wǎng)絡(luò)
首先我們創(chuàng)建一個 Docker 自定義網(wǎng)絡(luò),以允許容器相互發(fā)現(xiàn)和通信。在下面的創(chuàng)建命令中 kong-net 是我們創(chuàng)建的 Docker 網(wǎng)絡(luò)名稱。
docker network create kong-net
2. 搭建數(shù)據(jù)庫環(huán)境
Kong 目前使用 Cassandra 或者 PostgreSQL,你可以執(zhí)行以下命令中的一個來選擇你的 Database。請注意定義網(wǎng)絡(luò) --network=kong-net 。
使用 PostgreSQL:
docker pull postgres:9.6
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
?3. 初始化或者遷移數(shù)據(jù)庫
我們使用 docker run --rm 來初始化數(shù)據(jù)庫,該命令執(zhí)行后會退出容器而保留內(nèi)部的數(shù)據(jù)卷(volume)。這個命令我們還是要注意的,一定要跟你聲明的網(wǎng)絡(luò),數(shù)據(jù)庫類型、host 名稱一致。同時注意 Kong 的版本號,注:當(dāng)前 Kong 最新版本為 2.x,不過目前的 kong-dashboard (Kong Admin UI) 尚未支持 2.x 版的 Kong,為了方便后面的演示,這里以最新的 1.x 版的 Kong 作為演示。
下面指定的數(shù)據(jù)庫是 PostgreSQL:
docker run --rm \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
kong:1.5.1 kong migrations bootstrap
?4. 啟動 Kong 容器
完成初始化或者遷移數(shù)據(jù)庫后,我們就可以啟動一個連接到數(shù)據(jù)庫容器的 Kong 容器,請務(wù)必保證你的數(shù)據(jù)庫容器啟動狀態(tài),同時檢查所有的環(huán)境參數(shù) -e 是否是你定義的環(huán)境。
docker pull kong:1.5.1
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_CASSANDRA_CONTACT_POINTS=kong-database" \
-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" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
kong:1.5.1
?Kong 默認(rèn)綁定 4 個端口:
- 8000:用來接收客戶端的 HTTP 請求,并轉(zhuǎn)發(fā)到 upstream。
- 8443:用來接收客戶端的 HTTPS 請求,并轉(zhuǎn)發(fā)到 upstream。
- 8001:HTTP 監(jiān)聽的 API 管理接口。
- 8444:HTTPS 監(jiān)聽的 API 管理接口。
到這里,Kong 已經(jīng)安裝完畢,我們可以使用 docker ps 命令查看當(dāng)前運行容器,正常情況下可以看到 Kong 和 PostgreSQL 的兩個容器:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
06003dc47d4b kong:1.5.1 "/docker-entrypoint.…" 11 minutes ago Up 11 minutes 0.0.0.0:8000-8001->8000-8001/tcp, :::8000-8001->8000-8001/tcp, 0.0.0.0:8443-8444->8443-8444/tcp, :::8443-8444->8443-8444/tcp kong
5de52299a815 postgres:9.6 "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp kong-database
我們可以通過 curl -i http://10.95.35.92:8001?來查看 Kong 是否運行完好。
二、Kong?UI
Kong 企業(yè)版提供了管理 UI,開源版本是沒有的。但是有很多的開源的管理 UI ,其中比較 Fashion 的有Kong Dashboard 和 Konga。Kong Dashboard 當(dāng)前最新版本(3.6.x)并不支持最新版本的 Kong,最后一次更新也要追溯到 1 年多以前了,選擇 Konga 會更好一點。這里簡單介紹一下 Kong Dashboard 和 Konga。
1、Kong Dashboard
docker 環(huán)境中安裝運行如下:
docker pull pgbi/kong-dashboard
docker run --rm \
--network=kong-net \
-p 8080:8080 \
pgbi/kong-dashboard start \
--kong-url http://kong:8001
?啟動之后,可以在瀏覽器中輸入?http://10.95.35.92:8080/?來訪問 Kong Dashboard 管理界面。
2、Konga
Konga (官網(wǎng)地址:pantsel.github.io/konga/ ,Github 地址:github.com/pantsel/kon… )可以很好地通過 UI 觀察到現(xiàn)在 Kong 的所有的配置,并且可以對于管理 Kong 節(jié)點情況進行查看、監(jiān)控和預(yù)警。Konga 主要是用 AngularJS 寫的,運行于 nodejs 服務(wù)端。具有以下特性:
- 管理所有 Kong Admin API 對象。
- 支持從遠程源(數(shù)據(jù)庫,文件,API等)導(dǎo)入使用者。
- 管理多個 Kong 節(jié)點。使用快照備份,還原和遷移 Kong 節(jié)點。
- 使用運行狀況檢查監(jiān)視節(jié)點和 API 狀態(tài)。
- 支持電子郵件和閑置通知。
- 支持多用戶。
- 易于數(shù)據(jù)庫集成(MySQL,PostgresSQL,MongoDB,SQL Server)。
下面使用的 PostgreSQL 是和上面在 docker 環(huán)境中安裝 Kong 時的是一致的,注意用戶名、密碼、數(shù)據(jù)庫名稱等配置,docker 環(huán)境安裝啟動 Konga:
docker pull pantsel/konga
docker run -d -p 1337:1337 \
--network kong-net \
--name konga \
-e "DB_ADAPTER=postgres" \
-e "DB_URI=postgresql://kong:kong@kong-database/kong" \
pantsel/konga
如果 Konga 容器啟動成功,可以通過 http://10.95.35.92:1337/ 訪問管理界面。通過注冊后進入,然后在 CONNECTIONS 中添加 Kong 服務(wù)的管理路徑?http://10.95.35.92:8001。Konga 管理界面示例如下:
三、Kong Admin?API
部署好 Kong 之后,則需要將我們自己的接口加入到 Kong 的中管理,Kong 提供了比較全面的RESTful API,每個版本會有所不同,詳細可以參考官網(wǎng):docs.konghq.com/2.0.x/admin… 。Kong 管理 API 的端口是 8001(8044),服務(wù)、路由、配置都是通過這個端口進行管理,所以部署好之后頁面可以直接訪問 http://10.95.35.92:8001
這里我們先來了解一下如何使用 RESTful 管理接口來管理 Service (服務(wù))、Route(路由)。
1. 添加一個Service
curl -i -X POST http://10.95.35.92:8001/services \
> --data name=hello-service \
> --data url='http://10.95.35.92:9000/hello'
HTTP/1.1 201 Created
Date: Mon, 17 Oct 2022 07:44:16 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/1.5.1
Content-Length: 301
X-Kong-Admin-Latency: 42
{"host":"10.95.35.92","created_at":1665992656,"connect_timeout":60000,"id":"a5b306b6-4399-4294-9240-6ffdca12f05a","protocol":"http","name":"hello-service","read_timeout":60000,"port":9000,"path":"\/hello","updated_at":1665992656,"retries":5,"write_timeout":60000,"tags":null,"client_certificate":null}
2、查詢Service
curl http://10.95.35.92:8001/services/hello-service
{"host":"10.95.35.92","created_at":1665992656,"connect_timeout":60000,"id":"a5b306b6-4399-4294-9240-6ffdca12f05a","protocol":"http","name":"hello-service","read_timeout":60000,"port":9000,"path":"\/hello","updated_at":1665992656,"retries":5,"write_timeout":60000,"tags":null,"client_certificate":null}
3、為 Service 添加一個 Route
curl -i -X POST \
> --url http://10.95.35.92:8001/services/hello-service/routes \
> --data 'paths[]=/hello' \
> --data name=hello-route
HTTP/1.1 201 Created
Date: Mon, 17 Oct 2022 07:49:02 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/1.5.1
Content-Length: 434
X-Kong-Admin-Latency: 35
{"id":"eed7e6e7-937a-4f79-b9b4-51b5824fafca","path_handling":"v1","paths":["\/hello"],"destinations":null,"headers":null,"protocols":["http","https"],"methods":null,"snis":null,"service":{"id":"a5b306b6-4399-4294-9240-6ffdca12f05a"},"name":"hello-route","strip_path":true,"preserve_host":false,"regex_priority":0,"updated_at":1665992942,"sources":null,"hosts":null,"https_redirect_status_code":426,"tags":null,"created_at":1665992942}[root@aswtechlabpoc92 helloworld]#
?4、測試
我們可以通過訪問?http://10.95.35.92:8000/hello?來驗證一下配置是否正確。
Kong代理:
url http://10.95.35.92:8000/hello
Hello world !
真實服務(wù):
http://10.95.35.92:9000/hello/
前面的操作就等效于配置 nginx.conf:
server {
listen 8000;
location /hello {
proxy_pass http://10.95.35.92:9000/hello;
}
}
不過,前面的配置操作都是動態(tài)的,無需像 Nginx一樣需要重啟。
Service是抽象層面的服務(wù),它可以直接映射到一個物理服務(wù),也可以指向一個Upstream(同Nginx中的Upstream,是對上游服務(wù)器的抽象)。Route是路由的抽象,它負(fù)責(zé)將實際的請求映射到 Service。除了Serivce、Route之外,還有 Tag、Consumer、Plugin、Certificate、SNI、Upstream、Target等,讀者可以從 官網(wǎng)的介紹文檔 中了解全貌。
下面在演示一個例子,修改 Service,將其映射到一個 Upstream:
# 添加 name為 hello-upstream 的 Upstream
curl -i -X POST http://10.95.35.92:8001/upstreams \
> --data name=hello-upstream
HTTP/1.1 201 Created
Date: Mon, 17 Oct 2022 08:13:20 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/1.5.1
Content-Length: 868
X-Kong-Admin-Latency: 51
{"created_at":1665994400,"hash_on":"none","id":"b9760079-8321-4b44-beba-fbaf65cbc1a2","algorithm":"round-robin","name":"hello-upstream","tags":null,"hash_fallback_header":null,"hash_fallback":"none","hash_on_cookie":null,"host_header":null,"hash_on_cookie_path":"\/","healthchecks":{"active":{"unhealthy":{"http_statuses":[429,404,500,501,502,503,504,505],"tcp_failures":0,"timeouts":0,"http_failures":0,"interval":0},"type":"http","http_path":"\/","timeout":1,"healthy":{"successes":0,"interval":0,"http_statuses":[200,302]},"https_sni":null,"https_verify_certificate":true,"concurrency":10},"passive":{"unhealthy":{"http_failures":0,"http_statuses":[429,500,503],"tcp_failures":0,"timeouts":0},"healthy":{"http_statuses":[200,201,202,203,204,205,206,207,208,226,300,301,302,303,304,305,306,307,308],"successes":0},"type":"http"}},"hash_on_header":null,"slots":10000}
# 為 mock-upstream 添加 Target,Target 代表了一個物理服務(wù)(IP地址/hostname + port的抽象),一個Upstream可以包含多個Targets
curl -i -X POST http://10.95.35.92:8001/upstreams/hello-upstream/targets \
> --data target="10.95.35.92:9000"
HTTP/1.1 201 Created
Date: Mon, 17 Oct 2022 08:15:02 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/1.5.1
Content-Length: 171
X-Kong-Admin-Latency: 54
{"created_at":1665994502.454,"upstream":{"id":"b9760079-8321-4b44-beba-fbaf65cbc1a2"},"id":"fa9b8da2-ac9f-46e7-9528-23181b5577cd","target":"10.95.35.92:9000","weight":100}
# 修改 hello-service,為其配置
curl -i -X PATCH http://10.95.35.92:8001/services/hello-service \
> --data url='http://hello-upstream/hello'
HTTP/1.1 200 OK
Date: Mon, 17 Oct 2022 10:06:27 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/1.5.1
Content-Length: 302
X-Kong-Admin-Latency: 40
{"host":"hello-upstream","created_at":1665992656,"connect_timeout":60000,"id":"a5b306b6-4399-4294-9240-6ffdca12f05a","protocol":"http","name":"hello-service","read_timeout":60000,"port":80,"path":"\/hello","updated_at":1666001187,"retries":5,"write_timeout":60000,"tags":null,"client_certificate":null}
?上面的配置等同于 Nginx 中的nginx.conf配置 :
upstream hello-upstream{
server 10.95.35.92:8001;
}
server {
listen 8000;
location /hello {
proxy_pass http://hello-upstream/hello;
}
}
當(dāng)然,這里的配置我們也可以通過管理界面來操作。上面操作完之后,在Konga中也有相關(guān)信息展示出來:
?
?
?
四、Kong Plugins
Kong通過插件Plugins實現(xiàn)日志記錄、安全檢測、性能監(jiān)控和負(fù)載均衡等功能。下面我將演示一個例子,通過啟動 apikey 實現(xiàn)簡單網(wǎng)關(guān)安全檢驗。
1. 配置 key-auth 插件?
curl -i -X POST http://10.95.35.92:8001/routes/hello-route/plugins \
> --data name=key-auth
HTTP/1.1 201 Created
Date: Tue, 18 Oct 2022 01:23:00 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/1.5.1
Content-Length: 380
X-Kong-Admin-Latency: 282
{"created_at":1666056180,"config":{"key_names":["apikey"],"run_on_preflight":true,"anonymous":null,"hide_credentials":false,"key_in_body":false},"id":"79c9fdce-6997-45eb-9615-003708f75827","service":null,"name":"key-auth","protocols":["grpc","grpcs","http","https"],"enabled":true,"run_on":"first","consumer":null,"route":{"id":"eed7e6e7-937a-4f79-b9b4-51b5824fafca"},"tags":null}
這個插件接收 config.key_names 定義參數(shù),默認(rèn)參數(shù)名稱 ['apikey']。在 HTTP 請求中 header 和 params 參數(shù)中包含 apikey 參數(shù),參數(shù)值必須 apikey 密鑰,Kong 網(wǎng)關(guān)將堅持密鑰,驗證通過才可以訪問后續(xù)服務(wù)。
此時我們使用 curl -i http://10.95.35.92:8000/hello/
?來驗證一下是否生效,如果如下所示,訪問失?。℉TTP/1.1 401 Unauthorized,"No API key found in request" ),說明 Kong 安全機制生效了。
curl -i http://10.95.35.92:8000/hello/
HTTP/1.1 401 Unauthorized
Date: Tue, 18 Oct 2022 01:24:51 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
WWW-Authenticate: Key realm="kong"
Content-Length: 41
X-Kong-Response-Latency: 21
Server: kong/1.5.1
{"message":"No API key found in request"}
在 Konga 中我們也可以看到相關(guān)記錄:
2. 為Service添加服務(wù)消費者(Consumer)?
定義消費者訪問 API Key, 讓他擁有訪問 hello-service 的權(quán)限。
創(chuàng)建消費者 Hidden:?
curl -i -X POST http://10.95.35.92:8001/consumers/ \
> --data username=Hidden
HTTP/1.1 201 Created
Date: Tue, 18 Oct 2022 01:28:24 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/1.5.1
Content-Length: 118
X-Kong-Admin-Latency: 38
創(chuàng)建成功之后,返回:
{"custom_id":null,"created_at":1666056504,"id":"9cab1417-a152-441c-a5a8-9640e04a38ee","tags":null,"username":"Hidden"}
之后為消費者 Hidden 創(chuàng)建一個 api key,輸入如下命令:
curl -i -X POST http://10.95.35.92:8001/consumers/Hidden/key-auth/ \
> --data key=123456
HTTP/1.1 201 Created
Date: Tue, 18 Oct 2022 01:30:16 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/1.5.1
Content-Length: 164
X-Kong-Admin-Latency: 36
{"created_at":1666056616,"consumer":{"id":"9cab1417-a152-441c-a5a8-9640e04a38ee"},"id":"8023ced8-cdf7-4436-90df-257e93fae482","tags":null,"ttl":null,"key":"123456"}
現(xiàn)在我們再來驗證一下?http://10.95.35.92:8000/hello
:
curl -i http://10.95.35.92:8000/hello/ \
> --header "apikey:123456"
返回:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 14
Connection: keep-alive
Date: Tue, 18 Oct 2022 01:32:30 GMT
Server: WSGIServer/0.1 Python/2.7.5
X-Frame-Options: SAMEORIGIN
X-Kong-Upstream-Latency: 13
X-Kong-Proxy-Latency: 19
Via: kong/1.5.1
Hello world !
Kong 網(wǎng)關(guān)插件概括為如下:文章來源:http://www.zghlxwxcb.cn/news/detail-459550.html
- 身份認(rèn)證插件:Kong 提供了 Basic Authentication、Key authentication、OAuth2.0 authentication、HMAC authentication、JWT、LDAP authentication 認(rèn)證實現(xiàn)。
- 安全控制插件:ACL(訪問控制)、CORS(跨域資源共享)、動態(tài) SSL、IP 限制、爬蟲檢測實現(xiàn)。
- 流量控制插件:請求限流(基于請求計數(shù)限流)、上游響應(yīng)限流(根據(jù) upstream 響應(yīng)計數(shù)限流)、請求大小限制。限流支持本地、Redis 和集群限流模式。
- 分析監(jiān)控插件:Galileo(記錄請求和響應(yīng)數(shù)據(jù),實現(xiàn) API 分析)、Datadog(記錄 API Metric 如請求次數(shù)、請求大小、響應(yīng)狀態(tài)和延遲,可視化 API Metric)、Runscope(記錄請求和響應(yīng)數(shù)據(jù),實現(xiàn) API 性能測試和監(jiān)控)。
- 協(xié)議轉(zhuǎn)換插件:請求轉(zhuǎn)換(在轉(zhuǎn)發(fā)到 upstream 之前修改請求)、響應(yīng)轉(zhuǎn)換(在 upstream 響應(yīng)返回給客戶端之前修改響應(yīng))。
- 日志應(yīng)用插件:TCP、UDP、HTTP、File、Syslog、StatsD、Loggly 等。
五、總結(jié)
Kong 作為 API 網(wǎng)關(guān)提供了 API 管理功能及圍繞 API 管理實現(xiàn)了一些默認(rèn)的插件,另外還具備集群水平擴展能力,從而提升整體吞吐量。Kong 本身是基于 OpenResty,可以在現(xiàn)有 Kong 的基礎(chǔ)上進行一些擴展,從而實現(xiàn)更復(fù)雜的特性。雖然有一些特性 Kong 默認(rèn)是缺失的,如 API 級別的超時、重試、fallback 策略、緩存、API 聚合、AB 測試等,這些功能插件需要企業(yè)開發(fā)人員通過 Lua 語言進行定制和擴展。綜上所述,Kong API 網(wǎng)關(guān)默認(rèn)提供的插件比較豐富, 適應(yīng)針對企業(yè)級的 API 網(wǎng)關(guān)定位。文章來源地址http://www.zghlxwxcb.cn/news/detail-459550.html
到了這里,關(guān)于Docker安裝Kong的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!