文章目錄
- karmada簡介
- karmada概述
- karmada Helm部署
- Kubernetes karmada介紹
- 基礎準備
- Kubernetes集群
- 獲取chat包
- 正式部署
- karmada使用
- karmada納管集群
- 查看memeber集群
- 導出kubeconfig
- 切換集群
- 測試應用
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包。
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)。 | 可選 | 提供便利性,非核心功能。 |
root@master01:~# mkdir karmada
root@master01:~# cd karmada/
root@master01:~/karmada# helm show values karmada-charts/karmada > defaults-values.yamlroot@master01:~/karmada# vim my-values.yaml
components: - "descheduler"- "search"
etcd:internal:replicaCount: 1storageType: "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 文件。
root@master01:~/karmada# helm template karmada karmada-charts/karmada --namespace karmada-system -f my-values.yaml > karmada-manifests.yaml
- 確認驗證
確認主要組件部署成功。
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。
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 ]; thenapt-get update -yapt-get install -y yq
elif [ -f /etc/redhat-release ]; thenyum install -y epel-releaseyum install -y yq
elseecho "[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"
EOFecho -e "\n[INFO] 已生成 $OUT_FILE"root@master01:~/karmada# bash mkagent.sh
root@master01:~/karmada# cat host-agent-values.yaml
釋義:如上腳本可生成當前部署karmada集群的Kubernetes加入karmada的helm values部署文件。
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的切換,從而實現集群的管理。
root@master01:~/karmada# kubectl -n karmada-system get secret karmada-kubeconfig -o jsonpath='{.data.kubeconfig}' | base64 -d > /root/.kube/karmada.configroot@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/profileroot@master01:~/karmada# kubectl -n karmada-system get svc karmada-apiserver -o jsonpath='{.spec.clusterIP}'
10.20.19.121root@master01:~/karmada# echo "10.20.19.121 karmada-apiserver.karmada-system.svc.cluster.local" | sudo tee -a /etc/hosts
切換集群
切換到聯邦集群。
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集群,模擬應用的聯邦集群調度。
- 創建部署
root@karmada:~/karmada# vim nginx_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginxlabels:app: nginx
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: uhub.service.ucloud.cn/imxhy/nginx:1.29.0name: nginxroot@master01:~/karmada# kubectl apply -f nginx_deployment.yaml
- 創建調度策略
root@karmada:~/karmada# vim nginx_propagationpolicy.yaml
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:name: nginx-propagation
spec:resourceSelectors:- apiVersion: apps/v1kind: Deploymentname: nginxplacement:clusterAffinity:clusterNames:- host-clusterreplicaScheduling:replicaDivisionPreference: WeightedreplicaSchedulingType: DividedweightPreference:staticWeightList:- targetCluster:clusterNames:- member1weight: 1
root@master01:~/karmada# kubectl apply -f nginx_propagationpolicy.yaml
- 確認調度結果
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 集群中。