附050.Kubernetes Karmada Helm部署联邦及使用

文章目录

karmada简介

karmada概述

参考:附049.Kubernetes Karmada Local-up部署联邦

karmada Helm部署

Kubernetes karmada介绍

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

Karmada 旨在为多云和混合云场景中的多集群应用程序管理提供开箱即用的自动化,其关键特性包括集中式多云管理、高可用性、故障恢复和流量调度。

基础准备

Kubernetes集群

该方式是讲karmada以Kubernetes资源进行部署,在部署之前必须有一个Kubernetes集群,Kubernetes集群部署可参考:附045.Kubernetes_v1.33.2高可用部署架构二

提示:该方式部署还需要提前安装Helm,helm安装也可参考如上链接。

获取chat包

该方式安装,会在命名空间 karmada-system 中安装名为 karmada 的chat包。

shell 复制代码
root@master01:~# helm repo add karmada-charts https://raw.githubusercontent.com/karmada-io/karmada/master/charts
root@master01:~# helm repo list
root@master01:~# helm search repo karmada                #查看版本
NAME                            CHART VERSION   APP VERSION     DESCRIPTION                      
karmada-charts/karmada          v1.15.0         v1.1.0          A Helm chart for karmada         
karmada-charts/karmada-operator v1.15.0         v1.1.0          A Helm chart for karmada-operator

正式部署

参考默认配置,创建自定义配置:

  • 部署descheduler和search,
  • etcd保持持久化,利用集群已有的StorageClass。
组件 安装位置 作用 必要性 备注
descheduler Karmada 控制面 (host cluster) 全局决策者。监视所有成员集群状态,根据策略决定是否以及如何在集群间迁移工作负载。 可选,但生产推荐 在控制面做全局决策。
search Karmada 控制面 (host cluster) 提供全局搜索API。允许用户从一个地方(Karmada API)查询所有成员集群中的资源(如Pod, Service)。 可选 提供便利性,非核心功能。
shell 复制代码
root@master01:~# mkdir karmada
root@master01:~# cd karmada/
root@master01:~/karmada# helm show values karmada-charts/karmada > defaults-values.yaml

root@master01:~/karmada# vim my-values.yaml
components: 
  - "descheduler"
  - "search"
etcd:
  internal:
    replicaCount: 1
    storageType: "persistentVolume"
    pvc:
      storageClass: "longhorn"
      size: "5G"

root@master01:~/karmada# helm upgrade --install karmada karmada-charts/karmada --create-namespace --namespace karmada-system -f my-values.yaml

提示:可使用如下命令渲染为传统部署的 mainfests 文件。

shell 复制代码
root@master01:~/karmada# helm template karmada karmada-charts/karmada --namespace karmada-system -f my-values.yaml > karmada-manifests.yaml
  • 确认验证
    确认主要组件部署成功。
shell 复制代码
root@master01:~/karmada# kubectl -n karmada-system get pods -o wide
NAME                                               READY   STATUS    RESTARTS       AGE     IP            NODE       NOMINATED NODE   READINESS GATES
etcd-0                                             1/1     Running   0              5m30s   10.10.30.93   worker02   <none>           <none>
karmada-aggregated-apiserver-7974c77ddb-2lbt6      1/1     Running   0              5m30s   10.10.30.80   worker02   <none>           <none>
karmada-apiserver-cc9bd8d5b-qld4b                  1/1     Running   0              5m30s   10.10.30.70   worker02   <none>           <none>
karmada-controller-manager-86d7d4cdc-nvs4b         1/1     Running   0              5m30s   10.10.30.71   worker02   <none>           <none>
karmada-descheduler-579dc78566-9r2sq               1/1     Running   0              5m29s   10.10.5.15    worker01   <none>           <none>
karmada-descheduler-579dc78566-h78kk               1/1     Running   0              5m29s   10.10.30.77   worker02   <none>           <none>
karmada-kube-controller-manager-55948f7b57-2mf87   1/1     Running   0              5m30s   10.10.30.76   worker02   <none>           <none>
karmada-scheduler-7bdb96b45-8fbdv                  1/1     Running   0              5m30s   10.10.30.78   worker02   <none>           <none>
karmada-search-75b647f567-f4d6v                    1/1     Running   0              5m29s   10.10.5.28    worker01   <none>           <none>
karmada-search-75b647f567-p64bx                    1/1     Running   0              5m29s   10.10.30.74   worker02   <none>           <none>
karmada-webhook-c77c9f797-rz6cz                    1/1     Running   0              5m30s   10.10.30.72   worker02   <none>           <none>

karmada使用

karmada纳管集群

使用karmada可纳管多个集群,有两种主要方式:

  • Helm安装agent

参考官方示例:Install agent

使用如下脚本可快速生成helm部署的values.yaml。

shell 复制代码
root@master01:~/karmada# vim mkagent.sh 
#!/bin/bash
#***************************************************************#
# ScriptName: mkagent.sh
# Author: xhy
# Create Date: 2025-09-05 16:32
# Modify Author: xhy
# Modify Date: 2025-09-05 16:33
# Version: v1
#***************************************************************#
#***************************************************************#
# 作用:
#   1. 自动检测操作系统 (Ubuntu/Debian 或 CentOS/RHEL)
#   2. 安装 yq
#   3. 从 karmada-system 的 karmada-kubeconfig secret 提取
#      CA/CRT/KEY 并生成 Helm values 文件
#***************************************************************#

OUT_FILE=host-agent-values.yaml
CLUSTER_NAME="host-cluster"

# 0. 安装 yq 工具
echo "[INFO] 正在检测系统并安装 yq ..."
if [ -f /etc/debian_version ]; then
  apt-get update -y
  apt-get install -y yq
