為Knative服務配置HTTPS認證訪問

更新時間:
Copy as MD

如需在Knative服務中使用自訂網域名,推薦為自訂網域名配置一個HTTPS認證,提高資料轉送的安全性。Knative支援HTTPS服務訪問,將Knative服務安全地映射到自訂網域名。

前提條件

已在叢集中部署Knative,請參見部署Knative

步驟一:建立Knative服務

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇應用 > Knative

  3. Knative頁面的服務管理頁簽,選擇命名空間default,然後單擊使用模板建立,使用控制台的樣本模板建立Knative服務(helloworld-go服務),根據控制台指引完成服務的建立。

    服務建立完成後,服務管理頁簽中顯示 helloworld-go 服務狀態為成功,預設網域名稱為 helloworld-go.default.example.com。服務訪問前,需將訪問服務的網域名稱與訪問網關進行 Host 綁定。

步驟二:配置HTTPS服務

HTTPS 配置方式取決於網關類型:

  • ALB 網關:認證由 AlbConfig 統一管理,通過 Annotation 開啟 TLS,無需手動處理認證檔案。

  • Kourier 網關:需手動建立認證 Secret,再通過 DomainMapping 將 Secret 與網域名稱綁定。

ALB

可在ALBConfig中指定認證,並在Knative服務中通過Annotationknative.k8s.alibabacloud/tls: "true"開啟TLS訪問。樣本如下。

在 Knative 服務中添加 TLS Annotation,並在 AlbConfig 中配置 443 監聽,即可開啟 HTTPS 訪問。

  1. 在 Knative 服務 YAML 中添加 knative.k8s.alibabacloud/tls: "true" Annotation。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld
      namespace: default
      annotations:
        knative.k8s.alibabacloud/tls: "true"
    spec:
      template:
        spec:
          containers:
          - image: registry-vpc.cn-shenzhen.aliyuncs.com/knative-sample/helloworld-go:73fbdd56  # 替換地區為實際使用的地區。
            env:
            - name: TARGET
              value: "Knative"
  2. AlbConfig中添加443監聽,例如knative-internet,將 HTTPS 流量引入叢集。

    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: knative-internet
    spec:
      config:
      ...
      listeners:
        - port: 443
          # 可選項包括 HTTP、HTTPS、QUIC
          protocol: HTTPS 
      ...
  3. 驗證服務可通過 HTTPS 訪問。

    # 替換 alb-ppcate4ox6******.cn-beijing.alb.aliyuncs.com 為 ALB 網關地址
    curl -H "Host: helloworld.knative.top" https://alb-ppcate4ox6******.cn-beijing.alb.aliyuncs.com -k

    預期輸出:

    Hello Knative!

Kourier

Kourier 網關不內建認證管理,需先將 TLS 認證以 Secret 形式存入叢集,Secret 就緒後再通過 DomainMapping 將網域名稱與認證綁定。

1建立認證 Secret

以下以 OpenSSL 自簽名的HTTPS認證為例。如已有 .pem 格式認證檔案,可跳過步驟 1,直接從步驟 2 開始。

自我簽署憑證僅用於測試,生產環境建議使用 CA 簽發的認證。
  1. 通過OpenSSL建立自我簽署憑證。

    openssl genrsa -out knativetop-key.pem 4096
    openssl req -subj "/CN=helloworld.knative.top" -sha256  -new -key knativetop-key.pem -out knativetop.csr
    echo subjectAltName = DNS:helloworld.knative.top > extfile.cnf
    openssl x509 -req -days 3650 -sha256 -in knativetop.csr -signkey knativetop-key.pem -out knativetop-cert.pem -extfile extfile.cnf

    預期輸出:

    Signature ok
    subject=CN = helloworld.knative.top
    Getting Private key
  2. 步驟1中的knativetop-key.pemknativetop-cert.pem檔案內容進行Base64編碼。

    • knativetop-key.pem進行Base64編碼。

      cat knativetop-key.pem | base64

      預期輸出:

      a25hdGl2ZXRvcC1r******
    • knativetop-cert.pem進行Base64編碼。

      cat knativetop-cert.pem | base64

      預期輸出:

      a25hdGl2ZXRvcC1jZ******==
  3. 建立Secret。

    Secret可以用於Knative服務的TLS配置中,以實現對網域名稱helloworld.knative.top的安全訪問。

    kubectl create secret tls secret-tls --key knativetop-key.pem --cert knativetop-cert.pem

    預期輸出:

    secret/secret-tls created

2、建立DomainMapping

Knative 中,DomainMapping 是一個資來源物件,用於將一個網域名稱映射到一個或多個Knative服務。

Secret 就緒後,通過 DomainMapping 將自訂網域名與 Knative 服務綁定,並引用此前建立的 Secret 啟用 TLS 加密。

  1. 建立 helloworld.knative.top.yaml 檔案,寫入以下 DomainMapping 配置。

    apiVersion: serving.knative.dev/v1beta1
    kind: DomainMapping
    metadata:
      name: helloworld.knative.top
      namespace: default
    spec:
      ref:
        name: helloworld-go
        kind: Service
        apiVersion: serving.knative.dev/v1
    # tls block specifies the secret to be used
      tls:
        secretName: secret-tls
  2. 將 DomainMapping 應用到叢集。

    kubectl apply -f helloworld.knative.top.yaml

    預期輸出:

    domainmapping.serving.knative.dev/helloworld.knative.top created
  3. 執行以下命令,驗證DomainMapping已就緒。

    kubectl get domainmapping helloworld.knative.top

    預期輸出:

    NAME                          URL                                      READY   REASON
    helloworld.knative.top       https://helloworld.knative.top            True
  4. 驗證服務可通過自訂網域名訪問。

    # 8.141.XX.XX為 Kourier 網關地址
    curl -H "Host: helloworld-go.default.example.com" http://8.141.XX.XX -k

    預期輸出:

    Hello Knative!

相關文檔