使用 Cloud Service Mesh 注入 Sidecar 代理

本文档介绍了如何使用 Cloud Service Mesh 配置边车代理注入,以增强网络安全性、可靠性和可观测性。这些功能从应用的主容器中抽象出来,并在作为同一 pod 中单独的容器提供的常见进程外代理 (Sidecar) 中实现。这可提供 Cloud Service Mesh 的功能,而无需重新设计生产应用以参与服务网格。

当 Cloud Service Mesh 检测到为工作负载 pod 配置的命名空间标签时,便会自动进行边车代理注入(自动注入)。该代理会拦截工作负载的所有入站和出站流量,并与 Cloud Service Mesh 通信。

启用自动 Sidecar 注入

虽然可以手动更新 pod 的 Kubernetes 配置,但注入 Sidecar 代理的推荐方法是使用基于网络钩子的自动 Sidecar 注入器。

如需启用自动注入功能,请使用默认注入标签(如果设置了默认标记)或名称空间的修订版本标签为您的命名空间添加标签。您添加的标签还取决于您是部署了代管式 Cloud Service Mesh(使用 Fleet APIasmcli),还是安装了集群内控制平面。Sidecar 注入器 Webhook 会使用标签将注入的 Sidecar 与特定控制平面修订版本相关联。

如需启用自动注入,请运行以下命令:

集群内

  1. 使用以下命令查找 istiod 的修订版本标签:

    kubectl -n istio-system get pods -l app=istiod --show-labels
    

    输出类似于以下内容:

    NAME                                READY   STATUS    RESTARTS   AGE   LABELS
    istiod-asm-1233-2-5788d57586-bljj4   1/1     Running   0          23h   app=istiod,istio.io/rev=asm-1233-2,istio=istiod,pod-template-hash=5788d57586
    istiod-asm-1233-2-5788d57586-vsklm   1/1     Running   1          23h   app=istiod,istio.io/rev=asm-1233-2,istio=istiod,pod-template-hash=5788d57586

    在输出中的 LABELS 列下,记下 istiod 修订版本标签的值,该值位于前缀 istio.io/rev= 之后。在此示例中,该值为 asm-1233-2

  2. 将修订版本标签应用于命名空间,并移除 istio-injection 标签(如果存在)。在以下命令中,NAMESPACE 是您要启用自动注入的命名空间的名称,REVISION 是您在上一步中记下的修订版本标签。

    kubectl label namespace NAMESPACE  istio-injection- istio.io/rev=REVISION --overwrite
    

    您可以忽略输出中的 "istio-injection not found" 消息。这意味着命名空间之前没有 istio-injection 标签,对于 Cloud Service Mesh 的新安装或新部署,这是预期现象。如果命名空间同时具有 istio-injection 和修订版本标签,自动注入行为未定义,因此 Cloud Service Mesh 文档中的所有 kubectl label 命令都会明确确保仅设置一个标签。

  3. 按照下一部分中的步骤重启受影响的 pod。

代管式服务网格

  1. 使用以下命令查找可用的发布渠道:

    kubectl -n istio-system get controlplanerevision
    

    输出类似于以下内容:

    NAME                AGE
    asm-managed         6d7h
    

    在输出中,选择 NAME 列下的值,此值是与 Cloud Service Mesh 版本可用的发布版本对应的 REVISION 标签。将此标签应用于您的命名空间,并移除 istio-injection 标签(如果它存在)。在以下命令中,将 REVISION 替换为您先前记录的修订版本标签,并将 NAMESPACE 替换为您要启用自动注入的命名空间的名称:

    kubectl label namespace NAMESPACE  istio-injection- istio.io/rev=REVISION --overwrite
    

    您可以忽略输出中的 "istio-injection not found" 消息。这意味着命名空间之前没有 istio-injection 标签,对于 Cloud Service Mesh 的新安装或新部署,这是预期现象。如果命名空间同时具有 istio-injection 和修订版本标签,自动注入行为未定义,因此 Cloud Service Mesh 文档中的所有 kubectl label 命令都会明确确保仅设置一个标签。

  2. 按照下一部分中的步骤重启受影响的 pod。

  3. 如果您还部署了可选的 Google 管理的数据平面,请按如下方式为 demo 命名空间添加注释:

    kubectl annotate --overwrite namespace YOUR_NAMESPACE \
    mesh.cloud.google.com/proxy='{"managed":"true"}'
    

重启 pod 以更新 Sidecar 代理

借助自动 Sidecar 注入,您可以通过 pod 重启来更新现有 pod 的 Sidecar:

如何重启 pod 取决于 pod 是否在 Deployment 中创建。

  1. 如果您使用了 Deployment,请重启 Deployment,这会重启所有安装了 Sidecar 的 pod:

    kubectl rollout restart deployment -n YOUR_NAMESPACE

    如果您未使用 Deployment,请删除 Pod,系统会自动重新创建 Pod 及其 Sidecar:

    kubectl delete pod -n YOUR_NAMESPACE --all
  2. 检查命名空间中的所有 Pod 是否都已注入 Sidecar:

    kubectl get pod -n YOUR_NAMESPACE

    在上一个命令的以下示例输出中,注意 READY 列表示每个工作负载均有两个容器:主容器和 Sidecar 代理的容器。

    NAME                    READY   STATUS    RESTARTS   AGE
    YOUR_WORKLOAD           2/2     Running   0          20s
    ...
    

后续步骤

详细了解以下内容: