配置Sidecar注入策略

ASM自带一个Sidecar注入器,能够自动为新建的Pod添加Sidecar代理。您可以配置注入器的策略以满足特定需求,通过标签选择哪些Pod需要加入Sidecar,从而更有效地使用资源并简化管理。根据集群的大小和负载,您也可以调整注入器的资源配置,确保其有充足的运行资源。

前提条件

已添加集群到ASM实例

配置自动注入策略

您可以通过Pod所在命名空间的标签、Pod自身的标签或注解,匹配需要注入Sidecar的Pod。

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择数据面组件管理 > 注入策略配置

  3. 注入策略配置页面的注入策略配置管理区域,配置自动注入策略。

    只有当Pod同时匹配Pod所在命名空间的标签需要满足条件Pod自身的标签/注解需要满足条件时,Pod才会被自动注入Sidecar。

    匹配条件

    说明

    Pod所在命名空间的标签需要满足条件

    Sidecar自动注入对Pod所在命名空间的标签的匹配条件。

    • 包含 istio-injection: enabled:当Pod所在的命名空间包含istio-injection: enabled标签时,Pod匹配自动注入条件。

    • 不包含 istio-injection: disabled:当Pod所在的命名空间不包含istio-injection: disabled标签时,Pod能够匹配自动注入条件。

    Pod自身的标签/注解需要满足条件

    Sidecar自动注入对Pod自身标签或注解的匹配条件。

    • 不包含 sidecar.istio.io/inject: "false":当Pod不包含sidecar.istio.io/inject: "false"标签或注解时,Pod能够匹配自动注入条件。

    • 包含 sidecar.istio.io/inject: "true":当Pod包含sidecar.istio.io/inject: "true"的标签或注解时,Pod匹配自动注入条件。

      说明
      • ASM实例版本为1.12以下,仅支持通过匹配Pod注解的方式进行自动注入。

      • ASM实例版本为1.12及以上,支持通过匹配Pod标签和匹配Pod注解两种方式进行自动注入。

        标签的匹配优先级大于注解。例如,Pod同时带有sidecar.istio.io/inject: "true"的标签和sidecar.istio.io/inject: "false"的注解,Pod将被标记为含有sidecar.istio.io/inject: "true"标签,而不是sidecar.istio.io/inject: "false"注解。

  4. (可选)在注入策略配置管理区域下方,单击展开高级选项,配置相关信息。

    配置项

    说明

    注入Sidecar的Pod标签选择器(AlwaysInjectSelector)

    AlwaysInjectSelector是一个可配置的Pod标签选择器。被AlwaysInjectSelector选中的Pod,将被视为包含sidecar.istio.io/inject:"true"标签或注解。

    不注入Sidecar的Pod标签选择器(NeverInjectSelector)

    NeverInjectSelector是一个可配置的Pod标签选择器。被NeverInjectSelector选中的Pod,将被视为包含sidecar.istio.io/inject:"false"标签或注解。

    说明

    AlwaysInjectSelector与NeverInjectSelector都是Pod标签选择器,配置方法相同,都分为多行,每一行是一个标签选择表达式,Pod的标签只要匹配其中任意一个标签选择表达式,就可以被Pod标签选择器选中。

    每个标签选择表达式包含以下三个部分:

    • 键:表达式匹配时所使用的Pod标签中的键。

    • 操作:表达式匹配Pod标签的操作,可以选择以下四种操作:

      • In:表达式根据Pod的标签值是否在给定的值中来判断是否匹配Pod。

      • NotIn:表达式根据Pod的标签值是否不在给定的值中来判断是否匹配Pod。

      • Exists:表达式根据Pod中给定的键是否存在来判断是否匹配Pod。

      • DoesNotExist:表达式根据Pod中给定的键是否不存在来判断是否匹配Pod。

    • 值:如果表达式的操作选择In或NotIn,可以在此设定一系列的值,以判断是否匹配Pod。

  5. 在页面下方,单击更新设置

配置Sidecar注入器

Sidecar注入器是一个部署在数据面Kubernetes集群的准入Webhook服务(并非Sidecar代理),负责Sidecar代理的自动注入。Sidecar注入器的服务和工作负载均部署在Kubernetes集群的istio-system命名空间,名称以istio-sidecar-injector开头。您可以调整Sidecar注入器组件的资源设置与副本数,以保证Sidecar注入器在同时注入大量Pod时的可用性。建议您参考容器服务报警管理kube-apiserver组件监控,配置Sidecar注入器准入Webhook服务的指标监控和报警规则。

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择数据面组件管理 > 注入策略配置

  3. 注入策略配置页面的Sidecar注入器配置管理区域,配置Sidecar注入器,然后在页面下方,单击更新设置

    配置项

    说明

    Sidecar注入器资源配置

    配置Sidecar注入器容器的资源限制所需资源

    • 资源限制:配置Sidecar注入器容器的CPU和内存资源限制,其中CPU资源限制的单位为核(Core),内存资源限制的单位为MiB。

    • 所需资源:配置Sidecar注入器容器的CPU和内存所需资源,其中CPU所需资源的单位为核(Core),内存所需资源的单位为MiB。

    Pod副本数

    配置Sidecar注入器Pod的副本数量。

    说明

    增加Sidecar注入器的副本数量可以提高Sidecar注入服务在同时注入大量Pod时的可用性。推荐您将Pod副本数设定为2个或以上。

    重写健康检查

    是否在注入时为Pod重写健康检查。您可以参考为网格内应用开启健康检查重定向,确定是否需要启用健康检查重写。

    Sidecar-injector部署节点选择

    通过匹配标签的方式选择Sidecar注入器Pod部署的节点。

    单击新增匹配标签,输入数据面集群节点标签的名称,匹配具体的部署节点。

