Kind 部署 Karmada 多集群管理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kind 部署 Karmada 多集群管理相关的知识,希望对你有一定的参考价值。

参考技术A Karmada 是 CNCF 的云原生项目,主要的能力是纳管多个 Kubernetes 集群,以及基于原生的 Kubernetes 的资源对象,将其下发到多个集群。对于一些有计算资源需求的 Deployment,Job 等 workload 具体副本数调度能力,让不同的 workload 按照一些的策略运行在不同的集群上。以此来达到多云分发的能力的这么一个项目。

Karmada 和 Kubernetes 的关系:首先 Karmada 本身需要运行在 Kubernetes 集群中,这样的 Kubernetes 集群,我们称作为 Host Cluster (宿主集群),主要是用来运行 Karmada 控制平面的组件,其中包含 Karmada 的 etcd,karmada-api server, karmada-controller manager, Kubernetes controller manager,karmada-scheduler,karmada-webhook, karmada-scheduler-estimator 等控制面的组件。还有一种集群是负责真正运行工作负载的集群,对于这种集群,我们称之为 Workload Cluster。在 Workload Cluster 集群中,会真正运行业务的容器、一些 Kubernetes 的资源对象、存储、网络、dns 等,同时对于 pull 模式的部署方式,还会运行 Karmada 的 agent 组件,用于和控制面组件通信,完成工作负载的下发能力。

本次实验环境使用 Kind 创建集群,因此需要提前安装好 Kind。请自行搜索安装。

我们直接使用 Karmada 为我们提供的脚本部署集群。

Kind配置文件

若需执行上面的 kind 配置文件,按照下面步骤进行修改。

开始部署。

安装 Karmada 1.1.0,根据实际情况替换对应的版本号。

看到以下内容表示你已经成功的将 karmada 部署到了,你刚创建 K8S 集群上。

karmada 部署完成后,你直接执行 kubectl get cluster 发现没有找到对应 crd 资源,那是因为 karmada apiserver 的配置文件没有找对。

因此我们来配置一个命令别名方便我们后续使用。

下面我们就可以使用这个命令来查询 Karmada 对应的 crd 列表了。

karmadactl 命令,我没有找到现成的二进制文件,通过源码自行编译了一个。

在源码项目根路径下执行一下命令即可。

执行下面命令将集群加入到 Karmada 中。

输出下面结果,则表示集群已经顺利加入了。

使用Karmada实现Helm应用的跨集群部署

摘要:借助Karmada原生API的支持能力,Karmada可以借助Flux轻松实现Helm应用的跨集群部署。

本文分享自华为云社区《 使用Karmada实现Helm应用的跨集群部署【云原生开源】》,作者:华为云云原生开源团队。

背景

通过使用 Kubernetes 原生 API 并提供高级调度功能,Karmada已经实现了多集群场景下的Kubernetes资源(包括CRD)的分发以及管理。但当前多集群应用往往不是单一的资源形式,使用Helm对应用进行打包的使用场景也非常常见。

借助Karmada原生API的支持能力,Karmada可以借助Flux轻松实现Helm应用的跨集群部署。

部署Karmada

