kubernetes ingress-nginx 的 canary 影响指向同一个 service 的所有 ingress

Tags: kubernetes_problem 

本篇目录

说明

这是 ingress-nginx 的金丝雀(canary)发布功能 的配套笔记。

当前版本(0.26.1)的 ingress-nginx 的金丝雀功能存在一个问题,#4667

几个使用不同 host 的 ingress 指向同一个 service 时,如果其中一个 ingress 启用了金丝雀功能,其它的 ingress 都会被动启用金丝雀,请求会被转发给金丝雀版本。

#4667 对该问题有描述。

原因分析

用 ingress-nginx 容器中的 dbg 查看 backends 会发现,启用了金丝雀功能的 backend 中有一个 alternativeBackends,alternativeBackends 就是金丝雀版本的 backend。

$ kubectl -n ingress-nginx exec nginx-ingress-controller-xxx /dbg backends  get canary.echo.example-demo-echo-echo-80
{
  "alternativeBackends": [
    "canary.echo.example-demo-echo-http-record-80"
  ],
  "endpoints": [
    {
      "address": "172.17.0.21",
      "port": "8080"
    }
  ],
  ...

在 ingress-nginx 中的 backends 在代码中对应的是 uptream,uptream 的命名方式是 “namespace-service-port”,因此使用相同的 service 的 ingress,即使使用了不同的域名也会指向相同的 upstream。

当前实现中将金丝雀版本的信息存放在 backends 中,这就出现了问题。ingress A 和 ingress B 使用同样的 service,对应同一个 backend,当 ingress A 启用了金丝雀时,会在与 B 共用的 backend 中设置 alternativeBackends,从而到 ingress B 的请求也被转发给了金丝雀版本。

解决方法

4668 提出了一种解决方法:修改 uptream 的名称格式,包含 host,规避共用 backends 的情况。

4716 的解决方式更好:将金丝雀的信息从 uptream 移动到 location 中,只在启用 canary 的 ingress 中起作用。

4716 还没有合并到 master 中 @2019-10-30 11:37:14。

参考

  1. 李佶澳的博客
  2. ingress-nginx 的金丝雀(canary)发布功能
  3. An Ingress with canary will impact all ingresses with same service

kubernetes_problem

  1. kubernetes ingress-nginx 启用 upstream 长连接,需要注意,否则容易 502
  2. kubernetes ingress-nginx 的 canary 影响指向同一个 service 的所有 ingress
  3. ingress-nginx 启用 tls 加密,配置了不存在的证书,导致 unable to get local issuer certificate
  4. https 协议访问,误用 http 端口,CONNECT_CR_SRVR_HELLO: wrong version number
  5. Kubernetes ingress-nginx 4 层 tcp 代理,无限重试不存在的地址,高达百万次
  6. Kubernetes 集群中个别 Pod 的 CPU 使用率异常高的问题调查
  7. Kubernetes 集群 Node 间歇性变为 NotReady 状态: IO 负载高,延迟严重
  8. Kubernetes的nginx-ingress-controller刷新nginx的配置滞后十分钟导致504
  9. Kubernetes的Nginx Ingress 0.20之前的版本,upstream的keep-alive不生效
  10. Kubernetes node 的 xfs文件系统损坏,kubelet主动退出且重启失败,恢复后无法创建pod
  11. Kubernetes的Pod无法删除,glusterfs导致docker无响应,集群雪崩
  12. Kubernetes集群node无法访问service: kube-proxy没有正确设置cluster-cidr
  13. Kubernetes集群node上的容器无法ping通外网: iptables snat规则缺失导致
  14. Kubernetes问题调查: failed to get cgroup stats for /systemd/system.slice
  15. Kubelet1.7.16使用kubeconfig时,没有设置--require-kubeconfig,导致node不能注册
  16. Kubelet从1.7.16升级到1.9.11,Sandbox以外的容器都被重建的问题调查
  17. Kubernetes: 内核参数rp_filter设置为Strict RPF,导致Service不通
  18. Kubernetes使用过程中遇到的一些问题与解决方法
  19. Kubernetes集群节点被入侵挖矿,CPU被占满
  20. kubernetes的node上的重启linux网络服务后,pod无法联通
  21. kubernetes的pod因为同名Sandbox的存在,一直无法删除
  22. kubelet升级,导致calico中存在多余的workloadendpoint,node上存在多余的veth设备
  23. 使用petset创建的etcd集群在kubernetes中运行失败
  24. Kubernetes 容器启动失败: unable to create nf_conn slab cache
  25. 未在calico中创建hostendpoint,导致开启隔离后,在kubernetes的node上无法访问pod
  26. calico分配的ip冲突,pod内部arp记录丢失,pod无法访问外部服务
  27. kubernetes的dnsmasq缓存查询结果,导致pod偶尔无法访问域名
  28. k8s: rbd image is locked by other nodes
  29. kuberntes的node无法通过物理机网卡访问Service

推荐阅读

Copyright @2011-2019 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: [email protected],备注网站合作

友情链接:  系统软件  程序语言  运营经验  水库文集  网络课程  微信网文  发现知识星球