第 1 章 集成 Service Mesh
1.1. 将 Service Mesh 2.x 与 OpenShift Serverless 集成 复制链接链接已复制到粘贴板!
OpenShift Serverless Operator 提供 Kourier 作为 Knative 的默认入口。但是,无论是否启用了 Kourier,您都可以在 OpenShift Serverless 中使用 Service Mesh。禁用 Kourier 集成后,您可以配置 Kourier ingress 不支持的额外网络和路由选项,如 mTLS 功能。
请注意以下假设和限制:
- 所有 Knative 内部组件以及 Knative 服务都是 Service Mesh 的一部分,并启用了 sidecar 注入。这意味着整个网格中强制使用 strict mTLS。所有对 Knative Services 的请求都需要 mTLS 连接,客户端必须发送其证书,但来自 OpenShift Routing 的调用除外。
- 带有 Service Mesh 集成的 OpenShift Serverless 只能 针对一个 服务网格。集群中可以存在多个网格,但 OpenShift Serverless 只在其中之一可用。
-
不支持更改 OpenShift Serverless 的目标
ServiceMeshMemberRoll,这意味着将 OpenShift Serverless 移到另一个网格中。更改目标 Service mesh 的唯一方法是卸载和重新安装 OpenShift Serverless。
1.1.1. 先决条件 复制链接链接已复制到粘贴板!
- 您可以使用集群管理员访问权限访问 Red Hat OpenShift Serverless 帐户。
-
已安装 OpenShift CLI(
oc)。 - 已安装 Serverless Operator。
- 已安装 Red Hat OpenShift Service Mesh 2.x Operator。
以下流程中的示例使用域
example.com。这个域的示例证书被用作为子域证书签名的证书颁发机构(CA)。要在部署中完成并验证这些步骤,您需要由广泛信任的公共 CA 签名的证书或您的机构提供的 CA。根据您的域、子域和 CA 调整命令示例。
-
您必须配置通配符证书,以匹配 OpenShift Container Platform 集群的域。例如,如果您的 OpenShift Container Platform 控制台地址是
https://console-openshift-console.apps.openshift.example.com,您必须配置通配符证书,以便域为*.apps.openshift.example.com。有关配置通配符证书的更多信息,请参阅创建证书来加密传入的外部流量。 - 如果要使用任何域名,包括不是默认 OpenShift Container Platform 集群域子域的域名,您必须为这些域设置域映射。如需更多信息,请参阅有关创建自定义域映射的 OpenShift Serverless 文档。
OpenShift Serverless 只支持使用本指南中明确记录的 Red Hat OpenShift Service Mesh 功能,且不支持其他未记录的功能。
在 Service Mesh 中使用 Serverless 1.31 仅支持 Service Mesh 版本 2.2 或更高版本。有关 1.31 以外的版本的详情和信息,请参阅"Red Hat OpenShift Serverless 支持的配置"页面。
1.1.2. 创建证书来加密传入的外部流量 复制链接链接已复制到粘贴板!
默认情况下,Service Mesh mTLS 功能只会保护 Service Mesh 本身内部的流量,在 ingress 网关和带有 sidecar 的独立 pod 间的安全。要在流向 OpenShift Container Platform 集群时对流量进行加密,您必须先生成证书,然后才能启用 OpenShift Serverless 和 Service Mesh 集成。
先决条件
- 在 OpenShift Container Platform 上具有集群管理员权限,或者具有 Red Hat OpenShift Service on AWS 或 OpenShift Dedicated 的集群或专用管理员权限。
- 安装了 OpenShift Serverless Operator 和 Knative Serving。
-
已安装 OpenShift CLI(
oc)。 -
您可以访问
knative-serving-ingress命名空间,OpenShift Serverless Operator 在安装过程中自动创建该命名空间。 - 您已创建了一个项目,或者具有适当的角色和权限访问项目,以创建应用程序和其他工作负载。
流程
创建为 Knative 服务签名的 root 证书和私钥:
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \ -subj '/O=Example Inc./CN=example.com' \ -keyout root.key \ -out root.crt$ openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \ -subj '/O=Example Inc./CN=example.com' \ -keyout root.key \ -out root.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建通配符证书:
openssl req -nodes -newkey rsa:2048 \ -subj "/CN=*.apps.openshift.example.com/O=Example Inc." \ -keyout wildcard.key \ -out wildcard.csr$ openssl req -nodes -newkey rsa:2048 \ -subj "/CN=*.apps.openshift.example.com/O=Example Inc." \ -keyout wildcard.key \ -out wildcard.csrCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为通配符证书签名:
openssl x509 -req -days 365 -set_serial 0 \ -CA root.crt \ -CAkey root.key \ -in wildcard.csr \ -out wildcard.crt$ openssl x509 -req -days 365 -set_serial 0 \ -CA root.crt \ -CAkey root.key \ -in wildcard.csr \ -out wildcard.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令之一创建一个包含通配符证书的 secret,具体取决于您的 Service Mesh 版本:
选项 A:对于 Service Mesh 2.x,输入 folloing 命令在
istio-system命名空间中创建 secret:oc create -n istio-system secret tls wildcard-certs \ --key=wildcard.key \ --cert=wildcard.crt$ oc create -n istio-system secret tls wildcard-certs \ --key=wildcard.key \ --cert=wildcard.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 选项 B:对于 Service Mesh 3.x,输入 folloing 命令在
knative-serving-ingress命名空间中创建 secret:oc create -n knative-serving-ingress secret tls wildcard-certs \ --key=wildcard.key \ --cert=wildcard.crt$ oc create -n knative-serving-ingress secret tls wildcard-certs \ --key=wildcard.key \ --cert=wildcard.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 用于 secret 的命名空间取决于 Service Mesh 的版本。Service Mesh 2.x 需要
istio-system命名空间中的证书。Service Mesh 3.x 使用专用的knative-serving-ingress命名空间,其中运行 OpenShift Serverless ingress 网关。
1.1.3. 将 Service Mesh 与 OpenShift Serverless 集成 复制链接链接已复制到粘贴板!
您可以将 Service Mesh 2.x 与 OpenShift Serverless 集成,以便为无服务器应用程序启用高级流量管理、安全性和可观察性。本节提供了验证先决条件、安装和配置这两个组件的步骤,并确认集成是否按预期工作。
1.1.3.1. 验证安装先决条件 复制链接链接已复制到粘贴板!
在安装和配置 Service Mesh 与 Serverless 集成前,请验证是否满足先决条件。
流程
检查冲突网关:
示例命令
oc get gateway -A -o jsonpath='{range .items[*]}{@.metadata.namespace}{"/"}{@.metadata.name}{" "}{@.spec.servers}{"\n"}{end}' | column -t$ oc get gateway -A -o jsonpath='{range .items[*]}{@.metadata.namespace}{"/"}{@.metadata.name}{" "}{@.spec.servers}{"\n"}{end}' | column -tCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
knative-serving/knative-ingress-gateway [{"hosts":["*"],"port":{"name":"https","number":443,"protocol":"HTTPS"},"tls":{"credentialName":"wildcard-certs","mode":"SIMPLE"}}] knative-serving/knative-local-gateway [{"hosts":["*"],"port":{"name":"http","number":8081,"protocol":"HTTP"}}]knative-serving/knative-ingress-gateway [{"hosts":["*"],"port":{"name":"https","number":443,"protocol":"HTTPS"},"tls":{"credentialName":"wildcard-certs","mode":"SIMPLE"}}] knative-serving/knative-local-gateway [{"hosts":["*"],"port":{"name":"http","number":8081,"protocol":"HTTP"}}]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个命令不应该返回绑定端口
的网关:443和hosts: ["*"],除了作为另一个 Service Mesh 实例一部分的knative-serving和的网关。Gateways注意Serverless 是 Serverless 一部分的网格必须不同,最好只为 Serverless 工作负载保留。这是因为额外的配置(如
Gateways)可能会影响 Serverless 网关knative-local-gateway和knative-ingress-gateway。Red Hat OpenShift Service Mesh 只允许一个网关在同一端口(端口:443 )上声明通配符主机绑定()。如果另一个网关已绑定此配置,则必须为 Serverless 工作负载创建一个单独的网格。hosts:["*"]
1.1.3.2. 安装和配置 Service Mesh 复制链接链接已复制到粘贴板!
要将 Serverless 与 Service Mesh 集成,您需要使用特定的配置安装 Service Mesh。
流程
使用以下配置在
istio-system命名空间中创建ServiceMeshControlPlane资源:重要如果您有一个现有的
ServiceMeshControlPlane对象,请确保应用了相同的配置。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将您要与 Service Mesh 集成的命名空间作为成员添加到
ServiceMeshMemberRoll对象中:servicemesh-member-roll.yaml配置文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 要与 Service Mesh 集成的命名空间列表。
重要此命名空间列表必须包含
knative-serving和knative-eventing命名空间。应用
ServiceMeshMemberRoll资源:oc apply -f servicemesh-member-roll.yaml
$ oc apply -f servicemesh-member-roll.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建必要的网关,以便 Service Mesh 可以接受流量。以下示例使用带有
ISTIO_MUTUAL模式(mTLS)的knative-local-gateway对象:istio-knative-gateways.yaml配置文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 应用
Gateway资源:oc apply -f istio-knative-gateways.yaml
$ oc apply -f istio-knative-gateways.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.1.3.3. 安装和配置 Serverless 复制链接链接已复制到粘贴板!
安装 Service Mesh 后,您需要使用特定的配置安装 Serverless。
流程
使用以下
KnativeServing自定义资源安装 Knative Serving,该资源启用 Istio 集成:knative-serving-config.yaml配置文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 应用
KnativeServing资源:oc apply -f knative-serving-config.yaml
$ oc apply -f knative-serving-config.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下 KnativeEventing 对象安装
Knative Eventing,它启用了 Istio 集成:knative-eventing-config.yaml配置文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
spec.config.features.istio启用 Eventing Istio 控制器为每个InMemoryChannel或KafkaChannel服务创建一个DestinationRule。 -
spec.workload为 Knative Eventing pod 启用 sidecar 注入。
-
应用
KnativeEventing资源:oc apply -f knative-eventing-config.yaml
$ oc apply -f knative-eventing-config.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下 KnativeKafka 自定义资源安装
Knative Kafka,该资源启用 Istio 集成:knative-kafka-config.yaml配置文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 应用
KnativeEventing对象:oc apply -f knative-kafka-config.yaml
$ oc apply -f knative-kafka-config.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 安装
ServiceEntry以告知 Service MeshKnativeKafka组件和 Apache Kafka 集群之间的通信:kafka-cluster-serviceentry.yaml配置文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意spec.ports中列出的端口是 examplecategories 端口。实际值取决于 Apache Kafka 集群的配置方式。应用
ServiceEntry资源:oc apply -f kafka-cluster-serviceentry.yaml
$ oc apply -f kafka-cluster-serviceentry.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.1.3.4. 验证集成 复制链接链接已复制到粘贴板!
安装启用了 Istio 的 Service Mesh 和 Serverless 后,您可以验证集成是否正常工作。
流程
创建一个启用了 sidecar 注入并使用 pass-through 路由的 Knative Service:
knative-service.yaml配置文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要始终将来自此示例中的注解添加到所有 Knative Service 中,以使它们与 Service Mesh 一起工作。
应用
Service资源:oc apply -f knative-service.yaml
$ oc apply -f knative-service.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 CA 信任的安全连接访问无服务器应用程序:
curl --cacert root.crt <service_url>
$ curl --cacert root.crt <service_url>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,运行:
示例命令
curl --cacert root.crt https://hello-default.apps.openshift.example.com
$ curl --cacert root.crt https://hello-default.apps.openshift.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Hello Openshift!
Hello Openshift!Copy to Clipboard Copied! Toggle word wrap Toggle overflow
如果使用 Mutual Transport Layer Security (mTLS)启用 Service Mesh,则 Knative Serving 和 Knative Eventing 的指标会被默认禁用,因为 Service Mesh 会阻止 Prometheus 提取指标。在使用 Service Mesh 和 mTLS 时,您可以启用 Knative Serving 和 Knative Eventing 指标。
先决条件
您有以下权限之一来访问集群:
- OpenShift Container Platform 上的集群管理员权限
- Red Hat OpenShift Service on AWS 上的集群管理员权限
- OpenShift Dedicated 上的专用管理员权限
-
已安装 OpenShift CLI(
oc)。 - 您可以使用适当的角色和权限访问项目,以创建应用程序和其他工作负载。
- 在集群中安装了 OpenShift Serverless Operator、Knative Serving 和 Knative Eventing。
- 已安装了启用了 mTLS 功能的 Red Hat OpenShift Service Mesh。
流程
在 Knative Serving 自定义资源 (CR) 的
observabilityspec 中将prometheus指定为metrics.backend-destination:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此步骤可防止默认禁用指标。
注意当使用
manageNetworkPolicy: false配置ServiceMeshControlPlane时,您必须使用 KnativeEventing 上的注解来确保正确发送事件。相同的机制用于 Knative Eventing。要为 Knative Eventing 启用指标,您需要在 Knative Eventing 自定义资源(CR)的
observabilityspec 中将prometheus指定为metrics.backend-destination,如下所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 修改并重新应用
istio-system命名空间中的默认 Service Mesh control plane,使其包含以下 spec:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.1.5. 禁用默认网络策略 复制链接链接已复制到粘贴板!
OpenShift Serverless Operator 默认生成网络策略。要禁用默认网络策略生成,您可以在 KnativeEventing 和 KnativeServing 自定义资源(CR)中添加 serverless.openshift.io/disable-istio-net-policies-generation 注解。
OpenShift Serverless Operator 默认生成所需的网络策略。但是,对 Service Mesh 3.x 的支持当前还只是一个技术预览,但这些默认网络策略还没有考虑 Service Mesh 3.x 的网络要求。因此,在应用这些策略时,新创建的 Knative Services (ksvc)可能无法进入 Ready 状态。
要避免这个问题,您必须在 KnativeServing 和 KnativeEventing 自定义资源中将 serverless.openshift.io/disable-istio-net-policies-generation 注解设置为 true 来禁用 Istio 相关的网络策略。
先决条件
您有以下权限之一来访问集群:
- OpenShift Container Platform 上的集群管理员权限
- Red Hat OpenShift Service on AWS 上的集群管理员权限
- OpenShift Dedicated 上的专用管理员权限
-
已安装 OpenShift CLI(
oc)。 - 您可以使用适当的角色和权限访问项目,以创建应用程序和其他工作负载。
- 在集群中安装了 OpenShift Serverless Operator、Knative Serving 和 Knative Eventing。
- 已安装了启用了 mTLS 功能的 Red Hat OpenShift Service Mesh。
流程
在 Knative 自定义资源中添加
serverless.openshift.io/disable-istio-net-policies-generation: "true"注解。注意OpenShift Serverless Operator 默认生成所需的网络策略。当使用
manageNetworkPolicy: false配置ServiceMeshControlPlane时,您必须禁用默认网络策略生成,以确保正确事件交付。要禁用默认网络策略生成,您可以在KnativeEventing和KnativeServing自定义资源(CR)中添加serverless.openshift.io/disable-istio-net-policies-generation注解。运行以下命令来注解
KnativeEventingCR:oc edit KnativeEventing -n knative-eventing
$ oc edit KnativeEventing -n knative-eventingCopy to Clipboard Copied! Toggle word wrap Toggle overflow KnativeEventingCR 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来注解
KnativeServingCR:oc edit KnativeServing -n knative-serving
$ oc edit KnativeServing -n knative-servingCopy to Clipboard Copied! Toggle word wrap Toggle overflow KnativeServingCR 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.1.6. 为 Service Mesh 使用 secret 过滤来提高 net-istio 内存用量 复制链接链接已复制到粘贴板!
默认情况下,Kubernetes client-go 库的 informers 实施会获取特定类型的所有资源。当有很多资源可用时,这可能会导致大量资源出现大量开销,这可能会导致 Knative net-istio 入口控制器因为内存泄漏而在大型集群中失败。但是,Knative net-istio ingress 控制器提供了一个过滤机制,它可让控制器只获取 Knative 相关的 secret。
OpenShift Serverless Operator 端默认启用 secret 过滤。默认向 net-istio 控制器 pod 添加环境变量 ENABLE_SECRET_INFORMER_FILTERING_BY_CERT_UID=true。
如果启用 secret 过滤,您必须将所有 secret 标记为 networking.internal.knative.dev/certificate-uid: "<id> "。否则,Knative Serving 不会检测到它们,这会导致失败。您必须标记新的和现有的 secret。
先决条件
- 在 OpenShift Container Platform 上具有集群管理员权限,或者具有 Red Hat OpenShift Service on AWS 或 OpenShift Dedicated 的集群或专用管理员权限。
- 您已创建了一个项目,或者具有适当的角色和权限访问项目,以创建应用程序和其他工作负载。
- 安装 Red Hat OpenShift Service Mesh。带有 Service Mesh 的 OpenShift Serverless 仅支持与 Red Hat OpenShift Service Mesh 2.0.5 或更高版本搭配使用。
- 安装 OpenShift Serverless Operator 和 Knative Serving。
-
安装 OpenShift CLI (
oc) 。
您可以使用 KnativeServing 自定义资源(CR)中的 workload 字段设置为 false 来禁用 secret 过滤,将 ENABLE_SECRET_INFORMER_FILTERING_BY_CERT_UID 变量设置为 false。
KnativeServing CR 示例