通过MSE Ingress访问容器服务

MSE Ingress是基于阿里云MSE云原生网关构建的Ingress服务,兼容Nginx Ingress以及Nginx Ingress Annotation,支持多服务版本同时灰度发布、灵活的服务治理能力以及全方位的安全防护保障,能够满足大规模云原生分布式应用的流量治理诉求。本文介绍如何通过MSE Ingress访问容器服务。

前提条件

背景信息

在容器服务领域,您可以通过定义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说明

说明
  1. 交换机若未设置时,则默认取MSE Ingress Controller被调度到的K8s Node节点所在的交换机,导致被创建的MSE云原生网关实例处于单交换机模式,生产环境建议手动配置两个交换机。

  2. SLB未设置时,则默认为MSE云原生网关创建一个slb.s2.small规格的公网SLB。

  3. 安全组未设置时,则默认为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资源,可选值如下所示。

  • 未配置:不监听任何Ingress资源。

  • 配置为mse:监听IngressClass为mse的Ingress资源。

  • 配置为空"":监听所有Ingress资源。

  • 配置为nginx:监听IngressClass为nginx或者未关联任何IngressClass的Ingress资源。

  • 配置为其他值:监听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访问容器服务

  1. 执行以下命令,部署以下后端服务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
  2. 执行以下命令,创建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
  3. 查看目标Ingress的IP地址。

    kubectl get ingress ingress

    预期输出:

    NAME      CLASS   HOSTS            ADDRESS         PORTS   AGE
    ingress   mse     example.com      114.55.XX.XX   80      12m
  4. 执行以下命令,进行访问测试。

    curl -H "host: example.com" 114.55.XX.XX/version

    预期输出:

    version:v1