我有一个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配置为:
我一直在玩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删除上游服务器后,将使用减少的服务器集重新哈希新的目的地。
谢谢
雷神
答案 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。