Menu Close
6.8. 将 Service Mesh 与 OpenShift Serverless 集成
将 Service Mesh 与 OpenShift Serverless 一起使用可让开发人员配置额外的网络和路由选项。
OpenShift Serverless Operator 提供 Kourier 作为 Knative 的默认入口。但是,无论是否启用了 Kourier,您都可以在 OpenShift Serverless 中使用 Service Mesh。当集成中禁用了 Kourier 时,您可以配置 Kourier ingress 不支持的额外联网和路由选项。
OpenShift Serverless 只支持使用本指南中明确记录的 Red Hat OpenShift Service Mesh 功能,且不支持其他未记录的功能。
6.8.1. 将 Service Mesh 与 OpenShift Serverless 原生集成
将 Service Mesh 与 OpenShift Serverless 原生集成(不带 Kourier)可让您使用默认 Kourier ingress 不支持的额外网络和路由选项,如 mTLS 功能。
以下流程中的示例使用域 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 文档。
6.8.1.1. 创建证书来加密传入的外部流量
默认情况下,Service Mesh mTLS 功能只会保护 Service Mesh 本身内部的流量,在 ingress 网关和带有 sidecar 的独立 pod 间的安全。要在流向 OpenShift Container Platform 集群时对流量进行加密,您必须先生成证书,然后才能启用 OpenShift Serverless 和 Service Mesh 集成。
流程
创建为 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 -nodes -newkey rsa:2048 \ -subj "/CN=*.apps.openshift.example.com/O=Example Inc." \ -keyout wildcard.key \ -out wildcard.csr
为通配符证书签名:
$ openssl x509 -req -days 365 -set_serial 0 \ -CA root.crt \ -CAkey root.key \ -in wildcard.csr \ -out wildcard.crt
使用通配符证书创建 secret:
$ oc create -n istio-system secret tls wildcard-certs \ --key=wildcard.key \ --cert=wildcard.crt
此证书由 OpenShift Serverless 与 Service Mesh 集成时创建的网关获取,以便入口网关使用此证书提供流量。
6.8.1.2. 将 Service Mesh 与 OpenShift Serverless 集成
您可以通过完成以下步骤,在不使用 Kourier 的情况下将 Service Mesh 与 OpenShift Serverless 集成。
先决条件
- 您已在 OpenShift Container Platform 集群中安装了 OpenShift Serverless Operator。
- 已安装 Red Hat OpenShift Service Mesh。带有 Service Mesh 的 OpenShift Serverless 仅支持与 Red Hat OpenShift Service Mesh 2.0.5 或更高版本搭配使用。
在完成以下步骤前,不要安装 Knative Serving 组件。在创建 KnativeServing
自定义资源定义 (CRD) 以将 Knative Serving 与 Service Mesh 集成时,还需要额外的步骤,这在管理指南的常规 Knative Serving 安装过程中不涉及。
流程
-
在
istio-system
命名空间中创建ServiceMeshControlPlane
对象。如果要使用 mTLS 功能,则必须为istio-system
命名空间启用此功能。 将您要与 Service Mesh 集成的命名空间作为成员添加到
ServiceMeshMemberRoll
对象中:apiVersion: maistra.io/v1 kind: ServiceMeshMemberRoll metadata: name: default namespace: istio-system spec: members: 1 - knative-serving - <namespace>
- 1
- 要与 Service Mesh 集成的命名空间列表。
重要此命名空间列表必须包含
knative-serving
命名空间。应用
ServiceMeshMemberRoll
资源:$ oc apply -f <filename>
创建必要的网关,以便 Service Mesh 可以接受流量:
使用 HTTP 的
knative-local-gateway
对象示例apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: knative-ingress-gateway namespace: knative-serving spec: selector: istio: ingressgateway servers: - port: number: 443 name: https protocol: HTTPS hosts: - "*" tls: mode: SIMPLE credentialName: <wildcard_certs> 1 --- apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: knative-local-gateway namespace: knative-serving spec: selector: istio: ingressgateway servers: - port: number: 8081 name: http protocol: HTTP 2 hosts: - "*" --- apiVersion: v1 kind: Service metadata: name: knative-local-gateway namespace: istio-system labels: experimental.istio.io/disable-gateway-port-translation: "true" spec: type: ClusterIP selector: istio: ingressgateway ports: - name: http2 port: 80 targetPort: 8081
使用 HTTPS 的
knative-local-gateway
对象示例apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: knative-local-gateway namespace: knative-serving spec: selector: istio: ingressgateway servers: - port: number: 443 name: https protocol: HTTPS hosts: - "*" tls: mode: SIMPLE credentialName: <wildcard_certs>
应用
Gateway
资源:$ oc apply -f <filename>
通过创建以下
KnativeServing
自定义资源定义 (CRD) 来安装 Knative Serving,该定义还启用了 Istio 集成:apiVersion: operator.knative.dev/v1alpha1 kind: KnativeServing metadata: name: knative-serving namespace: knative-serving spec: ingress: istio: enabled: true 1 deployments: 2 - name: activator annotations: "sidecar.istio.io/inject": "true" "sidecar.istio.io/rewriteAppHTTPProbers": "true" - name: autoscaler annotations: "sidecar.istio.io/inject": "true" "sidecar.istio.io/rewriteAppHTTPProbers": "true"
应用
KnativeServing
资源:$ oc apply -f <filename>
创建一个启用了 sidecar 注入并使用 pass-through 路由的 Knative Service:
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: <service_name> namespace: <namespace> 1 annotations: serving.knative.openshift.io/enablePassthrough: "true" 2 spec: template: metadata: annotations: sidecar.istio.io/inject: "true" 3 sidecar.istio.io/rewriteAppHTTPProbers: "true" spec: containers: - image: <image_url>
应用
Service
资源:$ oc apply -f <filename>
验证
使用 CA 信任的安全连接访问无服务器应用程序:
$ curl --cacert root.crt <service_url>
示例命令
$ curl --cacert root.crt https://hello-default.apps.openshift.example.com
输出示例
Hello Openshift!
6.8.1.3. 在使用带有 mTLS 的 Service Mesh 时启用 Knative Serving 指标
如果启用了 mTLS 的 Service Mesh,则默认禁用 Knative Serving 的指标,因为 Service Mesh 会防止 Prometheus 提取指标。本节介绍在使用 Service Mesh 和 mTLS 时如何启用 Knative Serving 指标。
先决条件
- 您已在 OpenShift Container Platform 集群中安装了 OpenShift Serverless Operator。
- 已安装了启用了 mTLS 功能的 Red Hat OpenShift Service Mesh。
- 已安装 Knative Serving。
流程
在 Knative Serving 自定义资源 (CR) 的
observability
spec 中将prometheus
指定为metrics.backend-destination
:apiVersion: operator.knative.dev/v1beta1 kind: KnativeServing metadata: name: knative-serving spec: config: observability: metrics.backend-destination: "prometheus"
此步骤可防止默认禁用指标。
应用以下网络策略来允许来自 Prometheus 命名空间中的流量:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-openshift-monitoring-ns namespace: knative-serving spec: ingress: - from: - namespaceSelector: matchLabels: name: "openshift-monitoring" podSelector: {}
修改并重新应用
istio-system
命名空间中的默认 Service Mesh control plane,使其包含以下 spec:spec: proxy: networking: trafficControl: inbound: excludedPorts: - 8444