Sidecar代理用于增强服务调用之间的网络安全性、可靠性以及可观测性。ASM对Istio中的Sidecar代理配置进行了细化,提供了命名空间级别的配置能力,帮助您更好的管理Sidecar代理。本文介绍如何按照命名空间设置Sidecar代理的资源、生命周期、终止等待时长等。

前提条件

背景信息

ASM按照命名空间设置的Sidecar代理功能的详细描述如下:
功能 描述
设置注入的Istio代理资源 设置注入的Istio代理所需资源和资源限制。
设置istio-init初始化容器资源 设置istio-init初始化容器所需资源和资源限制。
按端口和地址来启用或禁用Sidecar代理 设置拦截对外访问地址、不拦截对外访问地址、按端口使入口流量免于经过Sidecar代理和按端口使出口流量免于经过Sidecar代理。
设置Sidecar代理生命周期 设置Sidecar代理生命周期。更多信息,请参见Container Lifecycle Hooks
设置Sidecar代理终止等待时长 自定义terminationDrainDuration连接时长,表示Pod停止时,存量的连接最多等待多长时间后强制销毁Sidecar代理。
启用DNS代理功能 启用DNS代理功能,当收到来自应用程序的DNS查询时,Istio代理将进行透明地拦截并提供解析能力。

优先级关系

您可以使用Pod Annotation的方式、按照命名空间级别和全局设置Sidecar代理。这三种方式具有以下优先级关系:

使用Pod Annotation的方式>命名空间级别设置Sidecar代理配置>全局的Sidecar代理设置的优先级

设置注入的Istio代理资源

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > Sidecar代理配置
  5. Sidecar代理配置页面单击命名空间页签。
  6. 选择配置的命名空间,单击注入的Istio代理资源设置左侧的Istio代理图标,设置Istio资源参数,然后单击更新设置
    参数 描述
    资源限制 Istio代理资源最大能申请到的CPU和内存,本文设置为CPU为2,内存为1025。
    所需资源 Istio代理资源运行时最小使用的CPU和内存,本文设置为CPU为0.1,内存为128。
  7. 重启Pod,使Sidecar配置生效。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏中,选择工作负载 > 容器组
    5. 容器组页签单击目标Pod右侧操作列下的删除
    6. 删除容器组对话框中单击确定
      稍等一段时间,容器重启后配置生效。
  8. 查看设置的Istio代理资源。
    1. 容器组页签单击目标Pod名称。
    2. 在容器页签下单击istio-proxy左侧的Istio代理图标。
      可以看到Istio代理资源,与所设置的值相同,说明设置Istio代理资源成功。Istio代理资源

设置istio-init初始化容器资源

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > Sidecar代理配置
  5. Sidecar代理配置页面单击命名空间页签。
  6. 选择配置的命名空间,单击istio-init初始化容器资源限制左侧的Istio代理图标,设置Istio资源参数,然后单击更新设置
    参数 描述
    资源限制 Istio-init初始化容器资源最大能申请到的CPU和内存。本文设置COU为0.916 Core,内存为512 MiB。
    所需资源 Istio-init初始化容器资源运行时最小使用的CPU和内存。本文设置COU为0.016 Core,内存为18 MiB。
  7. 重启Pod,使Sidecar配置生效。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏中,选择工作负载 > 容器组
    5. 容器组页签单击目标Pod右侧操作列下的删除
    6. 删除容器组对话框中单击确定
      稍等一段时间,容器重启后配置生效。
  8. 执行以下命令,查看设置的istio-init初始化容器资源。
    kubectl  get pod -n <命名空间名称> <Pod名称>  -o yaml

    预期输出:

        - name: DNS_AGENT
        image: registry-vpc.cn-hangzhou.aliyuncs.com/acs/proxyv2:1.10.5
        imagePullPolicy: IfNotPresent
        name: istio-init
        resources:
          limits:
            cpu: 916m
            memory: 512Mi
          requests:
            cpu: 16m
            memory: 18Mi
        securityContext:
          allowPrivilegeEscalation: false

按端口和地址来启用或禁用Sidecar代理

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > Sidecar代理配置
  5. Sidecar代理配置页面单击命名空间页签。
  6. 选择配置的命名空间,单击按端口和地址来启用/禁用Sidecar代理左侧的Istio代理图标,根据实际情况设置拦截对外访问的地址访问不拦截对外访问的地址范围设置端口使入口流量经过Sidecar代理设置端口使出口流量经过Sidecar代理设置端口使入口流量免于经过Sidecar代理设置端口使出口流量免于经过Sidecar代理,然后单击更新设置
    本文设置拦截对外访问的地址访问为192.168.1.2/32,不拦截对外访问的地址范围192.168.1.1/32,设置端口使入口流量经过Sidecar代理为*,设置端口使出口流量免于经过Sidecar代理为7015,7016,设置端口使入口流量免于经过Sidecar代理为7015,7016,设置端口使出口流量免于经过Sidecar代理为7011,7012,
  7. 重启Pod,使Sidecar配置生效。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏中,选择工作负载 > 容器组
    5. 容器组页签单击目标Pod右侧操作列下的删除
    6. 删除容器组对话框中单击确定
      稍等一段时间,容器重启后配置生效。
  8. 执行以下命令,查看容器启用或禁用Sidecar代理情况。
    kubectl  get pod -n <命名空间名称> <Pod名称>  -o yaml

    预期输出:

        - "15001"
        - -z
        - "15006"
        - -u
        - "1337"
        - -m
        - REDIRECT
        - -i
        - 192.168.1.2/32
        - -x
        - 192.168.0.1/32,192.168.1.1/32
        - -b
        - '*'
        - -d
        - 15090,15021,15081,9191,7013,7014
        - -o
        - 7011,7012

