使用您自己的 TLS 证书

了解如何配置 Knative serving 以使用您自己的 SSL/TLS 证书。

或者,您也可以使用代管式 TLS 证书功能,该功能通过 Let's Encrypt 自动创建和续订 TLS 证书。

如需使用您自己的证书,请将您的 TLS 证书存储在 Kubernetes Secret 中,然后将 Cloud Service Mesh 的入站网关配置为使用该 Secret。

准备工作

  • 以下说明假定您已获取 TLS 证书。
  • 您必须配置自定义网域。如需了解详情,请参阅映射自定义网域
  • 您必须将使用入站网关的每个 Knative 服务器提供服务的服务都配置为能够处理外部流量。如果这些面向外部的服务未配置为使用 TLS 证书,则这些服务将无法验证 HTTPS 连接,从而永远不会到达 ready 状态。

在 Kubernetes Secret 中存储 TLS 证书

如需将证书存储到 Secret 中,请执行以下操作:

  1. 打开终端并导航到 TLS 证书所在的目录。

  2. 使用以下命令创建用于存储证书的 Secret:

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

    您需要进行如下替换:

    • INGRESS_NAMESPACE 替换为您的入站服务(即 istio-ingressgateway)的命名空间。如果您使用默认配置安装了 Cloud Service Mesh,请指定 istio-system 命名空间。
    • SECRET_NAME 替换为您要用于 Kubernetes Secret 的名称。
    • PRIVATE_KEY.pem 替换为包含证书私钥的文件的名称。
    • FULL_CHAIN.pem 替换为包含公共证书的文件的名称。

您现在可以将入站网关配置为使用您刚为 TLS 证书创建的 Secret。

配置入站网关以使用证书

修改 Cloud Service Mesh 的入站网关,以使用您为 TLS 证书创建的 Secret:

  1. 运行以下命令,以在修改模式下打开入站网关 YAML:

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

    默认入站网关配置示例:

    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. 通过将 hostsporttls 特性附加到现有 YAML,将入站网关配置为使用您的 Secret。

    • 将所有服务都配置为使用同一 Secret:将以下项附加到 YAML 配置,然后将 "*" 指定为 hosts 特性值:

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

      SECRET_NAME 替换为您创建的 Secret 的名称。

      请参阅示例

    • 单独配置每项服务:将以下项附加到 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 服务的名称。每个使用入站网关来处理外部流量的服务都必须单独配置。
      • SERVICE_NAMESPACE 替换为在其中运行服务的命名空间的名称。
      • CUSTOM_DOMAIN 替换为服务要使用的自定义网域。
      • SECRET_NAME 替换为服务要使用的 Secret 的名称。如果您为不同的 TLS 证书集创建了多个 Secret,则可以指定每个服务要使用哪个 Secret。

      请参阅示例

  3. 保存更改。

您现在可以使用 HTTPS 协议访问已部署的 Knative serving 服务。

示例

配置所有服务:

以下示例演示了如何将所有服务都配置为使用 TLSsecret Secret:

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