Karmada(Kubernetes Armada)是一个 Kubernetes 管理系统,使您能够在多个 Kubernetes 集群和云中运行云原生应用程序,而无需更改应用程序。通过使用 Kubernetes 原生 API 并提供先进的调度功能,Karmada 实现了真正的开放式、多云 Kubernetes。

Karmada 旨在为多云和混合云场景下的多集群应用程序管理提供即插即用的自动化,具有集中式多云管理、高可用性、故障恢复和流量调度等关键功能。

本文是 Karmada 的快速入门,将介绍如何安装、怎么添加集群和怎么部署一个 deployment。

安装

准备 k8s 集群

在安装 Karmada 之前需要先准备两个 k8s 集群,建议使用 kubekey 快速安装,点击此链接进行参考。

准备 CSI

搭建好集群之后,需要准备 CSI ,在两个 k8s 集群中执行下面命令可以安装 openebs 的 CSI:

kubectl apply -f https://openebs.github.io/charts/openebs-operator.yaml

安装 karmada

安装完成 CSI 之后在任意一个 k8s 集群中可以安装 karmada-server,将介绍使用 operator 和 karmadactl 两种安装方式。

operator 安装

在执行以下命令使用 helm 安装 karmada-operator:

wget https://github.com/karmada-io/karmada/releases/download/v1.9.5/karmada-operator-chart-v1.9.5.tgz

tar xvf karmada-operator-chart-v1.9.5.tgz

cd  karmada-operator

helm install karmada-operator .  -n karmada-system --create-namespace --set operator.image.tag=v1.9.5

安装完成之后执行 kubectl get pod -n karmada-system 命令查看 operator 安装是否完成。

在确认 operator 安装完成之后,将下面的文件保存为 karmada.yaml 文件,执行 kubectl apply -f karmada.yaml 命令,即可创建 karmada-server 服务。

apiVersion: operator.karmada.io/v1alpha1
kind: Karmada
metadata:
  name: karmada-demo
  namespace: karmada-system
spec:
  components:
    etcd:
      local:
        imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers/etcd
        imageTag: 3.5.13-0
        replicas: 1
        volumeData:
          # hostPath:
          #   type: DirectoryOrCreate
          #   path: /var/lib/karmada/etcd/karmada-demo
          volumeClaim:
            metadata:
              name: etcd-data
            spec:
              accessModes:
                - ReadWriteOnce
              resources:
                requests:
                  storage: 3Gi
              storageClassName: openebs-hostpath
    karmadaAPIServer:
      imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver
      imageTag: v1.29.6
      replicas: 1
      serviceType: NodePort
      serviceSubnet: 10.96.0.0/12
    karmadaAggregatedAPIServer:
      imageRepository: docker.io/karmada/karmada-aggregated-apiserver
      imageTag: v1.8.0
      replicas: 1
    karmadaControllerManager:
      imageRepository: docker.io/karmada/karmada-controller-manager
      imageTag: v1.8.0
      replicas: 1
    karmadaScheduler:
      imageRepository: docker.io/karmada/karmada-scheduler
      imageTag: v1.8.0
      replicas: 1
    karmadaWebhook:
      imageRepository: docker.io/karmada/karmada-webhook
      imageTag: v1.8.0
      replicas: 1
    kubeControllerManager:
      imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager
      imageTag: v1.29.6
      replicas: 1
    karmadaMetricsAdapter:
      imageRepository: docker.io/karmada/karmada-metrics-adapter
      imageTag: v1.8.0
      replicas: 2
    # karmadaSearch: # the component `Karmadasearch` is not installed by default, if you need to install it, uncomment it and note the formatting
      # imageRepository: docker.io/karmada/karmada-search
      # imageTag: v1.8.0
      # replicas: 1
    # karmadaDescheduler: # the component `KarmadaDescheduler` is not installed by default, if you need to install it, uncomment it and note the formatting
      # imageRepository: docker.io/karmada/karmada-descheduler
      # imageTag: v1.8.0
      # replicas: 1
  hostCluster:
    networking:
      dnsDomain: cluster.local
使用 karmadactl 命令安装

点击链接下载所需要的 karamdactl 的版本,下载完成之后执行以下命令进行 karmada-server 的安装:

./karmadactl init  --kube-image-mirror-country='cn'

添加集群

准备 karmada-apiserver.config 文件

在注册集群之前,需要先找到 karmada-apiserver.config 文件。使用 operator 创建的 karmada-server ,执行以下命令获取文件:

kubectl get secret -n karmada-system karmada-demo-admin-config -o jsonpath={.data.kubeconfig} | base64 -d > ~/.kube/karmada-apiserver.config

使用 karmadactl 命令创建的 karmada-server 文件存放在 /etc/karmada 文件下面。

注册集群

将准备好的 karmada-kubeconfig 文件,传送到另一台服务器上,然后执行以下命令进行集群注册:

./karmadactl --kubeconfig /root/.kube/karmada-apiserver.config  join test --cluster-kubeconfig=$HOME/.kube/config ## test为名字,可以自定义,第一个 kubeconfig 是 karmada-apiserver.config 的位置,第二个 --cluster-kubeconfig 是集群本身 kubeconfig 文件的位置

在任意一台服务器上执行以下命令即可看到已经添加成功的集群:

[root@node1 ~]# kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get clusters
NAME    VERSION    MODE   READY   AGE
test   v1.23.10   Push   True    4d18h

如何部署一个 deployment

在部署 deployment 前,要先创建一个调度策略,用于声明 nginx 的 deployment 在哪个集群中运行。

将下面 yaml 文件保存为 policy.yaml ,执行命令 kubectl --kubeconfig /etc/karmada/karmada-apiserver.config apply -f policy.yaml 创建策略。

apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
  name: example-policy # The default namespace is `default`.
spec:
  resourceSelectors:
    - apiVersion: apps/v1
      kind: Deployment
      name: nginx # If no namespace is specified, the namespace is inherited from the parent object scope.
  placement:
    clusterAffinity:
      clusterNames:
        - test

在策略完成之后执行命令 kubectl --kubeconfig /etc/karmada/karmada-apiserver.config create deployment nginx --image nginx,在 test 集群中以下命令就可以查看到正在运行的 nginx pod:

[root@node2 ~]#  kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-85b98978db-6wqpx   1/1     Running   0          6m5s

总结

Karmada 在 k8s 集群之上抽象了一个 k8s 集群,被抽象出来的集群中的节点就是部署在各个地方的 k8s 集群,通过创建调度策略,来指定每个资源运行在哪个 k8s 集群中。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