文章目录
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 的设计理念是:
- 使用 kind (Kubernetes in Docker)快速创建容器嵌套集群,模拟 host 和多个 member 集群。
- 在 host 集群中安装并启动 Karmada 控制平面。
- 自动把 3 个模拟集群注册到 Karmada 控制面,变成 clusters 资源对象。
这样就不依赖外部真实 Kubernetes 集群,开发者本机一键就能有一个完整的 Karmada testbed。
提示:该方式建议在一台全新的节点部署,若在已位于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
等待初始化完成:
root@karmada:~/karmada# ./hack/local-up-karmada.sh
测试应用
使用模拟生成的三个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 集群中。