K8s Apache APISIX API Gateway

 
幾種常見網關的比較
Nginx, 模塊化設計的反向代理軟件,C 語言開發
OpenResty, 以 Nginx 為核心的 Web 開發平台,可以解析執行 Lua 腳本
Kong, OpenResty 的一個應用,是一個 API 網關,具有 API 管理和請求代理的功能,使用 PostgreSQL 存儲
APISIX, 替換了 Kong 的 PostgreSQL 為 Etcd,基於 Nginx 的核心庫實現
APISIX 的優勢在於提供了 API 的管理和擴展能力,讓網關不再僅僅轉發服務,而是可以被配置、定制化。相較於 Nginx,APISIX 使用的是動態路由,避免了配置之後 reload 產生的風險。同時,APISIX 支持 HTTP(S)、HTTP2、Dubbo、QUIC、MQTT、TCP/UDP 等更多的協議,具有更好的使用生態。
 
 

上面是 APISIX 的架構圖,數據面處理客戶端請求,控制面管理路由。

Apache APISIX是一個動態的、實時的、高性能的 API 網關。它提供豐富的流量管理功能,例如負載均衡、動態上游服務、金絲雀發布、斷路、身份驗證、可觀察性等。您可以使用 Apache APISIX 來處理傳統的南北流量,以及服務之間的東西流量。 2019 年 10 月份,深圳支流科技把網關 APISIX 貢獻給 Apache 基金會,他們提供商業版本,以下內容基於社區版本。

加入helm源

$ helm repo add apisix https://charts.apiseven.com
$ helm repo update
$ helm search repo apisix

安裝apisix

helm install apisix apisix/apisix --set gateway.type=NodePort --set admin.allow.ipList="{0.0.0.0/0}" -n apisix --create-namespace
NAME: apisix
LAST DEPLOYED: Fri Sep 17 10:39:07 2021
NAMESPACE: apisix
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Get the application URL by running these commands:
  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

查看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
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
Defaulted container "apisix" out of: apisix, wait-etcd (init)
  admin_key:
      key: edd1c9f034335f136f87ad84b625c8f1
      key: 4054f7cf07e344346cd3f287985e76a2
    # ipc_shared_dict: 100m # custom shared cache, format: `cache-key: cache-size`
  - authz-keycloak
  - key-auth

安裝Dashboard 預設admin / admin

helm install apisix-dashboard apisix/apisix-dashboard -n apisix --create-namespace
NAME: apisix-dashboard
LAST DEPLOYED: Fri Sep 17 10:41:37 2021
NAMESPACE: apisix
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace apisix -l "app.kubernetes.io/name=apisix-dashboard,app.kubernetes.io/instance=apisix-dashboard" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace apisix $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace apisix port-forward $POD_NAME 8080:$CONTAINER_PORT

安裝apisix-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
NAME: apisix-ingress-controller
LAST DEPLOYED: Fri Sep 17 10:46:15 2021
NAMESPACE: apisix
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace apisix -l "app.kubernetes.io/name=apisix-ingress-controller,app.kubernetes.io/instance=apisix-ingress-controller" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace apisix $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace apisix port-forward $POD_NAME 8080:$CONTAINER_PORT

檢查安裝好的服務

helm list -n apisix
上游類型也可以整合nacos
 

ApisixRoute路由yaml範例設定

------------------------------------
配置路由代理-使用ingress的方式 apisix-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo1-ingress
spec:
  ingressClassName: apisix
  rules:
  - host: ingress.gametw.cloudns.pro
    http:
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: demo1
              port:
                number: 80

 

 
------------------------------------
 

配置路由代理-使用apisix的方式 apisix-route.yaml

apiVersion: apisix.apache.org/v1
kind: ApisixRoute
metadata:
  name: demo1-route
spec:
  http:
  - name: demo1.gametw.cloudns.pro
    match:
      hosts:
      - apisix.
      paths:
      - "/*"
    backend:
     serviceName: demo1
     servicePort: 80

 

------------------------------------

 
 
參考資料
https://www.hi-linux.com/posts/16167.html
https://www.apiseven.com/zh/blog/why-we-need-Apache-APISIX
https://cloudnative.to/blog/full-traffic-api-gateway-based-on-apache-apisix/
https://blog.csdn.net/u014087707/article/details/119877958

點閱: 53

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料