Karmada

资料

背景

  • karmada是由华为开源的云原生多集群容器编排平台,在kubernetes Federation v1, v2(kubefed)的基础上发展而来,吸取了其经验和教训,kubefed项目目前已经被放弃;
  • 其特点是在保存原有k8s资源定义API不变的情况下,通过添加与多云应用资源编排相关的一套新的API和控制面板组件,为用户提供多云/多集群容器部署,实现扩展、高可用等目标;
  • 如下图所示为kubefed v2接入vs时需要定义的CRD,因此接入kubefed是需要对原始k8s资源进行改造,对用户不友好:
    apiVersion: types.kubefed.io/v1beta1
    kind: FederatedVirtualService
    metadata:
    name: service-route
    namespace: default
    spec:
    placement:
    clusters:
    - name: cluster1
    - name: cluster2
    - name: cluster3
    template:
    metadata:
    name: service-route
    spec:
    gateways:
    - service-gateway
    hosts:
    - '*'
    http:
    - match:
    - uri:
    prefix: /
    route:
    - destination:
    host: service-a-1
    port:
    number: 3000

部署

注意

  • 跨集群的pod网络通信可以接入如Submariner这种开源方案
  • In order to prevent routing conflicts, Pod and Service CIDRs of clusters need non-overlapping
  • 要开启multi-cluster service,需要安装ServiceExportServiceImport

架构

架构

  • 核心组件有:karmada apiserver, karmada controller manager, karmada scheduler
  • karmada apiserver是在k8s apiserver的基础上开发的,所以功能与k8s apiserver类似;
  • karmada scheduler是集群调度器,即完成在资源下发阶段,为资源选择合适集群的目标;
  • karmada controller manager如下图所示,集成了4个controller:
    • Cluster Controller 将k8s集群连接到karmada,为每个集群都创建了一个Cluster资源对象,来管理集群的生命周期;
    • Policy Controller 监视PropagationPolicy对象,当该CRD创建时,controller会选择与resourceSelector匹配的一组资源,为每个单独的联邦资源对象创建ResourceBinding对象;
    • Binding Controller 监视ResourceBinding对象,为每个带有单个资源manifest的集群创建一个Work对象
    • Executioin Controller 监视Work对象,当资源创建时,controller会把资源下发到成员集群中;

Arch

资源下发四个阶段

  • karmada下的资源配置下发会经历4个阶段:Resource Template -> Propagation Policy -> Resource Binding -> Override Policy
  • Resource Template阶段:是定义资源模板,其可直接套用原生k8s的配置,无需进行改造;
  • Propagation Policy阶段:为通过PropagationPolicy API来定义多集群的调度要求,CRD定义源码在这
    • 支持1:N的策略映射机制,无需为每个联邦应用都标明调度约束;
    • 使用默认策略的情况下,用户可以直接与k8s API交互;
  • Resource Binding阶段:此时应用会为每个联邦应用创建一个ResourceBinding资源,用于关联其PropagationPolicy资源,该CRD定义源码在这
  • Override Policy阶段:为每个ResourceBinding资源执行集群级别的差异化配置改写,其CRD定义源码在这

Karmada资源下发

组件特性

PropagationPolicy

重调度:karmada-descheduler and karmada-scheduler-estimator

karmada-descheduler

  • 可根据成员集群内实例状态变化,主动触发重调度;

karmada-scheduler-estimator

  • 为调度器提供更精确的成员集群运行实例的期望状态;

Karmada Install

环境准备

  1. 安装k8s;
  2. 如k8s主机是配置的域名,因karmada-controller需要通过该域名如atms-00.vm访问目标集群,所以需要在karmada机器的coredns上配置如下IP映射:
    #  kubectl edit cm -n kube-system coredns  -o yaml
    hosts {
    10.13.149.88 atms-01.vm
    10.13.148.34 atms-02.vm

    fallthrough
    }

install

  1. 安装cli:

    curl -s https://raw.githubusercontent.com/karmada-io/karmada/master/hack/install-cli.sh | sudo INSTALL_CLI_VERSION=1.8.1 bash
    curl -s https://raw.githubusercontent.com/karmada-io/karmada/master/hack/install-cli.sh | sudo INSTALL_CLI_VERSION=1.8.1 bash -s kubectl-karmada
  2. 初始化karmada

    sudo kubectl karmada init --kubeconfig ~/.kube/config

    #mkdir -p $HOME/.kube
    sudo cp -i /etc/karmada/karmada-apiserver.config $HOME/.kube/karmada-apiserver.config
    # sudo cp -i /etc/karmada/karmada-apiserver.config $HOME/.kube/karmada-apiserver.config
    sudo chown $(id -u):$(id -g) $HOME/.kube/karmada-apiserver.config
  3. Karmada有两个context: karmada-apiserverkarmada-host,可通过kubectl config view查看所有集群:

