为了充分利用服务网格的所有特性,服务网格中ACK集群的应用Pod必须包含一个Sidecar代理。除了手动注入方式外,通常建议启用自动注入的方式来简化部署。本文介绍如何使用多种方式开启自动注入。

背景信息

ASM默认提供了一个Webhook控制器,可以将Sidecar代理自动添加到可用的Pod中。Sidecar代理的详细介绍请参见设置Sidecar
说明 请确保ASM实例的Istio为v1.6.8.17及以上版本。

Sidecar注入优先级

Sidecar注入的设置存在优先级关系,逻辑决策如下图所示:优先级

开启自动注入

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > 注入策略配置
  5. 注入策略配置页面单击注入策略配置管理,设置自动注入功能,然后单击更新设置
    开启自动注入功能有以下选项:
    操作项 说明
    只选中为所有命名空间开启自动注入功能

    选中此项后,您可以根据实际需求开启和关闭自动注入功能:

    • 开启自动注入

      选中此项后,在不具有istio-injection:disabled标签的命名空间下,在Pod添加sidecar.istio.io/inject="true"注解,则该Pod会自动注入Sidecar代理。

    • 关闭自动注入
      • 选择此项后,为命名空间添加istio-injection:disabled标签,则该命名空间不会自动注入Sidecar代理。
      • 选择此项后,命名空间下的Pod没有sidecar.istio.io/inject="true"注解,则该Pod不会自动注入Sidecar代理。
    选中为所有命名空间开启自动注入功能其他自动注入的配置
    选中此项后,您可以根据实际需求开启和关闭自动注入功能:
    • 开启自动注入

      选中此项后,在其他自动注入的配置的文本框中设置alwaysInjectSelector字段,在不具有istio-injection:disabled标签的命名空间下,在Pod添加alwaysInjectSelector字段中的key标签。则该Pod会自动注入Sidecar代理。

    • 关闭自动注入
      • 选择此项后,为命名空间添加istio-injection:disabled标签,则该命名空间不会自动注入。
      • 选择此项后,命名空间下的Pod没有sidecar.istio.io/inject="true"注解,则该Pod不会自动注入Sidecar代理。
    只选中通过Pod Annotations实现自动注入
    选中此项后,您可以根据实际需求开启和关闭自动注入功能:
    • 开启自动注入

      选中此项后,为命名空间添加istio-injection:enabled标签,则该命名空间会自动注入Sidecar代理。

    • 关闭自动注入
      • 选择此项后,不具有istio-injection:enabled标签的命名空间不会自动注入Sidecar代理。
      • 选择此项后,Pod有sidecar.istio.io/inject="false"注解,则该Pod不会自动注入Sidecar代理。
    选中通过Pod Annotations实现自动注入其他自动注入的配置
    选中此项后,您可以根据实际需求开启和关闭自动注入功能:
    • 开启自动注入

      选中此项后,为命名空间添加istio-injection:enabled标签,则该命名空间会自动注入Sidecar代理。

    • 关闭自动注入

      选择此项后,不具有istio-injection:enabled标签的命名空间不会自动注入Sidecar代理。

    • 在具有istio-injection:enabled标签的命名空间下,在Pod关闭自动注入功能

      选中此项后,在其他自动注入的配置的文本框中设置neverInjectSelector字段,在Pod添加neverInjectSelector字段中的key标签后。即使Pod位于具有istio-injection:enabled标签的命名空间下,具有key标签的Pod不会自动注入Sidecar代理。

    选中为所有命名空间开启自动注入功能通过Pod Annotations实现自动注入

    选中此项后,您可以根据实际需求开启和关闭自动注入功能:

    • 开启自动注入

      选中此项后,只要命名空间没有istio-injection:disabled标签,则该命名空间会自动注入Sidecar代理。

    • 关闭自动注入

      选择此项后,为命名空间添加istio-injection:disabled标签,则该命名空间不会自动注入Sidecar代理。

    选中为所有命名空间开启自动注入功能通过Pod Annotations实现自动注入其他自动注入的配置
    选中此项后,您可以根据实际需求开启和关闭自动注入功能:
    • 开启自动注入

      选中此项后,只要命名空间没有istio-injection:disabled标签,则该命名空间会自动注入Sidecar代理。

    • 关闭自动注入

      选择此项后,为命名空间添加istio-injection:disabled标签,则该命名空间不会自动注入Sidecar代理。

    • 在没有istio-injection:disabled的标签命名空间下,关闭自动注入

      选中此项后,在其他自动注入的配置的文本框中设置neverInjectSelector字段,在Pod添加neverInjectSelector字段中的key标签。即使Pod位于没有istio-injection:disabled的标签命名空间下,仍然不会自动注入Sidecar代理。

    只选中其他自动注入配置
    选中此项后,您可以根据实际需求开启和关闭自动注入功能:
    • 开启自动注入

      选中此项后,为命名空间添加istio-injection:enabled标签,在其他自动注入的配置的文本框中设置alwaysInjectSelector字段,在Pod添加alwaysInjectSelector字段中的key标签,该Pod会自动注入Sidecar代理。

    • 关闭自动注入
      • 选中此项后,不具有istio-injection:enabled标签的命名空间不会自动注入Sidecar代理。
      • 选中此项后,具有istio-injection:enabled标签的命名空间,但是没有sidecar.istio.io/inject="true"注解的Pod不会自动注入Sidecar代理。
    不选择任何项
    不选择任何项,您可以根据实际需求开启和关闭自动注入功能:
    • 开启自动注入

      为命名空间添加istio-injection:enabled标签,然后为Pod添加sidecar.istio.io/inject="true"注解,该Pod会自动注入Sidecar代理。

    • 关闭自动注入
      • 不具有istio-injection:enabled标签的命名空间不会自动注入Sidecar代理。
      • 具有istio-injection:enabled标签的命名空间,但是没有sidecar.istio.io/inject="true"注解的Pod不会自动注入Sidecar代理。
  6. 可选:注入策略配置页面单击Sidecar注入器配置管理,设置Sidecar代理资源,单击更新设置
    参数 说明
    Sidecar代理注入器资源设置 ASM默认为每个数据面集群提供了一个Webhook控制器,可以将Sidecar代理自动添加到可用的Pod中。此处的资源设置是用于限制Webhook控制器资源的大小。
    Pod副本数 设置Sidecar代理的Pod副本数。
    Pod部署节点选择 根据标签匹配Sidecar代理的Pod部署的节点。

