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

发布于:2025-09-07 ⋅ 阅读:(12) ⋅ 点赞:(0)

karmada联邦介绍

karmada联邦概述

参考:Karmada 是什么?

karmada联邦组件

参考:关键组件

karmada联邦核心概念

参考:核心概念

karmada联邦架构设计

参考;架构设计

local-up脚本部署karmada

部署介绍

该方式通过一条脚本 hack/local-up-karmada.sh,快速在本地(开发/测试环境)启动一个完整的 Karmada 管理平面,并预置三个成员集群(member1、member2、member3)。
最终效果是:可以直接在本机用 kubectl --kubeconfig ~/.kube/karmada.config 访问 Karmada 控制平面,并调度到这三个成员集群。

Karmada 本身是一个多集群控制面,它需要:
Host 集群:运行 Karmada 控制面组件(apiserver、etcd、controller-manager、scheduler等)。
Member 集群:作为需要纳管的工作集群,加入到 host 的控制面。

local-up 的设计理念是:

  1. 使用 kind (Kubernetes in Docker)快速创建容器嵌套集群,模拟 host 和多个 member 集群。
  2. 在 host 集群中安装并启动 Karmada 控制平面。
  3. 自动把 3 个模拟集群注册到 Karmada 控制面,变成 clusters 资源对象。

这样就不依赖外部真实 Kubernetes 集群,开发者本机一键就能有一个完整的 Karmada testbed。

003

提示:该方式建议在一台全新的节点部署,若在已位于Kubernetes集群的节点,或已使用containerd容器运行时的节点,可能产生冲突。

基础准备

系统调优

建议将文件句柄调大。

root@karmada:~# sudo tee -a /etc/security/limits.d/custom_limits.conf <<EOF
# all user
* soft nofile 1048576
* hard nofile 1048576
* soft nproc 65535

# root
root soft nofile 1048576
root hard nofile 1048576
root soft nproc 65535
EOF
docker安装
  • 安装依赖

使用local-up部署karmada,依赖于docker。

root@karmada:~# sudo apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common            #安装软件包以允许apt通过HTTPS使用存储库
  • 添加Docker源
root@karmada:~# curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
root@karmada:~# chmod a+r /etc/apt/keyrings/docker.asc

root@karmada:~# echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.aliyun.com/docker-ce/linux/ubuntu/ \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  
root@karmada:~# sudo apt-get update
  • 安装docker ce
root@karmada:~# sudo sudo apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

root@karmada:~# sudo docker version
  • 配置docker加速器
root@karmada:~# mkdir -p /etc/docker /data/docker
root@karmada:~# cat > /etc/docker/daemon.json << EOF
{
  "data-root": "/data/docker",
  "registry-mirrors": [
    "https://js.linuxsb.com"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "200m",
    "max-file": "3"
  },
  "storage-driver": "overlay2"
}
EOF

root@karmada:~# systemctl daemon-reload
root@karmada:~# systemctl enable docker --now
kubectl命令安装

使用local-up部署,需要准备相关go命令。

root@karmada:~# KUBEARCH=`dpkg --print-architecture`
root@karmada:~# KUBVERSION=v1.34.0
root@karmada:~# curl -Lo ./kubectl https://dl.k8s.io/release/${KUBVERSION}/bin/linux/${KUBEARCH}/kubectl
root@karmada:~# chmod +x ./kubectl
root@karmada:~# mv ./kubectl /usr/local/bin/kubectl

root@karmada:~# kubectl version

root@karmada:~# cat >> /etc/profile.d/custom_kubectl.sh <<EOF
source <(kubectl completion bash)
EOF
go命令安装

使用local-up部署,需要准备相关go命令。

root@karmada:~# GOARCH=`dpkg --print-architecture`
root@karmada:~# GOVERSION=1.25.0
root@karmada:~# wget https://go.dev/dl/go${GOVERSION}.linux-${GOARCH}.tar.gz
root@karmada:~# tar -C /usr/local -xzf go${GOVERSION}.linux-${GOARCH}.tar.gz

root@karmada:~# echo 'export PATH=$PATH:/usr/local/go/bin' >> /etc/profile.d/custom_path.sh

root@karmada:~# source /etc/profile.d/custom_path.sh 
root@karmada:~# go version
kind命令安装

使用local-up部署,需要准备相关go命令。

root@karmada:~# KINDARCH=`dpkg --print-architecture`
root@karmada:~# KINDVERSION=v0.30.0
root@karmada:~# curl -Lo ./kind https://kind.sigs.k8s.io/dl/${KINDVERSION}/kind-$(uname)-${KINDARCH}
root@karmada:~# chmod +x ./kind
root@karmada:~# mv ./kind /usr/local/bin/kind

