基于Karmada的多集群管理(一)

基于Karmada的多集群管理(一)

简介

Karmada(Kubernetes Armada)是基于Kubernetes原生API的多集群管理系统。在多云和混合云场景下,Karmada提供可插拔,全自动化管理多集群应用,实现多云集中管理、高可用性、故障恢复和流量调度。

特性

跨云多集群多模式管理

  • 安全隔离:

    • 为每个集群创建一个namespace,以karmada-es-为前缀。
  • 多模式:

    • Push:Karmada与成员集群的kube-apiserver直连。
    • Pull:在成员集群中装agent组件,Karmada委托任务给agent组件。

多策略的多集群调度

  • 不同调度策略下的集群分发能力:
    • ClusterAffinity:基于ClusterName、Label、Field的定向调度。
    • Toleration:基于Taint和Toleration的调度。
    • SpreadConstraint:基于集群拓扑的调度。
    • ReplicasScheduling:针对有实例的工作负载的复制模式与拆分模式。
  • 差异化配置(OverridePolicy):
    • ImageOverrider:镜像的差异化配置。
    • ArgsOverrider:运行参数的差异化配置。
    • CommandOverrider:运行命令的差异化配置。
    • PlainText:自定义的差异化配置。
  • 支持重调度:
    • Descheduler(karmada-descheduler):根据成员集群内实例状态变化触发重调度。
    • Scheduler-estimator(karmada-scheduler-estimator):为调度器提供更精确的成员集群运行实例的期望状态。

应用的跨集群故障迁移

  • 集群故障迁移:
    • Karmada支持用户设置分发策略,在集群发生故障后,将故障集群实例进行自动的集中式或分散式的迁移。
  • 集群污点设置:
    • 当用户为集群设置污点,且资源分发策略无法容忍污点时,Karmada也会自动触发集群实例的迁移。
  • 服务不断服:
    • 在实例迁移过程中,Karmada能够保证服务实例不跌零,从而确保服务不会断服。

全局统一资源视图

  • 资源状态收集与聚合:借助资源解释器(Resource Interpreter),将状态收集并聚合到资源模板
    • 用户自定义,触发Webhook远程调用。
    • 对于一些常见资源,在Karmada中固定编码。
  • 统一资源管理 :统一管理资源的创建、更新、删除、查询。
  • 统一运维 :可以在同一个k8s上下文中执行describeexeclogs
  • 资源、事件全局搜索:
    • 缓存查询:支持全局模糊搜索、全局精确搜索。
    • 第三方存储:支持搜索引擎(Elasticsearch或OpenSearch)、关系型数据库、图数据库。

其他

  • Karmada 中有两个上下文环境:
    • karmada-apiserver kubectl config use-context karmada-apiserver 是与 Karmada 控制面交互时要使用的 主要 kubeconfig
    • karmada-host kubectl config use-context karmada-host 仅用于调试 Karmada 对 host cluster 的安装
    • 你可以通过运行 kubectl config view 随时查看所有集群。 要切换集群上下文,请运行 kubectl config use-context [CONTEXT_NAME]

框架结构

主要组件

  • ETCD:存储Karmada API对象。
  • Karmada Scheduler:提供高级的多集群调度策略。
  • Karmada Controller Manager: 包含多个Controller,Controller监听karmada对象并且与成员集群API server进行通信并创建成员集群的k8s对象。
    • Cluster Controller:成员集群的生命周期管理与对象管理。
    • Policy Controller:监听PropagationPolicy对象,创建ResourceBinding,配置资源分发策略。
    • Binding Controller:监听ResourceBinding对象,并创建work对象响应资源清单。
    • Execution Controller:监听work对象,并将资源分发到成员集群中。

CRD资源

  • Resource Template。这里的ResourceTemplate 只是对 Karmada 可分发的资源对象的一种抽象,这里的Resource 包含 Kubernetes 中所有支持的资源对象的类型和我们平时使用k8s的对象例如eployment,Service,Pod,Ingress,PVC,PV, Job没有不同,但是需要我们在global集群进行创建和修改;

  • Propagation Policy。定义Resource Template需要被调度到那些集群;

  • Resource Binding。即Resource Template根据Propagation Policy调度之后的结果,保存在ResourceBinding中;

  • Override Policy。由于我们可能需要在不同集群里面部署不同的版本,或者副本数,我们可以通过Override Policy对Resource Binding中的结果进行修改;

  • Work。经过Override Policy的渲染,Karmada会产生Work对象,而Work对象所处的namespace跟调度的cluster对应,同时work中包含最终的对象的Spec和Status。对应的Execution Controller和Agent会不断Reconcile Work对象,即在子集群中创建和更新Work中的workload,并更新globa集群中Work的status。

