热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kubernetes多集群服务API

由于各种原因,采用Kubernetes的企业内部存在着几个、几十甚至上百个集群。比如出于研发流程上的考虑,不同环境下都存在独立的集群;监管层面的考虑,就地存储的用户数据需要搭配应用

由于各种原因,采用 Kubernetes 的企业内部存在着几个、几十甚至上百个集群。比如出于研发流程上的考虑,不同环境下都存在独立的集群;监管层面的考虑,就地存储的用户数据需要搭配应用集群;单个集群的容量限制,无法满足业务体量;可用性要求的多云、多地、多中心;Kubernetes 原地升级成本大进而考虑新建集群,等等各种原因。然而,Kubernetes 设计之初并没有考虑多集群。

这些集群彼此之间看似独立,但又有着千丝万缕的联系。比如高可用性的多集群,实现了集群级的灾备,但集群中的服务如何实现跨集群的故障迁移?

我们先看下集群内的应用如何对集群外提供服务。由于 Kubernetes 网络隔离特性,存在着天然的网络边界,需要借助某些方案(如 Ingress、NodePort)来将服务暴露到集群外。虽然解决了连通性的问题,但是服务的注册和发现还无法解决。


                                                                                                      k8s-svc-exposing

通常我们将 Service 作为 Kubernetes 平台的服务注册和发现,今天要介绍的 Multi-Cluster Service(多集群服务 API,简称 MCS API) 则可以看成是 跨 Kubernetes 集群的服务注册发现


MCS 介绍

MCS API 来自 Kubernetes Enhancement Proposal KEP-1645: Multi-Cluster Services API[1] 目前还处于提案阶段。

MCS 的目标是既然多集群不可避免,那就定义一套 API 来实现服务的跨集群注册和发现,并且这套 API 足够轻量级,做到能够像访问本地服务一样访问其他集群的服务。

注意 MCS API 只提供 API 和实现的设计指导,不提供具体的实现。


术语



  • clusterset:集群集,集合内的集群间共享服务。

  • mcs-controller:多集群服务控制器,在多集群间完成服务的注册和发现。

  • cluster name:集群的唯一标识,用以标识注册的服务来自哪个集群。


CRD



  • ServiceExport 定义对集群集中其他集群暴露的服务,与 Service 一样必须创建在与负载相同的命名空间下,且与 Service 同名。

  • ServiceImport 定义了导入的其他集群的 Service

type ServiceExport struct {
  metav1.TypeMeta `json:",inline"`
  metav1.ObjectMeta `json:"metadata,omitempty"`
  Status ServiceExportStatus `json:"status,omitempty"`
}
type ServiceImport struct {
  metav1.TypeMeta `json:",inline"`
  metav1.ObjectMeta `json:"metadata,omitempty"`
  Spec ServiceImportSpec `json:"spec,omitempty"`
  Status ServiceImportStatus `json:"status,omitempty"`
}
type ServiceImportSpec struct {
  Ports []ServicePort `json:"ports"`
  IPs []string `json:"ips,omitempty"`
  Type ServiceImportType `json:"type"`
  SessionAffinity corev1.ServiceAffinity `json:"sessionAffinity"`
  SessionAffinityConfig *corev1.SessionAffinityConfig `json:"sessionAffinityConfig"`
}

跨集群服务注册

如果多个集群都以同样的名字和命名空间对外声明服务,这些服务将被视作单一的组合服务。例如 1 个集群集下有 4 个集群,其中 1 个集群在命名空间 bar 下有个名为 foo 的 Service。其他集群要想使用该集群的 Service,该集群需要对外声明该 Service 是可以跨集群提供服务,完成多集群服务的注册。


                                                                                mcs-service

多集群服务的注册通过在 Service 的同命名空间下创建同名的 ServiceExport 资源来完成。ServiceExport 可以手动创建,也可以实现支持服务的自动注册:根据标识将集群内或者指定命名空间下的服务自动注册。

更多的设计细节,可以参考 Service Exporting 设计细节[2]


跨集群服务发现

在 ServiceExport 资源创建完成后,该服务会被集群集下的其他集群“发现”:同名的命名空间下出现同名的 ServiceImport 资源,并且该 ServiceImport 与服务注册的 Endpoint 相关联。


                                                                          mcs-exported

同样,如果一个服务下线或者停止跨集群服务,删除 ServiceExport 资源后,其他集群中的 ServiceImport 也会相应地被销毁。ServiceImport 的管理,由 MCS 实现中的 mcs-controller 来完成。

值得注意的是,关于 ServiceImport 的使用,该标准中并未界定具体的实现细节。由于 Pod 在 Kubernetes 中是非永久性资源,我们访问应用的时候通常使用 Service。多集群服务的理想情况,是在使用 Service的时候能自动使用其他集群的 Endpoints,做到对应用的无感知。

一种方案是修改 Service API 的实现(比如 kube-proxy) 进行来使用 ServiceImport

另一种方案则是不需要修改现在 Service API 的实现,由 mcs-controller 来创建影子服务,该服务与新创建的 EndpointSlice 关联,后者聚合了该跨服务的所有 Endpoints。一个 ServiceImport 下可能有来自多个集群的 EndpointSlice,每个 EndpointSlice 上有各自集群的标识。


                                                                            mcs-endpoints

在官方的设计细节中建议了 ClusterIP 和 DNS 的方案并提供了细节,但不是唯一的实现方案。


总结

MCS API 希望在 API 的层面提供多集群服务的定义,但由于其实现的复杂性,该提案的进展缓慢。从 2020.2 提出方案,到 2020.8 提供 API 的 alpha 实现之后没有多少进展。

即便如此,多集群服务的注册和发现机制可以给后面的实现带来一定的参考价值。



推荐阅读
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • Kubernetes(k8s)基础简介
    Kubernetes(k8s)基础简介目录一、Kubernetes概述(一)、Kubernetes是什么(二& ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • centos安装Mysql的方法及步骤详解
    本文介绍了centos安装Mysql的两种方式:rpm方式和绿色方式安装,详细介绍了安装所需的软件包以及安装过程中的注意事项,包括检查是否安装成功的方法。通过本文,读者可以了解到在centos系统上如何正确安装Mysql。 ... [详细]
  • Iamtryingtocreateanarrayofstructinstanceslikethis:我试图创建一个这样的struct实例数组:letinstallers: ... [详细]
  • Java编程实现邻接矩阵表示稠密图的方法及实现类介绍
    本文介绍了Java编程如何实现邻接矩阵表示稠密图的方法,通过一个名为AMWGraph.java的类来构造邻接矩阵表示的图,并提供了插入结点、插入边、获取邻接结点等功能。通过使用二维数组来表示结点之间的关系,并通过元素的值来表示权值的大小,实现了稠密图的表示和操作。对于对稠密图的表示和操作感兴趣的读者可以参考本文。 ... [详细]
author-avatar
happy柒月卍520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有