有没有一种方法可以配置Istio将流量路由到处于终止状态的POD?

时间:2018-10-09 21:22:16

标签: kubernetes istio

我有一个Kubernetes集群,其中部署了两个服务:SvcA和SvcB-都在服务网格中。

SvcA由单个Pod SvcA_P1支持。 SvcA_P1中的应用程序公开了PreStop HTTP挂钩。在SvcA_P1所在的节点上执行“ kubectl排水”命令时,Pod会转换为“终止”状态,并保持该状态,直到应用程序完成其工作(其余请求返回并且Kubernetes删除了Pod)。 SvcA_P1的工作包括完成正在进行的对话(属于已建立的会话)HTTP请求/响应。在完成之前,它可以保持“终止”状态数小时。

当Pod进入“终止”阶段时,Istio Sidecar似乎从池中删除了SvcA_P1。从“ SvcB_P1”发送到SvcA_P1的请求被拒绝,并显示“上游状态不正常”。

是否可以将Istio / Envoy配置为:

  1. 处于“终止”状态时是否继续向SvcA_P1发送具有亲和力的流量/会话?
  2. 拒绝与SvcA_P1没有会话亲缘关系的流量(没有JSESSIONID,cookie或特殊的HTTP标头)?

我一直在玩DestinationRule,没有运气就修改了 var Barchart = function(options){ this.options = options; this.canvas = options.canvas; this.ctx = this.canvas.getContext("2d"); this.colors = options.colors; this.draw = function(){ var maxValue = 0; for (var categ in this.options.data){ maxValue = Math.max(maxValue,this.options.data[categ]); } var canvasActualHeight = this.canvas.height - this.options.padding * 2; var canvasActualWidth = this.canvas.width - this.options.padding * 2; //drawing the grid lines var gridValue = 0; while (gridValue <= maxValue){ var gridY = canvasActualHeight * (1 - gridValue/maxValue) + this.options.padding; drawLine( this.ctx, 0, gridY, this.canvas.width, gridY, this.options.gridColor ); //writing grid markers this.ctx.save(); this.ctx.fillStyle = this.options.gridColor; this.ctx.font = "bold 10px Arial"; this.ctx.fillText(gridValue, 10,gridY - 2); this.ctx.restore(); gridValue+=this.options.gridScale; } //drawing the bars var barIndex = 0; var numberOfBars = Object.keys(this.options.data).length; var barSize = (canvasActualWidth)/numberOfBars; for (categ in this.options.data){ var val = this.options.data[categ]; var barHeight = Math.round( canvasActualHeight * val/maxValue) ; drawBar( this.ctx, this.options.padding + barIndex * barSize, this.canvas.height - barHeight - this.options.padding, barSize, barHeight, this.colors[barIndex%this.colors.length] ); //drawing series name this.ctx.save(); this.ctx.textBaseline="bottom"; this.ctx.textAlign="center"; this.ctx.fillStyle = "#000000"; this.ctx.font = "bold 14px Arial"; this.ctx.fillText(this.options.seriesName, this.canvas.width/2,this.canvas.height); this.ctx.restore(); barIndex++; } //draw legend barIndex = 0; var legend = document.querySelector("legend[for='myCanvasBAR']"); var ul = document.createElement("ul"); legend.append(ul); for (categ in this.options.data){ var li = document.createElement("li"); li.style.listStyle = "none"; li.style.borderLeft = "20px solid "+this.colors[barIndex%this.colors.length]; li.style.padding = "5px"; li.textContent = categ; ul.append(li); barIndex++; } } } var MyBARs = { "10%": 10, "20%": 31, "30%": 70, "40%": 50, "50%": 30, "60%": 20, "70%": 14, "80%": 17, "90%": 155, "100%": 100 }; 。当Envoy删除上游服务器后,将使用减少的服务器集重新哈希新的目的地。

谢谢

雷神

2 个答案:

答案 0 :(得分:1)

根据Kubernetes documentation,必须删除pod时,会同时发生三件事:

  
      
  • 在客户端命令中列出时,Pod显示为“正在终止”
  •   
  • 当Kubelet看到某个Pod已被标记为终止,因为在API服务器中已为Pod设置了“死”计时器时,   它开始吊舱关闭过程。      
        
    • 如果pod定义了preStop挂钩,则会在pod内部调用它。如果宽限期后preStop挂钩仍在运行   到期,然后以较小的(2秒)扩展宽限期调用步骤2   期间。
    •   
  •   
  • 已将Pod从端点列表中删除以进行服务,并且不再视为正在运行的Pod集合中的一部分以进行复制   控制器。缓慢关闭的荚无法继续投放   作为负载均衡器(例如服务代理)的流量将其从   他们的旋转
  •   

一旦Istio像Kubernetes Services之前/之后的网状网络一样工作,不再将处于终止状态的Pod视为流量的目的地,那么调整Istio策略就无济于事。

答案 1 :(得分:0)

是否可以将Istio / Envoy配置为在处于“终止”状态时继续向SvcA_P1发送具有亲和力的流量/会话?

此问题属于Kubernetes级别,而不是Istio / Envoy级别:默认情况下,进入“终止”状态时,会将Pod从其相应的服务中删除。

您可以通过告诉服务以“终止”状态播客Pod来更改该行为:请参见that answer