通过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云原生网关实例的生命周期以及全局配置。

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资源描述的流量管理规则。

  1. 执行以下命令,创建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
  2. 执行以下命令,查询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
阿里云首页 容器服务Kubernetes版 相关技术圈