拿什么拯救你 Kubernetes网络之殇

简介: 历史经验告诉我们,网络永远是最后的难题——从大型机到虚拟机,再到现在的容器,而所有这些小实体都必须相互通信。 在过去30年的大部分时间里,我们通过以太网实现了这种通信,其中应用层的不同通信端使用IP地址和端口号相互绑定。


历史经验告诉我们,网络永远是最后的难题——从大型机到虚拟机,再到现在的容器,而所有这些小实体都必须相互通信。
在过去30年的大部分时间里,我们通过以太网实现了这种通信,其中应用层的不同通信端使用IP地址和端口号相互绑定。但是,当这些计算部分缩小到容器大小时,这是否还有意义呢?
如果两个容器位于同一个物理机上,在相同的虚拟机管理程序上,在同一个Docker实例上,你是否真的需要一直跳到NIC以便于它们之间的通信?应用层寻址是否保持不变?使用overlay来促进这种通信会更好吗?你是用L2还是L3?那么多租户呢?
所有这些问题都说明Kubernetes网络是难题。   

Kubernetes网络基础知识

在理解Kubernetes基础知识之前,理解Kubernetes所克服的Docker网络局限性非常有用。这并不是说Docker网络本质上是“邪恶”的,只是容器引擎的范围往往是单个物理机或虚拟机,因此当考虑一系列容器引擎时,自然会出现问题。
Docker model默认情况下使用主机—私有网络,创建一个虚拟网桥和一系列映射,以便容器在同一台机器上对话。但是,不同机器上的容器需要端口分配和转发或代理以便相互通信。
随着应用程序的规模不断扩大,并且利用基于微服务的应用程序体系结构,这种体系结构需要许多容器(如果不是数百个容器分布在多台机器上),伸缩性就不尽如人意了。而且,这个网络方案是为了在单台机器上运行而出现的,它确实支持CNM模型,可以实现多主机网络,但考虑到它的初衷,它不适合集群。
“Kubernetes model”不仅要解决核心集群问题,而且还要允许针对不同情况有多种实现并后向兼容单节点。这种模式的基本原理是所有的容器和节点都可以在没有NAT的情况下相互通信,一个容器看到的自己的IP地址与别的容器或节点看到的相同。
Kubernetes术语中关于pod的基本定义是:它是“一组具有共享存储/网络的一个或多个容器,以及如何运行容器的规范”。
因此,位于同一个pod中的容器共享相同的IP和端口空间,并且可以使用本地主机彼此访问。这满足了单容器引擎的后向兼容性设计目标。
然而,更常见的是,应用程序中的微服务运行在不同的pod中,因此它们必须以更复杂的方式发现并访问彼此,而不是简单地使用本地主机。这种机制在Kubernetes中被抽象出来,有多种实现方法——最流行的是使用overlay、underlay或native L3。
overlay方法使用的是与底层物理网络去耦的虚拟网络。这个虚拟网络上的pod可以很容易地找到彼此,这些L2网络可以彼此隔离,必要时需要它们之间的L3路由。
underlay方法将L2网络连接到节点的物理NIC,从而将该pod直接暴露给底层物理网络而无需端口映射。在这里可以使用桥接模式来使pod能够在内部进行互连,以便流量在不是必要时不会离开主机。
native L3方法在数据平面上不包含overlay,这意味着利用节点主机和外部网络路由器做出路由决策,pod-to-pod的通信发生在IP地址上。pod-to-pod的通信可以利用BGP peering来不离开主机,如果需要的话,NAT可以用于输出流量。
应用程序的需求和规模(包括可能需要在集群外使用的其他资源)将决定哪种网络方法适合你,并且每种方法都有各种开源和商业实施方案。

但Kubernetes不是在“真空”中运行

Kubernetes集群很少在纯粹的新建环境中部署。相反,它被部署用于支持业务线开发团队的快速迭代工作,以便将创新注入到现有服务中。
举个例子,在选择overlay方法时,虚拟机主机上的容器需要与物理网络中其他位置的服务进行通信,现在它要跳过多个层,每层都可能带入不同数量的、可能会降低性能的延迟。因为这些基于微服务的应用程序并不常在”真空”中运行,所以在选择方法和实施时需要仔细考虑,并且在同一组托管应用程序中为一个应用程序所做的选择可能与另一个应用程序不同。

