自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一篇帶給你Apache APISIX 初體驗(yàn)

網(wǎng)絡(luò) 通信技術(shù)
Apache APISIX 是一個基于 OpenResty 和 Etcd 實(shí)現(xiàn)的動態(tài)、實(shí)時、高性能的 API 網(wǎng)關(guān),目前已經(jīng)進(jìn)入 Apache 進(jìn)行孵化。提供了豐富的流量管理功能。

Apache APISIX 是一個基于 OpenResty 和 Etcd 實(shí)現(xiàn)的動態(tài)、實(shí)時、高性能的 API 網(wǎng)關(guān),目前已經(jīng)進(jìn)入 Apache 進(jìn)行孵化。提供了豐富的流量管理功能,如負(fù)載均衡、動態(tài)路由、動態(tài) upstream、A/B測試、金絲雀發(fā)布、限速、熔斷、防御惡意攻擊、認(rèn)證、監(jiān)控指標(biāo)、服務(wù)可觀測性、服務(wù)治理等。可以使用 APISIX 來處理傳統(tǒng)的南北流量以及服務(wù)之間的東西向流量。

與傳統(tǒng) API 網(wǎng)關(guān)相比,APISIX 具有動態(tài)路由和熱加載插件功能,避免了配置之后的 reload 操作,同時 APISIX 支持 HTTP(S)、HTTP2、Dubbo、QUIC、MQTT、TCP/UDP 等更多的協(xié)議。而且還內(nèi)置了 Dashboard,提供強(qiáng)大而靈活的界面。同樣也提供了豐富的插件支持功能,而且還可以讓用戶自定義插件。

上圖是 APISIX 的架構(gòu)圖,整體上分成數(shù)據(jù)面和控制面兩個部分,控制面用來管理路由,主要通過 etcd 來實(shí)現(xiàn)配置中心,數(shù)據(jù)面用來處理客戶端請求,通過 APISIX 自身來實(shí)現(xiàn),會不斷去 watch etcd 中的 route、upstream 等數(shù)據(jù)。

APISIX Ingress

同樣作為一個 API 網(wǎng)關(guān),APISIX 也支持作為 Kubernetes 的一個 Ingress 控制器進(jìn)行使用。APISIX Ingress 在架構(gòu)上分成了兩部分,一部分是 APISIX Ingress Controller,作為控制面它將完成配置管理與分發(fā)。另一部分 APISIX(代理) 負(fù)責(zé)承載業(yè)務(wù)流量。

當(dāng) Client 發(fā)起請求,到達(dá) Apache APISIX 后,會直接把相應(yīng)的業(yè)務(wù)流量傳輸?shù)胶蠖?如 Service Pod),從而完成轉(zhuǎn)發(fā)過程。此過程不需要經(jīng)過 Ingress Controller,這樣做可以保證一旦有問題出現(xiàn),或者是進(jìn)行變更、擴(kuò)縮容或者遷移處理等,都不會影響到用戶和業(yè)務(wù)流量。

同時在配置端,用戶通過 kubectl apply 創(chuàng)建資源,可將自定義 CRD 配置應(yīng)用到 K8s 集群,Ingress Controller 會持續(xù) watch 這些資源變更,來將相應(yīng)配置應(yīng)用到 Apache APISIX(通過 admin api)。

從上圖可以看出 APISIX Ingress 采用了數(shù)據(jù)面與控制面的分離架構(gòu),所以用戶可以選擇將數(shù)據(jù)面部署在 K8s 集群內(nèi)部或外部。但 Ingress Nginx 是將控制面和數(shù)據(jù)面放在了同一個 Pod 中,如果 Pod 或控制面出現(xiàn)一點(diǎn)閃失,整個 Pod 就會掛掉,進(jìn)而影響到業(yè)務(wù)流量。這種架構(gòu)分離,給用戶提供了比較方便的部署選擇,同時在業(yè)務(wù)架構(gòu)調(diào)整場景下,也方便進(jìn)行相關(guān)數(shù)據(jù)的遷移與使用。

APISIX Ingress 控制器目前支持的核心特性包括:

  • 全動態(tài),支持高級路由匹配規(guī)則,可與 Apache APISIX 官方 50 多個插件 & 客戶自定義插件進(jìn)行擴(kuò)展使用
  • 支持 CRD,更容易理解聲明式配置
  • 兼容原生 Ingress 資源對象
  • 支持流量切分
  • 服務(wù)自動注冊發(fā)現(xiàn),無懼?jǐn)U縮容
  • 更靈活的負(fù)載均衡策略,自帶健康檢查功能
  • 支持 gRPC 與 TCP 4 層代理

安裝

我們這里在 Kubernetes 集群中來使用 APISIX,可以通過 Helm Chart 來進(jìn)行安裝,首先添加官方提供的 Helm Chart 倉庫:

  1. ➜ helm repo add apisix https://charts.apiseven.com 
  2. ➜ helm repo update 