调度

调度策略插件

  • APIInstalled: 用于检查资源的API(CRD)是否安装在目标集群中。
  • ClusterAffinity: 用于检查资源选择器是否与集群标签匹配。
  • SpreadConstraint: 用于检查 Cluster.Spec 中的 spread 属性即Provider/Zone/Region字段。
  • TaintToleration: 用于检查传播策略是否容忍集群的污点。
  • ClusterLocality 是一个评分插件,为目标集群进行评分

分发策略

apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
  name: nginx-propagation
spec:
  resourceSelectors:
    - apiVersion: apps/v1
      kind: Deployment
      name: nginx
  placement:
    clusterAffinity:
      clusterNames:
        - member1  #分发到成员集群member1和member2
        - member2
    replicaScheduling:
      replicaDivisionPreference: Weighted #划分副本策略
      replicaSchedulingType: Divided  #调度副本策略
      weightPreference:  
        staticWeightList:  #目标集群静态权重
          - targetCluster:
              clusterNames:
                - member1
            weight: 1
          - targetCluster:
              clusterNames:
                - member2
            weight: 1

Duplicated策略

Duplicated 策略表示将要分发资源的 replicas 相同数量的复制到所有的目标成员集群中,例如:分发 deployment 资源时,deployment 资源设定的副本数为 10,则分发到所有目标集群的 deployment 的副本数都是 10,如图所示:

Divided 策略

Divided 策略表示将要分发资源的 replicas 划分到多个目标成员集群中,例如:分发 deployment 资源时,deployment 资源设定的副本数为 10,则分发到所有目标集群的 deployment 的副本总数是 10。具体如何划分需要根据 ReplicaDivisionPreference 的值来决定,而 ReplicaDivisionPreference(划分副本策略) 的值可以设定为 Aggregated 或者 Weighted

Aggregated 策略

Aggregated 策略表示将副本调度到尽可能少的目标集群上,例如目标集群有三个,但是第一个目标集群拥有足够的资源调度到所有的副本,则副本会全部调度到第一个目标集群上,如图所示:

Weighted 策略

Weighted 策略具体设置通过 weightPreference 字段设置,如果 weightPreference 不设置,则默认给所有目标集群加相同的静态权重 1。

karmada-descheduler

karmada-descheduler在调度策略为动态划分时(dynamic division)时才会生效;karmada-descheduler 将每隔一段时间检测一次所有部署,默认情况下每 2 分钟检测一次。在每个周期中,它会通过调用 karmada-scheduler-estimator 找出部署在目标调度集群中有多少不可调度的副本,然后更新ResourceBinding资源的Clusters[i].Replicas字段,并根据当前情况触发 karmada-scheduler 执行“Scale Schedule”。

karmada scheduler-estimator

当调度策略是动态权重调度或者Aggregated策略时,karmada-scheduler通过调用 karmada-scheduler-estimator不会将过多的副本分配到资源不足的集群中。karmada-scheduler-estimator用来计算集群中CPU,Memory,EphemeralStorage 或者请求创建工作负载中的其他资源是否满足调度需求,对集群中每个节点可调度副本数进行计算,最终计算出该集群可调度的最大副本数。

安装环境

安装cli工具

Karmadactl工具

1.安装指令 curl -s https://raw.githubusercontent.com/karmada-io/karmada/master/hack/install-cli.sh | sudo bash

kubectl-karmada(需要有kubectl环境)

curl -s https://raw.githubusercontent.com/karmada-io/karmada/master/hack/install-cli.sh | sudo bash -s kubectl-karmada

安装Karmada

  • 在你自己的集群上安装 Karmada: karmadactl init –kube-image-mirror-country=cn (国内设置cn区域会下载国内包,否则镜像会一直拉取不下来)
  • 离线安装 kubectl karmada init –crds /$HOME/crds.tar.gz –private-image-registry xxxx

​ crd安装包下载地址: https://github.com/karmada-io/karmada/releases/download/v1.4.0/crds.tar.gz (v1.4.x 都用v1.4.0,其他版本同理)

​ private-image-registry 指定私有仓库镜像地址

TIPS:
出现github拉取gz包一直拉不下来情况。配置github对应地址加速
1. 登录https://ping.chinaz.com/github.com

2. 查询以下域名映射,并分别取访问速度较快的一个ip
#github
151.101.229.194  github.global.ssl.fastly.net
203.208.39.99 assets-cdn.github.com

集群注册和卸载

注册

Push模式
kubectl karmada join member1 --kubeconfig=<karmada kubeconfig> --karmada-context=karmada \
--cluster-kubeconfig=<member1 kubeconfig> --cluster-context=member1

