
# 数据面sidecar升级不中断业务
应用服务网格作为集群网络管理的重要工具，为网格内的服务提供流量治理与流量监控的能力。sidecar作为应用服务网格数据面的重要组件，需要依赖服务业务pod的更新来实现sidecar的升级和重新注入。
本章节主要介绍如何实现数据面sidecar升级过程中，不中断服务的业务流量。
#### 配置服务实例数
为保证您的服务在sidecar升级的过程中不中断业务流量，首先确保您的服务实例数大于等于2，升级策略为滚动升级（rollingUpdate）。
相关滚动升级策略如下，供参考：
**kubectl get deploy nginx -n** *namespace_name* **-oyaml \| grep strategy -a10**
![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001145684268.png)
**配置项说明：**
- 服务实例数：deployment.spec.replicas \>= 2
- 升级策略：deployment.spec.strategy.type == RollingUpdate
- 滚动升级最小存活实例数：deployment.spec.replicas - deployment.spec.strategy.maxUnavailable \> 0
 
#### 添加readiness探针
添加readiness探针，可以保证您的新实例pod在真正准备就绪时，才开始接管业务流量。这就避免了在新的实例pod未启动时，接管业务流量造成的访问不通问题。
相关配置如下：
**kubectl get deploy nginx -n** *namespace_name* **-oyaml \| grep readinessProbe -a10**
![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001191764069.png)
**配置项说明：**
readiness探针配置项：deployment.spec.template.spec.containers\[i\].readinessProbe
其中，包括探针检查初始时间，检查间隔，超时时间等配置。
#### 设置服务就绪时间
服务就绪时间，minReadySeconds：用于标识pod的ready时间至少保持多长时间，才会认为服务是运行中。
相关配置如下：
**kubectl get deploy nginx -n** *namespace_name* **-oyaml \| grep minReadySeconds -a1**
![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001191923931.png)
**配置项说明：**
服务就绪时间：deployment.spec.minReadySeconds，可根据您业务的实际情况确定。
#### 配置优雅关闭时间
terminationGracePeriodSeconds，优雅关闭时间。在滚动升级过程中，首先会移除旧的服务实例pod的endpoint，并将实例pod的状态置为Terminating，这时K8S会发送SIGTERM信号给pod实例，并等待优雅关闭时间后，将pod强制终止。您可以利用这段时间，处理未完成的请求：
**kubectl get deploy nginx -n** *namespace_name* **-oyaml \| grep terminationGracePeriodSeconds -a1**
![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001191923929.png)
**配置项说明：**
优雅关闭时间：deployment.spec.template.spec.terminationGracePeriodSeconds，默认值为30s，可根据业务诉求适当调整。
#### 配置preStop
preStop会在实例pod中止前调用，可以用来实现业务pod的优雅关闭。此处需要根据业务诉求来进行相应的配置，以Nginx为例。
**kubectl get deploy nginx -n** *namespace_name* **-oyaml \| grep lifec -a10**
![](https://support.huaweicloud.com/bestpractice-asm/zh-cn_image_0000001493677652.png)
在"lifecycle"下的"preStop"中，定义了一个命令**nginx -s quit; sleep 10**，这个命令首先会发送一个优雅关闭信号给Nginx进程，然后暂停10秒。这样，在Pod终止之前，Nginx会有足够的时间完成正在处理的请求并优雅地关闭。
需要注意的是，sleep 10中的10秒是一个示例值，您可以根据实际需要和应用程序的性能来调整这个值，关键是为Nginx提供足够的时间来优雅地关闭。
类似地，您可以选择运行自定义命令或自定义脚本，来优雅关闭您的服务进程。
