无法使用带有金丝雀注释和 100% 权重的 nginx 入口规则将流量路由到金丝雀版本
Unable to route traffic to canary release using nginx ingress rule with canary annotation and 100 % weight
- 我的应用程序 运行 在命名空间 A 中,版本 X,我能够
通过 nginx 入口控制器访问应用端点 运行
在同一个命名空间 A.
- 我使用版本 Y 启动相同的应用程序堆栈
命名空间 B 并创建指向相同的入口规则
kubernetes.io/ingress.class 作为控制器 运行 在
命名空间 A.
- 此外,我启用了金丝雀注释,权重为 50%。
当我尝试通过入口访问应用程序端点时,请求正在分发
跨越命名空间 A 中的版本 X 运行 和命名空间 A 中的版本 Y 运行
根据指定的权重命名空间 B
- 现在,我将金丝雀权重更改为 100,并看到所有流量都流向命名空间 B 中的版本 Y。
- 以上都符合我的预期
但是,现在我从名称空间 A 中删除了应用程序 pods,但保持原样
- a) 命名空间 A 中的服务 运行(为其定义了入口规则)
- b) 命名空间 A Nginx 控制器中的入口规则 运行 命名空间 A
- c) 命名空间 B 具有所有 pods 运行 各自的服务和入口规则 100 %
- 当我现在尝试访问应用程序端点时,它只是失败了。我知道命名空间 A 中没有活动端点(因为 pods 已被删除)但是 svc 在命名空间 A 中仍然可用,而且 B 中的入口规则启用了权重为 100% 的金丝雀,我期望流量将被路由到命名空间 B 中的 pods,但这并没有发生。
我使用
比较了命名空间 A 中删除 pods 之前和之后的 nginx 控制器配置(100% 金丝雀入口规则完好无损)
kubectl exec <nginx-controller-pod-name> -n <namespace> -- curl localhost:10246/configuration/backends
kubectl exec <nginx-controller-pod-name> -n <namespace> -- cat nginx.conf
命名空间Apods删除前后o/p没有区别
注意:
- Nginx 入口镜像:码头。io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.2
- Kubernetes 版本:1.12.7
这是预期的行为吗?我无法找到导致此行为的原因。
在删除命名空间 A 中的 pods 之前,您需要执行以下操作。
- 删除金丝雀入口
- 指向主应用程序入口以将流量发送到新版本。
如 here 所述,当您删除 pods 时,端点发生变化,端点发生变化既不会重新创建新的 nginx.conf 文件,也不会重新加载它。使用 HTTP POST 请求将新的端点列表发送到 Nginx 内部的 Lua 处理程序 运行。您可以检查 Lua 处理程序的日志来验证 that.In 一个相对较大的集群,该集群经常部署应用程序此功能可以节省大量的 Nginx 重新加载,否则会影响响应延迟、负载平衡质量(每次重新加载 Nginx 后重置负载平衡的状态)所以 on.When 你创建一个新的入口然后它会改变 nginx.conf 并重新加载 it.This 应该解释为什么 nginx.conf.
- 我的应用程序 运行 在命名空间 A 中,版本 X,我能够 通过 nginx 入口控制器访问应用端点 运行 在同一个命名空间 A.
- 我使用版本 Y 启动相同的应用程序堆栈 命名空间 B 并创建指向相同的入口规则 kubernetes.io/ingress.class 作为控制器 运行 在 命名空间 A.
- 此外,我启用了金丝雀注释,权重为 50%。 当我尝试通过入口访问应用程序端点时,请求正在分发 跨越命名空间 A 中的版本 X 运行 和命名空间 A 中的版本 Y 运行 根据指定的权重命名空间 B
- 现在,我将金丝雀权重更改为 100,并看到所有流量都流向命名空间 B 中的版本 Y。
- 以上都符合我的预期
但是,现在我从名称空间 A 中删除了应用程序 pods,但保持原样
- a) 命名空间 A 中的服务 运行(为其定义了入口规则)
- b) 命名空间 A Nginx 控制器中的入口规则 运行 命名空间 A
- c) 命名空间 B 具有所有 pods 运行 各自的服务和入口规则 100 %
- 当我现在尝试访问应用程序端点时,它只是失败了。我知道命名空间 A 中没有活动端点(因为 pods 已被删除)但是 svc 在命名空间 A 中仍然可用,而且 B 中的入口规则启用了权重为 100% 的金丝雀,我期望流量将被路由到命名空间 B 中的 pods,但这并没有发生。
我使用
比较了命名空间 A 中删除 pods 之前和之后的 nginx 控制器配置(100% 金丝雀入口规则完好无损)kubectl exec <nginx-controller-pod-name> -n <namespace> -- curl localhost:10246/configuration/backends
kubectl exec <nginx-controller-pod-name> -n <namespace> -- cat nginx.conf
命名空间Apods删除前后o/p没有区别
注意:
- Nginx 入口镜像:码头。io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.2
- Kubernetes 版本:1.12.7
这是预期的行为吗?我无法找到导致此行为的原因。
在删除命名空间 A 中的 pods 之前,您需要执行以下操作。
- 删除金丝雀入口
- 指向主应用程序入口以将流量发送到新版本。
如 here 所述,当您删除 pods 时,端点发生变化,端点发生变化既不会重新创建新的 nginx.conf 文件,也不会重新加载它。使用 HTTP POST 请求将新的端点列表发送到 Nginx 内部的 Lua 处理程序 运行。您可以检查 Lua 处理程序的日志来验证 that.In 一个相对较大的集群,该集群经常部署应用程序此功能可以节省大量的 Nginx 重新加载,否则会影响响应延迟、负载平衡质量(每次重新加载 Nginx 后重置负载平衡的状态)所以 on.When 你创建一个新的入口然后它会改变 nginx.conf 并重新加载 it.This 应该解释为什么 nginx.conf.