其他主动注入的配置

您可以在其他自动注入中配置标签,匹配Pod上的标签,从而控制Pod是否需要中注入Sidecar。
  • 使用一个alwaysInjectSelector的字段,总是将Sidecar注入匹配标签选择器的Pod中,而忽略全局策略。
    {
      "alwaysInjectSelector": [
        {
          "matchExpressions": [
            {
              "key": "key1",
              "operator": "Exists"
            }
          ]
        },
        {
          "matchExpressions": [
            {
              "key": "key2",
              "operator": "Exists"
            }
          ]
        }
      ]
    }
  • 使用一个neverInjectSelector的字段,总是不会将Sidecar注入匹配标签选择器的Pod中,而忽略全局策略。
    {
      "neverInjectSelector": [
        {
          "matchExpressions": [
            {
              "key": "key3",
              "operator": "Exists"
            }
          ]
        },
        {
          "matchExpressions": [
            {
              "key": "key4",
              "operator": "Exists"
            }
          ]
        }
      ]
    }    
  • 其他配置参数。
    {
      "replicaCount": 2,
      "injectedAnnotations": {
        "test/istio-init": "runtime/default",
        "test/istio-proxy": "runtime/default"
      },
      "nodeSelector": {
         "beta.kubernetes.io/os": "linux"
      }   
    }  
    • replicaCount:部署的副本数。
    • injectedAnnotations:注入的其他注解。
    • nodeSelector:注入部署的节点,本文设置为linux,表示注入到带有标签linux的Node节点上。

场景示例一:某命名空间开启自动注入的情况下,该命名空间下某些Pod关闭自动注入

如果您希望命名空间能够开启自动注入功能,但是该命名空间下某些Pod关闭自动注入。您可以进行以下操作:

