×

关于 Sidecar 注射

Sidecar 注射是使用命名空间或 Pod 级别的标签启用的。这些标签还指示管理代理的特定控制平面。当您将有效的注入标签应用到部署中定义的 Pod 模板时,该部署创建的任何新 Pod 都将自动接收 Sidecar。类似地,在命名空间级别应用 Pod 注入标签可确保该命名空间中的任何新 Pod 都包含 Sidecar。

注入通过准入控制器在 Pod 创建时发生,因此更改会显示在各个 Pod 上,而不是部署资源上。要确认 Sidecar 注入,请使用oc describe直接检查 Pod 详细信息,您可以在其中看到注入的 Istio 代理容器。

识别版本名称

启用 Sidecar 注射所需的标签由特定控制平面实例(称为版本)确定。每个版本都由一个IstioRevision资源管理,该资源由Istio资源自动创建和管理,因此通常不需要手动创建或修改IstioRevision资源。

IstioRevision的命名取决于Istio资源中的spec.updateStrategy.type设置。如果设置为InPlace,则版本共享Istio资源名称。如果设置为RevisionBased,则版本名称遵循格式<Istio 资源名称>-v<版本>。通常,每个Istio资源对应于单个IstioRevision。但是,在基于版本的升级期间,可能存在多个IstioRevision资源,每个资源代表一个不同的控制平面实例。

要查看可用的版本名称,请使用以下命令

$ oc get istiorevisions

您应该会看到类似于以下示例的输出

示例输出
NAME              READY   STATUS    IN USE   VERSION   AGE
my-mesh-v1-23-0   True    Healthy   False    v1.23.0   114s

启用带有默认版本的 Sidecar 注射

当服务网格的IstioRevision名称为default时,可以在命名空间或 Pod 上使用以下标签来启用 Sidecar 注射

资源 标签 启用值 禁用值

命名空间

istio-injection

enabled

disabled

Pod

sidecar.istio.io/inject

true

false

您还可以通过在命名空间或 Pod 中设置istio.io/rev: default标签来启用注入。

启用带有其他版本的 Sidecar 注射

IstioRevision名称不是default时,请使用带有istio.io/rev标签的特定IstioRevision名称将 Pod 映射到所需的控制平面并启用 Sidecar 注射。要启用注入,请在命名空间或 Pod 中设置istio.io/rev: default标签,因为不需要同时将其添加到两者。

例如,使用上面的版本,以下标签将启用 Sidecar 注射

资源 启用标签 禁用标签

命名空间

istio.io/rev=my-mesh-v1-23-0

istio-injection=disabled

Pod

istio.io/rev=my-mesh-v1-23-0

sidecar.istio.io/inject="false"

当同时应用istio-injectionistio.io/rev标签时,istio-injection标签优先,并将命名空间视为默认版本的一部分。

启用 Sidecar 注射

为了演示配置 Sidecar 注入的不同方法,以下过程使用 Bookinfo 应用程序。

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

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

  • 您已创建将成为网格一部分的命名空间,并且 Istio 控制平面可以发现它们。

  • 可选:您已部署要包含在服务网格中的工作负载。在以下示例中,Bookinfo 已部署到bookinfo命名空间,但未配置 sidecar 注射(步骤 5)。

使用命名空间标签启用 sidecar 注射

在此示例中,命名空间内的所有工作负载都会收到 sidecar 代理注入,当命名空间中的大部分工作负载应包含在服务网格中时,这是最佳方法。

步骤
  1. 使用以下命令验证 Istio 控制平面的版本名称

    $ oc get istiorevisions

    您应该会看到类似于以下示例的输出

    示例输出
    NAME      TYPE    READY   STATUS    IN USE   VERSION   AGE
    default   Local   True    Healthy   False    v1.23.0   4m57s

    由于版本名称为 default,您可以使用默认注入标签,无需引用确切的版本名称。

  2. 使用以下命令验证已在目标命名空间中运行的工作负载是否显示1/1 个容器为就绪状态。这确认了 Pod 正在运行且没有 sidecar。

    $ oc get pods -n bookinfo

    您应该会看到类似于以下示例的输出

    示例输出
    NAME                             READY   STATUS    RESTARTS   AGE
    details-v1-65cfcf56f9-gm6v7      1/1     Running   0          4m55s
    productpage-v1-d5789fdfb-8x6bk   1/1     Running   0          4m53s
    ratings-v1-7c9bd4b87f-6v7hg      1/1     Running   0          4m55s
    reviews-v1-6584ddcf65-6wqtw      1/1     Running   0          4m54s
    reviews-v2-6f85cb9b7c-w9l8s      1/1     Running   0          4m54s
    reviews-v3-6f5b775685-mg5n6      1/1     Running   0          4m54s
  3. 要将注入标签应用于bookinfo命名空间,请在 CLI 上运行以下命令

    $ oc label namespace bookinfo istio-injection=enabled
    namespace/bookinfo labeled
  4. 为了确保应用 sidecar 注射,请重新部署bookinfo命名空间中现有的工作负载。使用以下命令执行所有工作负载的滚动更新

    $ oc -n bookinfo rollout restart deployments
验证
  1. 通过检查新 Pod 是否显示2/2 个容器为就绪状态来验证滚动更新,这确认了 sidecar 注射成功,请运行以下命令

    $ oc get pods -n bookinfo

    您应该会看到类似于以下示例的输出

    示例输出
    NAME                              READY   STATUS    RESTARTS   AGE
    details-v1-7745f84ff-bpf8f        2/2     Running   0          55s
    productpage-v1-54f48db985-gd5q9   2/2     Running   0          55s
    ratings-v1-5d645c985f-xsw7p       2/2     Running   0          55s
    reviews-v1-bd5f54b8c-zns4v        2/2     Running   0          55s
    reviews-v2-5d7b9dbf97-wbpjr       2/2     Running   0          55s
    reviews-v3-5fccc48c8c-bjktn       2/2     Running   0          55sz

