【问题标题】:How to allow rolling upgrades together with host networking in kubernetes如何在 kubernetes 中允许滚动升级和主机网络
【发布时间】:2023-01-23 18:46:49
【问题描述】:

因为我想利用 AnyIP 并将整个 IPv6 前缀委托给一个套接字侦听器,所以我通过设置 hostNetwork: true 将此子网路由到一个 pod。

现在我希望它在更新服务时具有高可用性。 pod 套接字可以通过设置 SO_RESUSEPORT 并在杀死前一个进程之前启动一个新进程来实现高可用性。但是 kubernetes 不会允许这种情况发生,因为在使用 hostNetwork 时会自动检查主机 IP 和端口:

节点没有用于请求的 pod 端口的空闲端口

到目前为止,我发现的唯一解决方法是通过在每次推出时手动替换清单中的 hostIP 来欺骗 kubernetes。也许有更好的方法:

  • 为此 pod 禁用主机 IP/端口检查
  • 在不设置 hostNetwork 的情况下以某种方式将该子网路由到 pod 网络命名空间(我正在使用 Calico)

允许滚动更新此服务的最佳方法是什么?

【问题讨论】:

    标签: kubernetes calico


    【解决方案1】:

    有几种方法可以通过 Kubernetes 中的主机网络实现滚动更新。这里有几个选项:

    禁用 pod 的主机 IP/端口检查: 你在问题中提到的内容。

    使用具有 sessionAffinity 的服务:“ClientIP”:你可以创建一个 Kubernetes 服务sessionAffinity: "客户端IP"将流量路由到 pod。这允许您在滚动更新期间为多个 pod 使用相同的主机 IP 和端口,还允许客户端在更新期间坚持使用同一个 pod。

    使用带有健康检查的负载均衡器:您可以在 pod 前面使用负载均衡器(如 HAProxy 或 NGINX),并配置健康检查以仅在准备好处理流量后将流量路由到新的 pod。

    使用 DaemonSet: 你可以使用一个DaemonSet将pod部署在每个节点上,这样它会同时运行在多个节点上,pod可以通过扩展副本数来更新。

    将 IPVS 与 kube-proxy 结合使用:您可以将 IPVS 与 kube-proxy 一起使用,为您的服务创建虚拟 IP,这将允许您创建一个可以由 kubernetes 管理的虚拟 IP,并允许您在滚动更新期间将流量路由到不同的 pod。

    您还应该考虑每种方法的权衡,例如,如果您使用负载均衡器,您将不得不自己管理负载均衡器并处理维护它的额外复杂性。如果你使用 DaemonSet,你将不得不处理副本数量的扩展,并确保你在节点上有足够的资源。

    您应该选择最适合您的用例并且您觉得最适合管理的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多