文章目錄
- 一、Karmada的概念
- 1.Karmada是什麼
- 2.Karmada的誕生背景
- 3.Karmada的優勢
- 二、Karmada的架構
- 1.Karmada控制平面的組成
- 2.Karmada的Controller詳解
- 2.1 Cluster Controller
- 2.2 Cluster status controller
- 2.3 namespace sync controller
- 2.4 Resourse Template controller
- 2.5 Binding controller
- 2.6 execution controller
- 2.7 work status controller
- 2.8 serviceexport controller
- 2.9 endpointslice controller
- 2.10 serviceimport controller
- 2.11 hpa controller
- 三、karmada安裝
- 1.安裝Docker
- 1.1 Docker的架構
- 1.2 系統環境
- 1.3 使用倉庫安裝
- 1.3.1 設置倉庫
- 1.3.2 添加GPG密鑰,並添加Docker-ce軟件源
- 1.3.3 安裝Docker-ce
- 1.3.4 測試Docker是否安裝成功
- 1.4 配置國內鏡像源
- 1.5 添加當前用户到 docker 用户組,可以不用 sudo 運行 docker
- 2.安裝GO
- 2.1 下載並安裝GO
- 2.2 測試GO是否安裝成功
- 2.3 設置go環境為國內源
- 3.安裝k8s
- 3.1 前置條件
- 3.1.1 關閉swap內存
- 3.1.2 關閉防火牆
- 3.1.3 確保時區和時間正確
- 3.1.3 主機名和hosts設置
- 3.2 安裝組件
- 3.2.1 更改docker默認驅動為systemd
- 3.2.2 配置NAT轉發
- 3.2.2 SSH密鑰免密
- 3.3 更新源
- 3.4 下載公開簽名秘鑰、並添加k8s庫
- 3.5 更新 apt 包索引
- 3.6 安裝 kubelet、kubeadm 和 kubectl,並鎖定其版本
- 3.7 配置kubectl開機啓動
- 3.8 測試kubectl是否安裝成功
- 3.9 初始化主節點master
- 3.10 配置kubernetes-admin來運行
- 3.11 集羣部署網絡插件
- 4.安裝簡易k8s開發集羣管理工具:kind
- 4.1 安裝kind
- 4.2 環境變量配置
- 4.3 測試kind是否安裝成功
- 5.安裝karmada控制面
- 5.1 先行條件
- 5.2 安裝karmada
- 5.2.1 下載karmada源碼
- 5.2.2 安裝karmada控制面
- 5.3 查看karmada控制面組成
- 5.3.1 切換到karmada-host
- 5.3.2 獲取組件列表
- 5.3.3 集羣的加入
- 三、karmada實戰案例
- 總結
一、Karmada的概念
1.Karmada是什麼
Karmada(Kubernetes Armada)是一個Kubernetes管理系統,使您能夠跨多個Kubernetes集羣和雲運行雲原生應用程序,而無需更改您的應用程序。通過使用Kubernetes原生API並提供高級調度功能,Karmada實現了真正開放的多雲Kubernetes。
Karmada旨在為多雲和混合雲場景中的多集羣應用程序管理提供自動化功能,具有集中式多雲管理,高可用性,故障恢復和流量調度等關鍵功能。
官方網站:https://karmada.io/
代碼地址:https://github.com/karmada-io/karmada
2.Karmada的誕生背景
Karmada項目由華為雲、工商銀行、小紅書、中國一汽等8家企業聯合發起,沉澱了各企業在多雲管理領域的豐富積累,於2021年4月25日在華為開發者大會2021(HDC.Cloud)上正式宣佈開源。同年9月,Karmada項目正式捐贈給雲原生計算基金會CNCF,成為CNCF首個多雲容器編排項目。Karmada項目的加入,也將CNCF的雲原生版圖進一步擴展至分佈式雲領域。
CNCF總經理Priyanka Sharma對此表示:“華為一直是雲原生社區與開發者生態的重要參與者,Karmada對所有企業構建多雲業務架構至關重要,希望未來CNCF與華為雲繼續密切合作,持續幫助廣大雲原生開發者。”
Karmada自開源以來受到了廣泛的關注和支持,目前在代碼託管平台上已有超過30家大型企業/機構/高校參與社區開發及貢獻。
3.Karmada的優勢
Karmada結合了華為雲容器平台MCP以及Kubernetes Federation核心實踐,並融入了眾多新技術:包括Kubernetes原生API支持、多層級高可用部署、多集羣自動故障遷移、多集羣應用自動伸縮、多集羣服務發現等,並且提供原生Kubernetes平滑演進路徑,讓基於Karmada的多雲方案無縫融入雲原生技術生態,為企業提供從單集羣到多雲架構的平滑演進方案。Karmada的優勢主要有以下幾點:
1、K8s原生API兼容
- 既有應用配置及基礎設施無需改造,由單集羣架構平滑升級到多集羣(多雲)架構。
- 無縫集成Kubernetes現有工具鏈生態。
2、開箱即用
- 面向多場景的內置策略集,包括兩地三中心、同城雙活、異地容災等。
- 支持應用的跨集羣上的自動伸縮、故障遷移和負載均衡。
3、避免供應商鎖定
- 與主流雲提供商集成。
- 自動分配,跨集羣遷移。
- 不受專有供應商編排的約束。
4、集中管理
- 與位置無關的羣集管理。
- 支持公有云、本地或邊緣的集羣。
5、富有成效的多集羣調度策略
- 多集羣親和性調度、應用跨集羣拆分、資源重新平衡。
- 多維度多層次的高可用部署:區域/可用區/集羣/供應商等。
6、開放和中立
- 由互聯網、金融、製造、電信、雲提供商等共同發起。
- 使用CNCF實現開放式治理的目標。
二、Karmada的架構
1.Karmada控制平面的組成
Karmada控制平面由以下組件組成:
- Karmada API Server
- Karmada Controller Manager
- Karmada Scheduler
|
組件
|
原生
|
説明
|
|
etcd
|
是
|
存儲karmada API對象,API服務器是所有其他組件與之通信的REST端點,Karmada控制器管理器根據您通過API服務器創建的API對象執行操作
|
|
kube-apiserver
|
是
|
API Server是所有其他組件都可以與之通信的REST端點
|
|
kube-controller-manager
|
是
|
Controller Manager將根據您通過API服務器創建的API對象執行操作
|
|
karmada-controller-manager
|
karmada
|
karmada controller-manager,監聽相關資源,創建ResourceBinding及ClusterResourceBinding,更新work,同步集羣間資源
|
|
karmada-scheduler
|
karmada
|
加載Policy,分析資源,更新work
|
|
karmada-webhook
|
karmada
|
karmada資源校驗
|
|
karmada-agent
|
karmada
|
取決於Cluster的同步模式,若是push模式,則不需要部署,否則需要部署到管理的集羣中
|
Karmada Controller Manager運行各種控制器,控制器監視karmada對象,然後與底層集羣的API服務器通信以創建常規的Kubernetes資源。
|
控制器名稱
|
説明
|
|
集羣控制器
|
將kubernetes集羣附加到Karmada,用於通過創建集羣對象來管理集羣的生命週期。
|
|
策略控制器
|
控制器監視傳播策略對象。添加傳播策略對象時,它會選擇一組與資源選擇器匹配的資源,併為每個資源對象創建資源綁定。
|
|
綁定控制器
|
控制器監視資源綁定對象,並使用單個資源清單創建與每個羣集對應的工作對象。
|
|
執行控制器
|
控制器監視工作對象。創建Work對象時,它會將資源分發到成員集羣。
|
2.Karmada的Controller詳解
Controller(控制器)在Kubernetes中是邏輯能力的主要體現所在,根據資源對象的狀態來完成調和工作,讓資源對象逐步接近期待的狀態,這個就是Kubernetes的申明式特性。
在Karmada中,同樣需要對Karmada自己的資源對象,實現對應的申明式特性,這就需要實現對應的Controller。在Karmada中目前的版本中有11個Controllers,接下來就從每一個控制器所負責的資源對象,以及原理來分析一下,在Karmada中是怎樣完成多雲能力的。
11種控制器結構圖如下:
2.1 Cluster Controller
cluster controller主要就是處理Cluster資源對象的邏輯,負責處理Cluster對應需要的關聯資源。
2.2 Cluster status controller
cluster status controller主要就是處理cluster status資源對象的邏輯,用來收集Cluster的狀態,保存到Cluster的status字段中,同步上報到Karmada的控制平面中。
2.3 namespace sync controller
namespace sync controller主要就是處理namespace資源對象的邏輯,負責將Karmada控制平面創建的namespace在集羣中同步創建出來。
2.4 Resourse Template controller
detector模塊中包含了通用controller負責resource template的Kubernetes資源對象的調和處理邏輯,以及匹配PropagationPolicy。主要就是處理PropagationPolicy資源對象的邏輯,來派生出資源對象對應的ResourceBinding對象。
2.5 Binding controller
binding controller主要就是處理ResourceBinding資源對象的增刪改邏輯,ResourceBinding的調和能力是派生出work對象,work對象是和特定集羣關聯的。一個work只能屬於一個集羣,代表一個集羣的資源對象的模型封裝。
2.6 execution controller
execution controller主要就是處理Work資源對象的增刪改邏輯,用於處理Work,將Work負責的Kubernetes資源對象在對應的集羣上創建出來。
2.7 work status controller
work status controller主要就是處理Work資源對象的狀態邏輯,負責收集Work的狀態,也就是Work對應的資源對象的狀態,只是這個狀態是保存在Work的status字段裏的。
2.8 serviceexport controller
serviceexport controller主要就是處理serviceexport資源對象的狀態邏輯,將需要被其它集羣發現的服務暴露出來。
2.9 endpointslice controller
endpointslice controller主要根據serviceexport資源對象對應到處的Service,Service對應的endpointslice上報到Karmada的控制面。
2.10 serviceimport controller
serviceimport controller主要負責根據ServiceExport暴露出來的Service,在自己負責的集羣中創建對應的service,注意service的名稱不是完全一樣的,同時在自己負責的集羣中也創建對應的EndpointSlice,這個EndpointSlice的數據就是來源於EndpointSlice controller中上報到karmada控制平面的EndpointSlice對象,具體是通過在karmada-webhook中給ServiceImport的PropagationPolicy中增加了EndpointSlice的下發能力。
2.11 hpa controller
hpa controller主要負責將Karmada控制面中創建的HPA對象通過創建Work的方式下發到對應的集羣中。
三、karmada安裝
1.安裝Docker
Docker的相關文檔網站如下:
- Docker官網:https://hub.docker.com/search?type=edition&offering=community
- Ubuntu安裝Docker文檔:https://docs.docker.com/engine/install/ubuntu/
1.1 Docker的架構
Docker的架構設計分為三個組件:一個客户端,一個REST API和一個服務器(守護進程):
- Client:與REST API交互。主要目的是允許用户連接守護進程。
- REST API:充當客户端和服務器之間的接口,實現通信。
- 守護進程:負責實際管理容器-啓動,停止等。守護進程監聽來自docker客户端的API請求。
1.2 系統環境
本人使用的是ubuntu22.04 LTS版本,查看系統版本命令如下
lsb_release -a
cat /proc/version
1.3 使用倉庫安裝
如果以前有安裝需要先卸載舊版Docker,docker,docker.io,docker-engine。
卸載舊版本的命令如下:
sudo apt-get remove docker docker-engine docker.io containerd runc
1.3.1 設置倉庫
更新apt-get
sudo apt-get update
安裝包使得apt可以使用https
sudo apt-get install apt-transport-https ca-certificates software-properties-common curl
1.3.2 添加GPG密鑰,並添加Docker-ce軟件源
添加清華GPG密鑰
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
或者添加阿里雲GPG密鑰
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
添加清華Docker-ce軟件源
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
或者添加阿里雲Docker-ce 軟件源
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
如果出現錯誤可以用以下命令刪除重新執行命令
#注意:添加錯了可以用以下命令刪除
#查詢keyid,下圖
sudo apt-key list
#keyid 就是90那一串
sudo apt-key del <keyid>
#加參數-r可以移除
sudo add-apt-repository -r "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
1.3.3 安裝Docker-ce
再次更新系統
sudo apt-get update
安裝docker-ce軟件
sudo apt-get install docker-ce docker-ce-cli containerd.io -y
1.3.4 測試Docker是否安裝成功
查看是否啓動
ps aux|grep docker
測試運行容器
sudo docker run hello-world
1.4 配置國內鏡像源
{
"registry-mirrors":[
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
],
"dns":[
"114.114.114.114",
"8.8.8.8"
]
}
1.5 添加當前用户到 docker 用户組,可以不用 sudo 運行 docker
將當前用户添加到docker組
sudo gpasswd -a ${USER} docker
重新登錄或者用以下命令切換到docker組
newgrp - docker
重啓docker服務
sudo service docker restart
不加sudo直接執行docker命令檢查效果
docker ps
2.安裝GO
2.1 下載並安裝GO
sudo apt-get install golang-go
2.2 測試GO是否安裝成功
go version
2.3 設置go環境為國內源
go env -w GOPROXY=goproxy.cn #設置go環境為國內源
3.安裝k8s
3.1 前置條件
K8S官網:https://kubernetes.io/docs/setup/
最新版高可用安裝:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/
3.1.1 關閉swap內存
這個swap其實可以類比成windows上的虛擬內存,它可以讓服務器在內存吃滿的情況下可以保持低效運行,而不是直接卡死。但是k8s的較新版本都要求關閉swap。所以咱們直接動手,修改/etc/fstab文件:
sudo gedit /etc/fstab
3.1.2 關閉防火牆
ubuntu 查看防火牆命令,ufw status可查看狀態,ubuntu22.04默認全部關閉,無需設置。
設置命令如下:
sudo ufw status #查看防火牆狀態
sudo ufw disable
sudo swapoff -a #臨時禁止
3.1.3 確保時區和時間正確
systemctl start chrony
systemctl enable chrony
chronyc sources #看連接狀態
chronyc tracking #看同步狀態,時間差
chronyc -a makestep #立即同步時間
3.1.3 主機名和hosts設置
非必須,但是為了直觀方便管理,建議設置。
在宿主機分別設置主機名:k8s-master01,k8s-node01
hostnamectl set-hostname k8s-master01
hosts設置
sudo gedit /etc/hosts
#配置host如下
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.16.133 k8s-master01.ilinux.io k8s-master01 k8s-api.ilinux.io
192.168.16.134 k8s-node01.ilinux.io k8s-node01
199.232.96.133 raw.githubusercontent.com
3.2 安裝組件
3.2.1 更改docker默認驅動為systemd
為防止初始化出現一系列的錯誤,請檢查docker和kubectl驅動是否一致,否則kubectl沒法啓動造成報錯。版本不一樣,docker有些為cgroupfs,而kubectl默認驅動為systemd,所以需要更改docker驅動。
可查看自己docker驅動命令:
sudo docker info|grep Driver
如果不是systemd需要執行以下命令:
#編輯創建文件
sudo gedit /etc/docker/daemon.json
#添加內容
{
"registry-mirrors":[
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
],
"exec-opts":["native.cgroupdriver=systemd"],
"dns":[
"114.114.114.114",
"8.8.8.8"
]
}
重啓docker
sudo systemctl restart docker.service
3.2.2 配置NAT轉發
modprobe br_netfilter
cat /etc/profile
cat /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
sudo sysctl -p /etc/sysctl.d/k8s.conf #執行同步參數
3.2.2 SSH密鑰免密
sudo apt-get install openssh-server
ssh-keygen -t rsa
此時會在/home/ubuntu/.ssh目錄下生成密鑰對
ll .ssh
上傳公鑰到對應服務器
ssh-copy-id 192.168.16.133
ssh-copy-id 192.168.16.134
3.3 更新源
sudo apt-get update
3.4 下載公開簽名秘鑰、並添加k8s庫
國外 :下載 Google Cloud 公開簽名秘鑰:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
國內:可以用阿里源即可:
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
3.5 更新 apt 包索引
sudo apt-get update
3.6 安裝 kubelet、kubeadm 和 kubectl,並鎖定其版本
sudo apt-get install -y kubectl kubelet kubeadm
sudo apt-mark hold kubelet kubeadm kubectl
- kubeadm:用來初始化集羣的指令。
- kubelet:在集羣中的每個節點上用來啓動Pod和容器等。
- kubectl:用來與集羣通信的命令行工具。
3.7 配置kubectl開機啓動
systemctl daemon-reload
systemctl enable kubelet
3.8 測試kubectl是否安裝成功
kubelet --version
kubectl version --client
kubeadm version
3.9 初始化主節點master
拉取相關包
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
初始化主節點master
kubeadm init \
--apiserver-advertise-address=192.168.16.133 \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16
異常情況分析:
錯誤提示1:
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp 127.0.0.1:10248: connect: connection refused.
原因:kubectl沒法啓動,journalctl -xe查看啓動錯誤信息。
journalctl -xe
#信息顯示docker和kubectel驅動不一致
kubelet cgroup driver: \"systemd\" is different from docker cgroup driver: \"cgroupfs\""
解決方案:k8s建議systemd驅動,所以更改docker驅動即可,編輯/etc/docker/daemon.json(沒有就新建一個),添加如下啓動項參數即可:
#編輯創建文件
sudo vim /etc/docker/daemon.json
#添加內容
{
"exec-opts":["native.cgroupdriver=systemd"]
}
重啓docker和kubectl
#重啓docker
sudo systemctl restart docker.service
#重載kubectl
sudo systemctl daemon-reload
#重啓kubectl
sudo systemctl restart kubelet.service
#查看kubectl服務狀態恢復正常
sudo systemctl status kubelet.service
錯誤提示2:
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists
[ERROR FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists
[ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists
[ERROR FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
原因:初始化生產的文件,重新初始化,需要刪除即可
rm -fr /etc/kubernetes/manifests/*
錯誤提示3:
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR Port-10250]: Port 10250 is in use
解決方法:重置配置
sudo kubeadm reset
3.10 配置kubernetes-admin來運行
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
3.11 集羣部署網絡插件
安裝cni插件:
mkdir -p go/src/github.com/containernetworking/
cd go/src/github.com/containernetworking/
git clone https://github.com/containernetworking/plugins.git
git clone https://github.com/containernetworking/cni.git
cd plugins
./build_linux.sh
cd ../cni/cnitool
go build cnitool.go
部署網絡插件命令如下:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
4.安裝簡易k8s開發集羣管理工具:kind
Kind是Kubernetes In Docker的縮寫,顧名思義是使用Docker容器作為Node並將Kubernetes部署至其中的一個工具。官方文檔中也把Kind作為一種本地集羣搭建的工具進行推薦。
4.1 安裝kind
GOPROXY=goproxy.cn go install sigs.k8s.io/kind@v0.12.0
4.2 環境變量配置
sudo cp $(go env GOPATH)/bin/kind /usr/local/bin
kind使用一個容器來模擬一個node,在容器內部使用systemd託管kubelet和containerd(不是docker),然後通過被託管的kubelet啓動其他k8s組件,比如kube-apiserver、etcd、CNI等跑起來。
由於kind使用containerd而非docker作為容器運行時,要查看kind啓動的k8s節點內部容器運行情況,需要使用containerd的cli客户端ctr。可以通過下面這條命令查看後續步驟中karmada調用kind啓動的單節點k8s集羣內部容器的運行情況:
docker exec karmada-host-control-plane ctr --namespace k8s.io containers ls
注意點:ctr的flag --namespace不是k8s裏的namespace,也不是linux內核支持的namespace,感興趣的同學可以查看containerd的namespace相關概念
4.3 測試kind是否安裝成功
kind --version
5.安裝karmada控制面
karmada項目地址:https://gitcode.net/mirrors/karmada-io/karmada?utm_source=csdn_github_accelerator
5.1 先行條件
安裝karmada需要先安裝以下工具:
- make
- gcc
- kubectl
- go
- kind
- git
5.2 安裝karmada
5.2.1 下載karmada源碼
git clone https://github.com/karmada-io/karmada.git karmada-io/karmada
cd karmada-io/karmada
5.2.2 安裝karmada控制面
因為安裝中會無法安裝k8s.gcr.io相關軟件,把替源碼中的k8s.gcr.io換成registry.cn-hangzhou.aliyuncs.com/google_containers就可以部署
執行安裝命令如下:
hack/local-up-karmada.sh
安裝步驟詳解:
- 檢查go、kind等工具是否已經存在
- 調用kind創建host k8s集羣,集羣版本默認為1.23.4,與karmada重用的k8s組件(kube-apiserver、kube-controllermanager)版本一致
- build karmada控制面可執行文件及容器鏡像,build結束後本地可以找到如下鏡像:karmada-agent、karmada-webhook、karmada-scheduler、karmada-controller-manager
- 部署karmada控制面組件到host集羣
- 創建CRD,也就是karmada自定義的多雲工作負載API資源,包含:propgation policy,override policy,work,resource binding等
- 創建webhook
- 部署完成後,形成kubeconfig文件$HOME/kube/karmada.config,包含karmada-host和karmada-apiserver兩個context,分別對應支撐karmada控制面運行的host集羣,以及karmada控制面本身
安裝成功後會出現如下信息:
Local Karmada is running.
To start using your karmada, run:
export KUBECONFIG="$HOME/.kube/karmada.config"
Please use 'kubectl config use-context karmada-host/karmada-apiserver' to switch the host and control plane cluster.
To manage your member clusters, run:
export KUBECONFIG="$HOME/.kube/members.config"
Please use 'kubectl config use-context member1/member2/member3' to switch to the different member cluster.
5.3 查看karmada控制面組成
使用karmada管理的多雲環境包含兩類集羣:
- host集羣:即由karmada控制面構成的集羣,接受用户提交的工作負載部署需求,將之同步到member集羣,並從member集羣同步工作負載後續的運行狀況。
- member集羣:由一個或多個k8s集羣構成,負責運行用户提交的工作負載
5.3.1 切換到karmada-host
kubectl config use-context karmada-host #切換到karmada-host控制面
5.3.2 獲取組件列表
kubectl get po --all-namespaces
5.3.3 集羣的加入
集羣加入karmada步驟如下:
- 執行
hack/create-cluster.sh member1 $HOME/.kube/karmada.config創建新的集羣member1 - 執行
kubectl config use-context karmada-apiserver切換到karmada控制面 - 執行
karmadactl join member1 --cluster-kubeconfig=$HOME/.kube/karmada.config以push的方式把member1加入karmada集羣
三、karmada實戰案例
Karmada下nginx集羣實操視頻
實操步驟:
1、執行kubectl config use-context karmada-apiserver切換到karmada控制面。
2、執行kubectl create -f samples/nginx/deployment.yaml創建deployment資源,如前面所述,由於kamada控制面沒有部署deployment controller,nginx不會在karmada控制面所在集羣跑起來,而是僅僅保存在etcd裏,這時候如果去member1集羣查看pod資源的情況,可以發現nginx也沒有在member1集羣中運行起來。
3、執行kubectl create -f samples/nginx/propagationpolicy.yaml,定義如下的propgation policy:
apiVersion: policy.karmada.io/v1alpha1
kind: PropagationPolicy
metadata:
name: nginx-propagation
spec:
resourceSelectors:
- apiVersion: apps/v1
kind: Deployment
name: nginx
placement:
clusterAffinity:
clusterNames:
- member1
這個progation policy將之前部署的nginx deployment資源(由resourceSelectors指定)同步到member1集羣(由placement指定)中。
這時不用切換到member1 context,對karmada控制面執行kubectl get deploy可以看到名叫nginx的deployment已經正常運行:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 21m
上述結果説明karmada有能力從member集羣同步工作負載狀態到host集羣。作為驗證,我們可以切換到member1集羣,執行kubectl get po可以看到deployment對應的nginx pod已經在member1集羣內正常運行:
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-7tgmb 1/1 Running 0 8m27s
總結
Karmada 的架構在很多方面類似於單個Kubernetes集羣。它們都有一個控制平面、一個API服務器、一個調度程序和一組控制器。而且Karmada完全兼容K8S原生API操作,便於各種k8s集羣的接入,為多雲和混合雲架構保駕護航。