配置外部域加密¶
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
-
运行以下命令编辑您的
config-networkConfigMapkubectl 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 secret 才能在集群中使用该证书。有关手动获取和配置证书的详细信息,请参阅本主题后面的步骤。
使用工具获取证书¶
请参考相应工具的文档
Knative 期望一个为您的集群外部域的 DNS 域签名的泛型证书,例如
*.yourdomain.com
一旦您获得证书和私钥,请为证书和密钥创建 Kubernetes Secret 以供 Knative 使用。
警告
由 Let's Encrypt 颁发的证书有效期仅为 90 天。因此,如果您选择手动获取和配置证书,您必须确保在每个证书过期之前续订它。
创建 Kubernetes Secret¶
在相关选项卡中执行以下步骤,将您的证书添加到 Knative 集群中
要将 TLS 证书添加到 Knative 集群,您必须创建一个 Kubernetes Secret,然后配置 Knative Contour 插件。
-
通过运行命令,创建一个 Kubernetes Secret 来保存您的 TLS 证书
cert.pem和私钥key.pemkubectl create -n contour-external secret tls default-cert \ --key key.pem \ --cert cert.pem注意
记下命名空间和 Secret 名称。您将在后续步骤中需要它们。
-
要在不同的命名空间中使用此证书和私钥,您必须创建委托。为此,请使用以下模板创建一个 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 secret,然后配置 knative-ingress-gateway
- 通过输入以下命令,创建一个 Kubernetes secret 来保存您的 TLS 证书
cert.pem和私钥key.pem
kubectl create --namespace istio-system secret tls tls-cert \
--key key.pem \
--cert cert.pem
-
配置 Knative 以使用您为 HTTPS 连接创建的新 Secret
-
运行以下命令以编辑模式打开 Knative 共享
gatewaykubectl 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-certTLS_HOSTS表示您的 TLS 证书的主机。它可以是单个主机、多个主机或通配符主机。有关详细说明,请参阅 Istio 文档
验证¶
-
部署 Knative Service
-
使用
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 Service 外部域的客户端都需要信任签署证书的证书颁发机构。这超出了 Knative 的范围,但需要解决以确保系统正常运行。特别是当证书颁发机构执行 CA 或中间证书轮换时。有关更多信息,请参阅 配置 Knative cert-manager 集成。
额外配置¶
配置 HTTP 重定向¶
当外部域启用 HTTPS 时,Knative Serving 允许自动重定向 HTTP 流量。要配置此功能:
-
使用
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 示例
-
使用
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