kubernetes滚动发布服务中断问题的解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kubernetes滚动发布服务中断问题的解决相关的知识,希望对你有一定的参考价值。

参考技术A 在kubernates上使用Deployment部署了一个web应用的多个结点。并通过service的方式,将服务提供给外部使用。
但是通过指令修改应用镜像版本,来对应用滚动升级时。

通过浏览器访问应用时,发现应用会在较长一段时间内无法响应请求。后面通过查阅kubernates官方文档及相关文档。了解到应用的滚动更新,对应的控制器需要监听pod的运行状态,当新的rs正常启动以后,新的pod状态就为running了,如果不做其它的检查,控制器就会认为老的rs控制的老的pod就可以更换掉了。其实一般应用在pod进入running状态以后,只是表明容器已经成功分配到了资源开始正常运行了。但应用本身这时还没有进行到可服务的状态,比如:tomcat这里还在加载对应的web应用,应用还要通过spring初始化应用等等等等。

为了判断pod中的应用是否进入到了可服务状态,就需要通过使用pod中的readiness属性做健康检查。
具体的 官方文档 ,也有好心的网友翻译成了 中文文档 。

根据文档,需要对容器对象配置readiness属性,来对容器中的服务进行健康检查。当应用进行可服务状态的时候,再通过控制器更新替换。
在阅读文档的同时了解到了容器的liveness属性,是用来检测服务中的应用健康状态检查的。这个配置在实际应用中还是很有用。比如当我们的web应用内存堆栈溢出了,从实际上来说,该容器已经处于不可使用的状态了,但容器还是处于running状态(大概是因为进程还在)。所以容器不会根据重启策略去重启服务。所以同时将这个属性也配置上。
优化以后的配置如下所示:

其中具体参数请查阅相关文档。

修改更新配置以后,就可以在滚动更新中查看状态

或更新完成后查看相关日志看到效果了。

使用 iOS 4.2 GM 种子将 UITableView 滚动到不可见的行解决方法中断

【中文标题】使用 iOS 4.2 GM 种子将 UITableView 滚动到不可见的行解决方法中断【英文标题】:Scrolling UITableView to non-visible row workaround breaks with iOS 4.2 GM seed 【发布时间】:2010-11-04 19:10:19 【问题描述】:

场景: - 我在弹出窗口中有一个普通的 tableView,它将其高度限制为四个可见行。当弹出视图控制器被初始化时,表数据源数组可能会被填充,例如,10 个元素。 - 我的用户之前选择了保留在核心数据对象中的 10 个元素值之一。 - 初始化弹出视图控制器时,我将用户选择的核心数据值与数据源数组值匹配,并将索引保​​存到名为 selectedIndexPath 的 NSIndexPath 视图控制器属性的行属性中。 - 然后当表格加载时,我选中 selectedIndexPath.row 的单元格并将其滚动到 UITableViewScrollPositionTop。

历史: 我从来没有能够从 viewController viewWillAppear: 或 viewDidLoad 方法获得 tableView:scrollToRowAtIndexPath:atScrollPosition:animated: 或 scrollRectToVisible:animated: 来完成此操作。经过大量的搜索和试验,我找到了一种可行的解决方法。我从 viewController viewWillAppear 中调用了这个方法:

(void)updateContentOffsetForTableView:(UITableView *)tbl withIndexPath:(NSIndexPath *)indexPath 

// Get rect of selected row from which to calculate origin point
CGRect rowRect = [tbl rectForRowAtIndexPath:indexPath];

// Get point of origin of selected row rect
CGPoint ptOffset = CGPointMake(rowRect.origin.x, rowRect.origin.y);

// Set tableView superclass scrollView.contentOffset property with selected row origin     
tbl.contentOffset = ptOffset;

 // Note: the cell checkmarking is done in tableView:cellForRowAtIndexPath:

传递 tableView 和 selectedIndexPath 属性。同样,这按预期工作:例如,数据源数组中的第 10 个元素将与核心数据值匹配,保存到 selectedIndexPath.row 的索引,以及使用 tableView 和 selectedIndexPath 行调用上述方法,并且 tableView 将出现滚动以包含选中标记的行。

问题: 在 4.2 GM 版本中,所需的滚动不再起作用 - 仅显示数据源数组中前四个值的四个 tableView 单元格。例如,第 10 行中的单元格仍会像以前一样被选中,但无法实现将下一行滚动到视图中。

请注意,以前的解决方法仅在从 viewWillAppear 调用时才有效:而不是从 viewDidLoad。随着 4.2 GM 种子的发布,上述解决方法不再有效。

这是在 iPad 应用程序中。我正在使用最近发布的 Xcode 3.2.5 和 iOS SDK 4.2 GM 种子(雪豹)。我已经验证,当我为 iOS SDK 3.2 模拟器和设备构建时,上面的代码有效。在为 iOS SDK 4.2 GM Simulator 和 Device 构建时,上述代码 tableView:scrollToRowAtIndexPath:atScrollPosition:animated: 或 scrollRectToVisible:animated: 均无法实现将所需行滚动到视图中。

这是一个错误吗?任何帮助或想法将不胜感激。

【问题讨论】:

【参考方案1】:

Apple 开发者论坛用户的建议提供了一个可行的解决方案:

这适用于 4.2 GM 种子、模拟器和设备,不再依赖于 UIScrollView.contentOffset hack。

在视图控制器viewWillAppear:方法中:

(void)viewWillAppear:(BOOL)animated 
if (self.savedIndexPath) 
    [self performSelector:@selector(displayRowAtSelectedIndexPath:) withObject:self.savedIndexPath afterDelay:0.0];

调用:

(void)displayRowAtSelectedIndexPath:(NSIndexPath *)indexPath 

if (indexPath == self.savedIndexPath) 
    [self.myTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];

【讨论】:

以上是关于kubernetes滚动发布服务中断问题的解决的主要内容,如果未能解决你的问题,请参考以下文章

更新应用时,如何实现 K8s 零中断滚动更新?

kubernetes应用4

蓝绿部署滚动发布灰度发布的介绍以及最佳实践

Kubernetes 到底解决了什么问题,Kubernetes 的核心功能

Kubernetes 滚动部署和数据库迁移

使用 JavaScript 中断 iOS 滚动