拿什么拯救你 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网络之殇

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
运维 Kubernetes 前端开发
如何用 eBPF 实现 Kubernetes 网络可观测性?实战指南
本文深入探讨了Kubernetes网络观测的挑战与eBPF技术的应用。首先分析了传统工具在数据碎片化、上下文缺失和性能瓶颈上的局限性,接着阐述了eBPF通过零拷贝观测、全链路关联和动态过滤等特性带来的优势。文章进一步解析了eBPF观测架构的设计与实现,包括关键数据结构、内核探针部署及生产环境拓扑。实战部分展示了如何构建全栈观测系统,并结合NetworkPolicy验证、跨节点流量分析等高级场景,提供具体代码示例。最后,通过典型案例分析和性能数据对比,验证了eBPF方案的有效性,并展望了未来演进方向,如智能诊断系统与Wasm集成。
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
Kubernetes 负载均衡 网络安全
Kubernetes 网络模型与实践
【8月更文第29天】Kubernetes(K8s)是当今容器编排领域的佼佼者,它提供了一种高效的方式来管理容器化应用的部署、扩展和运行。Kubernetes 的网络模型是其成功的关键因素之一,它支持服务发现、负载均衡和集群内外通信等功能。本文将深入探讨 Kubernetes 的网络模型,并通过实际代码示例来展示服务发现和服务网格的基本概念及其实现。
804 3
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
666 12
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
1291 2
|
Kubernetes 容器 Perl
Kubernetes网络插件体系及flannel基础
文章主要介绍了Kubernetes网络插件体系,特别是flannel网络模型的工作原理、配置和测试方法。
675 3
Kubernetes网络插件体系及flannel基础
|
Kubernetes 网络协议 网络安全
k8s中网络连接问题
【10月更文挑战第3天】
1463 7
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
5201 3
|
Kubernetes 容器
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
基于Ubuntu-22.04安装K8s-v1.28.2实验(三)数据卷挂载NFS(网络文件系统)
871 0
|
Kubernetes Cloud Native 网络安全
云原生入门指南:Kubernetes和容器化技术云计算与网络安全:技术融合的新篇章
【8月更文挑战第30天】在云计算的浪潮中,云原生技术如Kubernetes已成为现代软件部署的核心。本文将引导读者理解云原生的基本概念,探索Kubernetes如何管理容器化应用,并展示如何通过实践加深理解。

热门文章

最新文章

推荐镜像

更多