服务网格ASM支持通过为集群中的业务容器注入Sidecar代理来增强服务调用之间的网络安全性、可靠性以及可观测性。同时,服务网格ASM支持对Sidecar代理进行配置,以设置Sidecar代理在资源、生命周期、流量拦截策略、可观测能力等方面的各项参数。您可以根据实际业务需求对Sidecar代理进行灵活配置。本文介绍如何在不同的级别配置Sidecar代理,并介绍可配置的Sidecar代理参数。
前提条件
- 已创建ASM实例。具体操作,请参见创建ASM实例。
- 已创建ACK集群。具体操作,请参见创建Kubernetes托管版集群。
- 添加集群到ASM实例。具体操作,请参见添加集群到ASM实例。
- 已开启自动注入。具体操作,请参见多种方式灵活开启自动注入。
背景信息
由于已经部署的Pod配置无法更改,您对Sidecar代理进行的配置将无法立即生效。因此,在配置Sidecar代理后,您需要重新部署工作负载,重新部署的Pod中注入的Sidecar代理将生效新的配置。
您可以通过以下步骤,在容器服务控制台删除Pod以重新部署工作负载、让新的Sidecar代理配置生效:
- 登录容器服务管理控制台。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
- 在集群管理页左侧导航栏中,选择工作负载 > 容器组。
- 在容器组页签单击目标Pod右侧操作列下的删除。
- 在删除容器组对话框中单击确定。稍等一段时间,等待容器组重新启动。
Sidecar代理配置级别说明
Sidecar代理配置有配置级别之分,不同的Sidecar代理配置级别意味着不同的配置生效范围,您可以根据实际业务需求,在不同级别进行Sidecar代理配置,让Sidecar代理配置生效在不同的范围内。
Sidecar代理配置主要分为以下几个级别:
- 全局级别:Sidecar代理配置将全局生效,您的任意Pod在注入Sidecar代理时都将应用配置。
- 命名空间级别:Sidecar代理配置将生效在指定命名空间,只有该命名空间内的Pod在注入Sidecar代理时才会应用配置。在配置此级别的Sidecar代理配置时,您需要选择一个命名空间。
- 工作负载级别:Sidecar代理配置将生效在指定的工作负载,只有被给定的标签选择器选中的工作负载在注入Sidecar代理时,才会应用配置。在配置此级别的SIdecar代理配置时,您需要给定工作负载标签选择器,以指定哪些工作负载需要应用配置。
- Pod范围级别:该级别的Sidecar代理配置无法在ASM控制台进行配置,而是通过在Pod中添加Annotation来进行配置。有关如何通过Annotation方式配置Sidecar代理,请参考https://help.aliyun.com/document_detail/358835.html。
Sidecar配置级别优先级说明
若在不同级别上针对同一个Sidecar代理参数进行了配置,服务网格ASM会根据每个Sidecar配置级别的优先级来决定在注入Sidecar代理时最终生效的配置参数。具体来说,Sidecar配置级别之间的优先级关系如下:
Pod范围 > 工作负载 > 命名空间 > 全局
比如,客户在命名空间级别和全局级别都配置了某个Sidecar代理配置参数,其中命名空间级别配置在default命名空间。此时,客户在default命名空间部署新的工作负载,因为命名空间级别的优先级大于全局级别,注入的Sidecar代理中将应用在命名空间级别配置的参数。
配置Sidecar代理步骤
一、在全局级别配置Sidecar代理
- 登录ASM控制台。
- 在左侧导航栏,选择服务网格 > 网格管理。
- 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
- 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > Sidecar代理配置。进入SIdecar代理配置页面,页面将默认展示全局页签。
- 根据需求选择需要配置的Sidecar配置项,并根据配置项要求的配置方法进行配置。有关不同的Sidecar代理配置项以及配置方法说明,请见Sidecar代理配置项说明。
- 点击页面下方的更新设置按钮,网格将进入短暂的更新中状态,等待网格重新进入运行中状态后,全局级别的Sidecar代理配置将正式生效。
二、在命名空间级别配置Sidecar代理
- 登录ASM控制台。
- 在左侧导航栏,选择服务网格 > 网格管理。
- 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
- 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > Sidecar代理配置。
- 在Sidecar代理配置页面单击命名空间页签。
- 在命名空间选择框中选择希望配置生效的命名空间。
- 由于命名空间级别并非最低Sidecar代理配置级别,所有Sidecar代理配置项将没有默认值(默认采用全局级别中的配置)。要配置命名空间级别的Sidecar代理配置,首先要根据需求选择需要配置的Sidecar配置项,然后勾选对应的Sidecar配置项,接下来再根据配置项要求的配置方法进行配置。有关不同的Sidecar代理配置项以及配置方法说明,请见Sidecar代理配置项说明。
- 点击页面下方的更新设置按钮,命名空间级别的Sidecar代理配置将立即生效。
三、在工作负载级别配置Sidecar代理
在同一个命名空间下,可以创建多份工作负载级别的sidecar代理配置,分别应用于不同的工作负载。本节将分别介绍如何创建、更新和删除工作负载级别的Sidecar代理配置。
创建工作负载级别Sidecar代理配置
- 登录ASM控制台。
- 在左侧导航栏,选择服务网格 > 网格管理。
- 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
- 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > Sidecar代理配置。
- 在Sidecar代理配置页面单击工作负载页签。
- 单击创建按钮,进入工作负载级别Sidecar代理配置创建页面。
- 在命名空间选择框中选择希望配置生效的工作负载所在的命名空间。在名称输入框中为工作负载级别Sidecar代理配置命名。在匹配标签中创建匹配工作负载标签的标签选择器。
- 由于工作负载级别并非最低Sidecar代理配置级别,所有Sidecar代理配置项将没有默认值(默认采用全局级别中的配置)。要配置工作负载级别的Sidecar代理配置,首先要根据需求选择需要配置的Sidecar配置项,然后勾选对应的Sidecar配置项,接下来再根据配置项要求的配置方法进行配置。有关不同的Sidecar代理配置项以及配置方法说明,请见Sidecar代理配置项说明。
- 点击页面下方的创建按钮,将立即创建出工作负载级别的Sidecar代理配置。
更新工作负载级别Sidecar代理配置
- 登录ASM控制台。
- 在左侧导航栏,选择服务网格 > 网格管理。
- 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
- 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > Sidecar代理配置。
- 在Sidecar代理配置页面单击工作负载页签。
- 在工作负载页签下找到希望更新的工作负载级别Sidecar代理配置,在操作栏单击更新,进入工作负载级别Sidecar代理配置更新页面。
编辑工作负载级别Sidecar代理配置
- 可以选择在匹配标签中更新匹配工作负载标签的标签选择器,让工作负载级别Sidecar代理配置生效于不同的工作负载。
- 可以选择更新工作负载级别Sidecar代理配置。由于工作负载级别并非最低Sidecar代理配置级别,所有Sidecar代理配置项将没有默认值(默认采用全局级别中的配置)。要配置工作负载级别的Sidecar代理配置,首先要根据需求选择需要配置的Sidecar配置项,然后勾选对应的Sidecar配置项,接下来再根据配置项要求的配置方法进行配置。有关不同的Sidecar代理配置项以及配置方法说明,请见Sidecar代理配置项说明。
- 点击页面下方的更新按钮,工作负载级别的Sidecar代理配置将立即更新。
删除工作负载级别Sidecar代理配置
- 登录ASM控制台。
- 在左侧导航栏,选择服务网格 > 网格管理。
- 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
- 在网格详情页面左侧导航栏选择Sidecar管理(数据面) > Sidecar代理配置。
- 在Sidecar代理配置页面单击工作负载页签。
- 在工作负载页签下找到希望更新的工作负载级别Sidecar代理配置,在操作栏单击删除,对应工作负载级别Sidecar代理配置将被删除,对应配置将会在下次注入Sidecar代理时失效。
四、在Pod范围级别配置Sidecar代理
在Pod范围级别,您需要修改Pod的配置,为Pod加入特定的Annotation以配置Pod中的Sidecar代理。请参考https://help.aliyun.com/document_detail/358835.html进行配置。
Sidecar代理配置项说明
您可以针对Sidecar代理的资源占用、流量拦截策略、DNS代理、生命周期等方面进行参数配置。本章将针对不同的Sidecar代理配置项的作用及配置方法进行说明。
ASM支持设置的Sidecar代理配置项如下:
- 注入的Istio代理资源设置
- istio-init初始化容器资源设置
- istio-proxy线程数
- 拦截对外访问的地址范围
- 不拦截对外访问的地址范围
- 设置端口使出口流量经过Sidecar代理
- 设置端口使出口流量免于经过Sidecar代理
- 设置端口使入口流量经过Sidecar代理
- 设置端口使入口流量免于经过Sidecar代理
- 启用DNS代理功能
- HoldApplicationUntilProxyStarts
- Sidecar代理终止等待时长
- Sidecar代理生命周期
- 外部服务访问策略
- Sidecar入站流量拦截策略
- 日志级别
- Sidecar代理环境变量配置
注入的Istio代理资源设置
配置项说明
该配置项用于配置Sidecar代理容器在运行时最小需要使用的CPU和内存资源、以及最大能够申请到的CPU和内存资源。配置项共有两个子项,包括资源限制和所需资源:
配置子项 | 描述 |
---|---|
资源限制 | Sidecar代理容器最大能申请到的CPU和内存资源。其中,CPU资源以核数(Core)为单位,内存资源以MiB为单位。 |
所需资源 | Sidecar代理容器运行时最小需要使用的CPU和内存资源。其中,CPU资源以核数(Core)为单位,内存资源以MiB为单位。 |
配置示例
作为示例,您可以对Istio代理资源设置进行以下配置:
- 在Sidecar代理配置页面中,找到资源设置 > 注入的Istio代理资源设置,若非全局级别配置,您需要勾选此项。
- 在资源限制子项下,将CPU配置为2 Core、内存设置为1025MiB。
- 在所需资源子项下,将CPU配置为0.1 Core、内存设置为128MiB。
- Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的Istio代理资源。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
...
spec:
containers:
- args:
- proxy
...
name: istio-proxy
...
resources:
limits:
cpu: '2'
memory: 1025Mi
requests:
cpu: 100m
memory: 128Mi
...
可以查看到Pod中名称为istio-proxy的resources字段,该字段已经被设置成在注入的Istio代理资源设置中配置的资源值。istio-proxy容器即为Sidecar代理容器。
istio-init初始化容器资源设置
配置项说明
该配置项用于配置注入Sidecar代理的Pod中的istio-init容器在运行时最小需要使用的CPU和内存资源、以及最大能够申请到的CPU和内存资源。其中,istio-init容器是注入Sidecar代理的Pod在启动时执行的初始化容器,用于为Sidecar代理容器配置流量拦截路由规则等。配置项共有两个子项,包括资源限制和所需资源:
配置子项 | 描述 |
---|---|
资源限制 | istio-init容器最大能申请到的CPU和内存资源。其中,CPU资源以核数(Core)为单位,内存资源以MiB为单位。 |
所需资源 | istio-init容器运行时最小需要使用的CPU和内存资源。其中,CPU资源以核数(Core)为单位,内存资源以MiB为单位。 |
配置示例
作为示例,您可以对istio-init初始化容器资源进行以下配置:
- 在Sidecar代理配置页面中,找到资源设置 > istio-init初始化容器资源设置,若非全局级别配置,您需要勾选此项。
- 在资源限制子项下,将CPU配置为1 Core、内存设置为512MiB。
- 在所需资源子项下,将CPU配置为0.1 Core、内存设置为128MiB。
- Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的istio-init初始化容器资源。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
...
spec:
...
initContainers:
- args:
...
name: istio-init
resources:
limits:
cpu: '1'
memory: 512Mi
requests:
cpu: 100m
memory: 128Mi
...
可以查看到Pod中名称为istio-init的初始化容器包含了resources字段,该字段已经被设置成在注入的Istio代理资源设置中配置的资源值。
istio-proxy线程数
配置项说明
该配置项用于配置Sidecar代理容器运行的工作线程数量。此项需要输入一个非负整数,以代表Sidecar代理容器的线程数。当此项被设为0时,工作线程数量将根据为Sidecar代理配置的所需CPU资源或CPU资源限制进行自动选择(资源限制优先于所需资源)。
配置示例
作为示例,您可以对istio-proxy线程数进行以下配置:
- 在Sidecar代理配置页面中,找到资源设置 > Istio-Proxy线程数,若非全局级别配置,您需要勾选此项。
- 在Istio-Proxy线程数下方的输入框中输入3,代表Sidecar代理容器运行时将启动3条工作线程。
- Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的istio-proxy线程数。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
...
spec:
...
- args:
- proxy
- sidecar
- '--domain'
- $(POD_NAMESPACE).svc.cluster.local
- '--proxyLogLevel=warning'
- '--proxyComponentLogLevel=misc:error'
- '--log_output_level=default:info'
- '--concurrency'
- '3'
...
name: istio-proxy
...
可以查看到istio-proxy容器的运行参数中,concurrency被设定为3,与Sidecar代理配置中设置的参数值一致,此参数会为Sidecar代理容器设置工作线程数量。
拦截对外访问的地址范围
配置项说明
在此项中,您需要配置一个以英文逗号“,”区隔的IP地址范围列表,其中的每个IP地址范围都以CIDR形式表示。当注入Sidecar代理的工作负载访问其它服务时(此时,Sidecar代理拦截出站流量),只有目的地IP地址在配置的地址范围中的请求会被Sidecar代理拦截,其它请求则直接不经过Sidecar代理直接发往目的地。
此项也可以配置为通配符“”,当配置为“”时,代表Sidecar代理将拦截工作负载所有的出站流量。默认情况下,此项将被配置为“*”。
配置示例
作为示例,您可以进行以下配置:
- 在Sidecar代理配置页面中,找到按端口或地址来启用/禁用Sidecar代理 > 拦截对外访问的地址范围,若非全局级别配置,您需要首先勾选此项。
- 在拦截对外访问的地址范围右侧的输入框中输入
192.168.0.0/16,10.1.0.0/24
,代表Sidecar代理容器将拦截目的地IP地址在192.168.0.0/16
和10.1.0.0/24
两个CIDR内部的请求。 - Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的拦截对外访问的地址范围。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
...
spec:
...
initContainers:
- args:
- istio-iptables
- '-p'
- '15001'
- '-z'
- '15006'
- '-u'
- '1337'
- '-m'
- REDIRECT
- '-i'
- '192.168.0.0/16,10.1.0.0/24'
- '-x'
- 192.168.0.1/32
- '-b'
- '*'
- '-d'
- '15090,15021,15081,9191,15020'
- '--log_output_level=default:info'
...
name: istio-init
...
可以查看到istio-init容器的运行参数中设置了-i 192.168.0.0/16,10.1.0.0/24
,与Sidecar代理配置中设定的IP地址范围一致,代表已经成功设置拦截对外访问的地址范围。
不拦截对外访问的地址范围
配置项说明
在此项中,您需要配置一个以英文逗号“,”区隔的IP地址范围列表,其中的每个IP地址范围都以CIDR形式表示。当注入Sidecar代理的工作负载访问其它服务时(此时,Sidecar代理拦截出站流量),若请求目的地IP地址位于该项配置的CIDR中,则请求不会被Sidecar代理拦截。
:::info
注意:当不拦截对外访问的地址范围中包含拦截对外访问的地址范围指定的地址时,请求此地址将不会被Sidecar代理所拦截。
:::
配置示例
作为示例,您可以进行以下配置:
- 在Sidecar代理配置页面中,找到按端口或地址来启用/禁用Sidecar代理 > 不拦截对外访问的地址范围,若非全局级别配置,您需要首先勾选此项。
- 在拦截对外访问的地址范围右侧的输入框中输入
10.1.0.0/24
,代表Sidecar代理容器将不会拦截目的地IP地址在CIDR10.1.0.0/24
内部的请求。 - Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的不拦截对外访问的地址范围。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
...
spec:
...
initContainers:
- args:
- istio-iptables
- '-p'
- '15001'
- '-z'
- '15006'
- '-u'
- '1337'
- '-m'
- REDIRECT
- '-i'
- '*'
- '-x'
- '192.168.0.1/32,10.1.0.0/24'
- '-b'
- '*'
- '-d'
- '15090,15021,15081,9191,15020'
- '--log_output_level=default:info'
...
name: istio-init
...
可以查看到istio-init容器的运行参数中设置了-x 192.168.0.1/32,10.1.0.0/24
,192.168.0.1/32
为默认设置的主机地址CIDR,而10.1.0.0/24
与Sidecar代理配置中设定的IP地址范围一致,代表已经成功设置不拦截对外访问的地址范围。
设置端口使出口流量经过Sidecar代理
配置项说明
在此项中,您需要配置一个以英文逗号“,”区隔的端口号列表,代表一系列出站流量目的服务的端口。配置后,凡目的服务端口在列表之中的请求均会被Sidecar代理拦截。
:::info
注意:如果同时配置了不拦截对外访问的地址范围或者设置端口使出口流量经过Sidecar代理,当请求目标IP地址位于不拦截的CIDR范围中、或是请求目标服务端口位于不拦截的端口列表中时,即使目标端口位于该项的列表之中,请求也不会被Sidecar代理拦截。
:::
配置示例
作为示例,您可以进行以下配置:
- 在Sidecar代理配置页面中,找到按端口或地址来启用/禁用Sidecar代理 > 设置端口使出口流量经过Sidecar代理,若非全局级别配置,您需要首先勾选此项。
- 在设置端口使出口流量经过Sidecar代理右侧的输入框中输入
80,443
,代表Sidecar代理容器将拦截发往80端口和443端口服务的请求。 - Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的出站流量拦截端口。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
...
spec:
...
initContainers:
- args:
- istio-iptables
- '-p'
- '15001'
- '-z'
- '15006'
- '-u'
- '1337'
- '-m'
- REDIRECT
- '-i'
- '*'
- '-x'
- 192.168.0.1/32
- '-b'
- '*'
- '-d'
- '15090,15021,15081,9191,15020'
- '--log_output_level=default:info'
- '-q'
- '80,443'
- '--log_output_level=default:info'
...
name: istio-init
...
可以查看到istio-init容器的运行参数中设置了-q 80,443
,与Sidecar代理配置中设定的出向端口一致,代表已经成功设置了80和443端口使出口流量经过Sidecar代理。
设置端口使出口流量免于经过Sidecar代理
配置项说明
在此项中,您需要配置一个以英文逗号“,”区隔的端口号列表,代表一系列出站流量目的服务的端口。配置后,凡目的服务端口在列表之中的请求均不会被Sidecar代理拦截,而不考虑目的服务的IP地址是否在拦截对外访问的地址范围之内、或是目的服务的端口是否在拦截对外访问的端口列表之内。
配置示例
作为示例,您可以进行以下配置:
- 在Sidecar代理配置页面中,找到按端口或地址来启用/禁用Sidecar代理 > 设置端口使出口流量免于经过Sidecar代理,若非全局级别配置,您需要首先勾选此项。
- 在设置端口使出口流量免于经过Sidecar代理右侧的输入框中输入
8000
,代表Sidecar代理容器将不再拦截发往8000端口服务的请求。 - Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的出站流量不拦截端口。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
...
spec:
...
initContainers:
- args:
- istio-iptables
- '-p'
- '15001'
- '-z'
- '15006'
- '-u'
- '1337'
- '-m'
- REDIRECT
- '-i'
- '*'
- '-x'
- 192.168.0.1/32
- '-b'
- '*'
- '-d'
- '15090,15021,15081,9191,15020'
- '--log_output_level=default:info'
- '-o'
- '8000'
...
name: istio-init
...
可以查看到istio-init容器的运行参数中设置了-o 8000
,与Sidecar代理配置中设定的出向端口一致,代表已经成功设置了8000端口使出口流量经过Sidecar代理。
设置端口使入口流量经过Sidecar代理
配置项说明
在此项中,您需要配置一个以英文逗号“,”区隔的端口号列表。在配置此项后,只有目标端口在列表之中的流量会被Sidecar代理拦截。
此项也可以配置为通配符“”,当配置为“”时,代表Sidecar代理将拦截工作负载所有的入站流量。默认情况下,此项将被配置为“*”。
配置示例
作为示例,您可以进行以下配置:
- 在Sidecar代理配置页面中,找到按端口或地址来启用/禁用Sidecar代理 > 设置端口使入口流量经过Sidecar代理,若非全局级别配置,您需要首先勾选此项。
- 在设置端口使入口流量经过Sidecar代理右侧的输入框中输入
80,443
,代表Sidecar代理容器将仅拦截发往本工作负载80端口和443端口的请求。 - Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的入站流量拦截端口。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
...
spec:
...
initContainers:
- args:
- istio-iptables
- '-p'
- '15001'
- '-z'
- '15006'
- '-u'
- '1337'
- '-m'
- REDIRECT
- '-i'
- '*'
- '-x'
- 192.168.0.1/32
- '-b'
- '80,443'
- '-d'
- '15090,15021,15081,9191,15020'
- '--log_output_level=default:info'
...
name: istio-init
...
可以查看到istio-init容器的运行参数中设置了-b 80,443
,与Sidecar代理配置中设定的入向端口一致,代表已经成功设置了80和443端口使入口流量经过Sidecar代理。
设置端口使入口流量免于经过Sidecar代理
配置项说明
在此项中,您需要配置一个以英文逗号“,”区隔的端口号列表。在配置此项后,目标端口在列表之中的流量将不会被Sidecar代理拦截。
:::info
注意:此配置项仅在设置端口使入口流量经过Sidecar代理被配置为“*”的情况下生效(即Sidecar代理默认拦截所有入站流量)。
:::
配置示例
作为示例,您可以进行以下配置:
- 在Sidecar代理配置页面中,找到按端口或地址来启用/禁用Sidecar代理 > 设置端口使入口流量免于经过Sidecar代理,若非全局级别配置,您需要首先勾选此项。
- 在设置端口使入口流量免于经过Sidecar代理右侧的输入框中输入
8000
,代表Sidecar代理容器将不再拦截发往本工作负载8000端口的请求。 - Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的入站流量免拦截端口。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
...
spec:
...
initContainers:
- args:
- istio-iptables
- '-p'
- '15001'
- '-z'
- '15006'
- '-u'
- '1337'
- '-m'
- REDIRECT
- '-i'
- '*'
- '-x'
- 192.168.0.1/32
- '-b'
- '*'
- '-d'
- '15090,15021,15081,9191,15020,8000'
- '--log_output_level=default:info'
...
name: istio-init
...
可以查看到istio-init容器的运行参数中设置了-d 15090,15021,15081,9191,8000
,其中15090等端口是Sidecar代理的应用端口,默认位于不拦截范围之内;最后的8000端口与Sidecar代理配置中设定的入向端口一致,代表已经成功设置了8000端口使入口流量免于经过Sidecar代理。
启用DNS代理功能
配置项说明
在此项中,您可以选择为Sidecar代理启用或关闭DNS代理功能。启用DNS代理功能后,Sidecar代理将拦截工作负载的DNS请求,以提高服务网格的性能和可用性。
具体来说,来自工作负载的所有请求将被重定向至Sidecar代理,由于Sidecar代理在本地存储IP地址到本地域名的映射,Sidecar代理将可以直接返回DNS响应给工作负载,避免再向远端的DNS服务发送请求。若DNS请求无法被Sidecar代理处理,Sidecar将会原样转发DNS请求。详细信息,您可以参考:https://help.aliyun.com/document_detail/205486.html。
:::info
注意:由于网络权限问题,您将无法在运行于ASK集群或运行ECI Pod的ACK集群之上为Sidecar代理启用DNS代理功能。
:::
配置示例
作为示例,您可以进行以下配置:
- 在Sidecar代理配置页面中,找到DNS代理功能 > 启用DNS代理功能,若非全局级别配置,您需要首先勾选此项。
- 打开启用DNS代理功能右侧的开关,代表为Sidecar代理启用DNS代理功能。
- Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的DNS代理功能。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
spec:
containers:
- args:
- proxy
- sidecar
- '--domain'
- $(POD_NAMESPACE).svc.cluster.local
- '--proxyLogLevel=warning'
- '--proxyComponentLogLevel=misc:error'
- '--log_output_level=default:info'
- '--concurrency'
- '3'
env:
...
- name: ISTIO_META_DNS_AUTO_ALLOCATE
value: 'true'
- name: ISTIO_META_DNS_CAPTURE
value: 'true'
...
name: istio-proxy
可以查看到istio-proxy容器的ISTIO_META_DNS_AUTO_ALLOCATE环境变量和ISTIO_META_DNS_CAPTURE黄金变量被设置为true,代表DNS代理功能已经开启。
HoldApplicationUntilProxyStarts
配置项说明
HoldApplicationUntilProxyStarts是一项针对Sidecar代理生命周期的管理配置项。在默认情况下,HoldApplicationUntilProxyStarts被设定为开启,对应行为为:对于注入Sidecar代理的Pod,Pod在启动时需要先保证Sidecar代理容器启动成功,之后才能启动Pod中的业务容器,以确保发往业务容器的流量不会因Sidecar代理未启动完成而丢失。
若此配置项被设定为关闭,则Pod中的Sidecar代理容器及业务容器会同时启动。在集群中大量部署Pod时,Sidecar代理容器可能因为apiserver压力较大而发生启动较慢的情况,此时可以考虑关闭HoldApplicationUntilProxyStarts配置项来提升部署速度。
配置示例
作为示例,您可以进行以下配置:
- 在Sidecar代理配置页面中,找到生命周期管理 > HoldApplicationUntilProxyStarts,若非全局级别配置,您需要首先勾选此项。
- 关闭HoldApplicationUntilProxyStarts右侧的开关,代表不启用HoldApplicationUntilProxyStarts能力。
- Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的HoldApplicationUntilProxyStarts功能。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
...
name: sleep
...
env:
- name: PROXY_CONFIG
value: >-
{..."holdApplicationUntilProxyStarts":false,...}
...
name: istio-proxy
...
可以观察到,holdApplicationUntilProxyStarts功能关闭后,istio-proxy容器不再强制声明于业务容器之前,也不再声明默认的lilfecycle字段,代表此时服务网格已经不再强制确保Sidecar代理容器启动成功后才启动业务容器。
Sidecar代理终止等待时长
配置项说明
Sidecar代理终止等待时长是一项针对Sidecar代理生命周期的管理配置项。为Pod注入Sidecar代理后,业务Pod的流量会被Sidecar代理拦截。
当Pod开始停止时,对应的Service不再转发流量给Pod,而Sidecar代理在收到退出信号后会等待一段时间,在这段时间内,不再接受新的入站流量,继续处理存量的入站流量(出站流量不受影响,可以正常发起),这段时间被称为Sidecar代理终止等待时长。默认情况下,Sidecar代理的终止等待时长为5s。
如果被停止的服务提供的接口调用的耗时较长,超过了Sidecar代理的终止等待时长,已有的入站连接和出站连接即使没有处理完成也会被终止,造成某些请求的丢失。此时,您可以利用此配置项延长Sidecar代理终止等待时长,使得入站和出站流量的处理能够完成。
Sidecar代理终止等待时长需要配置为以s为单位的秒数,如10s。
配置示例
作为示例,您可以进行以下配置:
- 在Sidecar代理配置页面中,找到生命周期管理 > Sidecar代理终止等待时长,若非全局级别配置,您需要首先勾选此项。
- 在Sidecar代理终止等待时长右侧的输出框中输入
10s
,代表Sidecar代理将在终止时等待10s来处理存量连接。 - Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的Sidecar代理终止等待时长。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
...
spec:
containers:
- args:
...
env:
- name: TERMINATION_DRAIN_DURATION_SECONDS
value: '10'
...
- name: PROXY_CONFIG
value: >-
{..."terminationDrainDuration":"10s"}
...
name: istio-proxy
...
可以观察到,Pod中的istio-proxy容器配置了值为10
的TERMINATION_DRAIN_DURATION_SECONDS
环境变量,并在PROXY_CONFIG
环境变量中记录了terminationDrainDuration
为10s
,代表Sidecar代理终止等待时长已经配置生效。
Sidecar代理生命周期
配置项说明
Sidecar代理生命周期允许您完全定制Sidecar代理容器的容器声明周期回调。在此配置项中,您需要填写以json格式声明的容器生命周期回调(lifecycle)字段,该字段会替换掉Sidecar代理容器默认配置的容器生命周期回调字段。有关容器声明周期回调的概念,您可以参考容器生命周期回调。
配置示例
作为示例,您可以进行以下配置:
- 在Sidecar代理配置页面中,找到生命周期管理 > Sidecar代理生命周期,若非全局级别配置,您需要首先勾选此项。
- 在Sidecar代理生命周期下方的输出框中输入以下内容,其中配置了postStart与preStop回调参数,分别设置启用Sidecar容器后等待pilot-agent启动、以及设置停止Sidecar容器前休眠13秒。
{
"postStart": {
"exec": {
"command": [
"pilot-agent",
"wait"
]
}
},
"preStop": {
"exec": {
"command": [
"/bin/sh",
"-c",
"sleep 13"
]
}
}
}
- Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的Sidecar代理生命周期。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
...
spec:
containers:
- args:
...
...
lifecycle:
postStart:
exec:
command:
- pilot-agent
- wait
preStop:
exec:
command:
- /bin/sh
- -c
- sleep 13
name: istio-proxy
...
可以观察到,Pod中istio-proxy容器的容器生命周期回调(lifecycle)字段已经被修改为配置项中配置的内容,代表Sidecar代理生命周期已经设置完成。
外部服务访问策略
配置项说明
此配置项设置Sidecar代理对于外部服务的访问策略,“外部服务”是指未被服务网格注册的网格外服务。默认情况下,被服务网格管理的Kubernetes集群中的服务都属于被注册的服务,除此之外,您也可以通过声明服务条目(ServiceEntry)资源来手动为服务网格注册服务,不在此列服务之内的则都属于外部服务。
您可以为此配置项选择两种策略:
- ALLOW_ANY:默认的外部服务访问策略,Sidecar代理将允许访问外部服务,并原样转发发往外部服务的请求。
- REGISTRY_ONLY:Sidecar代理将拒绝对外部服务的访问,工作负责将无法建立与外部服务之间的连接。
:::info
注意:此配置项为全局配置,您只能在全局级别设置此项,要在命名空间或工作负载级别设置外部服务访问策略,您需要在Sidecar资源中进行配置
:::
配置示例
作为示例,您可以进行以下配置:
- 在Sidecar代理配置页面中,找到外部服务访问策略> 对外部服务的访问策略OutboundTrafficPolicy
- 在对外部服务的访问策略OutboundTrafficPolicy右侧的单选框中选中REGISTRY_ONLY,代表限制网格中的服务访问外部服务。
- Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 使用以下内容,创建sleep.yaml。
apiVersion: v1
kind: ServiceAccount
metadata:
name: sleep
---
apiVersion: v1
kind: Service
metadata:
name: sleep
labels:
app: sleep
service: sleep
spec:
ports:
- port: 80
name: http
selector:
app: sleep
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sleep
spec:
replicas: 1
selector:
matchLabels:
app: sleep
template:
metadata:
labels:
app: sleep
spec:
terminationGracePeriodSeconds: 0
serviceAccountName: sleep
containers:
- name: sleep
image: curlimages/curl
command: ["/bin/sleep", "3650d"]
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /etc/sleep/tls
name: secret-volume
volumes:
- name: secret-volume
secret:
secretName: sleep-secret
optional: true
---
- 执行以下命令,部署sleep应用。
kubectl apply -f sleep.yaml -n default
- 执行以下命令,通过sleep应用访问外部服务。
kubectl exec -it {sleep Pod名称} -c sleep -- curl www.aliyun.com -v
预期输出:
* Trying *********...
* Connected to www.aliyun.com (********) port 80 (#0)
> GET / HTTP/1.1
> Host: www.aliyun.com
> User-Agent: curl/7.87.0-DEV
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 502 Bad Gateway
< date: Mon,********* 03:25:00 GMT
< server: envoy
< content-length: 0
<
* Connection #0 to host www.aliyun.com left intact
可以发现注入了Sidecar代理的Sleep应用无法访问外部服务www.aliyun.com,代表外部服务访问策略已经成功配置为REGISTRY_ONLY。
Sidecar入站流量拦截策略
配置项说明
此配置项设置Sidecar代理对于入站流量的拦截策略。在默认情况下,Sidecar代理使用iptables重定向策略对发往应用程序工作负载的入站流量进行拦截,在重定向拦截入站流量后,应用程序将只能看到Sidecar代理的ip作为请求的源ip,而无法看到真正的客户端原始ip。
通过将入站流量拦截策略改为透明代理策略(TPROXY),服务网格将允许Sidecar代理使用iptables的透明代理模式对入站流量进行拦截,此时,应用程序将可以看到客户端原始ip。有关更多入站流量拦截策略背景信息,参见:在服务网格环境下如何保持服务访问时的客户端源IP。
配置示例
作为示例,您可以进行以下配置:
- 在Sidecar代理配置页面中,找到Sidecar入站流量拦截策略> Sidecar入站流量拦截策略,若非全局级别配置,您需要首先勾选此项。
- 在Sidecar入站流量拦截策略右侧的单选框中选择透明代理策略,代表Sidecar代理以透明代理模式对入站流量进行拦截。
- Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的Sidecar入站流量拦截策略。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
...
spec:
containers:
- args:
...
- name: PROXY_CONFIG
value: >-
{..."interceptionMode":"TPROXY",...}
- name: ISTIO_META_POD_PORTS
value: |-
[
]
...
name: istio-proxy
...
initContainers:
- args:
- istio-iptables
- '-p'
- '15001'
- '-z'
- '15006'
- '-u'
- '1337'
- '-m'
- TPROXY
...
name: istio-init
...
可以观察到,Pod中istio-proxy容器的Sidecar配置环境变量中记录了"interceptionMode":"TPROXY"
的信息,同时istio-init容器在初始化时也相应使用TPROXY参数运行初始化指令,代表Sidecar代理配置成功。
日志级别
配置项说明
此配置项用于设置Sidecar代理容器的日志级别。Sidecar代理默认拥有info的日志级别,您可以将Sidecar代理的日志级别修改为info、debug、trace、warning、error、critical、off七种级别之一,以在Sidecar代理中获取更多或更少的日志信息。
配置示例
作为示例,您可以进行以下配置:
- 在Sidecar代理配置页面中,找到监控统计 > 日志级别,若非全局级别配置,您需要首先勾选此项。
- 在日志级别右侧的选择框中选择error,代表Sidecar代理将以error级别进行日志输出,只有级别为error或以上的日志会被输出。
- Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的Sidecar代理日志级别。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
...
spec:
containers:
- args:
- proxy
- sidecar
- '--domain'
- $(POD_NAMESPACE).svc.cluster.local
- '--proxyLogLevel=error'
...
name: istio-proxy
...
可以观察到,istio-proxy容器的运行参数被设定为--proxyLogLevel=error
,日志级别配置成功。
proxyStatsMatcher
配置项说明
此配置项用于定义Sidecar代理上报的自定义Envoy统计指标信息。Envoy是Sidecar代理的技术实现,可以统计并上报一系列的指标信息,但服务网格默认仅开启其中一部分指标的统计与暴露,以减少对Sidecar代理的性能损耗。
您可以在此配置项中,通过前缀匹配、后缀匹配、或者正则匹配的方法,指定匹配Sidecar代理需要额外统计上报的指标信息。
配置示例
作为示例,您可以进行以下配置:
- 在Sidecar代理配置页面中,找到监控统计 > proxyStatsMatcher,若非全局级别配置,您需要首先勾选此项。
- 在proxyStatsMatcher下方勾选正则匹配,并在正则匹配下方添加一项,输入
.*outlier_detection.*
,代表为Sidecar代理加入熔断指标的统计。 - Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的Sidecar代理自定义统计指标信息。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
...
spec:
containers:
- args:
...
- name: PROXY_CONFIG
value: >-
{..."proxyStatsMatcher":{"inclusionRegexps":[".*outlier_detection.*"]},...}
...
可以观察到,Pod中istio-proxy容器的Sidecar配置环境变量中已经更新了自定义统计指标信息,代表Sidecar代理配置成功。
Sidecar代理环境变量配置
配置项说明
此配置项用于配置在Sidecar代理容器中额外添加的环境变量。您可以针对两项Sidecar代理环境变量进行配置。
- 在Sidecar代理启动前加载bootstrap配置
开启此项后,会对应在Sidecar代理容器的环境变量中添加环境变量BOOTSTRAP_XDS_AGENT: "true"
,该环境变量的作用如下:
在Sidecar代理容器启动时,容器中的pilot-agent进程将为Envoy代理生成BOOTSTRAP引导配置并启动Envoy代理,设置BOOTSTRAP_XDS_AGENT
能够让pilot-agent在启动Envoy代理之前,先通过xDS API从控制面动态地获取Envoy代理的BOOTSTRAP引导配置。这允许您能够通过xDS API来自定义Envoy代理的BOOTSTRAP引导配置,比如,您能够通过编写作用于BOOTSTRAP配置部分的Envoy过滤器来自定义BOOTSTRAP配置。
- 终止Pod时等待Sidecar连接数归零
开启此项后,会对应在Sidecar代理容器的环境变量中添加环境变量EXIT_ON_ZERO_ACTIVE_CONNECTIONS: "true"
,该环境变量的作用如下:
在Sidecar代理容器停止时,默认情况下,容器中的pilot-agent进程将停止Envoy代理对入向流量的监听,并等待一段时间(这段时间由配置项Sidecar代理终止等待时长决定),最后停止Envoy代理进程。
而设置EXIT_ON_ZERO_ACTIVE_CONNECTIONS
后,在Sidecar代理容器停止时,容器中的pilot-agent进程将首先停止Envoy代理对入向流量的监听,并等待默认的5s,等待完成后开始轮询Envoy代理的活跃连接数状态,直到活跃连接数变为0后再停止Envoy代理进程。设置EXIT_ON_ZERO_ACTIVE_CONNECTIONS
能够在常见情况下改善Sidecar代理容器的终止生命周期流程,在尽可能缩短终止时间的同时减少终止时被丢弃的请求。
:::info
注意:如果您设置了终止Pod时等待Sidecar连接数归零,则配置项 Sidecar代理终止等待时长 将不再起作用。
:::
配置示例
作为示例,您可以进行以下配置:
- 在Sidecar代理配置页面中,找到Sidecar代理环境变量配置 > 在Sidecar代理启动前加载bootstrap配置 与 Sidecar代理环境变量配置 > 终止Pod时等待Sidecar连接数归零,若非全局级别配置,您需要首先勾选此项。
- 打开两个配置项右侧的开关。
- Sidecar代理配置更新后,参考背景信息,重新部署工作负载,使Sidecar代理配置生效。
- 参考获取集群KubeConfig并通过kubectl工具连接集群,通过kubectl连接ACK集群。
- 执行以下命令,查看设置的Sidecar代理自定义统计指标信息。
kubectl get pod -n <命名空间名称> <Pod名称> -o yaml
预期输出:
apiVersion: v1
kind: Pod
...
spec:
containers:
- args:
...
env:
- name: BOOTSTRAP_XDS_AGENT
value: 'true'
- name: EXIT_ON_ZERO_ACTIVE_CONNECTIONS
value: 'true'
name: istio-proxy
...
可以观察到,Pod中istio-proxy容器的Sidecar配置环境变量中更新了两个额外的环境变量BOOTSTRAP_XDS_AGENT
和EXIT_ON_ZERO_ACTIVE_CONNECTIONS
,代表Sidecar代理配置成功。
Sidecar代理配置项起始支持版本声明
对于不同版本的服务网格ASM,其支持的功能范围往往有所不同。一般来说,新版本服务网格的Sidecar代理将相比老版本拥有更多的功能及参数配置。如果您无法找到某个Sidecar代理配置项,请检查如下的Sidecar代理配置项的起始版本声明,以确认是否需要升级服务网格ASM版本。
全局级别 | 命名空间级别 | 工作负载级别 | |
注入的Istio代理资源设置 | 全部版本 | 1.10.5.34 | 1.13.4.20 |
istio-init初始化容器资源设置 | 1.9.7.93 | 1.10.5.34 | 1.13.4.20 |
istio-proxy线程数 | 1.15.3.104 | 1.12.4.19 | 1.13.4.20 |
拦截对外访问的地址范围 | 全部版本 | 1.10.5.34 | 1.13.4.20 |
不拦截对外访问的地址范围 | 全部版本 | 1.10.5.34 | 1.13.4.20 |
设置端口使出口流量经过Sidecar代理 | 1.15.3.104 | 1.10.5.34 | 1.13.4.20 |
设置端口使出口流量免于经过Sidecar代理 | 全部版本 | 1.10.5.34 | 1.13.4.20 |
设置端口使入口流量经过Sidecar代理 | 1.15.3.104 | 1.10.5.34 | 1.13.4.20 |
设置端口使入口流量免于经过Sidecar代理 | 全部版本 | 1.10.5.34 | 1.13.4.20 |
启用DNS代理功能 | 1.8.3.17 | 1.10.5.34 | 1.13.4.20 |
HoldApplicationUntilProxyStarts | 1.15.3.104 | 1.12.4.58 | 1.13.4.20 |
Sidecar代理终止等待时长 | 1.9.7.93 | 1.10.5.34 | 1.13.4.20 |
Sidecar代理生命周期 | 1.9.7.93 | 1.10.5.34 | 1.13.4.20 |
外部服务访问策略 | 全部版本 | 1.10.5.34 | 1.13.4.20 |
Sidecar入站流量拦截策略 | 1.15.3.25 | 1.15.3.25 | 1.15.3.25 |
日志级别 | 1.15.3.104 | 1.12.4.58 | 1.13.4.20 |
proxyStatsMatcher | 1.15.3.104 | 1.12.4.58 | 1.13.4.20 |
Sidecar代理环境变量管理 | 1.15.3.104 | 1.15.3.104 | 1.15.3.104 |