使用ASM网关作为Ingress Controller暴露集群内的服务

ASM支持在管理的集群中使用Ingress资源,并指定特定的ASM网关作为Ingress Controller。本文介绍如何在ACK中配置Ingress资源,使用ASM网关作为Ingress Controller暴露集群内的服务。

前提条件

使用限制

  • 使用ASM网关作为Ingress Controller时,不支持在Ingress中配置defaultBackend字段。更多信息,请参见Ingress

  • 仅支持V1版本的Ingress API,使用前请确认数据面中的Ingress API版本为V1。

功能介绍

Ingress是Kubernetes的标准API对象,用于管理Kubernetes服务的外部访问。您可以在Ingress中配置路由规则,将集群内的HTTP或HTTPS服务暴露到集群外部。

ASM支持在管理的集群中使用Ingress资源,并指定特定的ASM网关作为Ingress Controller。ASM网关支持自动扩缩容、TLS硬件加速、网关优雅下线等多项高级功能。当使用ASM网关作为Ingress Controller时,您可以使用服务网格提供的多种可观测能力和安全能力。ASM网关还支持动态加载证书。TLS(Transport Layer Security)所需的私钥、服务器证书以及根证书,都可以在网关不重启的条件下动态配置。

步骤一:在目标网关上启用Ingress

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择ASM网关 > 入口网关

  3. 在目标网关右侧的高级功能区域,单击启用Ingress API访问,然后在确认对话框,单击确定

步骤二:创建Ingress资源,并指定ASM网关为IngressController

Ingress不支持选择网关监听的端口。HTTP协议默认会使用80端口,HTTPS协议默认使用443端口。因此,您的ASM网关需要开启80和443端口的监听。

使用Annotations指定IngressController

  1. 使用以下内容,创建ingress.yaml

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.io/ingress.class: istio
      name: ingress
    spec:
      rules:
      - host: httpbin.aliyun.com
        http:
          paths:
          - path: /status
            pathType: Prefix
            backend:
              service:
                name: httpbin
                port:
                  number: 8000
  2. 使用kubectl连接到ACK集群,执行以下命令,指定ASM网关为IngressController。

    kubectl apply -f ingress.yaml

使用IngressClass指定IngressController

  1. 使用以下内容,创建ingress.yaml

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress
    spec:
      ingressClassName: istio
      rules:
      - host: httpbin.aliyun.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: httpbin
                port:
                  number: 8000
  2. 使用kubectl连接到ACK集群,执行以下命令,指定ASM网关为IngressController。

    kubectl apply -f ingress.yaml

步骤三:使用HTTP的方式访问httpbin服务

使用以下命令,访问httpbin服务。

curl -H 'host: httpbin.aliyun.com'  http://${ASM网关IP地址}/status/418

预期输出:

    -=[ teapot ]=-

       _...._
     .'  _ _ `.
    | ."` ^ `". _,
    \_;`"---"`|//
      |       ;/
      \_     _/

预期输出表明,使用Ingress在ASM网关上暴露httpbin应用成功。

步骤四:设置TLS并使用HTTPS的方式访问httpbin服务

ASM支持Ingress指定TLS设置。ASM网关运行在命名空间istio-system,因此Ingress中引用的Secret也必须存在于istio-system命名空间。

ASM网关作为Ingress资源控制器,支持动态加载证书。TLS(Transport Layer Security)所需的私钥、服务器证书以及根证书,都可以在网关不重启的条件下动态配置。同时,ASM网关也允许挂载多个Secret支持不同的证书加载,整个过程不需要网关Pod重启

下文以加载一个证书为例进行说明。如果需要支持多个证书,请参照下文步骤2步骤3创建Secret完成自动加载。

  1. 准备服务器证书和私钥。

    使用域名时需要备案才能正常访问。本示例使用aliyun.com生成证书和私钥,并保存为Secret。

    • 场景一:没有针对aliyun.com可用的证书和私钥

      您可以通过openssl,执行以下步骤来生成证书和密钥。

      1. 执行以下命令,创建根证书和私钥。

        openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=myexample Inc./CN=aliyun.com' -keyout aliyun.root.key -out aliyun.root.crt
      2. 执行以下命令,为aliyun.com服务器生成证书和私钥。

        openssl req -out aliyun.com.csr -newkey rsa:2048 -nodes -keyout aliyun.com.key -subj "/CN=aliyun.com/O=myexample organization"
        openssl x509 -req -days 365 -CA aliyun.root.crt -CAkey aliyun.root.key -set_serial 0 -in aliyun.com.csr -out aliyun.com.crt
      3. 在入口网关Pod所在的集群对应的KubeConfig环境下,执行以下命令,在istio-system命名空间中创建包含证书和私钥的Secret。

        kubectl create -n istio-system secret tls myexample-credential --key=aliyun.com.key --cert=aliyun.com.crt
    • 场景二:已有针对aliyun.com可用的证书和私钥

      1. 将证书命名为aliyun.com.crt,私钥命名为aliyun.com.key

      2. 在入口网关Pod所在的集群对应的KubeConfig环境下,执行以下命令,在istio-system命名空间中创建包含证书和私钥的Secret。

        kubectl create -n istio-system secret tls myexample-credential --key=aliyun.com.key --cert=aliyun.com.crt
  2. 创建Ingress资源,并指定TLS引用的Secret为步骤1创建的myexample-credential。

    1. 使用以下内容,创建ingress-https.yaml

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: ingress
        annotations:
          kubernetes.io/ingress.class: istio
      spec:
        rules:
          - host: httpbin.aliyun.com
            http:
              paths:
                - backend:
                    service:
                      name: httpbin
                      port:
                        number: 8000
                  path: /status
                  pathType: Prefix
        tls:
          - hosts:
              - httpbin.aliyun.com
            secretName: myexample-credential
      说明

      如果通过ACK控制台创建Ingress资源,只支持从Ingress所在命名空间下选择证书对应的Secret。例如,当创建的Ingress资源在default命名空间时,您只能选择该命名空间default下的Secret。因此,您需要将步骤1创建的Secret myexample-credential复制到命名空间default下,以确保在ACK控制台上可以选择该Secret。

    2. 使用kubectl连接到ACK集群,执行以下命令,部署Ingress资源。

      kubectl apply -f ingress-https.yaml
  3. 执行以下命令,使用HTTPS的方式访问httpbin服务。

    curl  -H Host:httpbin.aliyun.com --resolve httpbin.aliyun.com:443:${ASM网关IP} https://httpbin.aliyun.com:443/status/418 -k

    预期输出:

        -=[ teapot ]=-
    
           _...._
         .'  _ _ `.
        | ."` ^ `". _,
        \_;`"---"`|//
          |       ;/
          \_     _/

    预期输出表明,使用Ingress在ASM网关上暴露httpbin应用成功。