使用其他自动注入的配置实现命名空间开启自动注入情况下,该命名空间下某些Pod关闭自动注入

  1. 在ASM开启自动注入。
    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > 注入策略配置
    5. 注入策略配置页面单击注入策略配置管理,选中通过Pod Annotations实现自动注入其他自动注入的配置,在文本框中添加以下内容,然后单击更新设置
      {
        "neverInjectSelector": [
          {
            "matchExpressions": [
              {
                "key": "notinjectapp",
                "operator": "Exists"
              }
            ]
          }
        ]
      }
  2. 创建命名空间。
    1. 在网格详情页面左侧导航栏选择网格实例 > 全局命名空间,在右侧页面单击新建
    2. 新建命名空间面板设置命名空间名称,单击添加,设置名称为istio-injection,值为enabled,然后单击确定。本文设置命名空间名称为test1。
  3. 创建应用。
    1. 在ACK集群的test1命名空间下创建应用。具体操作,请参见部署应用到ASM实例,本文以部署details服务为例。
    2. 验证应用的Pod是否注入Sidecar代理。
      1. 登录容器服务管理控制台
      2. 在控制台左侧导航栏中,单击集群
      3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
      4. 在集群管理页左侧导航栏中,选择工作负载 > 无状态
      5. 无状态页面顶部设置命名空间为test1,单击details应用名称。
        容器组页签下可以看到Pod包含Proxy镜像,说明自动注入Sidecar代理成功。不自动注入
  4. 在Pod中添加标签,使Pod关闭自动注入。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏中,选择工作负载 > 无状态
    5. 无状态页面设置命名空间为test1,选择details服务右侧操作下的更多 > 查看Yaml
    6. labels参数下添加keynotinjectapp的标签,value可以自定义,然后单击更新
      标签
    7. 无状态页面设置命名空间为test1,选择details服务右侧操作下的更多 > 重新部署
    8. 在弹出对话框单击确定
  5. 验证test1命名空间开启自动注入的情况下,details服务的Pod不进行自动注入是否成功。
    无状态页面单击details服务的名称,在容器组页签下可以看到Pod不包含Proxy镜像,说明在test1命名空间开启自动注入的情况下,details服务的Pod不进行自动注入成功。不包含自动注入

使用Annotations方式实现命名空间开启自动注入情况下,该命名空间下某些Pod关闭自动注入

  1. 在ASM开启自动注入。
    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > 注入策略配置
    5. 注入策略配置页面单击注入策略配置管理,选中通过Pod Annotations实现自动注入,然后单击更新设置
  2. 创建命名空间。
    1. 在网格详情页面左侧导航栏选择网格实例 > 全局命名空间,在右侧页面单击新建
    2. 新建命名空间面板设置命名空间名称,单击添加,设置名称为istio-injection,值为enabled,然后单击确定。本文设置命名空间名称为test1。
  3. 创建应用。
    1. 在ACK集群的test1命名空间下创建应用。具体操作,请参见部署应用到ASM实例,本文以部署details服务为例。
    2. 验证应用的Pod是否注入Sidecar代理。
      1. 登录容器服务管理控制台
      2. 在控制台左侧导航栏中,单击集群
      3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
      4. 在集群管理页左侧导航栏中,选择工作负载 > 无状态
      5. 无状态页面设置命名空间为test1,单击details应用名称。
        容器组页签下可以看到Pod包含Proxy镜像,说明自动注入Sidecar代理成功。不自动注入
  4. 在Pod中添加注解,使Pod关闭自动注入。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏中,选择工作负载 > 无状态
    5. 无状态页面设置命名空间为test1,选择details服务右侧操作下的更多 > 查看Yaml
    6. annotations参数下添加sidecar.istio.io/inject: "false"的注解,然后单击更新
      注解
    7. 无状态页面设置命名空间为test,选择details服务右侧操作下的更多 > 重新部署
    8. 在弹出对话框单击确定
  5. 验证test1命名空间开启自动注入的情况下,details服务的Pod不进行自动注入是否成功。
    无状态页面单击details服务的名称,在容器组页签下可以看到Pod不包含Proxy镜像,说明在test1命名空间开启自动注入的情况下,details服务的Pod不进行自动注入成功。不包含自动注入

场景示例二:单独为Pod设置自动注入策略

如果您不想以命名空间为维度批量设置自动注入策略,您也可以单独为Pod设置自动注入策略。

  1. 为命名空间开启自动注入。
    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > 注入策略配置
    5. 注入策略配置页面单击注入策略配置管理,选中为所有命名空间开启自动注入功能,然后单击更新设置
  2. 在ACK集群的test2命名空间下创建应用。具体操作,请参见部署应用到ASM实例,本文以部署reviews服务为例。
  3. 为Pod添加注解,使Pod开启自动注入。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏中,选择工作负载 > 无状态
    5. 无状态页面设置命名空间为test2,选择reviews服务右侧操作下的更多 > 查看Yaml
    6. annotations参数下添加sidecar.istio.io/inject: "true"注解,然后单击更新
      单独为Pod添加策略
    7. 无状态页面设置命名空间为test2,选择reviews服务右侧操作下的更多 > 重新部署
    8. 在弹出对话框单击确定
  4. 验证为Pod设置自动注入策略是否成功。
    无状态页面单击reviews服务的名称,在容器组页签下可以看到Pod中包含Proxy镜像,说明为Pod设置自动注入策略成功。自动注入