×

关于使用 Red Hat OpenShift Service Mesh 运算符部署 Istio

要使用 Red Hat OpenShift Service Mesh 运算符部署 Istio,必须创建一个 `Istio` 资源。然后,运算符创建一个 `IstioRevision` 资源,该资源表示 Istio 控制平面的一个版本。根据 `IstioRevision` 资源,运算符部署 Istio 控制平面,其中包括 `istiod` `Deployment` 资源和其他资源。

根据 `Istio` 资源中定义的更新策略,Red Hat OpenShift Service Mesh 运算符可能会创建 `IstioRevision` 资源的其他实例。

关于更新策略

更新策略会影响更新过程的执行方式。对于每个网格,您选择两种策略之一

  • 就地

  • 基于版本

默认策略为 `就地` 策略。有关更多信息,请参阅位于“更新 OpenShift Service Mesh”中的以下文档

  • “关于就地策略”

  • “关于基于版本的策略”

安装 Service Mesh 运算符

先决条件

您已在 OpenShift Container Platform 4.14 或更高版本上部署集群。

您已以具有 cluster-admin 角色的用户身份登录到 OpenShift Container Platform Web 控制台。

步骤
  1. 在 OpenShift Container Platform Web 控制台中,导航到**运算符**→**OperatorHub**页面。

  2. 搜索 Red Hat OpenShift Service Mesh 3 运算符。

  3. 找到 Service Mesh 运算符,然后单击以选择它。

  4. 当出现讨论社区运算符的提示时,单击**继续**。

  5. 验证 Service Mesh 运算符的版本为 3.0,然后单击**安装**。

  6. 使用显示的默认安装设置,然后单击**安装**以继续。

  7. 单击**运算符**→**已安装的运算符**以验证 Service Mesh 运算符是否已安装。“已成功”应出现在**状态**列中。

关于 Service Mesh 自定义资源定义

安装 Red Hat OpenShift Service Mesh 运算符还会安装管理员可用于为 Service Mesh 安装配置 Istio 的自定义资源定义 (CRD)。运算符生命周期管理器 (OLM) 安装两类 CRD:Sail 运算符 CRD 和 Istio CRD。

Sail Operator CRD 定义了用于安装和维护运行服务网格所需的 Istio 组件的自定义资源。这些自定义资源属于 `sailoperator.io` API 组,包括 `Istio`、`IstioRevision`、`IstioCNI` 和 `ZTunnel` 资源种类。有关如何配置这些资源的更多信息,请参阅 `sailoperator.io` API 参考 文档。

Istio CRD 与网格配置和服务管理相关。这些 CRD 在多个 `istio.io` API 组(例如 `networking.istio.io` 和 `security.istio.io`)中定义自定义资源。CRD 还包括各种资源种类,例如 `AuthorizationPolicy`、`DestinationRule` 和 `VirtualService`,管理员可以使用这些资源来配置服务网格。

关于 Istio 部署

要部署 Istio,您必须创建两个资源:`Istio` 和 `IstioCNI`。`Istio` 资源部署并配置 Istio 控制平面。`IstioCNI` 资源部署并配置 Istio 容器网络接口 (CNI) 插件。您应该在单独的项目中创建这些资源;因此,您必须在 Istio 部署过程中创建两个项目。

您可以使用 OpenShift Web 控制台或 OpenShift CLI (oc) 在您的集群中创建项目或资源。

在 OpenShift Container Platform 中,项目本质上是具有附加注释的 Kubernetes 命名空间,例如项目中可使用的用户 ID 范围。通常,OpenShift Container Platform Web 控制台使用术语“项目”,而 CLI 使用术语“命名空间”,但这两个术语基本同义。

使用 Web 控制台创建 Istio 项目

服务网格操作员将 Istio 控制平面部署到您创建的项目中。在此示例中,`istio-system` 是项目的名称。

先决条件
  • 必须安装 Red Hat OpenShift 服务网格操作员。

  • 您已以集群管理员身份登录到 OpenShift Container Platform Web 控制台。

