全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用ASM網關作為Ingress Controller暴露叢集內的服務

更新時間:Jan 13, 2025

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應用成功。