文章目錄

  • 一、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

charles小紅手_docker

組件

原生

説明

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種控制器結構圖如下:

charles小紅手_#華為雲_02

2.1 Cluster Controller

cluster controller主要就是處理Cluster資源對象的邏輯,負責處理Cluster對應需要的關聯資源。

charles小紅手_#華為雲_03

2.2 Cluster status controller

cluster status controller主要就是處理cluster status資源對象的邏輯,用來收集Cluster的狀態,保存到Cluster的status字段中,同步上報到Karmada的控制平面中。

charles小紅手_#華為雲_04

2.3 namespace sync controller

namespace sync controller主要就是處理namespace資源對象的邏輯,負責將Karmada控制平面創建的namespace在集羣中同步創建出來。

charles小紅手_API_05

2.4 Resourse Template controller

detector模塊中包含了通用controller負責resource template的Kubernetes資源對象的調和處理邏輯,以及匹配PropagationPolicy。主要就是處理PropagationPolicy資源對象的邏輯,來派生出資源對象對應的ResourceBinding對象。

charles小紅手_API_06

2.5 Binding controller

binding controller主要就是處理ResourceBinding資源對象的增刪改邏輯,ResourceBinding的調和能力是派生出work對象,work對象是和特定集羣關聯的。一個work只能屬於一個集羣,代表一個集羣的資源對象的模型封裝。

charles小紅手_API_06

2.6 execution controller

execution controller主要就是處理Work資源對象的增刪改邏輯,用於處理Work,將Work負責的Kubernetes資源對象在對應的集羣上創建出來。

charles小紅手_API_06

2.7 work status controller

work status controller主要就是處理Work資源對象的狀態邏輯,負責收集Work的狀態,也就是Work對應的資源對象的狀態,只是這個狀態是保存在Work的status字段裏的。

charles小紅手_docker_09

2.8 serviceexport controller

serviceexport controller主要就是處理serviceexport資源對象的狀態邏輯,將需要被其它集羣發現的服務暴露出來。

charles小紅手_docker_10

2.9 endpointslice controller

endpointslice controller主要根據serviceexport資源對象對應到處的Service,Service對應的endpointslice上報到Karmada的控制面。

charles小紅手_docker_10

2.10 serviceimport controller

serviceimport controller主要負責根據ServiceExport暴露出來的Service,在自己負責的集羣中創建對應的service,注意service的名稱不是完全一樣的,同時在自己負責的集羣中也創建對應的EndpointSlice,這個EndpointSlice的數據就是來源於EndpointSlice controller中上報到karmada控制平面的EndpointSlice對象,具體是通過在karmada-webhook中給ServiceImport的PropagationPolicy中增加了EndpointSlice的下發能力。

charles小紅手_docker_10

2.11 hpa controller

hpa controller主要負責將Karmada控制面中創建的HPA對象通過創建Work的方式下發到對應的集羣中。

charles小紅手_docker_13

三、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

charles小紅手_docker_14

1.3 使用倉庫安裝

如果以前有安裝需要先卸載舊版Docker,docker,docker.io,docker-engine。

卸載舊版本的命令如下:

sudo apt-get remove docker docker-engine docker.io containerd runc

charles小紅手_docker_15

1.3.1 設置倉庫

更新apt-get

sudo apt-get update

charles小紅手_API_16

安裝包使得apt可以使用https

sudo apt-get install apt-transport-https ca-certificates software-properties-common curl

charles小紅手_Docker_17

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 -

charles小紅手_docker_18

添加清華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"

charles小紅手_docker_19


如果出現錯誤可以用以下命令刪除重新執行命令

#注意:添加錯了可以用以下命令刪除
#查詢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

charles小紅手_Docker_20


安裝docker-ce軟件

sudo apt-get install docker-ce docker-ce-cli containerd.io -y

charles小紅手_charles小紅手_21

1.3.4 測試Docker是否安裝成功

查看是否啓動

ps aux|grep docker

charles小紅手_#華為雲_22

測試運行容器

sudo docker run hello-world

charles小紅手_docker_23

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

charles小紅手_#華為雲_24


重新登錄或者用以下命令切換到docker組

newgrp - docker

charles小紅手_API_25


重啓docker服務

sudo service docker restart

charles小紅手_charles小紅手_26


不加sudo直接執行docker命令檢查效果

docker ps

charles小紅手_Docker_27

2.安裝GO

2.1 下載並安裝GO