步骤
  1. 在 OpenShift Container Platform Web 控制台中,单击**主页** → **项目**。

  2. 单击**创建项目**。

  3. 在提示符下,在**名称**字段中输入项目的名称。例如,`istio-system`。其他字段为 `Istio` 资源定义提供补充信息,是可选的。

  4. 单击**创建**。服务网格操作员会将 Istio 部署到您指定的项目。

使用 Web 控制台创建 Istio 资源

创建包含 Istio 部署的 YAML 配置文件的 Istio 资源。Red Hat OpenShift 服务网格操作员使用 YAML 文件中的信息来创建 Istio 控制平面的实例。

先决条件
  • 必须安装服务网格操作员。

  • 您已以集群管理员身份登录到 OpenShift Container Platform Web 控制台。

步骤
  1. 在 OpenShift Container Platform Web 控制台中,单击**操作员** → **已安装的操作员**。

  2. 在**项目**下拉菜单中选择 `istio-system`。

  3. 单击服务网格操作员。

  4. 单击**Istio**。

  5. 单击**创建 Istio**。

  6. 从**命名空间**下拉菜单中选择 `istio-system` 项目。

  7. 单击**创建**。此操作将部署 Istio 控制平面。

    当**状态**列中显示 `状态:健康` 时,表示 Istio 已成功部署。

使用 Web 控制台创建 IstioCNI 项目

服务网格操作员将 Istio CNI 插件部署到您创建的项目中。在此示例中,`istio-cni` 是项目的名称。

先决条件
  • 必须安装 Red Hat OpenShift 服务网格操作员。

  • 您已以集群管理员身份登录到 OpenShift Container Platform Web 控制台。

步骤
  1. 在 OpenShift Container Platform Web 控制台中,单击**主页** → **项目**。

  2. 单击**创建项目**。

  3. 在提示符下,您必须在**名称**字段中输入项目的名称。例如,`istio-cni`。其他字段提供补充信息,是可选的。

  4. 单击**创建**。

使用 Web 控制台创建 IstioCNI 资源

创建一个 Istio 容器网络接口 (CNI) 资源,其中包含 Istio CNI 插件的配置文件。服务网格操作员使用此资源指定的配置来部署 CNI pod。

先决条件
  • 必须安装 Red Hat OpenShift 服务网格操作员。

  • 您已以集群管理员身份登录到 OpenShift Container Platform Web 控制台。

步骤
  1. 在 OpenShift Container Platform Web 控制台中,单击**操作员** → **已安装的操作员**。

  2. 在**项目**下拉菜单中选择 `istio-cni`。

  3. 单击服务网格操作员。

  4. 单击**IstioCNI**。

  5. 单击**创建 IstioCNI**。

  6. 确保名称为 `default`。

  7. 单击**创建**。此操作将部署 Istio CNI 插件。

    当**状态**列中显示 `状态:健康` 时,表示 Istio CNI 插件已成功部署。

使用 discovery selectors 确定服务网格范围

服务网格包含满足以下条件的工作负载

  • 控制平面已发现工作负载。

  • 工作负载已注入 Envoy 代理 sidecar。

默认情况下,控制平面会发现集群中所有命名空间中的工作负载,结果如下

  • 每个代理实例都会接收所有命名空间的配置,包括未注册到网格中的工作负载。

  • 任何具有适当 pod 或命名空间注入标签的工作负载都会收到代理 sidecar。

在共享集群中,您可能希望将服务网格的范围限制为仅某些命名空间。如果多个服务网格在同一集群中运行,这种方法尤其有用。

关于 discovery selectors

使用 discovery selectors,网格管理员可以控制控制平面可以访问哪些命名空间。通过使用 Kubernetes 标签选择器,管理员可以设置控制平面可见命名空间的条件,排除任何与指定条件不匹配的命名空间。

Istiod 始终为所有命名空间打开对 OpenShift 的监控。但是,discovery selectors 在其处理的早期阶段就会忽略未选择的对象,从而最大限度地降低成本。

