karmada介绍和分析
背景
- kind v0.11.1
- 已用kind创建一个版本为1.23的集群:k8s123
1. kubectl-karmada
kubectl-karmada是kubectl的一个插件,用来操纵karmada的命令行工具。我们通过以下步骤安装它:
# 1.下载
wget https://github.com/karmada-io/karmada/releases/download/v1.0.2/kubectl-karmada-linux-amd64.tgz
# 2.解压
tar -zxf kubectl-karmada-linux-amd64.tgz
# 3.移动到指定目录
mv kubectl-karmada /usr/local/bin/
现有command:
command | 解释 |
---|---|
cordon | 标记指定集群不可调度 |
get | 获取一个或多个资源 |
init | 在kubernetes集群中安装karmada |
join | 注册一个集群到karmada控制面板(push模式) |
promote | 将资源从遗留(member)集群提升到karmada控制面板 |
taint | 给一个或多个集群更新污点 |
uncordon | 标记指定集群可调度 |
unjoin | 从karmada控制面板移除集群注册 |
version | 输出版本信息 |
2. 安装Karmada
为了更好的理解Karmada,我们采用离线的方式安装karmada。提前准备好以下内容crd和相关组件的镜像:
- CRD ,karmada部署所需的CRD文件。
- --etcd-image: registry.cn-hangzhou.aliyuncs.com/earl-k8s/karmada-k8sgcrio-etcd:3.5.1-0 (原镜像仓库: k8s.gcr.io/etcd:3.5.1-0),该镜像为etcd镜像,服务于karmada-apiserver。
- --etcd-init-image: registry.cn-hangzhou.aliyuncs.com/earl-k8s/karmada-dockerio-alpine:3.14.3 (原镜像仓库: docker.io/library/alpine:3.14.3),该镜像为ectd init容器镜像。
- --karmada-aggregated-apiserver-image: registry.cn-hangzhou.aliyuncs.com/earl-k8s/karmada-aggregated-apiserver:latest (原镜像仓库: swr.ap-southeast-1.myhuaweicloud.com/karmada/karmada-aggregated-apiserver:latest)
- --karmada-apiserver-image: registry.cn-hangzhou.aliyuncs.com/earl-k8s/karmada-k8sgcrio-kube-apiserver:v1.21.7(原镜像仓库: k8s.gcr.io/kube-apiserver:v1.21.7)
- --karmada-controller-manager-image: registry.cn-hangzhou.aliyuncs.com/earl-k8s/karmada-controller-manager:latest(原镜像仓库: swr.ap-southeast-1.myhuaweicloud.com/karmada/karmada-controller-manager:latest)
- --karmada-kube-controller-manager-image: registry.cn-hangzhou.aliyuncs.com/earl-k8s/karmada-k8sgcrio-kube-controller-manager:v1.21.7(原镜像仓库: k8s.gcr.io/kube-controller-manager:v1.21.7)
- --karmada-scheduler-image: registry.cn-hangzhou.aliyuncs.com/earl-k8s/karmada-scheduler:latest(原镜像仓库: swr.ap-southeast-1.myhuaweicloud.com/karmada/karmada-scheduler:latest)
- --karmada-webhook-image: registry.cn-hangzhou.aliyuncs.com/earl-k8s/karmada-webhook:latest(原镜像仓库: swr.ap-southeast-1.myhuaweicloud.com/karmada/karmada-webhook:latest)
2.1 执行安装
kubectl karmada init --crds crds.tar.gz \
--etcd-image registry.cn-hangzhou.aliyuncs.com/earl-k8s/karmada-k8sgcrio-etcd:3.5.1-0 \
--etcd-init-image registry.cn-hangzhou.aliyuncs.com/earl-k8s/karmada-dockerio-alpine:3.14.3 \
--karmada-aggregated-apiserver-image registry.cn-hangzhou.aliyuncs.com/earl-k8s/karmada-aggregated-apiserver:latest \
--karmada-apiserver-image registry.cn-hangzhou.aliyuncs.com/earl-k8s/karmada-k8sgcrio-kube-apiserver:v1.21.7 \
--karmada-controller-manager-image registry.cn-hangzhou.aliyuncs.com/earl-k8s/karmada-controller-manager:latest \
--karmada-kube-controller-manager-image registry.cn-hangzhou.aliyuncs.com/earl-k8s/karmada-k8sgcrio-kube-controller-manager:v1.21.7 \
--karmada-scheduler-image registry.cn-hangzhou.aliyuncs.com/earl-k8s/karmada-scheduler:latest \
--karmada-webhook-image registry.cn-hangzhou.aliyuncs.com/earl-k8s/karmada-webhook:latest
2.2 部署成功
部署成功后会显示如下内容,其中由包含注册member集群的步骤指导。注册模式分为push模式和pull模式。
其中push模式下,karmada将直接访问member集群的kube-apiserver来获取集群状态和部署资源。
在pull模式下,karmada不会访问成员集群而是通过karmada-agen组件来实现:
- 将member集群注册到karmada
- 维护集群的状态报告给karmada
- 从karmada执行空间(karmada-es-)获取部署资源部署到其所在集群。
------------------------------------------------------------------------------------------------------
█████ ████ █████████ ███████████ ██████ ██████ █████████ ██████████ █████████
░░███ ███░ ███░░░░░███ ░░███░░░░░███ ░░██████ ██████ ███░░░░░███ ░░███░░░░███ ███░░░░░███
░███ ███ ░███ ░███ ░███ ░███ ░███░█████░███ ░███ ░███ ░███ ░░███ ░███ ░███
░███████ ░███████████ ░██████████ ░███░░███ ░███ ░███████████ ░███ ░███ ░███████████
░███░░███ ░███░░░░░███ ░███░░░░░███ ░███ ░░░ ░███ ░███░░░░░███ ░███ ░███ ░███░░░░░███
░███ ░░███ ░███ ░███ ░███ ░███ ░███ ░███ ░███ ░███ ░███ ███ ░███ ░███
█████ ░░████ █████ █████ █████ █████ █████ █████ █████ █████ ██████████ █████ █████
░░░░░ ░░░░ ░░░░░ ░░░░░ ░░░░░ ░░░░░ ░░░░░ ░░░░░ ░░░░░ ░░░░░ ░░░░░░░░░░ ░░░░░ ░░░░░
------------------------------------------------------------------------------------------------------
Karmada is installed successfully.
Register Kubernetes cluster to Karmada control plane.
Register cluster with 'Push' mode
Step 1: Use kubectl karmada join to register the cluster to Karmada control panel. --cluster-kubeconfig is members kubeconfig.
(In karmada)~# MEMBER_CLUSTER_NAME=`cat ~/.kube/config | grep current-context | sed 's/: /\n/g'| sed '1d'`
(In karmada)~# kubectl karmada --kubeconfig /etc/karmada/karmada-apiserver.config join ${MEMBER_CLUSTER_NAME} --cluster-kubeconfig=$HOME/.kube/config
Step 2: Show members of karmada
(In karmada)~# kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get clusters
Register cluster with 'Pull' mode
Step 1: Send karmada kubeconfig and karmada-agent.yaml to member kubernetes
(In karmada)~# scp /etc/karmada/karmada-apiserver.config /etc/karmada/karmada-agent.yaml {member kubernetes}:~
Step 2: Create karmada kubeconfig secret
Notice:
Cross-network, need to change the config server address.
(In member kubernetes)~# kubectl create ns karmada-system
(In member kubernetes)~# kubectl create secret generic karmada-kubeconfig --from-file=karmada-kubeconfig=/root/karmada-apiserver.config -n karmada-system
Step 3: Create karmada agent
(In member kubernetes)~# MEMBER_CLUSTER_NAME="demo"
(In member kubernetes)~# sed -i "s/{member_cluster_name}/${MEMBER_CLUSTER_NAME}/g" karmada-agent.yaml
(In member kubernetes)~# kubectl create -f karmada-agent.yaml
Step 4: Show members of karmada
(In karmada)~# kubectl --kubeconfig /etc/karmada/karmada-apiserver.config get clusters
3. karmada组件介绍及分析
3.1 karmadactl
karmadactl是karmada的一个命令行工具,其功能和kubectl-karmada是完全一样的。karmada在全局参数中通过--kubeconfig
配置kubeconfig的路径。
3.1.1 init子命令
init子命令用于在kubernetes上部署karmada。
用法:
karmadactl init [flags]
参数介绍:
参数 | 类型 | 描述 |
---|---|---|
--cert-external-dns | string | the external DNS of Karmada certificate (e.g localhost,localhost.com),生成证书生效外部DNS |
--cert-external-ip | string | the external IP of Karmada certificate (e.g 192.168.1.2,172.16.1.2),生成证书生效外部IP |
--crds | string | karmada的自定义资源 |
--etcd-data | string | 配置etcd数据路径,在hostPath模式下生效 |
--etcd-image | string | 配置etcd镜像仓库,默认k8s.gcr.io/etcd:3.5.1-0 |
--etcd-init-image | string | 配置etcd init容器镜像仓库,默认docker.io/alpine:3.14.3 |
--etcd-node-selector-labels | string | 配置etcd pod运行的节点通过label,在hostPath模式生效 |
--etcd-pvc-size | string | 配置etcd所有pvc大小,默认5Gi,在PVC模式生效 |
--etcd-replicas | int32 | 配置etcd副本数,默认1 |
--etcd-storage-mode | string | 配置etcd数据储存模式(emptyDir(默认),hostPath,PVC(配置--storage-classes-name)) |
--karmada-aggregated-apiserver-image | string | 配置karmada聚合apiserver镜像仓库,默认swr.ap-southeast-1.myhuaweicloud.com/karmada/karmada-aggregated-apiserver:latest |
--karmada-aggregated-apiserver-replicas | int32 | 配置karmada聚合apiserver副本数,默认1 |
--karmada-apiserver-image | string | 配置karmada apiserver镜像仓库,默认k8s.gcr.io/kube-apiserver:v1.21.7 |
--karmada-apiserver-replicas | int32 | 配置karmada apiserver副本数 |
--karmada-controller-manager-image | string | 配置karmada-controller-manager镜像仓库,默认"swr.ap-southeast-1.myhuaweicloud.com/karmada/karmada-controller-manager:latest |
--karmada-controller-manager-replicas | int32 | 配置karmada-controller-manage副本数 |
--karmada-data | string | 配置karmada数据(kubeconfig cert,crds等)路径,默认/etc/karmada(执行命令的主机上) |
--karmada-kube-controller-manager-image | string | 配置karmada-kube-controller-manager镜像仓库,默认k8s.gcr.io/kube-controller-manager:v1.21.7 |
--karmada-kube-controller-manager-replicas | int32 | 配置karmada-kube-controller-manager副本数 |
--karmada-scheduler-image | string | 配置karmada-scheduler镜像仓库,默认swr.ap-southeast-1.myhuaweicloud.com/karmada/karmada-scheduler:latest |
--karmada-scheduler-replicas | int32 | 配置karmada-scheduler副本数,默认1 |
--karmada-webhook-image | string | 配置karmada-webhook镜像仓库,默认swr.ap-southeast-1.myhuaweicloud.com/karmada/karmada-webhook:latest |
--karmada-webhook-replicas | int32 | 配置karmada-webhook副本数,默认1 |
--namespace | string | 配置karmada组件所在的namespace,默认karmada-system |
--port | int32 | 配置访问karmada apiserver的node port,默认32443 |
--storage-classes-name | string | 配置使用的Kubernetes StorageClasses名 |
通过参数可以看出,我们可以在部署karmada的时候根据自己的实际情况配置karmada组件相关参数,整个流程如下所示:
3.1.2 join子命令
join子命令用于添加member集群到karmada控制面。
用法:
karmadactl join CLUSTER_NAME --cluster-kubeconfig=<KUBECONFIG> [flags]
参数介绍:
参数 | 类型 | 描述 |
---|---|---|
--cluster-context | string | 当kubeconfig(member)中有多个context时,指定context name |
--cluster- |