Step 1: Use "karmadactl join" command to register the cluster to Karmada control plane. --cluster-kubeconfig is kubeconfig of the member cluster.
(In karmada)~# MEMBER_CLUSTER_NAME=$(cat ~/.kube/config  | grep current-context | sed 's/: /\n/g'| sed '1d')
(In karmada)~# karmadactl --kubeconfig /etc/karmada/karmada-apiserver.config  join ${MEMBER_CLUSTER_NAME} --cluster-kubeconfig=$HOME/.kube/config

Step 2: Show members of karmada
(In karmada)~# kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get clusters
Pull模式
1.Karmada集群创建token(有效时间为24H)  karmadactl token create --print-register-command --kubeconfig /etc/karmada/karmada-apiserver.config
2.karmadactl register 10.10.x.x:32443 --token t2jgtm.9nybj0526mjw1jbf --discovery-token-ca-cert-hash sha256:f5a5a43869bb44577dba582e794c3e3750f2050d62f1b1dc80fd3d6a371b6ed4


Step 1: Use "karmadactl register" command to register the cluster to Karmada control plane. "--cluster-name" is set to cluster of current-context by default.
(In member cluster)~# karmadactl register 172.31.12.116:32443 --token on3grp.qhjzderafsh6aofe --discovery-token-ca-cert-hash sha256:a3d6de13a53891fa92ad305dad1aad7990c5e7e46b3f51e504c3d51b52d9012c

Step 2: Show members of karmada
(In karmada)~# kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get clusters

卸载

在Karmada主集群方法1.kubectl karmada unjoin member1 --kubeconfig=<karmada kubeconfig> --cluster-kubeconfig=<member1 kubeconfig>
在work集群方法2.kubectl delete cluster member3

TIPS

Karmada 的配置文件默认创建到 /etc/karmada/karmada-apiserver.config
查看pod是否部署成功:kubectl   -n  karmada-system get pod 
查看cluster: kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get clusters
切换config: export KUBECONFIG="$HOME/.kube/karmada.config"

使用

成员部署应用

[root@172-31-12-116 home]# cat deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
---
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
  name: nginx-propagation
spec:
  resourceSelectors:
    - apiVersion: apps/v1
      kind: Deployment
      name: nginx
  placement:
    clusterAffinity:
      clusterNames:
        - cluster121
        - cluster127
    replicaScheduling:
      replicaDivisionPreference: Weighted
      replicaSchedulingType: Divided
      weightPreference:
        staticWeightList:
          - targetCluster:
              clusterNames:
                - cluster121
            weight: 1
          - targetCluster:
              clusterNames:
                - cluster127
            weight: 1

查看信息

查看部署情况

日志查看

用法

[root@172-31-12-116 home]# karmadactl -h
karmadactl controls a Kubernetes Cluster Federation.

Basic Commands:
  get           Display one or many resources

Cluster Registration Commands:
  init          Install the Karmada control plane in a Kubernetes cluster
  deinit        Remove the Karmada control plane from the Kubernetes cluster.
  addons        Enable or disable a Karmada addon
  join          Register a cluster to Karmada control plane with Push mode
  unjoin        Remove a cluster from Karmada control plane
  token         Manage bootstrap tokens
  register      Register a cluster to Karmada control plane with Pull mode

Cluster Management Commands:
  cordon        Mark cluster as unschedulable
  uncordon      Mark cluster as schedulable
  taint         Update the taints on one or more clusters

Troubleshooting and Debugging Commands:
  logs          Print the logs for a container in a pod in a cluster
  exec          Execute a command in a container in a cluster
  describe      Show details of a specific resource or group of resources in a cluster
  interpret     Validate, test and edit interpreter customization before applying it to the control plane

Advanced Commands:
  apply         Apply a configuration to a resource by file name or stdin and propagate them into member clusters
  promote       Promote resources from legacy clusters to Karmada control plane

Other Commands:
  completion    Generate the autocompletion script for the specified shell
  version       Print the version information

   转载规则


《基于Karmada的多集群管理(一)》 by XieJiayi is licensed under a 知识共享署名 4.0 国际许可协议 许可协议。转载请注明来源
 上一篇
基于karmada的多集群管理(二) 基于karmada的多集群管理(二)
基于Karmada的多集群管理-调度(二)介绍上文主要介绍了karmada集群的快速搭建以及基本的用例的下发demo,本文主要详细介绍karmada集群中调度传播策略propagationpolicies、差异性配置overridepoli
2023-04-10
下一篇 
基于prometheus的告警监控 基于prometheus的告警监控
prometheus系统架构图手动试验:1.部署一个简单的webhook服务 apiVersion: apps/v1 kind: Deployment metadata: name: alert-webhook namespac
  目录