使用自动 Envoy 注入功能设置 Google Kubernetes Engine Pod 的选项

本指南为您提供有关自动 Envoy Sidecar 注入器的其他选项和任务的信息。

将 Sidecar 代理添加到现有工作负载

在将 Sidecar 注入器安装到集群后,Sidecar 代理会自动注入到已启用的命名空间中新创建的 pod 中。如果在启用 Sidecar 注入器之前已经有工作负载在运行,则必须重新启动它们以进行注入。

对于由 Deployment、DaemonSet 或 StatefulSet 控制器管理的 pod,可以运行以下命令:

# Deployment
kubectl rollout restart deployment/DEPLOYMENT_NAME --namespace NAMESPACE

# DaemonSet
kubectl rollout restart daemonset/DAEMONSET_NAME --namespace NAMESPACE

# StatefulSet
kubectl rollout restart statefulset/STATEFULSET_NAME --namespace NAMESPACE

如果您没有使用上述任何控制器部署您的 pod,则必须单独删除 pod。之后,这些 pod 会通过新的 Sidecar 代理自动重新创建。

kubectl delete pod POD_NAME -n NAMESPACE

验证是否已在每个 pod 中注入边车代理容器:

kubectl get pods -n NAMESPACE

例如,对于上面创建的 busybox 客户端,您应该看到 2/2 个 pod 正在运行,其中一个用于 busybox 应用本身,另一个用于注入的 Envoy 边车代理:

NAME                      READY   STATUS    RESTARTS   AGE
busybox-c54f578c9-c9fk4   2/2     Running   183        7d15h

注入替换

默认情况下,启用命名空间可为所有常驻 pod 启用边车代理注入。您还可为注入配置不同范围,以满足特定需求。例如,您可以使用替换来防止无代理 gRPC 服务的边车代理注入。

请注意,注入替换仅在启用命名空间时适用,并按以下优先级生效:Pod 注释 > NeverInjectSelector > AlwaysInjectSelector > 默认政策

为特定的单个 pod 启用/停用注入

使用以下 pod 注解为已启用的命名空间中的特定 pod 开启或关闭注入:

...
metadata:
  annotations:
    sidecar.istio.io/inject: "true" / "false"

为特定的 pod 组启用/停用注入

可以根据 Kubernetes 标签选择器的数组将 Sidecar 注入器本身配置为始终或从不注入已启用的命名空间中的 pod。例如,如果 pod 的标签为“run=client”,可以使用以下命令将 Sidecar 注入器配置为注入边车代理:

kubectl edit configmap -n istio-control istio-sidecar-injector

...
config: |-
  policy: enabled
  alwaysInjectSelector:
    []

  neverInjectSelector:
    - matchLabels:
        run: client
...

必须重启现有的 Sidecar 注入器部署,此配置才会生效。

自定义流量拦截行为

默认情况下,来自应用的所有出站流量都会被拦截并重定向到 Envoy 边车代理。然后,Envoy 代理可以根据从 Traffic Director 收到的说明处理流量。在某些情况下,您可能需要修改此行为以绕过边车代理。

使用以下 pod 注释可将流量从拦截和重定向中排除。

按出站 IP 地址范围从拦截排除

您可以根据 IP 地址范围阻止流量拦截。

...
metadata:
  annotations:
    cloud.google.com/excludeOutboundCIDRs: "10.0.0.1/32,169.254.169.254/32"

cloud.google.com/excludeOutboundCIDRs pod 注解是出站 IP 地址范围(CIDR 格式)的逗号分隔列表。以这些 IP 地址范围为目标的出站流量不会被重定向到 Envoy Sidecar。

请注意,您需要在 pod 注解中列出 169.254.169.254/32,以确保应用可与元数据服务器通信。如果未指定 cloud.google.com/excludeOutboundCIDRs pod 注解,流量拦截会配置为排除“169.254.169.254/32”出站 CIDR 范围。

包含在被出站 IP 地址范围拦截之内

您可以按 IP 地址范围在拦截中包含流量。

...
metadata:
  annotations:
    cloud.google.com/includeOutboundCIDRs: "10.0.0.1/32,169.254.169.254/32"

cloud.google.com/includeOutboundCIDRs pod 注解是出站 IP 地址范围(CIDR 格式)的逗号分隔列表。以这些 IP 地址范围为目标的出站流量会被重定向到 Envoy Sidecar。

通配符 * 可用于重定向所有出站流量。空列表会停用所有出站流量。该注解默认为 *

按出站端口号从拦截排除

您可以按出站端口号,阻止流量拦截和重定向。

...
metadata:
  annotations:
    cloud.google.com/excludeOutboundPorts: "10001, 10002"

cloud.google.com/excludeOutboundPorts pod 注解是出站端口的逗号分隔列表。以这些端口为目标的出站流量不会被拦截和重定向到 Envoy Sidecar。

如果未指定 cloud.google.com/excludeOutboundPorts 注解,流向任何端口的出站流量都会被拦截并重定向到 Envoy Sidecar。这等同于传递带有空 ("") 列表的 cloud.google.com/excludeOutboundPorts 注解。

按入站端口号在拦截中包含

您可以使用入站端口号在拦截时添加流量。

...
metadata:
  annotations:
    cloud.google.com/includeInboundPorts: "10001, 10002"

cloud.google.com/includeInboundPorts Pod 注解是将流量重定向到 Envoy Sidecar 的入站端口的逗号分隔列表。通配符 * 可用于为所有端口配置重定向。留空会停用所有入站重定向。该值默认为空字符串 ("")。

按入站端口号从拦截排除