elif [ -f /etc/redhat-release ]; then
  yum install -y epel-release
  yum install -y yq
else
  echo "[WARN] 未识别的操作系统, 请手动安装 yq (>=v4.x)"
  exit 1
fi

# 1. 获取 kubeconfig 数据
KARMADA_KUBECONFIG=$(kubectl -n karmada-system get secret karmada-kubeconfig \
  -o jsonpath='{.data.kubeconfig}' | base64 -d)

# 2. 提取 CA/CRT/KEY/Server
CA=$(echo "$KARMADA_KUBECONFIG" | yq -r '.clusters[0].cluster."certificate-authority-data"' | base64 -d)
CRT=$(echo "$KARMADA_KUBECONFIG" | yq -r '.users[0].user."client-certificate-data"' | base64 -d)
KEY=$(echo "$KARMADA_KUBECONFIG" | yq -r '.users[0].user."client-key-data"' | base64 -d)
SERVER=$(echo "$KARMADA_KUBECONFIG" | yq -r '.clusters[0].cluster.server')

# 3. 生成 values.yaml
cat > $OUT_FILE <<EOF
installMode: "agent"
agent:
  clusterName: "$CLUSTER_NAME"
  kubeconfig:
    caCrt: |
$(echo "$CA" | sed 's/^/      /')
    crt: |
$(echo "$CRT" | sed 's/^/      /')
    key: |
$(echo "$KEY" | sed 's/^/      /')
    server: "$SERVER"
EOF

echo -e "\n[INFO] 已生成 $OUT_FILE"

root@master01:~/karmada# bash mkagent.sh
root@master01:~/karmada# cat host-agent-values.yaml

释义:如上脚本可生成当前部署karmada集群的Kubernetes加入karmada的helm values部署文件。

shell 复制代码
root@master01:~/karmada# helm upgrade --install karmada-agent karmada-charts/karmada \
  -n karmada-system \
  -f host-agent-values.yaml

查看memeber集群

导出kubeconfig

将karmada-apiserver的kubeconfig导出到宿主机,然后可以在host-cluster进行kubectl的切换,从而实现集群的管理。

shell 复制代码
root@master01:~/karmada# kubectl -n karmada-system get secret karmada-kubeconfig -o jsonpath='{.data.kubeconfig}' | base64 -d > /root/.kube/karmada.config

root@master01:~/karmada# vim /etc/profile.d/custom_kubectl.sh 
export KUBECONFIG=/root/.kube/config:/root/.kube/karmada.config
source <(kubectl completion bash)

root@master01:~/karmada# source /etc/profile

root@master01:~/karmada# kubectl -n karmada-system get svc karmada-apiserver -o jsonpath='{.spec.clusterIP}'
10.20.19.121

root@master01:~/karmada# echo "10.20.19.121 karmada-apiserver.karmada-system.svc.cluster.local" | sudo tee -a /etc/hosts
切换集群

切换到联邦集群。

shell 复制代码
root@master01:~/karmada# kubectl config use-context karmada-apiserver 
root@master01:~/karmada# kubectl get clusters
NAME           VERSION   MODE   READY   AGE
host-cluster   v1.33.2   Pull   True    31m

测试应用

使用现有的一个cluster集群,模拟应用的联邦集群调度。

  • 创建部署
shell 复制代码
root@karmada:~/karmada# vim nginx_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: uhub.service.ucloud.cn/imxhy/nginx:1.29.0
        name: nginx

root@master01:~/karmada# kubectl apply -f nginx_deployment.yaml
  • 创建调度策略
shell 复制代码
root@karmada:~/karmada# vim nginx_propagationpolicy.yaml
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
  name: nginx-propagation
spec:
  resourceSelectors:
    - apiVersion: apps/v1
      kind: Deployment
      name: nginx
  placement:
    clusterAffinity:
      clusterNames:
        - host-cluster
    replicaScheduling:
      replicaDivisionPreference: Weighted
      replicaSchedulingType: Divided
      weightPreference:
        staticWeightList:
          - targetCluster:
              clusterNames:
                - member1
            weight: 1
root@master01:~/karmada# kubectl apply -f nginx_propagationpolicy.yaml
  • 确认调度结果
shell 复制代码
root@master01:~/karmada# kubectl config use-context kubernetes-admin@kubernetes 

root@master01:~/karmada# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP             NODE       NOMINATED NODE   READINESS GATES
nginx-6bcdf8cdb8-bx9lq   1/1     Running   0          77s   10.10.30.118   worker02   <none>           <none>

结论:如上所示,使用 PropagationPolicy 可创建集群的调度策略。从而实现在联邦 api-server 中将对应的资源调度到指定的 Kubernetes 集群中。

相关推荐
wdxylb5 小时前
Kubernetes实战系列(4)
云原生·容器·kubernetes
专注代码七年6 小时前
Docker 本地开发环境搭建(MySQL5.7 + Redis7 + Nginx + 达梦8)- Windows11 版 2.0
nginx·docker·容器
我真的是大笨蛋6 小时前
K8S-Pod(上)
java·云原生·容器·kubernetes
脚大江山稳11 小时前
docker使用nginxWebUI配置
java·docker·容器
iiYcyk12 小时前
服务器线程高占用定位方法
容器
哈里谢顿12 小时前
Kubernetes 服务高可用详解
kubernetes
A-刘晨阳13 小时前
从全球视角到K8s落地的Apache IoTDB实战
kubernetes·apache·iotdb
Delphi菜鸟1 天前
docker 部署RustDesk服务
运维·docker·容器
Sweety丶╮7941 天前
【Kubernetes】知识点总结5
云原生·容器·kubernetes