为什么基于策略的Kubernetes网络管理很有意义?

开发人员喜欢微服务,因为它使他们能够构建具有更小的、更隔离的组件的解决方案,这些组件可以通过API对话。只要这些API没有改变,它们就充当组件之间的”契约”,而且这些组件可以彼此独立地部署,使发布更容易、更快。
但正如所有其他底层基础设施的管理一样,复杂性的增加会造成管理难题。你的集群应该有多少个节点?当你后来改变主意时会发生什么?如何管理因为运行的多个应用程序有不同的需求而一个集群使用overlay网络,另一个使用native L3的情况?你采取了哪些管理措施来保持一致性和安全性?
这些问题摆在了管理Kubernetes集群的团队面前,而答案与解决其他基础架构管理难题的一样:策略。
管理员在管理软件定义网络和其上的虚拟机时发现,手动管理的“东西”的数量在某些时候难以继续增加。Kubernetes集群管理会使得,要管理的“东西”的数量大幅增加,并且在这个新的容器集群中人工干预不可持续。通过基于策略的管理实现自动化管理并实施最佳实践,成为一个明确的选择,无论单个应用程序的具体Kubernetes网络方法是什么。 因此,你可能正在管理越来越多的基于微服务的应用程序,无论这些应用程序是需要overlay、underlay或native L3网络,请确保你选择的任何实施方案都提供了通过使用合适插件的策略管理Kubernetes集群网络的选择。否则,在集群中实施变更并保持一致性将很快变得不可能。但通过策略自动化管理意图,你可以随时准备好满足应用的需求。

本文转移K8S技术社区-拿什么拯救你 Kubernetes网络之殇

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
运维 Kubernetes Cloud Native
探索Kubernetes的大二层网络:原理、优势与挑战🚀
在云原生领域,Kubernetes (K8s) 已经成为容器编排的事实标准☁️📦。为了支撑其灵活的服务发现和负载均衡🔍🔄,K8s采用了大二层网络的设计理念🕸️。本文将深入探讨大二层网络的工作原理、带来的好处✨,以及面临的挑战和解决方案❗🛠️。
探索Kubernetes的大二层网络:原理、优势与挑战🚀
|
5月前
|
Kubernetes Cloud Native Docker
云原生|kubernetes|网络插件flannel二进制部署和calico的yaml清单部署总结版
云原生|kubernetes|网络插件flannel二进制部署和calico的yaml清单部署总结版
149 0
|
11天前
|
Kubernetes API 调度
|
28天前
|
JSON Kubernetes 网络架构
Kubernetes CNI 网络模型及常见开源组件
【4月更文挑战第13天】目前主流的容器网络模型是CoreOS 公司推出的 Container Network Interface(CNI)模型
|
2月前
|
Kubernetes Shell Docker
K8S核心插件-Flannel网络插件
K8S核心插件-Flannel网络插件
56 0
|
2月前
|
运维 Kubernetes 网络协议
总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(服务治理与网络访问)
总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(服务治理与网络访问)
35 0
|
2月前
|
Kubernetes 应用服务中间件 nginx
Kubernetes服务网络Ingress网络模型分析、安装和高级用法
Kubernetes服务网络Ingress网络模型分析、安装和高级用法
52 5
|
5月前
|
存储 Kubernetes Cloud Native
云原生|kubernetes|centos7下离线化部署kubesphere-3.3.2---基于kubernetes-1.22.16(从网络插件开始记录)
云原生|kubernetes|centos7下离线化部署kubesphere-3.3.2---基于kubernetes-1.22.16(从网络插件开始记录)
93 0
|
15天前
|
运维 Kubernetes 监控
Kubernetes 集群的持续性能优化实践
【4月更文挑战第26天】 在动态且不断增长的云计算环境中,维护高性能的 Kubernetes 集群是一个挑战。本文将探讨一系列实用的策略和工具,旨在帮助运维专家监控、分析和优化 Kubernetes 集群的性能。我们将讨论资源分配的最佳实践,包括 CPU 和内存管理,以及集群规模调整的策略。此外,文中还将介绍延迟和吞吐量的重要性,并提供日志和监控工具的使用技巧,以实现持续改进的目标。
|
2天前
|
Kubernetes Java API
Kubernetes详解(三)——Kubernetes集群组件
Kubernetes详解(三)——Kubernetes集群组件
13 1