`discoverySelectors` 字段接受 Kubernetes 选择器的数组,这些选择器应用于命名空间上的标签。您可以为不同的用例配置每个选择器

  • 自定义标签名称和值。例如,配置所有具有标签 `istio-discovery=enabled` 的命名空间。

  • 使用基于集合的选择器和 OR 逻辑列出命名空间标签。例如,配置具有 `istio-discovery=enabled` 或 `region=us-east1` 的命名空间。

  • 包含和排除命名空间。例如,配置具有 `istio-discovery=enabled` 和标签 `app=helloworld` 的命名空间。

Discovery selectors 不是安全边界。即使您已配置 `discoverySelector` 字段,Istiod 仍然可以访问所有命名空间。

使用 discovery selectors 确定服务网格范围

如果您知道要包含在服务网格中的命名空间,请在安装期间或之后通过将所需的选择器添加到 `Istio` 资源的 `meshConfig.discoverySelectors` 部分来配置 `discoverySelectors`。例如,配置 Istio 以仅发现标记为 `istio-discovery=enabled` 的命名空间。

先决条件
  • 已安装 OpenShift 服务网格操作员。

  • 已创建 Istio CNI 资源。

步骤
  1. 为包含 Istio 控制平面的命名空间添加标签,例如,istio-system 系统命名空间。

    $ oc label namespace istio-system istio-discovery=enabled
  2. 修改Istio 控制平面资源,使其包含具有相同标签的discoverySelectors 部分。

    kind: Istio
    apiVersion: sailoperator.io/v1alpha1
    metadata:
      name: default
    spec:
      namespace: istio-system
      values:
        meshConfig:
          discoverySelectors:
            - matchLabels:
                istio-discovery: enabled
  3. 应用 Istio CR

    $ oc apply -f istio.yaml
  4. 确保所有将包含作为服务网格一部分的工作负载的命名空间都同时具有discoverySelector 标签,以及(如果需要)相应的 Istio 注射标签。

发现选择器有助于限制单个服务网格的范围,并且在您在单个集群中部署多个 Istio 控制平面时,对于限制控制平面范围至关重要。

关于 Bookinfo 应用

安装bookinfo 示例应用程序包含两个主要任务:部署应用程序和创建网关,以便应用程序可以在集群外部访问。

您可以使用bookinfo 应用程序来探索服务网格功能。使用bookinfo 应用程序,您可以轻松确认来自 Web 浏览器的请求通过网格并到达应用程序。

bookinfo 应用程序显示有关书籍的信息,类似于在线书店的单个目录条目。该应用程序显示一个页面,描述书籍,列出书籍详细信息(ISBN、页数和其他信息)和书籍评论。

bookinfo 应用程序通过网格公开,网格配置决定如何使用构成应用程序的微服务来服务请求。评论信息来自三个服务之一:reviews-v1reviews-v2reviews-v3。如果您在不定义reviews 虚拟服务的情况下部署bookinfo 应用程序,则网格使用轮询规则将请求路由到服务。

通过部署reviews 虚拟服务,您可以指定不同的行为。例如,您可以指定如果用户登录到bookinfo 应用程序,则网格将请求路由到reviews-v2 服务,并且应用程序显示带有黑色星的评论。如果用户未登录到bookinfo 应用程序,则网格将请求路由到reviews-v3 服务,并且应用程序显示带有红色星的评论。

有关更多信息,请参阅上游 Istio 文档中的Bookinfo 应用程序

部署 Bookinfo 应用程序

先决条件
  • 您已在 OpenShift Container Platform 4.15 或更高版本上部署了一个集群。

  • 您已以具有cluster-admin 角色的用户身份登录到 OpenShift Container Platform Web 控制台。

  • 您可以访问 OpenShift CLI (oc)。

  • 您已安装 Red Hat OpenShift Service Mesh Operator,创建了 Istio 资源,并且 Operator 已部署 Istio。

  • 您已创建 IstioCNI 资源,并且 Operator 已部署必要的 IstioCNI Pod。

