配置外部域加密¶
Knative 允许使用自定义 TLS 证书或使用自动生成的 TLS 证书,为您的 Knative 服务启用对外部域(如 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 服务一个证书
- 每个命名空间一个通配符证书
它们中只能有一个处于活动状态!
使用每个 Knative 服务的证书¶
更新 knative-serving
命名空间中的 config-network
ConfigMap,以启用 external-domain-tls
-
运行以下命令来编辑您的
config-network
ConfigMapkubectl edit configmap config-network -n knative-serving
-
在
data
部分下添加external-domain-tls: Enabled
属性apiVersion: v1 kind: ConfigMap metadata: name: config-network namespace: knative-serving data: ... external-domain-tls: Enabled ...
-
重新启动 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 流量。
手动获取和更新证书¶
手动获取证书的方法多种多样。您可以使用 Certbot 或 cert-manager 等工具,也可以手动从其他来源提供证书。通常,在获取证书后,您必须创建 Kubernetes 密钥才能在集群中使用该证书。有关手动获取和配置证书的详细信息,请参阅本主题后面的步骤。
使用工具获取证书¶
请参阅该工具的相应文档
Knative 预计会获得一个针对集群外部域 DNS 域签名的通配符证书,例如
*.yourdomain.com
获取证书和私钥后,创建 Kubernetes 密钥,以便 Knative 可以使用证书和密钥。
警告
由 Let's Encrypt 签发的证书有效期仅为 90 天。因此,如果您选择手动获取和配置证书,则必须确保在每个证书到期之前续订证书。
创建 Kubernetes 密钥¶
在相关选项卡中使用以下步骤将您的证书添加到 Knative 集群
要将 TLS 证书添加到 Knative 集群,您必须创建 Kubernetes 密钥,然后配置 Knative Contour 插件。
-
通过运行以下命令,创建 Kubernetes 密钥来保存您的 TLS 证书
cert.pem
和私钥key.pem
kubectl create -n contour-external secret tls default-cert \ --key key.pem \ --cert cert.pem
注意
记下命名空间和密钥名称。您将在以后的步骤中需要这些信息。
-
要在不同的命名空间中使用此证书和私钥,您必须创建一个委派。为此,请使用以下模板创建一个 YAML 文件
apiVersion: projectcontour.io/v1 kind: TLSCertificateDelegation metadata: name: default-delegation namespace: contour-external spec: delegations: - secretName: default-cert targetNamespaces: - "*"
-
通过运行以下命令,应用 YAML 文件
其中kubectl apply -f <filename>.yaml
<filename>
是您在上一步中创建的文件的名称。 -
更新 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 密钥,然后配置 knative-ingress-gateway
- 通过输入以下命令,创建 Kubernetes 密钥来保存您的 TLS 证书
cert.pem
和私钥key.pem
kubectl create --namespace istio-system secret tls tls-cert \
--key key.pem \
--cert cert.pem
-
配置 Knative 使用您为 HTTPS 连接创建的新密钥
-
运行以下命令以在编辑模式下打开 Knative 共享
gateway
kubectl edit gateway knative-ingress-gateway --namespace knative-serving
-
更新
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 文档
验证¶
-
部署 Knative 服务
-
使用
kubectl get ksvc -n <your-namespace>
检查 URL -
服务 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 服务外部域的客户端都需要信任签署证书的证书颁发机构。这超出了 Knative 的范围,但需要解决才能确保系统正常运行。尤其是当证书颁发机构执行 CA 或中间证书的轮换时。有关更多信息,请参阅 配置 Knative cert-manager 集成。
其他配置¶
配置 HTTP 重定向¶
Knative Serving 允许在外部域上启用 HTTPS 时自动重定向 HTTP 流量。要配置此功能
-
使用
http-protocol
属性配置如何处理 HTTP 和 HTTPS 请求。默认情况下,Knative 入口被配置为提供 HTTP 流量(
http-protocol: Enabled
)。现在您的集群已配置为使用 TLS 证书并处理外部域上的 HTTPS 流量,您可以指定是否允许任何 HTTP 流量。支持的
http-protocol
值启用
: 提供 HTTP 流量。重定向
: 使用302
重定向响应 HTTP 请求,要求客户端使用 HTTPS。
data: http-protocol: Redirected
示例
apiVersion: v1 kind: ConfigMap metadata: name: config-network namespace: knative-serving data: ... external-domain-tls: Enabled http-protocol: Redirected ...
禁用每个服务或路由的自动 TLS 证书配置¶
如果您在集群中启用了自动 TLS 证书配置,可以选择通过添加注释 networking.knative.dev/disable-external-domain-tls: true
来禁用单个 Knative 服务或路由的此功能。
使用 autoscale-go
示例
-
使用
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" ...
-
服务 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