首页 > 其他分享 >认识一下 Kubernetes 多集群服务 API

认识一下 Kubernetes 多集群服务 API

时间:2022-12-09 16:32:09浏览次数:72  
标签:ServiceImport 服务 Kubernetes Service json API 集群 认识一下

sunset-g55251915a_1280

由于各种原因,采用 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 目前还处于提案阶段。

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 下有个名为 fooService。其他集群要想使用该集群的 Service,该集群需要对外声明该 Service 是可以跨集群提供服务,完成多集群服务的注册。

mcs-service

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

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

跨集群服务发现

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 实现之后没有多少进展。

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

关注"云原生指北"微信公众号 (转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

标签:ServiceImport,服务,Kubernetes,Service,json,API,集群,认识一下
From: https://blog.51cto.com/u_15528248/5926251

相关文章

  • 百度开发者根据地名查询经纬度api
    说明工作中,项目经理让我全国的省市区的经纬度进行统计到数据库中,在网上也没有找到好的方式,有些网站也只有一个个查,后来,我想到通过爬虫的形式调用api进行获取,然后找到了百......
  • vue3组合式api<script lang="ts" setup>中如何接收父组件props传值,以及子组件emit回调
    子组件children.vue首先要引入<scriptlang="ts"setup>import{defineProps,defineEmits}from"vue";constprops=defineProps<{id:string,option:any}>()c......
  • AspNetCoreWebAPI使用Serilog通过配置appsettings记录日志
    继上一篇AspNetCore中使用Serilog记录日志-点终将连成线-博客园(cnblogs.com)中的日志记录配置都是写死在Program中的,本篇是通过配置文件进行配置日志记录的参数1、......
  • RapidIO核
    转自https://www.cnblogs.com/liujinggang/p/10072115.html一、RapidIO核概述RapidIO核的设计标准来源于RapidIOInterconnectSpecificationrev2.2,它支持1x,2x和4x......
  • 基于 Serverless一键体验FastAPI
    基于Serverless一键体验FastAPI​​活动地址​​​​服务搭建​​​​服务使用​​​​ServerlessDevs介绍​​​​什么是ServerlessDevs​​​​ServerlessDevs优势​......
  • WinUI(WASDK)使用MediaPipe检查手部关键点并通过ML.NET进行手势分类
    前言之所以会搞这个手势识别分类,其实是为了满足之前群友提的需求,就是针对稚晖君的ElectronBot机器人的上位机软件的功能丰富,因为本来擅长的技术栈都是.NET,也刚好试试全能......
  • GitOps实践之kubernetes安装argocd
    1.什么是argocd1.ArgoCD是Kubernetes的一个声明性GitOps持续交付工具。2.应用程序定义、配置和环境应该是声明性的和版本控制的。应用程序部署和生命周期管理应自动化......
  • ASP.NET Core跨平台WebApi+Jwt+HttpClient构建API接口服务实战
    《ASP.NETCore高级编程必备实战技能实践》1、一图看懂ASP.NETCore中的服务生命周期2、ASP.NETCore中的服务生命周期实例讲解3、查看ASP.NETCore容器已注册服务列表4......
  • webapi CORS origin
    dotnetcore6.0reference:https://learn.microsoft.com/zh-cn/aspnet/core/security/cors?view=aspnetcore-6.0test: https://learn.microsoft.com/zh-cn/aspnet/core......
  • Centos7部署kubernetes单机集群(K8S)
    Kubernetes单机版部署还是比较简单的,下面开始操作吧。查看内核版本:cat/etc/redhat-release关闭selinuxsetenforce0&&sed-i"s/SELINUX=enforcing/SELINUX=disabled/g"......