通过MSE Ingress访问容器服务
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组件。
说明您的集群版本需为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云原生网关实例的生命周期以及全局配置。
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配置。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的状态。当状态显示为 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