跳到内容

配置外部域加密

Knative 允许使用自定义 TLS 证书或自动生成的 TLS 证书,以实现 Knative Service 外部域(例如 application.example.com)的安全 HTTPS 连接。

准备工作

您必须满足以下要求才能启用安全的 HTTPS 连接

  • 必须安装 Knative Serving。有关安装 Serving 组件的详细信息,请参阅 Knative 安装指南
  • 您必须配置 Knative 集群以使用 自定义外部域
  • 您的 DNS 提供商必须已设置并配置到您的域。
  • 网络层,例如 Kourier、带有 SDS v1.3 或更高版本的 Istio,或 Contour v1.1 或更高版本。请参阅 安装网络层

自动获取和续订证书

安装和配置 cert-manager 并进行集成

信息

如果您想使用 HTTP-01 质询,您需要配置您的自定义域以映射到入口的 IP。您可以通过添加 DNS A 记录将域映射到 IP,具体操作请参考您的 DNS 提供商的说明。

首先,您需要安装和配置 cert-manager 以及 Knative cert-manager 集成。详情请参考 配置 Knative cert-manager 集成

配置 Knative Serving

自动证书配置允许以两种方式请求证书

  • 每个 Knative Service 一个证书
  • 每个命名空间一个泛型证书

同一时间只能有一个处于活动状态!

为每个 Knative Service 使用一个证书

更新 knative-serving 命名空间中的 config-network ConfigMap 以启用 external-domain-tls

  1. 运行以下命令编辑您的 config-network ConfigMap

    kubectl edit configmap config-network -n knative-serving
    
  2. data 部分下添加 external-domain-tls: Enabled 属性

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: config-network
      namespace: knative-serving
    data:
       ...
       external-domain-tls: Enabled
       ...
    
  3. 重启 Knative Serving 控制器以启动 Knative cert-manager 集成

    kubectl rollout restart deploy/controller -n knative-serving
    

为每个命名空间使用一个泛型证书

警告

为每个命名空间配置泛型证书仅适用于 DNS-01 质询。此功能不能与 HTTP-01 质询一起使用。

每命名空间配置使用命名空间标签来选择哪些命名空间应该应用证书。选择是通过 config-network ConfigMap 中的键 namespace-wildcard-cert-selector 配置的。例如,您可以使用以下配置:

  • namespace-wildcard-cert-selector: "" = 使用空值禁用该功能(这是默认值)。
  • namespace-wildcard-cert-selector: {} = 使用空对象为所有命名空间启用。

您还可以配置选择器,以便在命名空间上存在特定标签时选择退出

namespace-wildcard-cert-selector: |-
  matchExpressions:
  - key: "networking.knative.dev/disableWildcardCert"
    operator: "NotIn"
    values: ["true"] 
这将选择所有标签值不在集合 "true" 中的命名空间。

或者使用现有的 Kubernetes 标签根据名称选择命名空间

namespace-wildcard-cert-selector: |-
  matchExpressions:
    - key: "kubernetes.io/metadata.name"
      operator: "In"
      values: ["my-namespace", "my-other-namespace"] 

要应用配置,您可以使用以下命令(可选地调整标签选择器)

kubectl patch --namespace knative-serving configmap config-network -p '{"data": {"namespace-wildcard-cert-selector": "{\"matchExpressions\": [{\"key\":\"networking.knative.dev/disableWildcardCert\", \"operator\": \"NotIn\", \"values\":[\"true\"]}]}"}}'

有关命名空间选择器的更多详细信息,请参阅 Kubernetes 文档

重启 Knative Serving 控制器以启动 Knative cert-manager 集成

kubectl rollout restart deploy/controller -n knative-serving

恭喜!Knative 现在已配置为获取和续订 TLS 证书。当您的 TLS 证书颁发并在集群中可用时,您的 Knative 服务将能够在外部域上处理 HTTPS 流量。

手动获取和续订证书

有多种方法可以手动获取证书。您可以使用 Certbotcert-manager 等工具,或从其他来源手动提供证书。通常,在您获得证书后,您必须创建一个 Kubernetes secret 才能在集群中使用该证书。有关手动获取和配置证书的详细信息,请参阅本主题后面的步骤。

使用工具获取证书

请参考相应工具的文档

Knative 期望一个为您的集群外部域的 DNS 域签名的泛型证书,例如

*.yourdomain.com

一旦您获得证书和私钥,请为证书和密钥创建 Kubernetes Secret 以供 Knative 使用。

警告

由 Let's Encrypt 颁发的证书有效期仅为 90 天。因此,如果您选择手动获取和配置证书,您必须确保在每个证书过期之前续订它。

创建 Kubernetes Secret

在相关选项卡中执行以下步骤,将您的证书添加到 Knative 集群中