您可以按入站端口号将流量从拦截中排除。

...
metadata:
  annotations:
    cloud.google.com/excludeInboundPorts: "10001, 10002"

cloud.google.com/excludeInboundPorts Pod 注解是以英文逗号分隔的入站端口列表,这些端口将被排除在重定向到 Envoy Sidecar 之外。仅当所有入站流量 (*) 都正在重定向时,该注解才适用。该值默认为空字符串 ("")。

启用代管式证书

您可以启用代管式工作负载证书。

...
metadata:
  annotations:
    cloud.google.com/enableManagedCerts: "true"

当 pod 注解 cloud.google.com/enableManagedCerts 设置为 true 时,将插入由 Certificate Authority Service 签名的 GKE 代管式工作负载证书并将其装载到 Sidecar 容器上。注解的值默认为 false

配置边车代理元数据

为了支持其他 Traffic Director 功能,Sidecar 代理可以从其封装 Pod 中继承特定的元数据。可以通过两种方法实现此目的。这两个选项都会附加元数据,并在边车代理连接到 Traffic Director 时与 Traffic Director 共享元数据。这两个选项是互斥的。

第一个选项允许您指定各个元数据键值对。例如,在 pod 模板规范中添加以下注解,可将 "version": "dev" 标签应用于注入它的 Sidecar 代理。

...
metadata:
  annotations:
    cloud.google.com/proxyMetadata: '{"version": "dev"}'

第二个选项会将 pod 的所有标签附加到注入该 pod 的 Sidecar 代理。

...
metadata:
  annotations:
    cloud.google.com/forwardPodLabels: "true"

如果未指定 cloud.google.com/forwardPodLabels 注解,pod 标签将不会附加到边车代理。请注意,cloud.google.com/proxyMetadatacloud.google.com/forwardPodLabels 注释是互斥的。如果同时设置两者,则 cloud.google.com/forwardPodLabels 优先,cloud.google.com/proxyMetadata 会被忽略。

然后,配置过滤允许 Traffic Director 仅与与此 "version": "dev" 标签匹配的特定代理共享配置子集。

必须重启现有部署,此配置才会生效。

支持的 pod 注释

Traffic Director 支持以下 pod 注释以进行 Sidecar 注入。尽管可能还有其他可用的 Sidecar 注入器注释,但以下列表展示的是 Traffic Director 支持的注释。为避免中断或不稳定,请不要在生产部署中创建其他注释依赖项。

注释名称 说明
sidecar.istio.io/inject 布尔值,以字符串表示。例如“true 指定是否应将 Envoy Sidecar 自动注入工作负载。
cloud.google.com/proxyMetadata 键值对的 JSON 映射。例如“'{"version": "dev"}' 以 JSON 映射的方式指定应附加到 Envoy 元数据的键值对。
cloud.google.com/forwardPodLabels “true”或“false” 设置为“true”时,所有 pod 标签都会附加到 Envoy 元数据,并且“cloud.google.com/proxyMetadata”注解会被忽略。默认为“false”。
cloud.google.com/excludeOutboundPorts 出站端口的逗号分隔列表 指示了任何这些目标端口的出站流量将从拦截/到 Envoy Sidecar 的重定向中排除。此流量将绕过 Envoy 代理并且不会根据 Traffic Director 配置进行处理。默认为空字符串(即 "")。
cloud.google.com/includeInboundPorts 入站端口列表(以英文逗号分隔) 以英文逗号分隔的入站端口列表,其流量将重定向到 Envoy Sidecar。使用通配符“*”为所有端口配置重定向。留空会停用所有入站重定向。该值默认为空字符串 ("")。
cloud.google.com/excludeInboundPorts 入站端口列表(以英文逗号分隔) 以英文逗号分隔的入站端口列表,其流量不会重定向到 Envoy Sidecar。仅当所有入站流量 (*) 都正在重定向时,该注解才适用。该值默认为空字符串 ("")。
cloud.google.com/excludeOutboundCIDRs 出站 IP 地址范围(CIDR 格式)的逗号分隔列表。 指示了任何这些目标 IP 的出站流量将从拦截/到 Envoy Sidecar 的重定向中排除。此流量将绕过 Envoy 代理并且不会根据 Traffic Director 配置进行处理。默认为“169.254.169.254/32”,这是与元数据服务器进行通信所需的范围。请注意,此范围是必需的,因此如果您指定 `excludeOutboundCIDings` 注解,请确保除了任何其他 CIDR 之外,还要添加“169.254.169.254/32”。 确保英文逗号分隔列表中没有空格。
cloud.google.com/includeOutboundCIDRs 出站 IP 地址范围(CIDR 格式)的逗号分隔列表。 指示了任何这些目标 IP 地址的出站流量包含在拦截/到 Envoy Sidecar 的重定向中。此流量会定向到 Envoy 代理,并根据 Traffic Director 配置进行处理。默认为“169.254.169.254/32”,这是与元数据服务器进行通信所需的范围。请注意,此范围是必需的,因此如果您指定 `includeOutboundCIDRs` 注解,请确保除了任何其他 CIDR 之外,还要添加“169.254.169.254/32”。确保英文逗号分隔列表中没有空格。
cloud.google.com/enableManagedCerts 布尔值,以字符串表示。例如“true 如果设置为“true”,则由 Certificate Authority Service 签名的 GKE 代管式工作负载证书将插入并装载到 Sidecar 容器中。默认值为“false”。

卸载 Sidecar 注入器

使用以下命令卸载 Sidecar 注入器:

kubectl delete -f specs/
kubectl label namespace default istio-injection-