1. Kubernetes 集群介紹
Kubernetes(k8s)作為自動化容器操作的開源平臺已經名聲大噪,目前已經成為容器玩家主流選擇。Kubernetes在容器技術的基礎上,增加調度和節點集群間擴展能力,可以非常輕松地讓你快速建立一個企業級容器應用集群,這個集群主要擁有以下能力:
自動化容器的部署和復制
隨時擴展或收縮容器規模
將容器組織成組,并且提供容器間的負載均衡
很容易地升級應用程序容器的新版本
提供容器彈性,如果容器失效就替換它
2. API網關作為Kubernetes集群的接入層架構
我們可以看到Kubernetes集群是可以作為應用服務的,但是Kubernetes集群沒有足夠的接入能力,特別在大型應用中,它是不能夠直接對用戶提供服務的,否則會有非常大的安全風險。而API網關作為成熟的云產品,已經集成了非常豐富的接入能力,把API網關放在Kubernetes集群前面作為應用集群的接入服務使用,將大大提高Kubernetes集群的服務能力,可以作為標準的大型互聯網應用的標準架構。下面是使用阿里云架構圖:
是否啟用Ingress Control?
從架構圖中我們可以看到,API網關作為Kubernetes集群的橋頭堡,負責處理所有客戶端的接入及安全工作,API網關和Kubernetes集群中Ingress Control的內網CLB或者服務的內網CLB進行通信。具體什么時候用Ingress Control呢?如果Kubernetes集群內只有一個服務,網關直接和此服務關聯的內網CLB進行通信最高效。如果Kubernetes集群內有多個服務,如果使用服務的內網CLB對網關提供服務,將會生成很多CLB,資源管理起來會比較麻煩,此時我們可以使用Ingress Control做Kubernetes中服務發現與七層代理工作,API網關的所有請求發送到Ingress Control關聯的內網CLB上,由Ingress Control將請求分發到Kubernetes集群內的容器內,這樣我們也只需要一個內網CLB就能將Kubernetes集群內的所有服務暴露出去了。
3. API網關接入能力
讀者要問了,接入了API網關具體能為整個架構帶來哪些好處呢?下面我們列一下這種架構中,API網關具體能給整個應用帶來什么價值。
1.API網關允許客戶端和API網關使用多種協議進行通信,其中包括:
* HTTP
* HTTP2
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網關提供基于請求數/錯誤數/應答超時時間/流量監控報警能力,所有的報警信息會使用短信或者郵件在一分鐘內發出;
8.API網關已經和阿里云的SLS產品打通,用戶可以將所有請求日志自動上傳到用戶自己的SLS中,后繼好對訪問日志進行統計分析;
9.API網關支持Mock模式,在聯調中這個能力非常方便;
10.API網關支持用戶配置調用方的IP白名單和黑名單; 12.API網關結合阿里云的云市場,為Provider提供向API使用者收費的能力。
阿里云的API網關是一個上線數年的成熟云產品,在穩定性和性能方面,經過了時間和阿里云的工程師的不斷打磨,有高性能需求的用戶盡管放馬過來。
4. 在阿里云快速配置Kubernetes集群和API網關
阿里云支持快速創建Kubernetes集群,同一個Region內的Kubernetes集群和API網關的集成也非常簡單,下面我們來一步一步地在阿里云中配置出本文第二節中架構設計。第二節中的架構設計中,API網關和Kubernetes有兩種結合的模式,一種是API網關將請求發送到Ingress Control前的CLB,由Ingress Control將請求路由到Kubernetes對應的節點中,第二種是API網關直接將請求發送到Kubernetes中服務前的CLB,由CLB直接將請求轉發到Kubernetes中服務對應的節點中。第一種模式只需要Ingress Control前有一個CLB就可以了,由Ingress Contro做服務發現與路由,第二種模式每個服務前都需要申請一個CLB,適合并發量大的場景。
4.1 Ingress Control模式的配置方式
4.1.1 創建Kubernetes集群
首先我們來通過控制臺創建一個具備Ingress Control組件的Kubernetes集群。
1.進入Kubernetes集群管理控制臺界面:https://cs.console.aliyun.com/#/k8s/cluster/list
2.單擊右上角創建集群按鈕。
3.在創建Kubernetes集群頁面選擇不同規格的,具體創建選項和常規創建參數一致,在組件配置子頁面,需要注意勾選創建Ingress組件。
4.創建成功后可以在Kubernetes列表頁面看到剛才創建的集群。
4.1.2 在集群內創建一個多容器的服務
現在集群有了,我們需要在集群內創建一個服務,這個服務由2個容器組成,每個容器都由最新的Tomcat鏡像生成。容器的端口是8080,Ingress Control提供服務的端口是80。
1.進入Kubernetes集群管理控制臺界面:https://cs.console.aliyun.com/#/k8s/cluster/list。
2.進入Kubernetes集群的控制臺頁面后,單擊左邊菜單欄的工作負載菜單下的無狀態按鈕,進入應用列表頁面后,單擊右上角的使用YAML創建資源按鈕進入創建頁面。
3.進入創建頁面后,輸入下面的資源編排文本單擊上傳按鈕進行創建。
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-demo
labels:
app: tomcat
spec:
replicas: 2
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:latest
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: tomcat
sessionAffinity: None
type: NodePort
對這段編排模板創建文本做下解釋:使用最新的Tomcat鏡像創建兩個容器的意思,容器的服務端口是8080,并且創建一個命名為tomcat-service的服務,對外服務的端口為80,映射到容器8080的端口;
好了,目前為止,我們已經創建了一個Kubernetes集群,并且在這個集群下面創建了兩個容器,每個容器上面跑著一個最新的Tomcat。這兩個容器組成一個無狀態應用,并且組成了一個命名為tomcat-service的服務。我們可以進入無狀態應用詳情頁面看到整個應用的運行情況。目前我們的API網關沒有辦法訪問到這個服務,需要我們在Ingress Control上建立一條到這個服務的路由才能把全鏈路打通
4.1.3 在Ingress Control上給服務加上路由
現在我們有應用了,還需要在Ingress Control上為這個應用建立一個服務,然后在服務上建立一條路由,這樣API網關將請求發送給Ingress Control時,Ingress Control會根據配置的路由信息將請求代理到對應的應用節點上。
1.在集群控制臺上單擊網絡菜單下的路由按鈕,單擊右上角的創建按鈕;
2.在創建路由頁面填寫服務對應的域名,所監聽的端口等。
4.1.4 對Ingress Control的內網CLB授權
API網關如果要訪問Ingress Control的內網CLB,需要增加VPC網絡的授權,首先我們需要準備VPC的標識和內網CLB的實例ID,我們可以在CLB控制臺獲取。
1.在Kubernetes管理控制臺的網絡菜單下單擊服務菜單,進入服務管理頁面后,選擇命名空間為"所有命名空間"后可以在列表中看到Ingress Control的內網CLB地址。
2.登錄CLB控制臺(https://slb.console.aliyun.com/),找到剛才創建Kubernetes服務時自動創建的VPC,單擊進去查看詳情,我們可以在這個頁面看到VPC的標識。
好了,目前我們已經獲取到了VPC的ID和CLB的實例ID,下面我們來創建API網關的授權:
3.進入API網關授權頁面:https://apigateway.console.aliyun.com/#/cn-beijing/vpcAccess/list ,單擊右上角的創建授權按鈕,彈出創建VPC授權的小頁面,將剛才查詢到的VPC標識和CLB實例ID填入到對應的內容中,單擊確認按鈕后,授權關系就創建好了,需要記住剛才填寫的授權名稱。
4.1.5 創建API
在API網關控制臺創建API的時候,后端服務這塊,有兩點需要注意的:
1.我們需要填寫剛才創建的VPC授權名稱;
2.在創建API頁面的常量參數添加一個名字為host,位置header的參數,參數值設置為4.1.3節中設置的路由中填寫的域名。
4.1.6 調用測試
API建立好了以后,我們把API發布到線上就可以使用API網關的測試工具進行測試,看看能否將請求發送到剛才創建的Kubernetes集群中去。 我們進入剛才創建好的API的詳情頁面,單擊左側菜單中的調試API,進入調試頁面。在調試頁面填寫好相應的參數,單擊“發起請求”按鈕。
我們可以看到,請求發送到了Kubernetes的集群中的容器中,并且收到了容器中tomcat的404的應答(因為沒有配置對應的頁面)。
4.2 Kubernetes服務內網CLB結合模式的配置
通過Kubernetes服務的CLB結合API網關與Kubernetes的模式的配置方式與前一節中通過Ingress Control結合模式的配置方式有兩點不同:1.申請Kubernetes中的容器服務時,需要指定生成內網CLB,2.找到這個CLB的VPC ID與CLB ID,使用這兩個ID到API網關去進行授權即可。上一節中描述的創建Kubernetes集群的步驟,本節不再冗余描述。本節主要描述創建攜帶內網CLB的Kubernetes服務,并且找到這個內網CLB的IP地址。在找到CLB的IP地址后,具體授權方法和4.1.4中描述的一致,本節也不再重復描述。
4.2.1 生成攜帶內網CLB的Kubernetes服務
在4.1.1操作之后,我們有了一個Kubernetes集群,現在我們通過資源編排文本在這個集群中創建帶有內網CLB的服務。我們注意下,本段資源編排代碼和4.1.2中的資源編排代碼不同的是,我們把最后一行的Type變成了LoadBalancer,并且指定了這個CLBLoadBalancer為內網:
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-demo
labels:
app: tomcat
spec:
replicas: 2
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:latest
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
annotations:
service.beta.kubernetes.io/alicloud-loadbalancer-address-type: intranet
spec:
ports:
- port: 80
targetPort: 8080
protocol: TCP
selector:
app: tomcat
type: LoadBalancer
對這段編排模板創建文本做下解釋:使用最新的Tomcat鏡像創建兩個容器的意思,容器的服務端口是8080,并且創建一個命名為tomcat-service的服務,這個服務前有一個內網CLB,對外服務的端口為80,映射到容器8080的端口。
4.2.2 在Kubernetes控制臺找到服務的內網CLB地址
現在我們成功創建了一個攜帶內網CLB的服務,我們可以在Kubernetes控制臺的網絡菜單的服務子頁面找到這個內網CLB的內網IP。
找到內網CLB之后,就可以像4.1.4中一樣,去CLB的控制臺找到這個CLB的VPC ID和CLB ID,并且使用這個CLB的VPC ID和CLB ID到API網關去授權了。
5 總結
讓我們總結一下本文的內容,在前三節中,我們描述了Kubernetes集群和API網關的各項能力,并且畫出了結合它倆作為后端應用服務生產的架構圖。我們結合API網關+Kubernetes集群的架構,讓系統具備了動態伸縮,動態路由,支持多協議接入,SDK自動生成等各項能力,成為可用性更高,更靈活,更可靠的一套架構。
5.1 配置總結
在最后一節,我們描述了在阿里云的公有云如何創建一整套API網關加Kubernetes的流程,關鍵點在于Kubernetes集群通過Ingress Control組件服務發現,在API網關對Ingress Control組件的內網CLB進行授權后,將所有請求發送到CLB上。下面我們再總結一下通過Ingress結合API網關與Kubernetes的步驟:
創建一個帶有Ingress Control組件的Kubernetes的集群;
使用資源編排命令,在Kubernetes集群中創建兩個運行這最新版本的Tomcat的容器,并且基于這兩個容器創建對應的服務;
在控制臺上給Ingress Control加上一條服務路由;
到CLB控制臺找到Ingress Control內網CLB的實例ID,在API網關創建一個VPC授權;
在API網關創建API,后端服務使用剛才創建的VPC授權,并且設定一個名為host的參數,參數值使用Ingress Control服務路由設置的域名。API的請求將發送到Kubernetes集群的Ingress Control的CLB上,由Ingress Control將請求路由到容器內部的Tomcat服務上。
在高并發場景或者只有一個服務的場景,我們可以跳過Ingress Control,直接在服務前面架設一個內網CLB,并且將這個內網CLB授權給API網關,供API網關進行訪問。
5.2 Ingress Control和CLB兩種方案對比
1. 使用CLB+Ingress Control。Ingress Control可以做Kubernetes集群的服務發現和七層代理工作,如果Kubernetes集群中有多個服務,可以統一使用Ingress Control進行路由,同時只需要一個內網CLB就可以對外暴露多個服務。便于運維管理和Kubernetes集群的服務擴充。推薦使用此種方式。
2. 直接使用CLB。如果集群中某個服務的業務壓力很大,可以考慮為此服務單獨建立一個CLB,API網關直接連接此CLB,從而達到更高的通信效率。此種方式的弊端也比較明顯,如果Kubernetes集群內有多個服務,需要為每個服務配置一個CLB,因此給運維管理帶來較大工作量。