【问题标题】:Unable to route traffic to canary release using nginx ingress rule with canary annotation and 100 % weight无法使用带有金丝雀注释和 100% 权重的 nginx 入口规则将流量路由到金丝雀版本
【发布时间】:2020-04-29 02:31:07
【问题描述】:
  • 我的应用程序在命名空间 A 中运行,版本为 X,我能够 通过运行的 nginx 入口控制器访问应用程序端点 在同一个命名空间 A 中。
  • 我使用版本 Y 启动相同的应用程序堆栈 命名空间 B 并创建指向相同的入口规则 kubernetes.io/ingress.class 作为控制器运行在 命名空间 A。
  • 另外,我启用了权重为 50 % 的金丝雀注释。 当我尝试通过入口访问应用程序端点时,请求正在分发 跨在命名空间 A 中运行的版本 X 和在命名空间 A 中运行的版本 Y 命名空间 B 根据指定的权重
  • 现在,我将金丝雀权重更改为 100,然后查看所有流量都流向命名空间 B 中的版本 Y。
  • 以上都符合我的预期
  • 但是,现在我从命名空间 A 中删除了应用程序 pod,但仍保持原样

    • a) 在命名空间 A 中运行的服务(为其定义了入口规则)
    • b) 命名空间 A 中的入口规则在命名空间 A 中运行的 Nginx 控制器
    • c) 命名空间 B 的所有 pod 都使用各自的服务和 100 % 的入口规则运行
  • 当我现在尝试访问应用程序端点时,它只是失败了。我知道命名空间 A 中没有活动端点(因为 pod 已被删除)但 svc 在命名空间 A 中仍然可用,并且 B 中的入口规则启用了权重 100% 的金丝雀,我期望流量将被路由到命名空间中的 pod B ,但这并没有发生。

我比较了在命名空间 A 中删除 pod 前后 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

namespace A中pods删除前后的o/p没有区别

注意:

  • Nginx 入口镜像:quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.26.2
  • Kubernetes 版本:1.12.7

这是预期的行为吗?我找不到导致这种行为的原因。

【问题讨论】:

    标签: kubernetes nginx-ingress canary-deployment


    【解决方案1】:

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

    1. 删除金丝雀入口
    2. 指向主应用入口以将流量发送到新版本。

    here 所述,当您删除 pod 时,端点会更改,并且端点更改既不会重新创建新的 nginx.conf 文件,也不会重新加载它。而是使用 HTTP POST 请求发送到在 Nginx 内运行的 Lua 处理程序的新端点列表。您可以检查 Lua 处理程序的日志来验证。在具有频繁部署应用程序的相对较大的集群中,此功能可以节省大量 Nginx 重新加载,否则会影响响应延迟、负载均衡质量(每次重新加载后 Nginx 都会重置负载均衡状态) 等等。当你创建一个新入口时,它会更改 nginx.conf 并重新加载它。这应该可以解释为什么 nginx.conf 没有更改。

    【讨论】:

    • 谢谢。我已经看到了这些步骤github.com/ContainerSolutions/k8s-deployment-strategies/tree/…。但是,我无法理解为什么需要第 5 步和第 6 步。正如在命名空间 A 和命名空间 B 都存在活动端点时所描述的,100% 的权重给出了预期的行为。但是删除命名空间 A 中的 pod 开始影响 100% 的权重配置。
    • 另外,我已经尝试在我的入口规则中添加注释“nginx.ingress.kubernetes.io/service-upstream: true”,这似乎解决了我的问题而无需执行步骤 5 和 6。但是这个注释有它自己的警告
    • 第 5 步和第 6 步是必需的,因为 Nginx 不知道 Pod 被删除了..如果你想让 Nginx 知道你需要配置健康检查github.com/nginxinc/kubernetes-ingress/tree/master/examples/…
    • 我没有使用 nginx plus (github.com/nginxinc/kubernetes-ingress)。如上所述,我使用的是此处维护的那个 (github.com/kubernetes/ingress-nginx)。
    • 另外,我无法弄清楚 pod IP 在哪里可用。删除命名空间 A 中的 pod 前后配置没有区别。配置后端清楚地显示命名空间 B 的 pod IP,但命名空间 A 没有。前后交叉检查了 nginx.conf 和 curl localhost:10246/configuration/backends删除命名空间 A 中的 pod
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    相关资源
    最近更新 更多