要将 TLS 证书添加到 Knative 集群,您必须创建一个 Kubernetes Secret,然后配置 Knative Contour 插件。

  1. 通过运行命令,创建一个 Kubernetes Secret 来保存您的 TLS 证书 cert.pem 和私钥 key.pem

    kubectl create -n contour-external secret tls default-cert \
      --key key.pem \
      --cert cert.pem
    

    注意

    记下命名空间和 Secret 名称。您将在后续步骤中需要它们。

  2. 要在不同的命名空间中使用此证书和私钥,您必须创建委托。为此,请使用以下模板创建一个 YAML 文件

    apiVersion: projectcontour.io/v1
    kind: TLSCertificateDelegation
    metadata:
      name: default-delegation
      namespace: contour-external
    spec:
      delegations:
        - secretName: default-cert
          targetNamespaces:
          - "*"
    
  3. 通过运行命令应用 YAML 文件

    kubectl apply -f <filename>.yaml
    
    其中 <filename> 是您在上一步中创建的文件的名称。

  4. 运行命令,更新 Knative Contour 插件以在禁用 external-domain-tls 时使用该证书作为备用

    kubectl patch configmap config-contour -n knative-serving \
      -p '{"data":{"default-tls-secret":"contour-external/default-cert"}}'
    

要将 TLS 证书添加到 Knative 集群,您需要创建一个 Kubernetes secret,然后配置 knative-ingress-gateway

  1. 通过输入以下命令,创建一个 Kubernetes secret 来保存您的 TLS 证书 cert.pem 和私钥 key.pem
kubectl create --namespace istio-system secret tls tls-cert \
  --key key.pem \
  --cert cert.pem
  1. 配置 Knative 以使用您为 HTTPS 连接创建的新 Secret

  2. 运行以下命令以编辑模式打开 Knative 共享 gateway

    kubectl edit gateway knative-ingress-gateway --namespace knative-serving
    
  3. 更新 gateway 以包含以下 tls: 部分和配置

    tls:
      mode: SIMPLE
      credentialName: tls-cert
    

    示例

    # Edit the following object. Lines beginning with a '#' will be ignored.
    # An empty file will abort the edit. If an error occurs while saving this
    # file will be reopened with the relevant failures.
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      # ... skipped ...
    spec:
      selector:
        istio: ingressgateway
      servers:
        - hosts:
            - "*"
          port:
            name: http
            number: 80
            protocol: HTTP
        - hosts:
            - TLS_HOSTS
          port:
            name: https
            number: 443
            protocol: HTTPS
          tls:
            mode: SIMPLE
            credentialName: tls-cert
    
    在此示例中,TLS_HOSTS 表示您的 TLS 证书的主机。它可以是单个主机、多个主机或通配符主机。有关详细说明,请参阅 Istio 文档

验证

  1. 部署 Knative Service

  2. 使用 kubectl get ksvc -n <your-namespace> 检查 URL

  3. 服务 URL 现在应为 https

    NAME           URL                                          LATEST               AGE     CONDITIONS   READY   REASON
    autoscale-go   https://autoscale-go.default.1.example.com   autoscale-go-dd42t   8m17s   3 OK / 3     True
    

信任

注意

关于信任的简要说明:所有调用 Knative Service 外部域的客户端都需要信任签署证书的证书颁发机构。这超出了 Knative 的范围,但需要解决以确保系统正常运行。特别是当证书颁发机构执行 CA 或中间证书轮换时。有关更多信息,请参阅 配置 Knative cert-manager 集成

额外配置

配置 HTTP 重定向

当外部域启用 HTTPS 时,Knative Serving 允许自动重定向 HTTP 流量。要配置此功能:

  1. 使用 http-protocol 属性配置 HTTP 和 HTTPS 请求的处理方式。

    默认情况下,Knative ingress 配置为提供 HTTP 流量 (http-protocol: Enabled)。现在您的集群已配置为使用 TLS 证书并处理外部域上的 HTTPS 流量,您可以指定是否允许任何 HTTP 流量。

    支持的 http-protocol

    • Enabled:提供 HTTP 流量。
    • Redirected:对 HTTP 请求以 302 重定向响应,要求客户端使用 HTTPS。
    data:
      http-protocol: Redirected
    

    示例

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: config-network
      namespace: knative-serving
    data:
      ...
      external-domain-tls: Enabled
      http-protocol: Redirected
      ...
    

禁用每个 Service 或 Route 的自动 TLS 证书配置

如果您的集群中启用了自动 TLS 证书配置,您可以通过添加注解 networking.knative.dev/disable-external-domain-tls: true 来选择禁用单个 Knative Service 或 Route 的此功能。

使用 autoscale-go 示例

  1. 使用 kubectl edit service.serving.knative.dev/autoscale-go -n default 编辑服务并添加注解

     apiVersion: serving.knative.dev/v1
     kind: Service
     metadata:
       annotations:
        ...
         networking.knative.dev/disable-external-domain-tls: "true"
        ...
    
  2. 服务 URL 现在应为 http,表明自动 TLS 证书配置已禁用

    NAME           URL                                          LATEST               AGE     CONDITIONS   READY   REASON
    autoscale-go   http://autoscale-go.default.1.example.com    autoscale-go-dd42t   8m17s   3 OK / 3     True
    

我们使用分析和 cookie 来了解网站流量。有关您使用我们网站的信息会与 Google 共享以达到此目的。了解更多。