文章目录
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
- kubectl karmada join方式
参考:附051.Kubernetes Karmada kubectl 插件部署联邦及使用
查看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 集群中。