无法使用带有金丝雀注释和100%权重的nginx入口规则将流量路由到金丝雀发布 我的应用程序正在命名空间A中运行,版本为X,我可以 通过运行的nginx入口控制器访问应用程序端点 在同一名称空间A中。 我使用中的版本Y启动相同的应用程序堆栈 命名空间B,并创建指向该命名空间的入口规则 kubernetes.io/ingres.class作为运行在 名称空间A。 此外,我还启用了金丝雀注释,权重为50%。 当我尝试通过入口访问应用程序端点时,请求正在被分发 跨命名空间A中运行的版本X和命名空间A中运行的版本Y 根据指定的权重设置命名空间B 现在,我将金丝雀权重更改为100,并看到所有流量都进入命名空间B中的版本Y。 所有这些都符合我的期望

无法使用带有金丝雀注释和100%权重的nginx入口规则将流量路由到金丝雀发布 我的应用程序正在命名空间A中运行,版本为X,我可以 通过运行的nginx入口控制器访问应用程序端点 在同一名称空间A中。 我使用中的版本Y启动相同的应用程序堆栈 命名空间B,并创建指向该命名空间的入口规则 kubernetes.io/ingres.class作为运行在 名称空间A。 此外,我还启用了金丝雀注释,权重为50%。 当我尝试通过入口访问应用程序端点时,请求正在被分发 跨命名空间A中运行的版本X和命名空间A中运行的版本Y 根据指定的权重设置命名空间B 现在,我将金丝雀权重更改为100,并看到所有流量都进入命名空间B中的版本Y。 所有这些都符合我的期望,kubernetes,nginx-ingress,canary-deployment,Kubernetes,Nginx Ingress,Canary Deployment,但是,现在我从名称空间A中删除了应用程序pod,但保持以下内容不变 在为其定义入口规则的命名空间中运行的服务 b命名空间A中的入口规则运行在命名空间A中的Nginx控制器 c命名空间B的所有POD都以100%的百分比运行各自的服务和入口规则 当我现在尝试访问应用程序端点时,它就失败了。我知道命名空间A中没有活动的端点,因为POD已被删除,但svc在命名空间A中仍然可用,而且B中的入口规则已启用,权重为100%,我原以为流量将路由到命名空间B中的POD,但这并没有发生。 我已经比较了nginx控制

但是,现在我从名称空间A中删除了应用程序pod,但保持以下内容不变

在为其定义入口规则的命名空间中运行的服务 b命名空间A中的入口规则运行在命名空间A中的Nginx控制器 c命名空间B的所有POD都以100%的百分比运行各自的服务和入口规则 当我现在尝试访问应用程序端点时,它就失败了。我知道命名空间A中没有活动的端点,因为POD已被删除,但svc在命名空间A中仍然可用,而且B中的入口规则已启用,权重为100%,我原以为流量将路由到命名空间B中的POD,但这并没有发生。 我已经比较了nginx控制器在删除名称空间A中的pod之前和之后的配置,使用

kubectl exec-n-curl localhost:10246/configuration/backends

kubectl exec-n-cat nginx.conf

删除命名空间A中的POD前后的o/p没有差异

注:

Nginx入口映像:quay.io/kubernetes入口控制器/Nginx入口控制器:0.26.2 Kubernetes版本:1.12.7
这是故意的行为吗?我无法找到导致此行为的原因。

在删除命名空间A中的POD之前,需要执行以下操作

删除金丝雀入口 指向主应用程序入口以向新版本发送流量。
如前所述,删除POD时,端点会发生更改,端点也会发生更改,即不会重新创建新的nginx.conf文件,也不会重新加载该文件。而是使用HTTP POST请求发送到Nginx内部运行的Lua处理程序的新端点列表。您可以检查Lua处理程序的日志以验证这一点。在经常部署应用程序的相对较大的集群中,此功能可以节省大量Nginx重新加载,否则会影响响应延迟,每次重新加载后的负载平衡质量Nginx会重置负载平衡的状态,依此类推。当您创建新入口时,它将更改Nginx.conf并重新加载。这应该解释为什么Nginx.conf没有更改。

谢谢。我已经看到了这些步骤。但是,我无法理解为什么需要第5步和第6步。如前所述,当存在活动端点时,即命名空间A和命名空间B,100%权重将给出预期行为。但是删除名称空间中的pod将开始影响100%权重的配置。此外,我已经尝试在我的入口规则中添加注释nginx.ingres.kubernetes.io/service-upstream:true,这似乎可以在不执行步骤5和6的情况下解决我的问题。但此注释有自己的说明步骤5和步骤6是必需的,因为Nginx不知道POD已被删除..如果您想让Nginx知道您需要配置运行状况检查,我不使用Nginx plus。如上所述,我使用的是这里维护的那个。而且,我无法确定pod IP在哪里可用。删除命名空间A中的pod之前或之后的配置没有差异。配置后端清楚地显示命名空间B的pod IP,但不显示命名空间A的pod IP。交叉检查nginx.conf和curl localhost:10246/configuration/backends在删除命名空间A中的pod之前和之后