1
  • 我的应用程序在版本 X 的命名空间 A 中运行,我可以通过在同一命名空间 A 中运行的 nginx 入口控制器访问应用程序端点。
  • 我在命名空间 B 中使用版本 Y 启动相同的应用程序堆栈,并创建指向与在命名空间 A 中运行的控制器相同的 kubernetes.io/ingress.class 的入口规则。
  • 另外,我启用了权重为 50% 的金丝雀注释。当我尝试通过入口访问应用程序端点时,请求将根据指定的权重分布在命名空间 A 中运行的版本 X 和命名空间 B 中运行的版本 Y
  • 现在,我将金丝雀权重更改为 100,并看到所有流量都流向命名空间 B 中的版本 Y。
  • 以上都符合我的预期
  • 但是,现在我从命名空间 A 中删除了应用程序 pod,但保持不变

    • a) 在命名空间 A 中运行的服务(为其定义了入口规则)
    • b) 在命名空间 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

删除命名空间 A 中的 pod 前后的 o/p 没有区别

笔记:

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

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

4

1 回答 1

1

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

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

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

于 2020-01-12T05:15:49.930 回答