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