karmada-apiserver

  • 切换Context:kubectl config use-context karmada-apiserver --kubeconfig ~/.kube/karmada-apiserver.config
  • 该Context是与Karmada控制面板交互时使用的主要kubeconfig

karmada-host

  • 切换Context:kubectl config use-context karmada-host --kubeconfig ~/.kube/karmada-apiserver.config
  • 该Context仅用于调试Karmada对hostcluster的安装;
  1. join集群
    # 先更改当前member集群的名
    kubectl config rename-context kubernetes-admin@kubernetes atms-01

    # register
    kubectl karmada --kubeconfig ~/.kube/karmada-apiserver.config join atms-01 --cluster-kubeconfig=$HOME/.kube/config

    # check
    kubectl get clusters --kubeconfig ~/.kube/karmada-apiserver.config
  2. OK

uninstall

  • 命令如下:
    kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get clusters
    sudo rm -rf /var/lib/karmada-etcd

特性

  • Karmada集群中,Namespace资源是会被自动分发到集群成员中,这个功能是由Karmada-controller-manager组件中的namespace controller负责,可以通过配置Karmada控制器来进行配置,配置后,用户可以通过ClusterPropagationPolicy资源指定Namespace资源的分发策略;(参考)

Resource Propagating

https://karmada.io/zh/docs/userguide/scheduling/resource-propagating

Propagation API

  • Karmada提供两种资源分发API:PropagationPolicyClusterPropagationPolicy
  • PropagationPolicy:只能作用于同一命名空间下资源的分发策略;
  • ClusterPropagationPolicy:可以作用于所有命名空间下资源的分发策略;
  • 更新PropagationPolicy的目标集群,会立刻对资源产生作用,如PropagationPolicy先将deployment分发到集群A,更新PropagationPolicy将deployment分发到集群B后,集群A的pod会被清理掉;
  • 删除PropagationPolicy不会自动删除分发出去的资源;

Cluster Selector

  • LabelSelector

    apiVersion: policy.karmada.io/v1alpha1
    kind: PropagationPolicy
    spec:
    placement:
    clusterAffinity:
    labelSelector:
    matchLabels:
    location: us

    ---
    apiVersion: policy.karmada.io/v1alpha1
    kind: PropagationPolicy
    spec:
    placement:
    clusterAffinity:
    labelSelector:
    matchExpressions:
    - key: location
    operator: In
    values:
    - us
  • FieldSelector

    spec:
    placement:
    clusterAffinity:
    fieldSelector:
    matchExpressions:
    - key: region
    operator: NotIn
    values:
    - cn-south-1
  • ClusterNames

    spec:
    placement:
    clusterAffinity:
    clusterNames:
    - member1
    - member2
  • ExcludeClusters

    spec:
    placement:
    clusterAffinity:
    exclude:
    - member1
    - member3
  • 也支持基于污点的集群调度;

Replicas调度策略

  • .spec.placement.replicaScheduling字段代表了处理带有.replicas属性的资源如deployment, statefulsets, CRDs的副本分发策略;(CRDs可以通过自定义资源解释器来支持)

两种Replicas调度类型

作用于.spec.placement.replicaScheduling.replicaSchedulingType

  1. Duplicated:候选集群中副本数一样,如.replicas=3,则每个集群都是3个副本;
  2. Divided:候选集群中副本数一起划分,划分策略通过.spec.placement.replicaScheduling.replicaDivisionPreference字段来决定;

副本划分策略ReplicaDivisionPreference

仅在.replicaSchedulingType: Divided时生效

  1. Aggregated: 根据集群资源的情况,将尽可能少的副本数划分到集群中;
  2. Weighted: 根据WeightPreference策略,按比例划分副本数;

WeightPreference策略

  1. StaticWeightList: 静态权重分配;
  2. DynamicWeight : 根据动态权重因子来动态决定副本数,当前支持的因子有:AvailableReplicas,即根据集群能运行的副本数量上限,按比例在集群间划分;

Propagation优先级

  • PropagationPolicy的优先级 > ClusterPropagationPolicy优先级;
  • 显式优先级:通过字段.priority: 0来指定;
  • 隐式优先级:参考文档,根据集群筛选的selector类型,分三种优先级;

自定义资源解释器