如何处理 RWO 卷服务的滚动更新部署策略?
How to handle Rolling updates deployment strategy for RWO volume service?
我们在 AKS 中托管了服务,该服务具有 RWO 卷,部署策略为重新创建。
我们最近开始使用这项新服务,我们每天有很多 features/issues 需要交付。由于部署策略是 Recreate,业务团队遇到了一些停机时间(最多 2 分钟),但这很烦人。是否有更好的方法通过滚动更新策略来管理 RWO 卷?
在指定更新部署的方式时,您有两种类型的策略可供选择:
Recreate Deployment: 所有现有的 Pods 在创建新的之前被杀死。
Rolling Update Deployment:部署以滚动更新方式更新Pods。
默认且更推荐的是.spec.strategy.type==RollingUpdate
。请参阅以下示例:
spec:
replicas: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
在此示例中,将有一个额外的 Pod (maxSurge: 1
) 在所需数量 2 之上,并且可用的数量 Pods 不能低于该数量 (maxUnavailable: 0
).
选择这个配置,Kubernetes 将启动一个额外的 Pod,然后停止一个“旧”的。如果有另一个节点可用于部署此 Pod,系统将能够在部署期间处理相同的工作负载。否则,Pod 将部署在已使用的节点上,代价是来自同一节点上托管的其他 Pods 的资源。
您也可以尝试这样的操作:
spec:
replicas: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
对于上面的示例,不会有额外的 Pods (maxSurge: 0
),并且一次只有一个 Pod 不可用 (maxUnavailable: 1
)。
在这种情况下,Kubernetes 会先停止一个 Pod,然后再启动一个新的 Pod。这样做的好处是基础设施不需要扩展,但最大工作量会更少。
如果您选择使用 maxSurge
和 maxUnavailable
的百分比值,您需要记住:
maxSurge
- 绝对数是根据百分比四舍五入
计算出来的
maxUnavailable
- 绝对数是根据百分比向下舍入
计算得出的
在正确定义 RollingUpdate
的情况下,您还必须确保您的应用程序提供端点以供 Kubernetes 查询 return 应用程序的状态。在它下面是一个 /greeting
端点,当它准备好处理请求时,return 是一个 HTTP 200 状态,当它没有准备好时是 HTTP 500:
readinessProbe:
httpGet:
path: /greeting
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 1
initialDelaySeconds
- 完成第一次准备就绪检查之前的时间(以秒为单位)。
periodSeconds
- 第一次准备就绪检查后两次就绪检查之间的时间(以秒为单位)。
successThreshold
- 探测失败后被视为成功的最少连续成功次数。默认为 1。必须为 1 才能活跃。最小值为 1。
timeoutSeconds
- 探测超时后的秒数。默认为 1 秒。最小值为 1。
可以找到有关 liveness/readiness 探针主题的更多信息 here。
这些只是示例,但它们应该让您了解可用于消除停机可能性的特定更新策略。
我们在 AKS 中托管了服务,该服务具有 RWO 卷,部署策略为重新创建。 我们最近开始使用这项新服务,我们每天有很多 features/issues 需要交付。由于部署策略是 Recreate,业务团队遇到了一些停机时间(最多 2 分钟),但这很烦人。是否有更好的方法通过滚动更新策略来管理 RWO 卷?
在指定更新部署的方式时,您有两种类型的策略可供选择:
Recreate Deployment: 所有现有的 Pods 在创建新的之前被杀死。
Rolling Update Deployment:部署以滚动更新方式更新Pods。
默认且更推荐的是.spec.strategy.type==RollingUpdate
。请参阅以下示例:
spec:
replicas: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
在此示例中,将有一个额外的 Pod (maxSurge: 1
) 在所需数量 2 之上,并且可用的数量 Pods 不能低于该数量 (maxUnavailable: 0
).
选择这个配置,Kubernetes 将启动一个额外的 Pod,然后停止一个“旧”的。如果有另一个节点可用于部署此 Pod,系统将能够在部署期间处理相同的工作负载。否则,Pod 将部署在已使用的节点上,代价是来自同一节点上托管的其他 Pods 的资源。
您也可以尝试这样的操作:
spec:
replicas: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
对于上面的示例,不会有额外的 Pods (maxSurge: 0
),并且一次只有一个 Pod 不可用 (maxUnavailable: 1
)。
在这种情况下,Kubernetes 会先停止一个 Pod,然后再启动一个新的 Pod。这样做的好处是基础设施不需要扩展,但最大工作量会更少。
如果您选择使用 maxSurge
和 maxUnavailable
的百分比值,您需要记住:
计算出来的maxSurge
- 绝对数是根据百分比四舍五入
计算得出的maxUnavailable
- 绝对数是根据百分比向下舍入
在正确定义 RollingUpdate
的情况下,您还必须确保您的应用程序提供端点以供 Kubernetes 查询 return 应用程序的状态。在它下面是一个 /greeting
端点,当它准备好处理请求时,return 是一个 HTTP 200 状态,当它没有准备好时是 HTTP 500:
readinessProbe:
httpGet:
path: /greeting
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 1
initialDelaySeconds
- 完成第一次准备就绪检查之前的时间(以秒为单位)。periodSeconds
- 第一次准备就绪检查后两次就绪检查之间的时间(以秒为单位)。successThreshold
- 探测失败后被视为成功的最少连续成功次数。默认为 1。必须为 1 才能活跃。最小值为 1。timeoutSeconds
- 探测超时后的秒数。默认为 1 秒。最小值为 1。
可以找到有关 liveness/readiness 探针主题的更多信息 here。
这些只是示例,但它们应该让您了解可用于消除停机可能性的特定更新策略。