要部署Karmada,你可以参考社区的安装文档(https://github.com/karmada-io/karmada/blob/master/docs/installation/installation.md)。如果想快速体验Karmada,我们建议通过hack/local-up-karmada.sh构建一个Karmada的开发环境。

部署Flux

在Karmada控制面中,你需要安装Flux的CRD,但不需要安装Flux控制器来调和基于CRD创建的CR对象,它们被视为资源模板,而不是特定的资源实例。基于Karmada的work API,它们将被封装为一个work对象下发给成员集群,最终由成员集群中的Flux控制器进行调和。

kubectl apply -k github.com/fluxcd/flux2/manifests/crds?ref=main --kubeconfig ~/.kube/karmada.config

在成员集群中,你可以基于以下命令安装完整的Flux组件。

flux install --kubeconfig ~/.kube/members.config --context member1

flux install --kubeconfig ~/.kube/members.config --context member2

你可以参考此处的文档(https://fluxcd.io/docs/installation/)来获得更详细的安装Flux的细节。

提示:如果你想在你所有的集群上管理基于HelmRelease的应用,你需要在你的所有成员集群中安装Flux。

Helm release分发

准备工作就绪,下面将以一个podinfo的简单应用为例演示如何完成Helm chart分发。

1.在 Karmada 控制平面中定义一个 Flux 的HelmRepository CR对象和一个 HelmRelease CR对象。它们将视作资源模板。

apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: HelmRepository
metadata:
  name: podinfo
spec:
  interval: 1m
  url: https://stefanprodan.github.io/podinfo  

---

apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
  name: podinfo
spec:
  interval: 5m
  chart:
    spec:
      chart: podinfo
      version: 5.0.3
      sourceRef:
        kind: HelmRepository
        name: podinfo

2. 定义一个 Karmada的PropagationPolicy 对象将它们的资源实例下发到成员集群:

apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
  name: helm-repo
spec:
  resourceSelectors:
    - apiVersion: source.toolkit.fluxcd.io/v1beta2
      kind: HelmRepository
      name: podinfo
  placement:
    clusterAffinity:
      clusterNames:
        - member1
        - member2

---

apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
  name: helm-release
spec:
  resourceSelectors:
    - apiVersion: helm.toolkit.fluxcd.io/v2beta1
      kind: HelmRelease
      name: podinfo
  placement:
    clusterAffinity:
      clusterNames:
        - member1
        - member2

上述配置将会把Flux的资源对象下发到成员集群member1和member2中。

3. 将上述对象提交给Karmada-apiserver:

kubectl apply -f ../helm/ --kubeconfig ~/.kube/karmada.config

你将会得到以下的输出结果:

helmrelease.helm.toolkit.fluxcd.io/podinfo created
helmrepository.source.toolkit.fluxcd.io/podinfo created
propagationpolicy.policy.karmada.io/helm-release created
propagationpolicy.policy.karmada.io/helm-repo created

4. 切换至成员集群验证应用是否成功下发

helm --kubeconfig ~/.kube/members.config --kube-context member1 list

你将会得到以下的输出结果:

基于 Karmada 的 PropagationPolicy,你可以灵活地将 Helm应用发布到你期望的集群。

为特定集群定制 Helm 应用

上述的示例显示了如何将同一个Helm应用分发到 Karmada 中的多个集群。此外,你还可以使用 Karmada 的 OverridePolicy 为特定集群定制Helm应用。例如,上述应用包括了一个Pod副本,如果你只想更改 member1集群中的应用所包含的Pod副本数,你可以参考以下的 OverridePolicy策略。

1.定义一个Karmada的OverridePolicy对象。

apiVersion: policy.karmada.io/v1alpha1
kind: OverridePolicy
metadata:
  name: example-override
  namespace: default
spec:
  resourceSelectors:
  - apiVersion: helm.toolkit.fluxcd.io/v2beta1
    kind: HelmRelease
    name: podinfo
  overrideRules:
  - targetCluster:
      clusterNames:
        - member1
    overriders:
      plaintext:
        - path: "/spec/values"
          operator: add
          value:
            replicaCount: 2

2. 将上述对象提交给Karmada-apiserver:

kubectl apply -f example-override.yaml --kubeconfig ~/.kube/karmada.config

你将会得到以下的输出结果:

overridepolicy.policy.karmada.io/example-override created

3. 在 Karmada 控制平面中应用上述策略后,你会发现 member1成员集群中的Pod实例数已变更为 2,但 member2 集群中的那些保持不变。

kubectl --kubeconfig ~/.kube/members.config --context member1 get po

你将会得到以下的输出结果:

NAME                       READY   STATUS    RESTARTS   AGE
podinfo-68979685bc-6wz6s   1/1     Running   0          6m28s
podinfo-68979685bc-dz9f6   1/1     Running   0          7m42s

参考文档:

karmada/working-with-flux.md at master · karmada-io/karmada · GitHub

附:Karmada社区技术交流地址

添加Karmada社区助手微信k8s2222进入社区交流群,和Maintainer零距离。

项目地址:

GitHub - karmada-io/karmada: Open, Multi-Cloud, Multi-Cluster Kubernetes Orchestration

Slack地址:https://slack.cncf.io/

点击关注,第一时间了解华为云新鲜技术~

以上是关于Kind 部署 Karmada 多集群管理的主要内容,如果未能解决你的问题,请参考以下文章

k8s多集群分发方案karmada解析

Karmada 千级容器集群:工商银行业务容灾管理设计利器

业务容灾管理设计利器:工商银行如何使用 Karmada 千级容器集群

61 k8s + rancher + karmada容器化部署

使用Karmada实现Helm应用的跨集群部署

工商银行:应用多k8s集群管理及容灾实践