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组件。具体操作,请参见安装MSE Ingress Controller组件。
- 已为MSE Ingress Controller授予相关权限。具体操作,请参见为容器服务中的MSE Ingress Controller授权。
- 已通过kubectl工具连接ACK集群。具体操作,请参见通过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云原生网关实例的生命周期以及全局配置。
MSE Ingress Controller可根据MseIngressConfig的配置创建MSE云原生网关实例。更多关于MseIngressConfig的配置信息,请参见MseIngressConfig说明。
- 一个MseIngressConfig对应一个MSE云原生网关实例,如果您需要使用多个MSE云原生网关实例,需要创建多MseIngressConfig配置。
- 除复用场景外,删除MseIngressConfig配置,会级联删除对应的MSE云原生网关实例。
mse-ingress
,该实例包含3个2c4g副本,且VPC和交换机等参数取默认值。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
IngressClass是Ingress处理器的描述,用于在K8s集群中声明一个Ingress处理器实现,关联该IngressClass的Ingress资源会被该Ingress处理器解析。此外,需要通过IngressClass的Parameter字段关联一个MseIngressConfig(MSE云原生网关),用于实施被解析的Ingress资源描述的流量管理规则。
- 执行以下命令,创建IngressClass资源,并在
spec.parameters
中关联步骤一:通过MseIngressConfig配置MSE云原生网关实例创建的MseIngressConfig配置。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
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的状态。当状态显示为 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。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
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
常见问题
问题一:云原生网关支持Ingress的哪些版本?
云原生网关支持networking.k8s.io/v1beta1
和networking.k8s.io/v1
版本的Ingress,目前云原生网关可以关联的ACK集群版本为1.14.0或以上。
问题二:云原生网关解析Ingress Class的顺序是什么?
云原生网关遵循K8s Ingress的规范要求,Ingress注解kubernetes.io/ingress.class
的优先级高于Ingress Spec.IngressClassName
。
问题三:云原生网关是否同时支持管控手动管理流量规则和Ingress资源自动管理流量规则两种方式?
- 推荐您在云原生网关控制台上通过图形化界面手动为关联的ACK集群定义入口流量规则。
- 您也可以在ACK集群中通过定义Ingress资源来为集群定义入口流量规则,云原生网关可以自动监听Ingress资源变化并实时生效Ingress资源。
- 您可以同时使用以上2种方式,需要您注意的是Ingress资源解析出来的域名、路由相关配置不能在MSE云原生网关控制台进行编辑操作,其生命周期完全由ACK中Ingress资源自动管理。另外,Ingress资源自动管理的流量规则的优先级低于管控手动管理的流量规则。
问题四:为什么我的Ingress类型的域名或者路由在管控上显示不可用?
您可以将鼠标放在不可用状态来查看不可用的原因。