使用自己的傳輸層安全標準 (TLS) 憑證

瞭解如何設定 Knative Serving,以使用您自己的 SSL/TLS 憑證。

或者,您也可以使用受管理 TLS 憑證功能,透過 Let's Encrypt 自動建立及續約 TLS 憑證。

如要使用自己的憑證,請將 TLS 憑證儲存在 Kubernetes Secret 中,然後設定 Cloud Service Mesh 的 Ingress 閘道,以使用該 Secret。

事前準備

  • 這些操作說明假設您已取得 TLS 憑證。
  • 您必須設定自訂網域。詳情請參閱「對應自訂網域」。
  • 您必須設定每個使用Ingress 閘道提供外部流量的 Knative 服務。如果這些面向外部的服務未設定為使用 TLS 憑證,服務就無法驗證 HTTPS 連線,因此永遠無法達到 ready 狀態。

將 TLS 憑證儲存在 Kubernetes Secret 中

如要將憑證儲存到密鑰:

  1. 開啟終端機,然後前往 TLS 憑證所在的目錄。

  2. 使用下列指令建立儲存憑證的密鑰:

    kubectl create --namespace INGRESS_NAMESPACE secret tls SECRET_NAME \
      --key PRIVATE_KEY.pem \
      --cert FULL_CHAIN.pem

    取代:

    • INGRESS_NAMESPACE,並將 istio-ingressgateway 換成 Ingress 服務的命名空間。如果您使用預設設定安裝 Cloud Service Mesh,請指定 istio-system 命名空間。
    • SECRET_NAME 替換為您要使用的 Kubernetes Secret 名稱。
    • PRIVATE_KEY.pem,其中包含憑證私密金鑰的檔案名稱。
    • FULL_CHAIN.pem,並將其替換為包含公開憑證的檔案名稱。

現在您可以設定 Ingress 閘道,使用您剛為 TLS 憑證建立的密鑰。

設定 Ingress 閘道以使用憑證

修改 Cloud Service Mesh 的 Ingress 閘道,使用您為 TLS 憑證建立的密鑰:

  1. 執行下列指令,以編輯模式開啟 Ingress 閘道 YAML:

    kubectl edit gateway knative-ingress-gateway --namespace knative-serving

    預設 Ingress 閘道設定範例:

    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      ...
      # other skipped configuration
      ...
    spec:
      selector:
        istio: ingressgateway
      servers:
      - hosts:
        - '*'
        port:
          name: http
          number: 80
          protocol: HTTP
    
  2. 在現有 YAML 中附加 hostsporttls 屬性,設定 Ingress 閘道使用您的密鑰。

    • 為所有服務設定使用相同密鑰:在 YAML 設定中附加下列內容,並將 "*" 指定為 hosts 屬性值:

      ...
      # other skipped configuration
      ...
      - hosts:
        - "*"
        port:
          name: https
          number: 443
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: SECRET_NAME
      

      SECRET_NAME 替換為您建立的密鑰名稱。

      查看範例

    • 個別設定每項服務:在 YAML 設定中附加下列內容,並使用服務名稱和命名空間指定 hosts 屬性的值:

      針對每項服務,指定 hostsporttls 屬性的值:

      ...
      # other skipped configuration
      ...
      - hosts:
        - SERVICE_NAME.SERVICE_NAMESPACE.CUSTOM_DOMAIN
        port:
          number: 443
          name: https-SERVICE_NAME
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: SECRET_NAME
      

      取代:

      • SERVICE_NAME 改為 Knative serving 服務的名稱。凡是使用 Ingress 閘道提供外部流量的服務,都必須個別設定。
      • SERVICE_NAMESPACE 改為服務執行的命名空間名稱。
      • CUSTOM_DOMAIN,並將服務設定為使用該自訂網域。
      • SECRET_NAME 替換為您要服務使用的密鑰名稱。如果您為不同的 TLS 憑證集建立多個密鑰,可以指定每個服務使用的密鑰。

      查看範例

  3. 儲存變更。

您現在可以使用 HTTPS 通訊協定,存取已部署的 Knative 服務服務。

範例

設定所有服務:

以下範例說明如何設定所有服務,以使用 TLSsecret 密鑰:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  ...
  # other skipped configuration
  ...
spec:
  selector:
    istio: ingressgateway
  servers:
    - hosts:
      - "*"
      port:
        name: http
        number: 80
        protocol: HTTP
    - hosts:
      - "*"
      port:
        name: https
        number: 443
        protocol: HTTPS
      tls:
        mode: SIMPLE
        credentialName: TLSsecret
設定個別服務:

這個範例說明如何個別設定所有三項提供網際網路流量的服務:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  ...
  # other skipped configuration
  ...
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - "*"
    port:
      name: http
      number: 80
      protocol: HTTP
  - hosts:
    - prodservice.prodnamespace.my-custom-domain.com
    port:
      number: 443
      name: https-prodservice
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: TLSsecret
  - hosts:
    - experiment.namespace.my-custom-domain.com
    port:
      number: 443
      name: https-experiment
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: TLSsecret
  - hosts:
    - fallbackservice.anothernamespace.my-custom-domain.com
    port:
      number: 443
      name: https-fallbackservice
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: anotherTLSsecret