步骤
  1. 在 OpenShift Container Platform Web 控制台中,导航到**主页** → **项目**页面。

  2. 单击**创建项目**。

  3. 在**项目名称**字段中输入bookinfo

    **显示名称**和**描述**字段提供补充信息,并非必需。

  4. 单击**创建**。

  5. 通过输入以下命令,将 Istio 发现选择器和注入标签应用于bookinfo 命名空间

    $ oc label namespace bookinfo istio-discovery=enabled istio-injection=enabled

    在此示例中,Istio 资源的名称为default。如果 Istio 资源名称不同,则必须将istio.io/rev 标签设置为 Istio 资源的名称,而不是添加istio-injection=enabled 标签。

  6. 通过输入以下命令,应用bookinfo YAML 文件来部署bookinfo 应用程序

    oc apply -f https://raw.githubusercontent.com/istio/istio/release-1.23/samples/bookinfo/platform/kube/bookinfo.yaml -n bookinfo
验证
  1. 通过运行以下命令来验证bookinfo 服务是否可用

    $ oc get services -n bookinfo
    示例输出
    NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    details       ClusterIP   172.30.137.21   <none>        9080/TCP   44s
    productpage   ClusterIP   172.30.2.246    <none>        9080/TCP   43s
    ratings       ClusterIP   172.30.33.85    <none>        9080/TCP   44s
    reviews       ClusterIP   172.30.175.88   <none>        9080/TCP   44s
  2. 通过运行以下命令来验证bookinfo Pod 是否可用

    $ oc get pods -n bookinfo
    示例输出
    NAME                             READY   STATUS    RESTARTS   AGE
    details-v1-698d88b-km2jg         2/2     Running   0          66s
    productpage-v1-675fc69cf-cvxv9   2/2     Running   0          65s
    ratings-v1-6484c4d9bb-tpx7d      2/2     Running   0          65s
    reviews-v1-5b5d6494f4-wsrwp      2/2     Running   0          65s
    reviews-v2-5b667bcbf8-4lsfd      2/2     Running   0          65s
    reviews-v3-5b9bd44f4-44hr6       2/2     Running   0          65s

    Ready 列显示2/2时,代理 sidecar 已成功注入。确认每个 Pod 的Status 列中都显示Running

  3. 通过向bookinfo 页面发送请求来验证bookinfo 应用程序是否正在运行。运行以下命令

    $ oc exec "$(oc get pod -l app=ratings -n bookinfo -o jsonpath='{.items[0].metadata.name}')" -c ratings -n bookinfo -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"

关于使用网关访问 Bookinfo 应用程序

Red Hat OpenShift Service Mesh Operator 不部署网关。网关不是控制平面的一部分。作为安全最佳实践,入口和出口网关应部署在与包含控制平面的命名空间不同的命名空间中。

您可以使用 Gateway API 或网关注入方法来部署网关。

使用 Istio 网关注入访问 Bookinfo 应用程序

网关注入使用与 Istio sidecar 注入相同的机制,从与Service 资源配对的Deployment 资源创建网关。可以使Service 资源从 OpenShift Container Platform 集群外部访问。

先决条件
  • 您已以cluster-admin 身份登录到 OpenShift Container Platform Web 控制台。

  • 必须安装 Red Hat OpenShift 服务网格操作员。

  • 必须部署 Istio 资源。