将工作负载从服务网格中排除

您可以将特定工作负载从已为所有工作负载启用注入的命名空间中排除 sidecar 注射。

此示例仅用于演示目的。Bookinfo 应用程序要求所有工作负载都是服务网格的一部分才能正常运行。

步骤
  1. 在编辑器中打开应用程序的Deployment资源。在本例中,排除ratings-v1服务。

  2. 修改Deployment资源的spec.template.metadata.labels部分,以包含标签sidecar.istio.io/inject: false以禁用 sidecar 注射。

    kind: Deployment
    apiVersion: apps/v1
    metadata:
    name: ratings-v1
    namespace: bookinfo
    labels:
      app: ratings
      version: v1
    spec:
      template:
        metadata:
          labels:
            sidecar.istio.io/inject: 'false'

    将标签添加到Deployment的顶级labels部分不会影响 sidecar 注射。

    更新部署会触发滚动更新,从而创建具有更新 Pod 的新 ReplicaSet。

验证
  1. 通过运行以下命令验证更新后的 Pod 是否不包含 sidecar 容器,并显示1/1 个容器为运行中状态

    $ oc get pods -n bookinfo

    您应该会看到类似于以下示例的输出

    示例输出
    NAME                              READY   STATUS    RESTARTS   AGE
    details-v1-6bc7b69776-7f6wz       2/2     Running   0          29m
    productpage-v1-54f48db985-gd5q9   2/2     Running   0          29m
    ratings-v1-5d645c985f-xsw7p       1/1     Running   0          7s
    reviews-v1-bd5f54b8c-zns4v        2/2     Running   0          29m
    reviews-v2-5d7b9dbf97-wbpjr       2/2     Running   0          29m
    reviews-v3-5fccc48c8c-bjktn       2/2     Running   0          29m

使用 Pod 标签启用 sidecar 注射

这种方法允许您包含单个工作负载以进行 sidecar 注射,而不是将其应用于命名空间内的所有工作负载,这使其成为仅需少量工作负载成为服务网格一部分的场景的理想选择。此示例还演示了如何使用 sidecar 注射的版本标签,其中Istio资源的名称为my-mesh。当同一集群中存在多个 Istio 控制平面或在基于版本的控制平面升级期间,需要唯一的Istio资源名称。

步骤
  1. 通过运行以下命令验证 Istio 控制平面的版本名称

    $ oc get istiorevisions

    您应该会看到类似于以下示例的输出

    示例输出
    NAME      TYPE    READY   STATUS    IN USE   VERSION   AGE
    my-mesh   Local   True    Healthy   False    v1.23.0   47s

    由于版本名称为my-mesh,因此使用版本标签istio.io/rev=my-mesh启用 sidecar 注射。

  2. 通过运行以下命令验证正在运行的工作负载是否显示1/1 个容器为就绪状态,这表明 Pod 正在运行且没有 sidecar

    $ oc get pods -n bookinfo

    您应该会看到类似于以下示例的输出

    示例输出
    NAME                             READY   STATUS    RESTARTS   AGE
    details-v1-65cfcf56f9-gm6v7      1/1     Running   0          4m55s
    productpage-v1-d5789fdfb-8x6bk   1/1     Running   0          4m53s
    ratings-v1-7c9bd4b87f-6v7hg      1/1     Running   0          4m55s
    reviews-v1-6584ddcf65-6wqtw      1/1     Running   0          4m54s
    reviews-v2-6f85cb9b7c-w9l8s      1/1     Running   0          4m54s
    reviews-v3-6f5b775685-mg5n6      1/1     Running   0          4m54s
  3. 在编辑器中打开应用程序的Deployment资源。在本例中,更新ratings-v1服务。

  4. 更新Deploymentspec.template.metadata.labels部分,以包含适当的 Pod 注射或版本标签。在本例中,为istio.io/rev: my-mesh

    kind: Deployment
    apiVersion: apps/v1
    metadata:
    name: ratings-v1
    namespace: bookinfo
    labels:
      app: ratings
      version: v1
    spec:
      template:
        metadata:
          labels:
            istio.io/rev: my-mesh

    将标签添加到Deployment的顶级labels部分不会影响 sidecar 注射。

    更新部署会触发滚动更新,从而创建具有更新 Pod 的新 ReplicaSet。

验证
  1. 通过运行以下命令验证只有 ratings-v1 Pod 现在显示2/2 个容器就绪,这表明 sidecar 已成功注入

    $ oc get pods -n bookinfo

    您应该会看到类似于以下示例的输出

    示例输出
    NAME                              READY   STATUS    RESTARTS   AGE
    details-v1-559cd49f6c-b89hw       1/1     Running   0          42m
    productpage-v1-5f48cdcb85-8ppz5   1/1     Running   0          42m
    ratings-v1-848bf79888-krdch       2/2     Running   0          9s
    reviews-v1-6b7444ffbd-7m5wp       1/1     Running   0          42m
    reviews-v2-67876d7b7-9nmw5        1/1     Running   0          42m
    reviews-v3-84b55b667c-x5t8s       1/1     Running   0          42m
  2. 对您希望包含在服务网格中的其他工作负载重复此操作。