$ oc get istiorevisions
要在服务网格中使用 Istio 的功能,每个 Pod 都需要一个由 Istio 控制平面配置和管理的 Sidecar 代理。
Sidecar 注射是使用命名空间或 Pod 级别的标签启用的。这些标签还指示管理代理的特定控制平面。当您将有效的注入标签应用到部署中定义的 Pod 模板时,该部署创建的任何新 Pod 都将自动接收 Sidecar。类似地,在命名空间级别应用 Pod 注入标签可确保该命名空间中的任何新 Pod 都包含 Sidecar。
|
注入通过准入控制器在 Pod 创建时发生,因此更改会显示在各个 Pod 上,而不是部署资源上。要确认 Sidecar 注入,请使用 |
启用 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
当服务网格的IstioRevision名称为default时,可以在命名空间或 Pod 上使用以下标签来启用 Sidecar 注射
| 资源 | 标签 | 启用值 | 禁用值 |
|---|---|---|---|
命名空间 |
|
|
|
Pod |
|
|
|
|
您还可以通过在命名空间或 Pod 中设置 |
当IstioRevision名称不是default时,请使用带有istio.io/rev标签的特定IstioRevision名称将 Pod 映射到所需的控制平面并启用 Sidecar 注射。要启用注入,请在命名空间或 Pod 中设置istio.io/rev: default标签,因为不需要同时将其添加到两者。
例如,使用上面的版本,以下标签将启用 Sidecar 注射
| 资源 | 启用标签 | 禁用标签 |
|---|---|---|
命名空间 |
|
|
Pod |
|
|
|
当同时应用 |
为了演示配置 Sidecar 注入的不同方法,以下过程使用 Bookinfo 应用程序。
您已安装 Red Hat OpenShift Service Mesh Operator,创建了Istio资源,并且 Operator 已部署 Istio。
您已创建IstioCNI资源,并且 Operator 已部署必要的IstioCNI Pod。
您已创建将成为网格一部分的命名空间,并且 Istio 控制平面可以发现它们。
可选:您已部署要包含在服务网格中的工作负载。在以下示例中,Bookinfo 已部署到bookinfo命名空间,但未配置 sidecar 注射(步骤 5)。
在此示例中,命名空间内的所有工作负载都会收到 sidecar 代理注入,当命名空间中的大部分工作负载应包含在服务网格中时,这是最佳方法。
使用以下命令验证 Istio 控制平面的版本名称
$ oc get istiorevisions
您应该会看到类似于以下示例的输出
NAME TYPE READY STATUS IN USE VERSION AGE
default Local True Healthy False v1.23.0 4m57s
由于版本名称为 default,您可以使用默认注入标签,无需引用确切的版本名称。
使用以下命令验证已在目标命名空间中运行的工作负载是否显示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
要将注入标签应用于bookinfo命名空间,请在 CLI 上运行以下命令
$ oc label namespace bookinfo istio-injection=enabled
namespace/bookinfo labeled
为了确保应用 sidecar 注射,请重新部署bookinfo命名空间中现有的工作负载。使用以下命令执行所有工作负载的滚动更新
$ oc -n bookinfo rollout restart deployments
通过检查新 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 应用程序要求所有工作负载都是服务网格的一部分才能正常运行。 |
在编辑器中打开应用程序的Deployment资源。在本例中,排除ratings-v1服务。
修改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'
|
将标签添加到 |
更新部署会触发滚动更新,从而创建具有更新 Pod 的新 ReplicaSet。
通过运行以下命令验证更新后的 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
这种方法允许您包含单个工作负载以进行 sidecar 注射,而不是将其应用于命名空间内的所有工作负载,这使其成为仅需少量工作负载成为服务网格一部分的场景的理想选择。此示例还演示了如何使用 sidecar 注射的版本标签,其中Istio资源的名称为my-mesh。当同一集群中存在多个 Istio 控制平面或在基于版本的控制平面升级期间,需要唯一的Istio资源名称。
通过运行以下命令验证 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 注射。
通过运行以下命令验证正在运行的工作负载是否显示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
在编辑器中打开应用程序的Deployment资源。在本例中,更新ratings-v1服务。
更新Deployment的spec.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
|
将标签添加到 |
更新部署会触发滚动更新,从而创建具有更新 Pod 的新 ReplicaSet。
通过运行以下命令验证只有 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
对您希望包含在服务网格中的其他工作负载重复此操作。