步骤
  1. 通过运行以下命令来创建istio-ingressgateway 部署和服务

    $ oc apply -n bookinfo -f ingress-gateway.yaml

    此示例使用 Istio 社区存储库中提供的示例ingress-gateway.yaml 文件

  2. 配置bookinfo 应用程序以使用新的网关。通过运行以下命令来应用网关配置

    $ oc apply -f https://raw.githubusercontent.com/istio/istio/release-1.23/samples/bookinfo/networking/bookinfo-gateway.yaml -n bookinfo

    为了使用bookinfo 应用程序配置网关注入,此示例使用必须在安装应用程序的命名空间中应用的示例网关配置文件。

  3. 使用路由将网关暴露在集群外部,方法是运行以下命令

    $ oc expose service istio-ingressgateway -n bookinfo
  4. 修改 YAML 文件以在入口流量增加时自动扩展 Pod。

    示例配置
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      labels:
        istio: ingressgateway
        release: istio
      name: ingressgatewayhpa
      namespace: bookinfo
    spec:
      maxReplicas: 5 (1)
      metrics:
      - resource:
          name: cpu
          target:
            averageUtilization: 80
            type: Utilization
        type: Resource
      minReplicas: 2
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: istio-ingressgateway
    1 此示例将最大副本数设置为5,最小副本数设置为2。当利用率达到 80% 时,它还会创建一个新的副本。
  5. 指定必须在节点上运行的 Pod 的最小数量。

    示例配置
    apiVersion: policy/v1
    kind: PodDisruptionBudget
    metadata:
      labels:
        istio: ingressgateway
        release: istio
      name: ingressgatewaypdb
      namespace: bookinfo
    spec:
      minAvailable: 1 (1)
      selector:
        matchLabels:
          istio: ingressgateway
    1 此示例确保如果 Pod 在新节点上重新启动,则会运行一个副本。
  6. 通过运行以下命令获取网关主机名和产品页面的 URL

    $ HOST=$(oc get route istio-ingressgateway -n bookinfo -o jsonpath='{.spec.host}')
  7. 通过运行以下命令验证是否可以从 Web 浏览器访问productpage

    $ echo productpage URL: http://$HOST/productpage

使用 Gateway API 访问 Bookinfo 应用程序

Kubernetes Gateway API 通过创建Gateway 资源来部署网关。在 OpenShift Container Platform 4.15 和更高版本中。如果您希望您的集群使用 Gateway API CRD,则必须启用 CRD,因为它们默认情况下是禁用的。

Red Hat 提供了对在 Red Hat OpenShift Service Mesh 中使用 Kubernetes Gateway API 的支持。Red Hat 不提供对 Kubernetes Gateway API 自定义资源定义 (CRD) 的支持。在此过程中,仅出于演示目的显示社区 Gateway API CRD 的使用。

  1. 先决条件

    • 您已以cluster-admin 身份登录到 OpenShift Container Platform Web 控制台。

    • 必须安装 Red Hat OpenShift 服务网格操作员。

    • 必须部署 Istio 资源。

步骤
  1. 启用 Gateway API CRD

    $ oc get crd gateways.gateway.networking.k8s.io &> /dev/null ||  { oc kustomize "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v1.0.0" | oc apply -f -; }
  2. 使用Gateway 资源和HTTPRoute 资源创建和配置网关

    $ oc apply -f https://raw.githubusercontent.com/istio/istio/release-1.23/samples/bookinfo/gateway-api/bookinfo-gateway.yaml -n bookinfo

    要使用 Gateway API 配置带有bookinfo应用程序的网关,此示例使用一个示例网关配置文件,该文件必须应用于安装应用程序的命名空间。

  3. 确保 Gateway API 服务已准备就绪,并已分配地址。

    $ oc wait --for=condition=programmed gtw bookinfo-gateway -n bookinfo
  4. 检索主机、端口和网关 URL。

    $ export INGRESS_HOST=$(oc get gtw bookinfo-gateway -n bookinfo -o jsonpath='{.status.addresses[0].value}')
    $ export INGRESS_PORT=$(oc get gtw bookinfo-gateway -n bookinfo -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')
    $ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
  5. 获取网关主机名和产品页面 URL。

    $ echo "http://${GATEWAY_URL}/productpage"
  6. 验证从 Web 浏览器可以访问productpage

自定义 Istio 配置

控制平面部署时创建的Istio自定义资源定义的values字段可用于使用 Istio 的Helm配置值自定义 Istio 配置。当您使用 OpenShift Container Platform Web 控制台创建此资源时,它会预先填充配置设置以启用 Istio 在 OpenShift 上运行。

步骤
  1. 点击**Operators** → **Installed Operators**。

  2. 在**Provided APIs**列中点击**Istio**。

  3. 点击**Name**列中名为defaultIstio实例。

  4. 点击**YAML**查看Istio配置并进行修改。

有关values字段的可用配置列表,请参阅Istio 的 artifacthub 图表文档