由于 APISIX 的 Chart 包中包含 dashboard 和 ingress 控制器的依賴,我們只需要在 values 中啟用即可安裝 ingress 控制器了:

  1. ➜ helm fetch apisix/apisix 
  2. ➜ tar -xvf apisix-0.7.2.tgz 
  3. ➜ mkdir -p apisix/ci 

在 apisix/ci 目錄中新建一個用于安裝的 values 文件,內(nèi)容如下所示:

  1. # ci/prod.yaml 
  2. apisix: 
  3.   enabled: true 
  4.  
  5.   nodeSelector:  # 固定在node2節(jié)點(diǎn)上 
  6.     kubernetes.io/hostname: node2 
  7.  
  8. gateway: 
  9.   type: NodePort 
  10.   externalTrafficPolicy: Cluster 
  11.   http: 
  12.     enabled: true 
  13.     servicePort: 80 
  14.     containerPort: 9080 
  15.  
  16. etcd: 
  17.   enabled: true  # 會自動創(chuàng)建3個節(jié)點(diǎn)的etcd集群 
  18.   replicaCount: 1  # 多副本需要修改下模板,這里暫時運(yùn)行一個etcd pod 
  19.  
  20. dashboard: 
  21.   enabled: true 
  22.  
  23. ingress-controller: 
  24.   enabled: true 
  25.   config: 
  26.     apisix: 
  27.       serviceName: apisix-admin 
  28.       serviceNamespace: apisix  # 指定命名空間,如果不是 ingress-apisix 需要重新指定 

經(jīng)測試官方的 Helm Chart 包對 etcd 多節(jié)點(diǎn)集群支持不是很好,我測試跑3個節(jié)點(diǎn)會出問題,應(yīng)該還需要重新修改模板去兼容,另外對外部的 etcd tls 集群兼容度也不好,比如 dashboard 的 Chart 需要自己修改模板去支持 tls,所以這里我們測試先改成 1 個副本的 etcd 集群。

APISIX 需要依賴 etcd,默認(rèn)情況下 Helm Chart 會自動安裝一個3副本的 etcd 集群,需要提供一個默認(rèn)的 StorageClass,如果你已經(jīng)有默認(rèn)的存儲類則可以忽略下面的步驟,這里我們安裝一個 nfs 的 provisioner,用下面的命令可以安裝一個默認(rèn)的 StorageClass:

  1. ➜ helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/ 
  2. ➜ helm upgrade --install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \ 
  3. --set nfs.server=192.168.31.31 \  # 指定nfs地址 
  4. --set nfs.path=/var/lib/k8s/data \  # nfs路徑 
  5. --set image.repository=cnych/nfs-subdir-external-provisioner \ 
  6. --set storageClass.defaultClass=true -n kube-system 

安裝完成后會自動創(chuàng)建一個 StorageClass:

  1. ➜ kubectl get sc 
  2. NAME                   PROVISIONER                                     RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE 
  3. nfs-client (default)   cluster.local/nfs-subdir-external-provisioner   Delete          Immediate              true                   35s 

然后直接執(zhí)行下面的命令進(jìn)行一鍵安裝:

  1. ➜ helm upgrade --install apisix ./apisix -f ./apisix/ci/prod.yaml -n apisix 
  2. Release "apisix" does not exist. Installing it now. 
  3. NAME: apisix 
  4. LAST DEPLOYED: Thu Dec 30 16:28:38 2021 
  5. NAMESPACE: apisix 
  6. STATUS: deployed 
  7. REVISION: 1 
  8. NOTES: 
  9. 1. Get the application URL by running these commands: 
  10.   export NODE_PORT=$(kubectl get --namespace apisix -o jsonpath="{.spec.ports[0].nodePort}" services apisix-gateway) 
  11.   export NODE_IP=$(kubectl get nodes --namespace apisix -o jsonpath="{.items[0].status.addresses[0].address}") 
  12.   echo http://$NODE_IP:$NODE_PORT 

正常就可以成功部署 apisix 了:

  1. ➜ kubectl get pods -n apisix 
  2. NAME                                         READY   STATUS    RESTARTS   AGE 
  3. apisix-dashboard-b69d5c768-r6tqk             1/1     Running   0          85m 
  4. apisix-etcd-0                                1/1     Running   0          90m 
  5. apisix-fb8cdb569-wz9gq                       1/1     Running   0          87m 
  6. apisix-ingress-controller-7d5bbf5dd5-r6khq   1/1     Running   0          85m 
  7. ➜ kubectl get svc -n apisix 
  8. NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE 
  9. apisix-admin                ClusterIP   10.97.108.252    <none>        9180/TCP            3h 
  10. apisix-dashboard            NodePort    10.108.202.136   <none>        80:31756/TCP        3h 
  11. apisix-etcd                 ClusterIP   10.107.150.100   <none>        2379/TCP,2380/TCP   3h 
  12. apisix-etcd-headless        ClusterIP   None             <none>        2379/TCP,2380/TCP   3h 
  13. apisix-gateway              NodePort    10.97.214.188    <none>        80:32200/TCP        3h 
  14. apisix-ingress-controller   ClusterIP   10.103.176.26    <none>        80/TCP              3h 

