1. Kubernetes 叢集介紹
Kubernetes(k8s)作為自動化容器操作的開源平台已經名聲大噪,目前已經成為成為容器玩家主流選擇。Kubernetes在容器技術的基礎上,增加排程和節點叢集間擴充能力,可以非常輕松地讓你快速建立一個企業級容器應用叢集,這個叢集主要擁有以下能力:
- 自動化容器的部署和複制
- 随時擴充或收縮容器規模
- 将容器組織成組,并且提供容器間的負載均衡
- 很容易地更新應用程式容器的新版本
- 提供容器彈性,如果容器失效就替換它
下面是一個典型的Kubernetes架構圖:

2. API網關作為Kubernetes叢集的接入層架構
我們可以看到Kubernetes叢集是有足夠理由作為應用服務的首選,但是Kubernetes叢集沒有足夠的接入能力,特别在大型應用中,它是不能夠直接對使用者提供服務的,否則會有非常大的安全風險。而API網關作為成熟的雲産品,已經內建了非常豐富的接入能力,把API網關放在Kubernetes叢集前面作為應用叢集的接入服務使用,将大大提高Kubernetes叢集的服務能力,可以作為标準的大型網際網路應用的标準架構。下面是使用阿裡雲架構圖:
從架構圖中我們可以看到,API網關作為Kubernetes叢集的橋頭堡,負責處理所有用戶端的接入及安全工作,API網關和Kubernetes叢集中每個服務的内網SLB進行通信。
3. API網關接入能力
讀者要問了,接入了API網關具體能為整個架構帶來哪些好處呢?下面我們列一下這種架構中,API網關具體能給整個應用帶來什麼價值。
1.API網關允許用戶端和API網關使用多種協定進行通信,其中包括:
* HTTP * HTTP2 * WebScoket
2.API網關使用多種方法保證和用戶端之間的通信安全:
* 允許定義API和APP之間的授權關系,隻有授權的APP允許調用; * 全鍊路通信都使用簽名驗證機制,包括用戶端和API網關之間的通信和API網關和後端服務之間的通信,保證請求在整個鍊路上不會被篡改; * 支援使用者使用自己的SSL證書進行HTTPS通信; * 支援OPENID CONNECT;
3.API網關具備iOS/Android/Java三種SDK的自動生成能力,并且具備API調用文檔自動生成能力;
4.API網關支援入參混排能力,請求中的參數可以映射到後端請求中的任何位置;
5.API網關提供參數清洗能力,使用者定義API的時候可以指定參數的類型,正則等規則,API網關會幫使用者确認傳輸給後端服務的請求是符合規則的資料;
6.API網關支援流量控制能力,支援的次元為使用者/APP/API;
7.API網關提供雙向通信的能力;具體雙向通信相關的使用規則請參考:
https://help.aliyun.com/document_detail/66031.html8.API網關提供基于請求數/錯誤數/應答逾時時間/流量監控報警能力,所有的報警資訊會使用短信或者郵件在一分鐘内發出;
9.API網關已經和阿裡雲的SLS産品打通,使用者可以将所有請求日志自動上傳到使用者自己的SLS中,後繼好對通路日志進行統計分析;
10.API網關支援Mock模式,在聯通中這個能力非常友善;
11.API網關支援使用者自動以的IP白名單和黑名單;
12.API網關結合阿裡雲的雲市場,為Provider提供向API使用者收費的能力。
阿裡雲的API網關是一個上線數年的成熟雲産品,在穩定性和性能方面,經過了時間和阿裡雲的工程師的不斷打磨,有高性能需求的使用者盡管放馬過來。
4. 在阿裡雲快速配置Kubernetes叢集和API網關
阿裡雲支援快速建立Kubernetes叢集,同一個Region内的Kubernetes叢集和API網關的內建也非常簡單,下面我們來一步一步地在阿裡雲中配置出本文第二節中架構設計。我們假設要建立的目标叢集是一個Tomcat叢集,同時有6個容器對外服務,對外服務的接口是8080。
4.1 建立Kubernetes叢集,生成具備内網SLB的服務
首先我們來通過yaml檔案建立一個具備内網SLB的Kubernetes叢集。
4.1.1 在控制台建立一個Kubernetes
1.進入Kubernetes叢集管理控制台界面:
https://cs.console.aliyun.com/#/k8s/cluster/list2.點選左上角“建立Kubernetes叢集”按鈕,進入
3.在建立叢集頁面選擇不同的規格
4.建立成功後可以在Kubernetes清單頁面看到剛才建立的叢集。
4.1.2 在Kubernetes叢集内建立一個多容器的服務
現在叢集有了,我們需要在叢集内建立一個服務,這個服務由6個容器組成,每個容器都由最新的Tomcat鏡像生成。容器的服務端口是8080,整個服務對外服務的端口也是8080。
2.選在剛才建立的Kubernetes叢集,點選“控制台”連結:
3.進入Kubernetes叢集的控制台頁面後,點選左邊菜單欄的“服務”按鈕,進入服務頁面後,點選右上角的“建立”按鈕進入建立頁面:
4.進入建立頁面後,點選使用文本建立按鈕,輸入下面的資源編排文本點選上傳按鈕進行建立:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: tomcat-demo spec: replicas: 6 selector: matchLabels: app: tomcat-demo template: metadata: labels: app: tomcat-demo spec: containers: - name: tomcat-demo image: tomcat:latest ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: tomcat-demo annotations: service.beta.kubernetes.io/alicloud-loadbalancer-address-type: intranet spec: ports: - port: 8080 targetPort: 8080 name: tomcat-demo selector: app: tomcat-demo type: LoadBalancer
對這段編排模闆建立文本做下解釋:
- 第一段是使用最新的Tomcat鏡像建立6個容器的意思,容器的服務端口是8080;
- 第二段是将所有标簽為“tomcat-demo”的容器,建立一個服務。服務使用内網SLB對外提供服務。
具體的Kubernetes容器管理編排文法,請參加文檔:
https://help.aliyun.com/document_detail/66436.html另外,所有資源編排的模闆執行都可以在“容器服務”,使用模闆這個頁面去執行部署,在這個頁面有所有的資源模闆,可以改後即發:
好了,目前為止,我們已經建立了一個Kubernetes叢集,并且在這個叢集下面建立了六個容器,每個容器上面跑着一個最新的Tomcat。這六個容器組成一個服務,使用内網SLB對内網提供服務。我們可以進入服務詳情頁面看到整個服務的運作情況:
需要注意的是,我們外部服務的位址是一個VPC位址,是不可以直接在API網關上配置的,下面我們看看對于VPC的内網位址如何在API網關上配置。
4.2 在API網關建立Kubernets叢集的API
4.2.1 建立VPC授權
API網關如果要通路VPC内的SLB,需要增加VPC網絡的授權,首先我們需要準備VPC的辨別和内網SLB的示例ID,我們可以在VPC控制台擷取:
1.登入VPC控制台(vpcnext.console.aliyun.com),找到剛才建立Kubernetes服務時自動建立的VCP,點選進去檢視詳情,我們可以在這個頁面看到VPC的辨別:
2.我們點選SLB執行個體,進入SLB清單頁面,然後點選進入SLB執行個體詳情頁面,我們可以在這個頁面找到SLB的執行個體ID:
好了,目前我們已經擷取到了VPC的ID和SLB的執行個體ID,下面我們來建立API網關的授權:
3.進入API網關授權頁面:
https://apigateway.console.aliyun.com/#/cn-beijing/vpcAccess/list,點選右上角的建立授權按鈕,彈出建立VPC授權的小頁面,将剛才查詢到的VPC辨別和SLB執行個體ID填入到對應的内容中:
點選确認按鈕後,授權關系就建立好了。
4.2.1 建立API
在API網關控制台建立API的時候,後端服務這塊,我們需要選擇剛才建立的VPC授權關系,然後API的請求就會直接發送到剛才建立的内網SLB上去了。
API定義的其他字段的描述請參閱文檔:
https://help.aliyun.com/document_detail/29478.html4.3 調用測試
API建立好了以後,我們把API釋出到線上就可以使用API網關的測試工具進行測試,看看能否将請求發送到剛才建立的Kubernetes叢集中去。
我們進入剛才建立好的API的詳情頁面,點選左側菜單中的調試API,進入調試頁面。在調試頁面填寫好相應的參數,點選“發起請求”按鈕。
我們可以看到,請求發送到了Kubernetes的叢集中的容器中,并且收到了容器中tomcate的200的應答。
5 總結
讓我們總結一下本文的内容,在前三節中,我們描述了Kubernetes叢集和API網關的各項能力,并且畫出了結合他倆作為後端應用服務生産的架構圖。我們結合API網關+Kubernetes叢集的架構替代了傳統的Nginx(Ecs)+Tomcat(Ecs)(如下圖),讓系統具備了動态伸縮,動态路由,支援多協定接入,SDK自動生成,雙向通信等各項能力,成為可用性更高,更靈活,更可靠的一套架構。
在最後一節,我們描述了在阿裡雲的公有雲如何建立一整套API網關加Kubernetes的流程,關鍵點在于Kubernetes叢集通過VPC中的SLB結合容器做服務發現,API網關綁定VPC中的SLB,将所有請求發送到SLB上。下面我們再總結一下:
- 建立一個Kubernetes的叢集;
- 使用資源編排指令,在Kubernetes叢集中建立六個運作這最新版本的Tomcat的容器,并且基于這六個容器建立一個VPC内負載均衡(SLB)的服務;
- 到VPC内找到VPC的ID和SLB的執行個體ID,在API網關建立一個VPC授權;
- 在API網關建立一些列API,後端服務使用剛才建立的VPC授權。這些API的請求将發送到Kubernetes叢集的SLB上,由SLB分發給容器内部的Tomcat服務上。
P.S: 本文系轉載,原文由fredlong 首發于《
API網關為K8s容器應用叢集提供強大的接入能力》