root@karmada:~# kind version

获取源码

root@karmada:~# git clone https://github.com/karmada-io/karmada

安装karmada

使用脚本安装karmada。

root@karmada:~# cd karmada/
root@karmada:~/karmada# ./hack/local-up-karmada.sh
  • 故障处理
    安装过程中会使用kind创建一个karmada-host-control-plane容器,该容器内基于containerd容器运行时创建一个Kubernetes集群。
    有时候会遇到该Kubernetes集群的kube-proxy Pod异常,建议如下调整:

提示:建议重开一个窗口做如下优化,等待初始化脚本完成。

root@karmada:~# docker exec -ti karmada-host-control-plane /bin/bash

root@karmada-host-control-plane:/# cat >> /etc/sysctl.conf <<EOF
fs.inotify.max_user_watches=1048576
fs.inotify.max_user_instances=8192
fs.inotify.max_queued_events=32768
EOF

root@karmada-host-control-plane:/# sysctl -p

root@karmada-host-control-plane:/# tee -a /etc/security/limits.d/custom_limits.conf <<EOF
# all user
* soft nofile 1048576
* hard nofile 1048576
* soft nproc 65535

# root
root soft nofile 1048576
root hard nofile 1048576
root soft nproc 65535
EOF

root@karmada-host-control-plane:/# mkdir -p /etc/systemd/system/containerd.service.d

root@karmada-host-control-plane:/# cat > /etc/systemd/system/containerd.service.d/override.conf <<EOF
[Service]
LimitNOFILE=1048576
LimitNPROC=65535
EOF

root@karmada-host-control-plane:/# mkdir -p /etc/containerd/certs.d/docker.io/

root@karmada-host-control-plane:/# cat > /etc/containerd/certs.d/docker.io/hosts.toml <<EOF
server = "https://registry-1.docker.io"

[host."https://js.linuxsb.com"]
  capabilities = ["pull", "resolve", "push"]
EOF

root@karmada-host-control-plane:/# systemctl daemon-reload
root@karmada-host-control-plane:/# systemctl restart containerd

root@karmada-host-control-plane:/# kubectl get pods -o wide -A

001

等待初始化完成:

root@karmada:~/karmada# ./hack/local-up-karmada.sh 

002

测试应用

使用模拟生成的三个cluster集群,模拟应用的联邦集群调度。

root@karmada:~# export KUBECONFIG="$HOME/.kube/karmada.config"
root@karmada:~# kubectl config use-context karmada-host
root@karmada:~# kubectl get pods -o wide -A
  • 切换上下文
    切换上下文,查看当前member cluster。
root@karmada:~# export KUBECONFIG="$HOME/.kube/karmada.config"
root@karmada:~# kubectl config use-context karmada-apiserver 
Switched to context "karmada-apiserver".
root@karmada:~# kubectl get clusters
NAME      VERSION   MODE   READY   AGE
member1   v1.31.2   Push   True    3m17s
member2   v1.31.2   Push   True    3m12s
member3   v1.31.2   Pull   True    3m5s
  • 模拟部署
root@karmada:~/karmada# cat samples/nginx/deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx
root@karmada:~/karmada# cat samples/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:
        - member1
        - member2
    replicaScheduling:
      replicaDivisionPreference: Weighted
      replicaSchedulingType: Divided
      weightPreference:
        staticWeightList:
          - targetCluster:
              clusterNames:
                - member1
            weight: 1
          - targetCluster:
              clusterNames:
                - member2
            weight: 1
            
root@karmada:~/karmada# kubectl apply -f samples/nginx/deployment.yaml                  #部署测试业务
root@karmada:~/karmada# kubectl apply -f samples/nginx/propagationpolicy.yaml           #部署调度策略

root@karmada:~/karmada# export KUBECONFIG="$HOME/.kube/members.config"
root@karmada:~/karmada# kubectl config use-context member1                              #切换至member1集群
root@karmada:~/karmada# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP          NODE                    NOMINATED NODE   READINESS GATES
nginx-676b6c5bbc-8jt42   1/1     Running   0          77s   10.10.0.6   member1-control-plane   <none>           <none>
root@karmada:~/karmada# kubectl config use-context member2                              #切换至member2集群
root@karmada:~/karmada# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP          NODE                    NOMINATED NODE   READINESS GATES
nginx-676b6c5bbc-w98gs   1/1     Running   0          84s   10.12.0.6   member2-control-plane   <none>           <none>

root@karmada:~/karmada# kubectl config use-context member3
root@karmada:~/karmada# kubectl get pods -o wide
No resources found in default namespace.

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


网站公告

今日签到

点亮在社区的每一天
去签到