Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >多集群Kubernetes的架构设计

多集群Kubernetes的架构设计

作者头像
CNCF
发布于 2020-02-24 08:51:46
发布于 2020-02-24 08:51:46
1K0
举报
文章被收录于专栏:CNCFCNCF

作者:Thomas Rampelberg

最近,Linkerd社区一直在花时间处理多集群Kubernetes的挑战。如何在多个Kubernetes集群之间应用Linkerd的零配置自动mTLS或流量分割等特性?服务网格应该做什么,而更重要的是:服务网格不应该做什么?

与任何优秀的工程项目一样,开始的最佳方式是明确需求。在这篇博客文章中,我们概述了多集群解决方案的最低要求,从而使跨集群的流量更加可靠、安全和可观察。在后续的博客文章中,我们将讨论一些实现选项。

多集群从何而来?

Kubernetes集群就像品客薯片——你不可能只有一个!事实上,像Zalando这样的组织大约有100个。通过运行多个集群,可以将每个集群的关注点分开。不必解决每个应用程序和解决方案的约束,而是缩小问题空间。这最终成为一个非常好的工具,允许以更灵活、更简单的方式构建解决方案。

不幸的是,每个新的集群都增加了系统的复杂性。还有更多的内容需要管理、更新,并且需要处理集群上运行的所有应用程序之间的连接。Linkerd能帮我们吗?为了理解这个解决方案,我们首先列出一组需求。

需求一:支持层次网络

Kubernetes是一个有趣的野兽。每个pod拥有一个IP地址的含义之一是,默认情况下每个集群最终都是自己的网络。覆盖网络(Overlay network)只能在集群内部路由和发现。可以使用Submariner或Project Calico之类的工具来解决这个问题。如果你对维护一个平面网络有严格的要求,并且每个pod与其他集群中的pod直接通信,那么这些解决方案非常棒。然而,它们引入了新的失败点,增加了需要管理的复杂性。

为了降低复杂性并且不需要其他工具,任何多集群实现都必须使用Kubernetes的当前状态。如果我们不能依赖平面网络,这就意味着需要某种网关来管理进入集群的流量,并将流量路由到正确的后端服务。

需求二:保持独立状态

在一个每个集群中的每个pod之间都有一个完全平坦的、可路由的网络的世界中,允许直接通信仍然是没有意义的。为了让每个pod直接与另一个pod对话,它需要以某种方式发现那个遥远的pod。这在每个集群之间引入了全局状态的需求。每个集群的故障区现在已经一起粉碎了!让我们在这里描述一个失败场景,以理解为什么会发生这种情况以及它可能意味着什么。

Kubernetes中pod之间的通信由服务(Service)资源管理。默认情况下,该资源创建一个虚拟IP地址:ClusterIP。当pod决定要与另一个服务通信时,DNS将返回该服务的集群IP。当pod尝试连接到集群IP时,本地节点上的iptables被配置为随机选择目标pod IP地址。kube-proxy负责在集群中的每个节点上配置iptables,并在服务更改、pod启动或停止时执行此任务。这些更改发生在每个节点上,而且由于iptables实现细节,开销非常高。

通过要求全局可见性,某些集群中的状态更改将影响所有集群。这将潜在的不同的集群移动到相同的故障区,并立即降低最大可能的规模。每个集群不再能够独立伸缩,而是由每个集群的大小定义最大伸缩。一个集群中的任何错误配置,例如启动大量的pod,都能够DoS其他集群。这似乎与多个集群应该做的事情正好相反!

保持状态独立并通过复制管理更新,允许实现对更新进行筛选,以精确地获得所需的数据。本地集群外部的问题将被隔离,并确保单独的组件不能相互替换。

需求三:有独立的控制平面

引入一个共享的控制平面是很诱人的。这有效地集中了状态,减少了不同组件的管理开销,并具有做出全局优化决策的潜力。除了与全局复制状态共享许多相同的参数之外,这还会带来其他一些负面影响。

对于初学者来说,连接问题是真实存在的。当集群位于网络的两端时,中间的任何问题都可能导致失败。这些问题可以表现为任何情况,从延迟的增加一直到连接的完全丧失。在完全丧失连接性的情况下,任何不能与中央控制平面通信的集群要么完全中断,要么开始出现奇怪的错误,因为状态不同于本地缓存和共享控制平面。再一次,潜在的分离故障区已经被合并,当最薄弱环节出现问题时,整个系统就会失效。

即使在网络故障从未发生的完美世界中,共享控制平面也会引入一个关键的缺点。随着集群被配置到离共享控制平面更远的地方,诸如发现更新或策略检查之类的操作就会变慢。这只是因为进程之间的延迟将会增加,并且任何需要与中央集群通信的操作将会变得越来越慢。

