Karmada 多集群服务治理

Posted by Poor12 Blog on July 25, 2023

Service是Kubernetes中非常重要的概念,实现了基础的服务互访互通的能力,对于跨集群的场景,实现服务互访互通的一个前提就是多集群处于一个扁平网络中,集群中的Pod可以互访互通, 这个要求也天然限制了多集群服务的使用。假设集群间的网络条件已打通,那么摆在用户面前的挑战就变成了如何打通多集群服务的逻辑概念。

Kubernetes的Multi-cluster sig引入了ServiceImport与ServiceExport的API来定义多集群服务的互访互通。

例如,我们在member1集群中已部署了Deployment以及Service,并且我们需要在member2集群中访问这个服务,只需要在member1部署ServiceExport对象,member2部署ServiceImport对象。

apiVersion: multicluster.x-k8s.io/v1alpha1
kind: ServiceExport
metadata:
    name: serve   #Service名字
apiVersion: multicluster.x-k8s.io/v1alpha1
kind: ServiceImport
metadata:
    name: serve
spec:
    type: ClusterSetIP
    ports:
    - port: 80
      protocol: TCP

在实现ServiceImport与ServiceExport的过程中,serviceExport-controller将成员集群service派生的endpointSlice同步至控制面的Work,endpointSlice-controller则是将它从Work同步至控制面的资源对象, 最终serviceImport-controller将需要export的服务及其endpointSlice统一分发至需要导入的集群。

上述过程完成了基于上游社区的API的原子化实现,Karmada基于上述原子化的实现封装了更高阶的MultiClusterService API。

cross-clusters service discovery

在解决东西向流量的问题后,Karmada同样需要南北向流量暴露的解决方案。Karmada提供了multicluster-cloud-provider接口,用户可以实现上述接口并在LB实例上注册Pod IP地址, 并通过四层网络访问Pod实例。

service exposure

MCS API提供了基本的多集群服务互通互访的能力,下一步可演进的方向有

  • 多集群的Network policy
  • Gateway API + MCS
  • 结合Istio实现多集群服务治理