如何快速的在 Kubernetes 上部署云原生微服務(wù)網(wǎng)關(guān) APISIX
1、幾種常見網(wǎng)關(guān)的比較
- Nginx, 模塊化設(shè)計的反向代理軟件,C 語言開發(fā)
- OpenResty, 以 Nginx 為核心的 Web 開發(fā)平臺,可以解析執(zhí)行 Lua 腳本
- Kong, OpenResty 的一個應(yīng)用,是一個 API 網(wǎng)關(guān),具有 API 管理和請求代理的功能,使用 PostgreSQL 存儲
- APISIX, 替換了 Kong 的 PostgreSQL 為 Etcd,基于 Nginx 的核心庫實現(xiàn)
APISIX 的優(yōu)勢在于提供了 API 的管理和擴展能力,讓網(wǎng)關(guān)不再僅僅轉(zhuǎn)發(fā)服務(wù),而是可以被配置、定制化。相較于 Nginx,APISIX 使用的是動態(tài)路由,避免了配置之后 reload 產(chǎn)生的風險。同時,APISIX 支持 HTTP(S)、HTTP2、Dubbo、QUIC、MQTT、TCP/UDP 等更多的協(xié)議,具有更好的使用生態(tài)。
上面是 APISIX 的架構(gòu)圖,數(shù)據(jù)面處理客戶端請求,控制面管理路由。
2、APISIX 能解決什么問題
- 邊緣路由
機房對外暴露的訪問入口 IP 數(shù)量,通常是極少的,但是卻支撐了很多個服務(wù)。比如,訪問的 IP 是 1.2.3.4,但卻同時提供了 a.domain.com、b.domain.com 的訪問服務(wù)。這就需要用到邊緣路由,邊緣路由會將不同域名的訪問,轉(zhuǎn)發(fā)到不同的內(nèi)網(wǎng)地址。
APISIX 中三種方式可以注冊邊緣路由,dashboard、ingress-controller、admin api。
- 基礎(chǔ)網(wǎng)關(guān)能力
網(wǎng)關(guān)的功能不限于轉(zhuǎn)發(fā)流量,更重要的是限流、熔斷等。
APISIX 內(nèi)置了很多插件,提供 APM、日志、熔斷、鑒權(quán)、證書管理、故障注入等功能。同時,也支持拖拽組合新的插件、開發(fā)新插件以滿足業(yè)務(wù)需求。
- Serverless
APISIX 通過插件的方式提供 Serverless,目前僅支持 Lua。但 APIGateway + Serverless 的組合,極具想象力。
利用 Serverless 可以快速對外提供無服務(wù)的 API,粘合各種服務(wù),也可以對外直接提供功能服務(wù)。
- 灰度發(fā)布
由于對網(wǎng)關(guān)層進行了控制,APISIX 允許用戶通過配置權(quán)重控制流量的轉(zhuǎn)發(fā)行為,可以用來做灰度發(fā)布使用。
3、Kubernetes 上安裝 APISIX
(1)添加 Helm 源
- 添加 Helm 源
- $ helm repo add apisix https://charts.apiseven.com
- $ helm repo update
- 查找 Chart 包
- $ helm search repo apisix
- NAME CHART VERSION APP VERSION DESCRIPTION
- apisix/apisix 0.3.5 2.7.0 A Helm chart for Apache APISIX
- apisix/apisix-dashboard 0.1.5 2.7.0 A Helm chart for Apache APISIX Dashboard
- apisix/apisix-ingress-controller 0.5.0 1.0.0 Apache APISIX Ingress Controller for Kubernetes
(2)安裝 APISIX
- 安裝 APISIX
- $ helm install apisix apisix/apisix --set gateway.type=NodePort --set admin.allow.ipList="{0.0.0.0/0}" -n apisix --create-namespace
- 查看入口地址
- $ export NODE_PORT=$(kubectl get --namespace apisix -o jsonpath="{.spec.ports[0].nodePort}" services apisix-gateway)
- $ export NODE_IP=$(kubectl get nodes --namespace apisix -o jsonpath="{.items[0].status.addresses[0].address}")
- $ echo http://$NODE_IP:$NODE_PORT
- http://1.1.1.1:32462
這里的入口地址是后端服務(wù)的入口地址,如果是生成環(huán)境,應(yīng)該使用 LoadBalancer 提供的地址。
- 查看 apisix-admin 接口 key
- $ export POD_NAME=$(kubectl get pods --namespace apisix -l "app.kubernetes.io/instance=apisix,app.kubernetes.io/name=apisix" -o jsonpath="{.items[0].metadata.name}")
- $ kubectl -n apisix exec -it $POD_NAME cat conf/config.yaml |grep key
- admin_key:
- key: edd1c9f034335f136f87ad84b625c8f1
- key: 4054f7cf07e344346cd3f287985e76a2
第一個 key 是 admin,第二個 key 是 viewer。這里的 key 可以用來通過 admin api 來配置 APISIX,給其他系統(tǒng)集成 APISIX 提供了入口。
(3)安裝 Dashboard
- 安裝 Dashboard
- $ helm install apisix-dashboard apisix/apisix-dashboard -n apisix --create-namespace
默認賬戶是:admin 默認密碼是:admin
- 查看 Dashboard 訪問入口
- $ export NODE_PORT=$(kubectl get --namespace apisix -o jsonpath="{.spec.ports[0].nodePort}" services apisix-gateway)
- $ export NODE_IP=$(kubectl get nodes --namespace apisix -o jsonpath="{.items[0].status.addresses[0].address}")
- $ echo http://$NODE_IP:$NODE_PORT
- http://1.1.1.1:31501
(4)安裝 ingress-controller
- 安裝 ingress-controller
- $ helm install apisix-ingress-controller apisix/apisix-ingress-controller --set config.apisix.baseURL=http://apisix-admin:9180/apisix/admin --set config.apisix.adminKey=edd1c9f034335f136f87ad84b625c8f1 -n apisix
這里就會需要設(shè)置上面獲取到的 admin key, 實際上 ingress-controller 也是通過調(diào)用 admin api 來配置路由的。
4、創(chuàng)建服務(wù)測試
前面提到 APISIX 通過 admin api 配置路由,有三種方式可以操作。這里主要驗證使用 Dashboard 和 Ingress 兩種方式:
- 創(chuàng)建一個服務(wù)
- $ kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0
- 暴露服務(wù)
- $ kubectl expose deployment web --type=NodePort --port=8080
- 查看服務(wù)
$ kubectl get service web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web NodePort 10.233.58.113 <none> 8080:30572/TCP 28d
(1)Dashboard 配置路由
- 新建一個上游服務(wù)
這里需要填入上面創(chuàng)建的集群訪問地址:web.default.svc.cluster.local
- 新建一個路由
點擊下一步之后,選擇上面創(chuàng)建的服務(wù) web,相關(guān)的參數(shù)就會自動填充。
- 訪問測試
(2)Ingress 配置路由
- 創(chuàng)建一個 ApisixRoute 路由
雖然這里部署的是 ingress-controller 組件,但是使用時創(chuàng)建的是 ApisixRoute 對象。
- apiVersion: apisix.apache.org/v1
- kind: ApisixRoute
- metadata:
- name: web-route
- spec:
- http:
- - name: web
- match:
- hosts:
- - dev4.chenshaowen.com
- paths:
- - "/router-web/*"
- backend:
- serviceName: web
- servicePort: 8080
- 訪問測試
- 查看創(chuàng)建的路由
可以發(fā)現(xiàn)路由是被 ingress-controller 接管的,人工不要編輯。
- 查看服務(wù)
可以看到服務(wù)主要是由四個后端提供。
- 查看服務(wù) Pod 的 IP
- $ kubectl get pod -o wide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- web-79d88c97d6-2sdlj 1/1 Running 0 27d 10.233.105.34 node4 <none> <none>
- web-79d88c97d6-7bfbb 1/1 Running 0 27d 10.233.105.32 node4 <none> <none>
- web-79d88c97d6-hccqk 1/1 Running 0 27d 10.233.105.33 node4 <none> <none>
- web-79d88c97d6-mh9gz 1/1 Running 0 28d 10.233.105.22 node4 <none> <none>
APISIX 會將 Pod 的 IP 地址直接作為流量后端,而不需要經(jīng)過 Service 的轉(zhuǎn)發(fā),這有別于 Kubernetes 的服務(wù)轉(zhuǎn)發(fā)、負載均衡機制。
5、總結(jié)
本文主要簡述了幾種網(wǎng)關(guān)的區(qū)別,思考了 APISIX 主要能幫助我們解決什么問題,最后在 Kubernetes 上進行了實踐。內(nèi)容如下:
- APISIX 是基于 Nginx 網(wǎng)絡(luò)庫實現(xiàn)的 API 網(wǎng)關(guān)應(yīng)用,使用 Etcd 作為存儲后端
- APISIX 能作為邊緣路由使用,其動態(tài)特性,避免了 Nginx reload 帶來的抖動
- APISIX 提供了 admin api 管理路由,有三種方式可以進行配置
- Kubernetes 下的 APISIX 跳過了 Kubernetes Service 直接將流量轉(zhuǎn)發(fā)到 Pod IP
6、參考
- https://github.com/apache/apisix
- https://bbs.huaweicloud.com/blogs/125686
- https://github.com/apache/apisix-ingress-controller/blob/master/docs/en/latest/concepts/apisix_route.md