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,需要安装
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
组件中的namespace
controller负责,可以通过配置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类型,分三种优先级;