设置Sidecar代理生命周期

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > Sidecar代理配置
  5. Sidecar代理配置页面单击命名空间页签。
  6. 选择配置的命名空间,单击Sidecar代理生命周期左侧的Istio代理图标,根据实际情况修改以下内容,然后复制到文本框中,然后单击更新设置
    {
      "postStart": {
        "exec": {
          "command": [
            "pilot-agent",
            "wait"
          ]
        }
      },
      "preStop": {
        "exec": {
          "command": [
            "/bin/sh",
            "-c",
            "sleep 13"
          ]
        }
      }
    }
    • postStart参数下的command:设置启用Sidecar容器后的操作,本文设置为启用Sidecar容器后等待pilot-agent启动。
    • preStop参数下的command:设置停止Sidecar容器前的操作,本文设置为停止Sidecar容器前休眠13秒。
  7. 重启Pod,使Sidecar配置生效。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏中,选择工作负载 > 容器组
    5. 容器组页签单击目标Pod右侧操作列下的删除
    6. 删除容器组对话框中单击确定
      稍等一段时间,容器重启后配置生效。
  8. 执行以下命令,查看设置的Sidecar代理生命周期。
    kubectl  get pod -n <命名空间名称> <Pod名称>  -o yaml

    预期输出:

        - name: TERMINATION_DRAIN_DURATION_SECONDS
          value: "5"
        image: registry-vpc.cn-hangzhou.aliyuncs.com/acs/proxyv2:1.10.5
        imagePullPolicy: IfNotPresent
        lifecycle:
          postStart:
            exec:
              command:
              - pilot-agent
              - wait
          preStop:
            exec:
              command:
              - /bin/sh
              - -c
              - sleep 13
        name: istio-proxy

设置Sidecar代理终止等待时长

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > Sidecar代理配置
  5. Sidecar代理配置页面单击命名空间页签。
  6. 选择配置的命名空间,单击Sidecar代理终止等待时长左侧的Istio代理图标,然后输入等待时长,本文设置Sidecar代理终止等待时长为10s,然后单击更新设置
  7. 重启Pod,使Sidecar配置生效。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏中,选择工作负载 > 容器组
    5. 容器组页签单击目标Pod右侧操作列下的删除
    6. 删除容器组对话框中单击确定
      稍等一段时间,容器重启后配置生效。
  8. 查看Sidecar代理终止等待时长。
    1. 容器组页签单击目标Pod名称。
    2. 在容器页签下单击istio-proxy左侧的Istio代理图标。
      可以看到Sidecar代理终止等待时长,与所设置的值相同,说明设置Sidecar代理终止等待时长成功。终止等待时长

启用DNS代理功能

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > Sidecar代理配置
  5. Sidecar代理配置页面单击命名空间页签。
  6. 选择配置的命名空间,单击启用DNS代理功能左侧的Istio代理图标,选中启用DNS代理功能,然后单击更新设置
  7. 重启Pod,使DNS配置生效。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏中,选择工作负载 > 容器组
    5. 容器组页签单击目标Pod右侧操作列下的删除
    6. 删除容器组对话框中单击确定
      稍等一段时间,容器重启后配置生效。
  8. 执行以下命令,查看设置的DNS代理。
    kubectl  get pod -n <命名空间名称> <Pod名称>  -o yaml

    预期输出:

        - name: TRUST_DOMAIN
          value: cluster.local
        - name: DNS_AGENT
        - name: TERMINATION_DRAIN_DURATION_SECONDS
          value: "10"
        - name: ISTIO_META_DNS_AUTO_ALLOCATE
          value: "true"
        - name: ISTIO_META_DNS_CAPTURE
          value: "true"
        image: registry-vpc.cn-hangzhou.aliyuncs.com/acs/proxyv2:v1.10.5-33-gba0adb2df7-pro-aliyun
        imagePullPolicy: IfNotPresent
    --
    --
        - 7011,7012
        - -q
        - 7015,7016
        env:
        - name: DNS_AGENT
        - name: ISTIO_META_DNS_AUTO_ALLOCATE
          value: "true"
        - name: ISTIO_META_DNS_CAPTURE
          value: "true"
        image: registry-vpc.cn-hangzhou.aliyuncs.com/acs/proxyv2:v1.10.5-33-gba0adb2df7-pro-aliyun