示例一:为命名空间下的指定Pod关闭自动注入,其他Pod开启自动注入

  1. 配置自动注入策略。

    1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

    2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择数据面组件管理 > 注入策略配置

    3. 注入策略配置页面的注入策略配置管理区域,配置相关信息。

      以下配置表示只要命名空间带有istio-injection: enabled标签,命名空间内的Pod就都会被自动注入Sidecar,除非Pod带有sidecar.istio.io/injection: "false"的标签或注解。

      配置项

      说明

      Pod所在命名空间的标签需要满足条件

      选择包含istio-injection:enabled

      Pod自身的标签/注解需要满足条件

      选择不包含sidecar.istio.io/injection: "false"

  2. 创建全局命名空间,为命名空间开启自动注入。

    1. 在网格详情页面左侧导航栏,选择网格实例 > 全局命名空间,然后在右侧页面,单击新建

    2. 新建命名空间面板,输入命名空间的名称(本示例为test1),在标签右侧单击添加,配置名称istio-injectionenabled,然后单击确定

    3. 在页面上方,单击同步自动注入至Kubernetes集群,将全局命名空间同步至数据面Kubernetes集群。

  3. 创建应用。

    1. 在数据平面ACK集群的test1命名空间下创建details应用。具体操作,请参见在ASM实例关联的集群中部署应用

    2. 验证应用的Pod是否注入Sidecar代理。

      1. 登录容器服务管理控制台,在左侧导航栏选择集群

      2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

      3. 无状态页面顶部,设置命名空间test1,单击details应用名称。

        容器组页签下可以看到Pod包含Proxy镜像,表明自动注入Sidecar代理成功。1D58EF1F-DE30-4d90-954D-EE00D88C592B

  4. 在Pod中添加标签,使Pod关闭自动注入。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

    3. 无状态页面的test1命名空间下,在details应用右侧的操作列,单击更多 > 查看Yaml

    4. 编辑 YAML对话框,修改YAML配置,然后单击更新

      • ASM版本为1.12.4及以上:在labels参数下添加Key为sidecar.istio.io/inject、Value为"false"的标签,即sidecar.istio.io/inject: 'false'769D1622-11DE-41c8-9DD6-757C6BD97F19

      • ASM版本为1.12.4以下:在annotations参数下添加Key为sidecar.istio.io/inject、Value为"false"的注解,即sidecar.istio.io/inject: "false"

  5. 验证test1命名空间开启自动注入的情况下,details服务的Pod不进行自动注入是否成功。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

    3. 无状态页面顶部,设置命名空间test1,单击details应用名称。

      容器组页签下可以看到Pod不包含Proxy镜像,表明在test1命名空间开启自动注入的情况下,details服务的Pod不进行自动注入成功。验证details不进行自动注入..png

示例二:以Pod为单位,单独为Pod设置自动注入策略

若您不想以命名空间为维度批量设置自动注入策略,也可以单独为Pod设置自动注入策略,具体操作步骤如下。

  1. 为命名空间开启自动注入。

    1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

    2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择数据面组件管理 > 注入策略配置

    3. 注入策略配置管理页面的注入策略配置管理区域,配置相关信息,然后在页面下方,单击更新设置

      以下配置表示默认所有命名空间下带有sidecar.istio.io/injection: "true"标签的Pod都会被自动注入Sidecar,但是带有istio-injection:disabled标签的命名空间中所有Pod都不会被自动注入Sidecar。

      配置项

      说明

      Pod所在命名空间的标签需要满足条件

      选择不包含istio-injection:disabled

      Pod自身的标签/注解需要满足条件

      选择包含sidecar.istio.io/injection: "true"

  2. 在ACK集群中创建名为test2的命名空间,且不带有任何标签。具体操作,请参见管理命名空间与配额

  3. 在ACK集群的test2命名空间下创建reviews应用。具体操作,请参见在ASM实例关联的集群中部署应用

  4. 为Pod添加标签,使Pod开启自动注入。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

    3. 无状态页面顶部,设置命名空间test2,在reviews服务右侧的操作列,单击更多 > 查看Yaml

    4. 编辑 YAML对话框的labels参数下,添加sidecar.istio.io/inject: "true"标签,然后单击更新

      说明

      使用标签设置Pod自动注入功能,服务网格ASM版本需为1.12.4及以上。关于升级实例的具体操作,请参见升级ASM实例

      修改YAML..png

  5. 验证为Pod设置自动注入策略是否成功。

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

    3. 无状态页面顶部,设置命名空间test2,单击reviews应用名称。

      容器组页签下可以看到Pod中包含Proxy镜像,表明为Pod设置自动注入策略成功。场景二验证..png

相关文档

  • 对于正在运行的Pod,需要重新启动才能使Sidecar注入策略生效。具体操作,请参见重新启动Pod

  • 若您控制平面升级后,已经启用Istio的应用程序仍使用旧版本的Sidecar代理,请参照升级Sidecar代理进行升级。

  • 您可以按照不同的级别(例如全局、命名空间、工作负载、Pod范围)对Sidecar代理的资源占用、流量拦截策略、DNS代理、生命周期等方面进行配置。具体操作,请参见配置Sidecar代理