MSE Ingress是基于阿里云MSE云原生網關構建的Ingress服務,兼容Nginx Ingress以及Nginx Ingress Annotation,支持多服務版本同時灰度發布、靈活的服務治理能力以及全方位的安全防護保障,能夠滿足大規模云原生分布式應用的流量治理訴求。本文介紹如何通過MSE Ingress訪問容器服務。
前提條件
已為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工具連接集群。
背景信息
在容器服務領域,您可以通過定義Ingress資源來管理對外暴露的內部服務。Ingress是允許訪問集群內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 | 為云原生網關配置當前容器服務集群的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訪問容器服務
執行以下命令,部署以下后端服務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