Karmada
资料
背景
- karmada是由华为开源的云原生多集群容器编排平台,在kubernetes Federation v1, v2(
kubefed)的基础上发展而来,吸取了其经验和教训,kubefed项目目前已经被放弃; - 其特点是在保存原有k8s资源定义API不变的情况下,通过添加与多云应用资源编排相关的一套新的API和控制面板组件,为用户提供多云/多集群容器部署,实现扩展、高可用等目标;
- 如下图所示为
kubefedv2接入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,需要安装
ServiceExport和ServiceImport
架构
架构
- 核心组件有:
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会把资源下发到成员集群中;

资源下发四个阶段
- 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定义源码在这

组件特性
PropagationPolicy
重调度:karmada-descheduler and karmada-scheduler-estimator
karmada-descheduler
- 可根据成员集群内实例状态变化,主动触发重调度;
karmada-scheduler-estimator
- 为调度器提供更精确的成员集群运行实例的期望状态;
Karmada Install
环境准备
- 安装k8s;
- 如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
安装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初始化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.configKarmada有两个context:
karmada-apiserver和karmada-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的安装;
- 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 - OK
uninstall
- 命令如下:
kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get clusters
sudo rm -rf /var/lib/karmada-etcd
特性
- Karmada集群中,
Namespace资源是会被自动分发到集群成员中,这个功能是由Karmada-controller-manager组件中的namespacecontroller负责,可以通过配置Karmada控制器来进行配置,配置后,用户可以通过ClusterPropagationPolicy资源指定Namespace资源的分发策略;(参考)
Resource Propagating
https://karmada.io/zh/docs/userguide/scheduling/resource-propagating
Propagation API
- Karmada提供两种资源分发API:
PropagationPolicy和ClusterPropagationPolicy 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:
- usFieldSelector
spec:
placement:
clusterAffinity:
fieldSelector:
matchExpressions:
- key: region
operator: NotIn
values:
- cn-south-1ClusterNames
spec:
placement:
clusterAffinity:
clusterNames:
- member1
- member2ExcludeClusters
spec:
placement:
clusterAffinity:
exclude:
- member1
- member3也支持基于污点的集群调度;
Replicas调度策略
.spec.placement.replicaScheduling字段代表了处理带有.replicas属性的资源如deployment,statefulsets,CRDs的副本分发策略;(CRDs可以通过自定义资源解释器来支持)
两种Replicas调度类型
作用于
.spec.placement.replicaScheduling.replicaSchedulingType
Duplicated:候选集群中副本数一样,如.replicas=3,则每个集群都是3个副本;Divided:候选集群中副本数一起划分,划分策略通过.spec.placement.replicaScheduling.replicaDivisionPreference字段来决定;
副本划分策略ReplicaDivisionPreference
仅在
.replicaSchedulingType: Divided时生效
Aggregated: 根据集群资源的情况,将尽可能少的副本数划分到集群中;Weighted: 根据WeightPreference策略,按比例划分副本数;
WeightPreference策略
StaticWeightList: 静态权重分配;DynamicWeight: 根据动态权重因子来动态决定副本数,当前支持的因子有:AvailableReplicas,即根据集群能运行的副本数量上限,按比例在集群间划分;
Propagation优先级
PropagationPolicy的优先级 >ClusterPropagationPolicy优先级;- 显式优先级:通过字段
.priority: 0来指定; - 隐式优先级:参考文档,根据集群筛选的selector类型,分三种优先级;