sudo apt-get install golang-go

charles小紅手_#華為雲_28

2.2 測試GO是否安裝成功

go version

charles小紅手_API_29

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

charles小紅手_charles小紅手_30

3.1.2 關閉防火牆

ubuntu 查看防火牆命令,ufw status可查看狀態,ubuntu22.04默認全部關閉,無需設置。

設置命令如下:

sudo ufw status #查看防火牆狀態
sudo ufw disable
sudo swapoff -a #臨時禁止

charles小紅手_charles小紅手_31

3.1.3 確保時區和時間正確
systemctl start chrony
systemctl enable chrony
chronyc sources #看連接狀態
chronyc tracking #看同步狀態,時間差
chronyc -a makestep #立即同步時間

charles小紅手_Docker_32

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

charles小紅手_#華為雲_33

3.2 安裝組件

3.2.1 更改docker默認驅動為systemd

為防止初始化出現一系列的錯誤,請檢查docker和kubectl驅動是否一致,否則kubectl沒法啓動造成報錯。版本不一樣,docker有些為cgroupfs,而kubectl默認驅動為systemd,所以需要更改docker驅動。

可查看自己docker驅動命令:

sudo docker info|grep Driver

charles小紅手_#華為雲_34


如果不是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"
    ]
}

charles小紅手_charles小紅手_35


重啓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 #執行同步參數

charles小紅手_charles小紅手_36

3.2.2 SSH密鑰免密
sudo apt-get install openssh-server
ssh-keygen -t rsa

charles小紅手_docker_37


此時會在/home/ubuntu/.ssh目錄下生成密鑰對

ll .ssh

charles小紅手_charles小紅手_38


上傳公鑰到對應服務器

ssh-copy-id 192.168.16.133
ssh-copy-id 192.168.16.134

charles小紅手_API_39

3.3 更新源

sudo apt-get update

charles小紅手_charles小紅手_40

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

charles小紅手_docker_41

3.6 安裝 kubelet、kubeadm 和 kubectl,並鎖定其版本

sudo apt-get install -y kubectl kubelet kubeadm

sudo apt-mark hold kubelet kubeadm kubectl
  • kubeadm:用來初始化集羣的指令。
  • kubelet:在集羣中的每個節點上用來啓動Pod和容器等。
  • kubectl:用來與集羣通信的命令行工具。

charles小紅手_#華為雲_42

3.7 配置kubectl開機啓動

systemctl daemon-reload
systemctl enable kubelet

charles小紅手_charles小紅手_43

3.8 測試kubectl是否安裝成功

kubelet --version
kubectl version --client
kubeadm version

charles小紅手_docker_44

3.9 初始化主節點master

拉取相關包

kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers

charles小紅手_#華為雲_45

初始化主節點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

charles小紅手_#華為雲_46

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

charles小紅手_docker_47

部署網絡插件命令如下:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

charles小紅手_#華為雲_48

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

charles小紅手_Docker_49

4.2 環境變量配置

sudo cp $(go env GOPATH)/bin/kind /usr/local/bin

charles小紅手_Docker_50


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

charles小紅手_API_51

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

charles小紅手_API_52

5.2.2 安裝karmada控制面

因為安裝中會無法安裝k8s.gcr.io相關軟件,把替源碼中的k8s.gcr.io換成registry.cn-hangzhou.aliyuncs.com/google_containers就可以部署

執行安裝命令如下:

hack/local-up-karmada.sh

安裝步驟詳解:

  1. 檢查go、kind等工具是否已經存在
  2. 調用kind創建host k8s集羣,集羣版本默認為1.23.4,與karmada重用的k8s組件(kube-apiserver、kube-controllermanager)版本一致
  3. build karmada控制面可執行文件及容器鏡像,build結束後本地可以找到如下鏡像:karmada-agent、karmada-webhook、karmada-scheduler、karmada-controller-manager
  4. 部署karmada控制面組件到host集羣
  5. 創建CRD,也就是karmada自定義的多雲工作負載API資源,包含:propgation policy,override policy,work,resource binding等
  6. 創建webhook
  7. 部署完成後,形成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步驟如下:

  1. 執行hack/create-cluster.sh member1 $HOME/.kube/karmada.config創建新的集羣member1
  2. 執行kubectl config use-context karmada-apiserver切換到karmada控制面
  3. 執行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集羣的接入,為多雲和混合雲架構保駕護航。