測試

現(xiàn)在我們可以為 Dashboard 創(chuàng)建一個路由規(guī)則,新建一個如下所示的 ApisixRoute 資源對象即可:

  1. apiVersion: apisix.apache.org/v2beta2 
  2. kind: ApisixRoute 
  3. metadata: 
  4.   name: dashboard 
  5.   namespace: apisix 
  6. spec: 
  7.   http: 
  8.     - name: root 
  9.       match: 
  10.         hosts: 
  11.           - apisix.qikqiak.com 
  12.         paths: 
  13.           - "/*" 
  14.       backends: 
  15.       - serviceName: apisix-dashboard 
  16.         servicePort: 80 

創(chuàng)建后 apisix-ingress-controller 會將上面的資源對象通過 admin api 映射成 APISIX 中的配置:

  1. ➜ kubectl get apisixroute -n apisix 
  2. NAME        HOSTS                    URIS     AGE 
  3. dashboard   ["apisix.qikqiak.com"]   ["/*"]   75m 

所以其實(shí)我們的訪問入口是 APISIX,而 apisix-ingress-controller 只是一個用于監(jiān)聽 crds,然后將 crds 翻譯成 APISIX 的配置的工具而已,現(xiàn)在就可以通過 apisix-gateway 的 NodePort 端口去訪問我們的 dashboard 了:

默認(rèn)登錄用戶名和密碼都是 admin,登錄后在路由菜單下正常可以看到上面我們創(chuàng)建的這個 dashboard 的路由信息:

點(diǎn)擊更多下面的查看就可以看到在 APISIX 下面真正的路由配置信息:

所以我們要使用 APISIX,也一定要理解其中的路由 Route 這個概念,路由(Route)是請求的入口點(diǎn),它定義了客戶端請求與服務(wù)之間的匹配規(guī)則,路由可以與服務(wù)(Service)、上游(Upstream)關(guān)聯(lián),一個服務(wù)可對應(yīng)一組路由,一個路由可以對應(yīng)一個上游對象(一組后端服務(wù)節(jié)點(diǎn)),因此,每個匹配到路由的請求將被網(wǎng)關(guān)代理到路由綁定的上游服務(wù)中。

理解了路由后自然就知道了我們還需要一個上游 Upstream 進(jìn)行關(guān)聯(lián),這個概念和 Nginx 中的 Upstream 基本是一致的,在上游菜單下可以看到我們上面創(chuàng)建的 dashboard 對應(yīng)的上游服務(wù):

其實(shí)就是將 Kubernetes 中的 Endpoints 映射成 APISIX 中的 Upstream,然后我們可以自己在 APISIX 這邊進(jìn)行負(fù)載。

APISIX 提供的 Dashboard 功能還是非常全面的,我們甚至都可以直接在頁面上進(jìn)行所有的配置,包括插件這些,非常方便。

當(dāng)然還有很多其他高級的功能,比如流量切分、請求認(rèn)證等等,這些高級功能在 crds 中去使用則更加方便了,當(dāng)然也是支持原生的 Ingress 資源對象的,關(guān)于 APISIX 的更多高級用法,后續(xù)再進(jìn)行說明。

 

責(zé)任編輯:姜華 來源: k8s技術(shù)圈
相關(guān)推薦

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2021-07-21 09:48:20

etcd-wal模塊解析數(shù)據(jù)庫

2021-04-08 11:00:56

CountDownLaJava進(jìn)階開發(fā)

2021-06-21 14:36:46

Vite 前端工程化工具

2021-01-28 08:55:48

Elasticsear數(shù)據(jù)庫數(shù)據(jù)存儲

2021-04-01 10:51:55

MySQL鎖機(jī)制數(shù)據(jù)庫

2021-04-14 14:16:58

HttpHttp協(xié)議網(wǎng)絡(luò)協(xié)議

2022-04-29 14:38:49

class文件結(jié)構(gòu)分析

2023-03-29 07:45:58

VS編輯區(qū)編程工具

2021-03-12 09:21:31

MySQL數(shù)據(jù)庫邏輯架構(gòu)

2024-06-13 08:34:48

2022-03-22 09:09:17

HookReact前端

2022-02-17 08:53:38

ElasticSea集群部署

2021-04-14 07:55:45

Swift 協(xié)議Protocol

2022-02-25 15:50:05

OpenHarmonToggle組件鴻蒙

2021-04-23 08:59:35

ClickHouse集群搭建數(shù)據(jù)庫

2021-07-08 07:30:13

Webpack 前端Tree shakin

2023-03-13 09:31:04

2021-10-28 08:51:53

GPIO軟件框架 Linux

2021-05-08 08:36:40

ObjectString前端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號