MSE Ingress是基於阿里雲MSE雲原生網關構建的Ingress服務,相容Nginx Ingress以及Nginx Ingress Annotation,支援多服務版本同時灰階發布、靈活的服務治理能力以及全方位的安全防護保障,能夠滿足大規模雲原生分布式應用的流量治理訴求。本文介紹如何通過MSE Ingress訪問Container Service。
前提條件
已為ACK叢集安裝MSE Ingress Controller組件。以下兩種方式選擇一種即可。
在ACK建立叢集時,通過在組件配置嚮導頁面的Ingress欄位右側,選擇MSE Ingress,為叢集安裝MSE Ingress Controller組件。
若已建立ACK叢集,在組件管理頁面,可安裝MSE Ingress Controller組件。
說明您的叢集版本需為1.16及以上。關於建立叢集的具體操作,請參見建立Kubernetes專有版叢集或者建立Kubernetes託管版叢集;關於升級叢集的具體操作,請參見升級ACK叢集K8s版本。
已為MSE Ingress Controller授予相關許可權。具體操作,請參見授予MSE Ingress Controller存取權限。
已通過kubectl工具串連ACK叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
背景資訊
在Container Service領域,您可以通過定義Ingress資源來管理對外暴露的內部服務。Ingress是允許訪問叢集內Service的規則集合,您可以在目標Container Service叢集定義Ingress資源來配置轉寄規則,實現不同URL訪問叢集內不同的Service。
Ingress指流量治理規則,而Ingress Controller是Ingress資源的實施者,其中Nginx Ingress Controller較為常見。但Nginx Ingress Controller無法滿足雲原生應用服務對複雜業務路由、多種應用程式層協議(例如Dubbo和QUIC)、大規模七層流量能力的需求。
MSE Ingress是阿里雲推出的下一代網關,具備低成本、安全、高整合和高可用的產品優勢。關於MSE Ingress的介紹和工作原理,請參見MSE Ingress概覽。
步驟一:通過MseIngressConfig配置MSE雲原生網關執行個體
MseIngressConfig是由MSE Ingress Controller提供的CRD資源,MSE Ingress Controller使用MseIngressConfig來管理MSE雲原生網關執行個體的生命週期以及全域配置。
一個MseIngressConfig對應一個MSE雲原生網關執行個體,如果您需要使用多個MSE雲原生網關執行個體,需要建立多MseIngressConfig配置。
除複用情境外,刪除MseIngressConfig配置,會串聯刪除對應的MSE雲原生網關執行個體。
執行以下命令,建立一個執行個體名稱為mse-ingress
,該執行個體包含3個2c4g副本,且交換器、SLB和安全性群組等其他資訊會取預設值。更多關於MseIngressConfig的配置資訊,請參見MseIngressConfig說明。
交換器若未設定時,則預設取MSE Ingress Controller被調度到的K8s Node節點所在的交換器,導致被建立的MSE雲原生網關執行個體處於單交換器模式,生產環境建議手動設定兩個交換器。
SLB未設定時,則預設為MSE雲原生網關建立一個slb.s2.small規格的公網SLB。
安全性群組未設定時,則預設為MSE雲原生網關建立普通類型的安全性群組。
cat << EOF | kubectl apply -f -
apiVersion: mse.alibabacloud.com/v1alpha1
kind: MseIngressConfig
metadata:
name: test
spec:
name: mse-ingress
common:
instance:
spec: 2c4g
replicas: 3
EOF
以上Spec中出現的配置項說明如下:
參數 | 說明 | 是否可選 | 樣本值 |
spec.name | MSE雲原生網關執行個體名稱。 | 可選 | mse-ingress |
spec.common.instance.spec | MSE雲原生網關執行個體的規格。預設為4c8g。 | 可選 | 2c4g |
spec.common.instance.replicas | MSE雲原生網關執行個體的副本數。預設為3個。 | 可選 | 3 |
步驟二:配置IngressClass
目前,MSE Ingress支援兩種方式配置IngressClass,您可以根據實際的業務情境選擇對應的方式。
通過K8s IngressClass資源方式
通過標準的K8s IngressClass資源為MSE Ingress配置IngressClass,該方式適用於新業務接入MSE Ingress的情境。
通過MseIngressConfig資源方式
通過MseIngressConfig中Ingress相關的配置為MSE Ingress配置IngressClass,該方式適用於從其他Ingress(如Nginx Ingress)遷移至MSE Ingress的情境。因為一個K8s叢集中只能有一個同名的IngressClass資源,而遷移時需要Nginx Ingress和MSE Ingress同時監聽相同的IngressClass,所以MSE Ingress額外提供了通過MseIngressConfig資源方式配置IngressClass。
通過K8s IngressClass資源方式
IngressClass是Ingress處理器的描述,用於在K8s叢集中聲明一個Ingress處理器實現,關聯該IngressClass的Ingress資源會被該Ingress處理器解析。此外,需要通過IngressClass的Parameter欄位關聯一個MseIngressConfig(MSE雲原生網關),用於實施被解析的Ingress資源描述的流量管理規則。
執行以下命令,建立IngressClass資源,並在spec.parameters
中關聯步驟一:通過MseIngressConfig配置MSE雲原生網關執行個體建立的MseIngressConfig配置。
1.19之前版本叢集
cat << EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
name: mse
spec:
controller: mse.alibabacloud.com/ingress
parameters:
apiGroup: mse.alibabacloud.com
kind: MseIngressConfig
name: test
EOF
1.19及之後版本叢集
cat << EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: mse
spec:
controller: mse.alibabacloud.com/ingress
parameters:
apiGroup: mse.alibabacloud.com
kind: MseIngressConfig
name: test
EOF
通過MseIngressConfig資源方式
主要適用於遷移的情境,或者是無法建立IngressClass資源的情境。您可以通過MseIngressConfig中Ingress相關的配置,為MSE Ingress配置IngressClass。
比如,修改步驟一建立的MseIngressConfig配置,配置IngressClass為mse。
apiVersion: mse.alibabacloud.com/v1alpha1
kind: MseIngressConfig
metadata:
name: test
spec:
name: mse-ingress
common:
instance:
spec: 2c4g
replicas: 3
ingress:
local:
ingressClass: mse
參數 | 說明 |
ingress | ingress的監聽配置。 |
ingress.local | 為雲原生網關配置當前Container Service叢集的Ingress的監聽配置。 |
ingress.local.ingressClass | 雲原生網關監聽叢集中具體IngressClass下的Ingress資源,可選值如下所示。
說明 該配置的優先順序低於使用者通過IngressClass資源關聯MseIngressConfig的方式。 |
驗證IngressClass配置成功
執行以下命令,查詢MseIngressConfig的狀態。當狀態顯示為 Listening時,表示雲原生網關建立成功並且處於運行狀態。並自動監聽叢集中IngressClass為mse
的Ingress資源。
kubectl get MseIngressConfig test
預期結果為:
NAME STATUS AGE
test Listening 3m15s
MseIngressConfig會按照Pending >Running > Listening的狀態依次變化。各狀態說明如下:
Pending :表示雲原生網關正在建立中,需等待3min左右。
Running :表示雲原生網關建立成功,並處於運行狀態。
Listening:表示雲原生處於運行狀態,並監聽叢集中Ingress資源。
Failed:表示雲原生網關處於非法狀態,可以查看Status欄位中Message來進一步明確原因。
步驟三:通過MSE Ingress訪問Container Service
執行以下命令,部署以下後端服務go-httpbin。
cat << EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: go-httpbin namespace: default spec: replicas: 1 selector: matchLabels: app: go-httpbin template: metadata: labels: app: go-httpbin version: v1 spec: containers: - image: specialyang/go-httpbin:v3 args: - "--port=8090" - "--version=v1" imagePullPolicy: Always name: go-httpbin ports: - containerPort: 8090 --- apiVersion: v1 kind: Service metadata: name: go-httpbin namespace: default spec: ports: - port: 80 targetPort: 8090 protocol: TCP selector: app: go-httpbin EOF
執行以下命令,建立Ingress資源。代碼中網域名稱
example.com
下的/version
路由規則暴露後端服務go-httpbin。1.19之前版本叢集
cat << EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress namespace: default spec: ingressClassName: mse rules: - host: example.com http: paths: - path: /version backend: serviceName: go-httpbin servicePort: 80 EOF
1.19及之後版本叢集
cat << EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress namespace: default spec: ingressClassName: mse rules: - host: example.com http: paths: - backend: service: name: go-httpbin port: number: 80 path: /version pathType: Prefix EOF
查看目標Ingress的IP地址。
kubectl get ingress ingress
預期輸出:
NAME CLASS HOSTS ADDRESS PORTS AGE ingress mse example.com 114.55.XX.XX 80 12m
執行以下命令,進行訪問測試。
curl -H "host: example.com" 114.55.XX.XX/version
預期輸出:
version:v1