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滚动发布服务中断问题的解决的主要内容,如果未能解决你的问题,请参考以下文章