4.7. 为 Knative 服务配置自定义域
4.7.1. 为 Knative 服务配置自定义域
Knative 服务会自动根据集群配置分配默认域名。例如,<service_name>-<namespace>.example.com
。您可以通过将您自己的自定义域名映射到 Knative 服务来自定义 Knative 服务域。
您可以通过为服务创建 DomainMapping
资源来完成此操作。您还可以创建多个 DomainMapping
资源,将多个域和子域映射到单个服务。
4.7.2. 自定义域映射
您可以通过将您自己的自定义域名映射到 Knative 服务来自定义 Knative 服务域。要将自定义域名映射到自定义资源(CR),您必须创建一个映射到可寻址目标 CR 的 DomainMapping
CR,如 Knative 服务或 Knative 路由。
4.7.2.1. 创建自定义域映射
您可以通过将您自己的自定义域名映射到 Knative 服务来自定义 Knative 服务域。要将自定义域名映射到自定义资源(CR),您必须创建一个映射到可寻址目标 CR 的 DomainMapping
CR,如 Knative 服务或 Knative 路由。
先决条件
- 在集群中安装了 OpenShift Serverless Operator 和 Knative Serving。
-
安装 OpenShift CLI (
oc
) 。 - 您已创建了一个项目,或者具有适当的角色和权限访问项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。
您已创建了 Knative 服务,并控制要映射到该服务的自定义域。
注意您的自定义域必须指向 OpenShift Container Platform 集群的 IP 地址。
流程
在与您要映射的目标 CR 相同的命名空间中创建一个包含
DomainMapping
CR 的 YAML 文件:apiVersion: serving.knative.dev/v1alpha1 kind: DomainMapping metadata: name: <domain_name> 1 namespace: <namespace> 2 spec: ref: name: <target_name> 3 kind: <target_type> 4 apiVersion: serving.knative.dev/v1
服务域映射示例
apiVersion: serving.knative.dev/v1alpha1 kind: DomainMapping metadata: name: example-domain namespace: default spec: ref: name: example-service kind: Service apiVersion: serving.knative.dev/v1
路由域映射示例
apiVersion: serving.knative.dev/v1alpha1 kind: DomainMapping metadata: name: example-domain namespace: default spec: ref: name: example-route kind: Route apiVersion: serving.knative.dev/v1
将
DomainMapping
CR 应用为 YAML 文件:$ oc apply -f <filename>
4.7.3. 使用 Knative CLI 的 Knative 服务自定义域
您可以通过将您自己的自定义域名映射到 Knative 服务来自定义 Knative 服务域。您可以使用 Knative (kn
) CLI 创建映射到可寻址目标 CR 的 DomainMapping
自定义资源 (CR) ,如 Knative 服务或 Knative 路由。
4.7.3.1. 使用 Knative CLI 创建自定义域映射
先决条件
- 在集群中安装了 OpenShift Serverless Operator 和 Knative Serving。
您已创建了 Knative 服务或路由,并控制要映射到该 CR 的自定义域。
注意您的自定义域必须指向 OpenShift Container Platform 集群的 DNS。
-
已安装 Knative (
kn
) CLI。 - 您已创建了一个项目,或者具有适当的角色和权限访问项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。
流程
将域映射到当前命名空间中的 CR:
$ kn domain create <domain_mapping_name> --ref <target_name>
示例命令
$ kn domain create example-domain-map --ref example-service
--ref
标志为域映射指定一个可寻址的目标 CR。如果使用
--ref
标志时没有提供前缀,则会假定目标为当前命名空间中的 Knative 服务。将域映射到指定命名空间中的 Knative 服务:
$ kn domain create <domain_mapping_name> --ref <ksvc:service_name:service_namespace>
示例命令
$ kn domain create example-domain-map --ref ksvc:example-service:example-namespace
将域映射到 Knative 路由:
$ kn domain create <domain_mapping_name> --ref <kroute:route_name>
示例命令
$ kn domain create example-domain-map --ref kroute:example-route
4.7.4. 使用 Developer 视角的域映射
您可以通过将您自己的自定义域名映射到 Knative 服务来自定义 Knative 服务域。您可以使用 OpenShift Container Platform Web 控制台的 Developer 视角将 DomainMapping
自定义资源 (CR) 映射到 Knative 服务。
4.7.4.1. 使用 Developer 视角将自定义域映射到服务
先决条件
- 已登陆到 web 控制台。
- 处于 Developer 视角。
- 在集群中安装了 OpenShift Serverless Operator 和 Knative Serving。这必须由集群管理员完成。
- 您已创建了一个项目,或者具有适当的角色和权限访问项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。
您已创建了 Knative 服务,并控制要映射到该服务的自定义域。
注意您的自定义域必须指向 OpenShift Container Platform 集群的 IP 地址。
流程
- 导航到 Topology 页面。
-
右键单击要映射到某个域的服务,然后选择包含服务名称的 Edit 选项。例如,如果该服务命名为
example-service
,请选择 Edit example-service 选项。 在 Advanced options 部分中,点 Show advanced Routing options。
- 如果要映射到该服务的域映射 CR 已存在,您可以在域映射列表中选择。
-
如果要创建新域映射 CR,在框中输入域名,然后选择 Create 选项。例如,如果您在
example.com 中
键入,则 Create 选项为 Create "example.com"。
- 单击 Save,将更改保存到您的服务。
验证
- 导航到 Topology 页面。
- 单击您创建的服务。
- 在服务信息窗口的 Resources 选项卡中,您可以看到您映射到域映射中列出的服务的域。
4.7.5. 使用 Administrator 视角的域映射
如果您不想在 OpenShift Container Platform web 控制台中切换到 Developer 视角,或使用 Knative (kn
) CLI 或 YAML 文件,您可以使用 OpenShift Container Platform Web 控制台的 Administator 视角。
4.7.5.1. 使用 Administrator 视角将自定义域映射到服务
Knative 服务会自动根据集群配置分配默认域名。例如,<service_name>-<namespace>.example.com
。您可以通过将您自己的自定义域名映射到 Knative 服务来自定义 Knative 服务域。
您可以通过为服务创建 DomainMapping
资源来完成此操作。您还可以创建多个 DomainMapping
资源,将多个域和子域映射到单个服务。
如果您有集群管理员权限,您可以使用 OpenShift Container Platform web 控制台中的 Administrator 视角创建 DomainMapping
自定义资源 (CR) 。
先决条件
- 已登陆到 web 控制台。
- 您处于 Administrator 视角。
- 已安装 OpenShift Serverless Operator。
- 已安装 Knative Serving。
- 您已创建了一个项目,或者具有适当的角色和权限访问项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。
您已创建了 Knative 服务,并控制要映射到该服务的自定义域。
注意您的自定义域必须指向 OpenShift Container Platform 集群的 IP 地址。
流程
- 导航到 CustomResourceDefinitions,并使用搜索框查找 DomainMapping 自定义资源定义 (CRD) 。
- 点 DomainMapping CRD,然后导航到 Instances 选项卡。
- 单击 Create DomainMapping。
修改
DomainMapping
CR 的 YAML,使其为您的实例包含以下信息:apiVersion: serving.knative.dev/v1alpha1 kind: DomainMapping metadata: name: <domain_name> 1 namespace: <namespace> 2 spec: ref: name: <target_name> 3 kind: <target_type> 4 apiVersion: serving.knative.dev/v1
到 Knative 服务的域映射示例
apiVersion: serving.knative.dev/v1alpha1 kind: DomainMapping metadata: name: custom-ksvc-domain.example.com namespace: default spec: ref: name: example-service kind: Service apiVersion: serving.knative.dev/v1
验证
使用
curl
请求访问自定义域。例如:示例命令
$ curl custom-ksvc-domain.example.com
输出示例
Hello OpenShift!
4.7.6. 使用 TLS 证书保护映射的服务
4.7.6.1. 使用 TLS 证书保护带有自定义域的服务
为 Knative 服务配置了自定义域后,您可以使用 TLS 证书来保护映射的服务。要做到这一点,您必须创建一个 Kubernetes TLS secret,然后更新 DomainMapping
CR 以使用您创建的 TLS secret。
如果您将 net-istio
用于 Ingress,并使用 security.dataPlane.mtls: true
通过 SMCP 启用 mTLS,Service Mesh 为 *.local
主机部署 DestinationRule
,这代表不允许对 OpenShift Serverless 使用 DomainMapping
。
要临时解决这个问题,部署 PeerAuthentication
来启用 mTLS,而不是使用 security.dataPlane.mtls: true
。
先决条件
-
为 Knative 服务配置了自定义域,并有一个正常工作的
DomainMapping
CR。 - 您有来自证书授权机构供应商或自签名证书的 TLS 证书。
-
您已从证书授权中心(CA)提供商或自签名证书获取
cert
和key
文件。 -
安装 OpenShift CLI (
oc
) 。
流程
创建 Kubernetes TLS secret:
$ oc create secret tls <tls_secret_name> --cert=<path_to_certificate_file> --key=<path_to_key_file>
如果您使用 Red Hat OpenShift Service Mesh 作为 OpenShift Serverless 安装的 ingress,请使用以下内容标记 Kubernetes TLS secret:
“networking.internal.knative.dev/certificate-uid": “<value>”
如果使用第三方 secret 供应商(如 cert-manager),您可以配置 secret manager 来自动标记 Kubernetes TLS secret。cert-manager 用户可以使用提供的 secret 模板自动生成带有正确标签的 secret。在本例中,secret 过滤仅基于键,但这个值可以存储有用的信息,如 secret 包含的证书 ID。
注意{cert-manager-operator} 是一个技术预览功能。如需更多信息,请参阅安装 {cert-manager-operator} 文档。
更新
DomainMapping
CR,以使用您创建的 TLS secret:apiVersion: serving.knative.dev/v1alpha1 kind: DomainMapping metadata: name: <domain_name> namespace: <namespace> spec: ref: name: <service_name> kind: Service apiVersion: serving.knative.dev/v1 # TLS block specifies the secret to be used tls: secretName: <tls_secret_name>
验证
验证
DomainMapping
CR 状态是否为True
,输出中的URL
列显示了使用 schemehttps
的映射域:$ oc get domainmapping <domain_name>
输出示例
NAME URL READY REASON example.com https://example.com True
可选: 如果服务公开,请运行以下命令验证该服务是否可用:
$ curl https://<domain_name>
如果证书是自签名的,请通过在
curl
命令中添加-k
标志来跳过验证。