将控制平面(以及相关的数据平面)保持独立为每个集群提供了自由。这种自由让集群操作员以最适合他们的方式管理版本、连接和功能。松散耦合使系统具有更强的弹性,实际上降低了所需的总体复杂性。

迈向解决工程

有了这三个约束——支持层次网络、保持独立状态和拥有独立的控制平面——我们就有了实现一个解决方案所必需的约束,采用Linkerd使用的低复杂度模型并将其扩展到多个集群。

在之后的文章中,我们将概述我们已经找到的解决方案。同时,我们希望听到你对这组需求的反馈!请对需求文档进行评论,或者进入我们的Slack渠道,提出一些问题!

https://docs.google.com/document/d/1uzD90l1BAX06za_yie8VroGcoCB8F2wCzN0SUeA3ucw

https://slack.linkerd.io

Linkerd是一个社区项目,由CNCF托管。如果你有功能需求、问题或评论,我们欢迎你加入我们快速成长的社区!Linkerd代码由GitHub托管,我们在Slack、Twitter和邮件列表上有一个蓬勃发展的社区。快来加入我们的行列吧!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
springboot 启动原理、启动过程、启动机制的介绍
Spring Boot 是一种基于 Java 的框架,用于创建独立的、生产级别的 Spring 应用程序。它的主要目标是简化 Spring 应用的初始搭建和开发过程,同时提供一系列大型项目常见的非功能性特征(如嵌入式服务器、安全性、度量、健康检查和外部化配置)。以下是 Spring Boot 的一些核心原理:
小马哥学JAVA
2024/05/13
2K0
SpringBoot的启动流程是怎样的?SpringBoot源码(七)
本篇接 SpringBoot内置的各种Starter是怎样构建的? SpringBoot源码(六)
源码笔记
2020/03/23
1.1K0
SpringBoot的启动流程是怎样的?SpringBoot源码(七)
SpringBoot源码篇(二)启动过程
对于注解@SpringBootApplication不会再进行说明,重点是 SpringApplication.run(App.class);,从SpringMvc到Spring Boot,通过主程序便可以启动web服务,所以在这个方法中,有启动tomcat的步骤,但初始化spring容器和servlet容器是否还是和tomcat+SpringMvc一样?
用针戳左手中指指头
2022/11/16
5700
SpringBoot源码篇(二)启动过程
Spring Boot启动过程分析
首先贴一张很不错的图,SpringBoot启动结构图,图片出自SpringBoot启动流程解析。 本文的分析基于Spring Boot 2.1.5,非Spring的代码只有下面这个启动main函数:
爱撸猫的杰
2020/03/08
1.1K0
Spring Boot启动过程分析
浅谈springboot启动过程
spring最核心的功能无非是ioc容器,这个容器里管理着各种bean。ioc容器反映在java类上就是spring的核心类ApplicationContext。ApplicationContext有众多的子接口和子类,不同的实现类有不同的功能。比如ClassPathXmlApplicationContext支持从xml读取bean定义并注册到容器中,AnnotationConfigApplicationContext支持读取@Configuration、@Service等注解定义的bean。
用户4844014
2023/05/02
3100
9千字长文带你了解SpringBoot启动过程–史上最详细 SpringBoot启动流程-图文并茂
来自面试官发自内审深处的灵魂拷问:“说一下springboot的启动流程”; 一脸懵逼的面试者:“它简化了spring的配置,主要是因为有自动装配的功能,并且可以直接启动,因为它内嵌了tomcat容器”; 面试官:“嗯, 没错,这是 它的一些概念,你还没回答我的问题,它是怎么启动的,启懂时都经过了哪些东西?”; 一脸懵逼的面试者:“额~~~不知道额····,我用的很熟练,但是不知道它里面做了哪些事情!”; 面试官:“了解内部原理是为了帮助我们做扩展,同时也是验证了一个人的学习能力,如果你想让自己的职业道路更上一层楼,这些底层的东西你是必须要会的,行吧,你回去等消息吧!” 面试者:↓
全栈程序员站长
2022/10/01
14.4K0
9千字长文带你了解SpringBoot启动过程–史上最详细 SpringBoot启动流程-图文并茂
SpringBoot(一):springboot应用程序启动过程核心分析
说起springboot大家很容易想到的就是自动装配、约定大于配置这个特点,的确这是springboot相比较于普通的spring web项目最大的亮点。
用户2031163
2023/08/27
3110
spring boot启动过程
springboot的启动类我们一般都会加上SpringBootApplication注解,其实他是几个注解的集合
earthchen
2020/09/24
2.1K0
手写模拟Spring Boot启动过程功能
——https://cloud.tencent.com/developer/article/2466203
小马哥学JAVA
2024/11/18
1580
从 SpringApplication 认识 Spring 应用启动过程
BootstrapRegistryInitializer:回调接口,用于 BootstrapRegistry 初始化。
WindWant
2023/06/18
6130
Spring Boot 2.0 教程 - 深入SpringAplication
可以通过SpringApplication.run() 方法轻松的启动一个Spring应用,例如
代码拾遗
2018/07/24
4890
头秃系列,二十三张图带你从源码分析Spring Boot 启动流程~
Spring Boot 专栏已经写了五十多天了,前面二十章从基础应用到高级整合避重就轻介绍的都是工作、面试中常见的知识点。
Bug开发工程师
2020/12/15
2.2K0
头秃系列,二十三张图带你从源码分析Spring Boot 启动流程~
Spring Boot(6) 原理和启动流程四、ApplicationContextInitializer、ApplicationContextAware、ApplicationContext、App
SpringBoot是一个快速开发框架,目的是解放java程序猿的生产力,提高开发效率。主要特点: 1、整合依赖:通过Maven,快速的将一些常用的第三方依赖整合。 2、简化配置:简化XML配置,全部采用注解形式。 3、集成web容器:内置Http服务器(Jetty和Tomcat),最终以java应用程序进行执行。 简化Spring应用的创建、运行、调试、部署的工作,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置。
黄规速
2022/04/14
1.6K0
Spring Boot(6) 原理和启动流程四、ApplicationContextInitializer、ApplicationContextAware、ApplicationContext、App
SpringBoot 系列-启动过程分析
小伙伴们,大家好!昨天因为操作失误,所以没有更新成功。在这个澳门回归20周年的今天,我继续更新SpringBoot 系列的第二篇,上次文章还没看的小伙伴,可以点击查看:《SpringBoot 系列-FatJar 启动原理》。
安徽开发者圈
2020/03/02
8440
SpirngBoot | 启动原理 01
一个读者,大二学生,常泡酒吧,逃课无数,就这还写得一手好代码,酸了酸了。这是他投稿的一篇关于 SpringBoot 启动原理的文章,才大二就如此优秀,未来可期。
JavaFish
2019/10/17
3450
重学SpringBoot3-事件与监听器
Spring Framework 提供了一个强大的事件发布和监听机制,允许应用组件在发生特定操作时相互通信,而无需直接引用对方。这种基于事件的通信方式有助于实现松耦合的架构,增强应用的模块化。Spring Boot 3 0继承并增强了这一机制,让开发者能够更便捷地使用事件和监听器来处理应用中的各种业务场景。本文将深入探讨Spring Boot 3中的事件和监听器,包括它们的工作原理、如何定义和使用它们,以及一些实际应用场景。
CoderJia
2024/10/18
3630
重学SpringBoot3-事件与监听器
SpringBoot2.x基础篇:编写应用程序时常用的ApplicationEvents
在SpringFramework编写过程中使用了大量的Event/Listener来做一些解耦的任务工作,当然在SpringBoot内同样也沿用了这一点,如果你看过我写的 业务解耦利器Event/Listener ,你应该了解事件的发布都是由ApplicationContext进行控制,但是在SpringBoot启动过程中有一些Event是在ApplicationContext实例化之前发布的,那我们要怎么去监听这些Events呢?
恒宇少年
2020/03/20
6980
SpringBoot2.x基础篇:编写应用程序时常用的ApplicationEvents
spring(2) - springboot内置Tomcat 启动过程
当在服务器执行该命令的时候 : 服务器去环境变量找到 "java" 对应的执行文件路径 (例如 windows中的 java.exe) --> 执行java.exe --> 按照启动参数,调用JNI 申请内存,初始化JVM ,调用类的加载器进行类的预加载(检查,校验,加载等) 将jdk自带的核心类库加载到方法区 --> 找到主类 --> 执行 main方法
惊羽-布壳儿
2022/06/15
9340
spring(2) - springboot内置Tomcat 启动过程
springboot启动流程简述_请简要说明单位根的流程
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/171553.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/24
2230
【愚公系列】2023年10月 Java教学课程 168-SpringBoot事件监听
SpringBoot事件监听器是一种机制,可以监听应用程序中的事件和状态变化。它可以让开发人员在应用程序启动、关闭、失败或者其他事件发生时,接收到通知并执行相应的操作。SpringBoot提供了很多种事件监听器,如应用程序启动事件、应用程序关闭事件、Web服务器启动事件、Web服务器关闭事件等。开发人员可以通过实现特定的监听器接口并注册到SpringBoot中,来监听这些事件的触发并执行相应的操作。
愚公搬代码
2025/05/28
900
【愚公系列】2023年10月 Java教学课程 168-SpringBoot事件监听
推荐阅读
相关推荐
springboot 启动原理、启动过程、启动机制的介绍
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档