第一次请求新的ReplicaSet超时

时间:2017-11-22 01:10:23

标签: kubernetes

我在AWS上有一个Kubernetes群集,设置为kops

我设置了一个运行Apache容器和部署服务的部署(类型:LoadBalancer)。

当我通过运行kubectl set image ...更新部署时,只要新ReplicaSet的第一个窗格准备就绪,第一个请求到服务超时

我尝试过的事情:

  • 我在pod上设置了readinessProbe,正常工作。
  • 我在pod上运行curl localhost,正常工作。
  • 我为该服务执行了DNS查找,无效。
  • 如果我curl在DNS中查找该DNS查找的IP,则第一个请求将超时。这告诉我这不是ELB问题。

这真的令人沮丧,因为否则我们的Kubernetes堆栈工作得很好,但每次我们部署我们的应用程序时,都会冒着用户超时请求的风险。

1 个答案:

答案 0 :(得分:0)

经过大量调试后,我想我已经解决了这个问题。

TL; DR; Apache必须优雅地退出。

我发现了几个相关的问题:

我尝试了更多的东西:

  • 增加Apache的KeepAliveTimeout,没有帮助。
  • 在pod IP和节点IP上运行 InitializeComponent(); List<string> nonReadebleFonts = new List<string>(); nonReadebleFonts.Add("Wingdings"); foreach (FontFamily font in Fonts.SystemFontFamilies) { ComboBoxItem boxItem = new ComboBoxItem(); boxItem.Content = font.ToString(); Uri s = font.BaseUri; if (!nonReadebleFonts.Contains(font.ToString())) { boxItem.FontFamily = font; } fontsComboBox.Items.Add(boxItem); } ,正常工作。
  • 为几个外部依赖项设置一个curl无选择器服务,认为它可能与DNS查找有关,但没有帮助。

解决方案:

我在pod上设置了preStop生命周期钩子,以优雅地终止Apache运行externalName

问题(至少从我所知道的)是,当pod在部署中被删除时,它们会收到apachectl -k graceful-stop信号,这会导致apache到immediately kill所有孩子。此可能导致竞争条件,其中TERM仍会向已收到kube-proxy信号但未完全终止的广告连播发送一些流量。

还从这个blog post获得了一些关于如何设置钩子的帮助。

我还建议增加PodSpec中的TERM,以便apache有足够的时间优雅地退出。