1 什么是karmada
1.1 karmada简介
Karmada(Karmada 是什么? | karmada)是一个开源的云原生多云容器编排平台,由华为开源,目标是让开发者像使用单个Kubernetes集群一样使用多个k8s集群。Karmada 旨在为多云和混合云场景下的多集群应用程序管理提供即插即用的自动化,具有集中式多云管理、高可用性、故障恢复和流量调度等关键功能。
1.2 karmada特性
- 兼容 K8s 原生 API
- 从单集群到多集群的无侵入式升级
- 现有 K8s 工具链的无缝集成
- 开箱即用
- 针对场景内置策略集,包括:Active-active, Remote DR, Geo Redundant 等。
- 在多集群上进行跨集群应用程序自动伸缩、故障转移和负载均衡。
- 避免供应商锁定
- 与主流云提供商集成
- 在集群之间自动分配、迁移
- 未绑定专有供应商编排
- 集中式管理
- 位置无关的集群管理
- 支持公有云、本地或边缘上的集群。
- 丰富多集群调度策略
- 集群亲和性、实例在多集群中的拆分调度/再平衡,
- 多维 HA:区域/AZ/集群/提供商
- 开放和中立
- 由互联网、金融、制造业、电信、云提供商等联合发起。
- 目标是与 CNCF 一起进行开放治理。
1.3 karmada架构与组件
控制面组件:
karmada-apiserver:API服务器,对外暴露 Karmada API 以及 Kubernetes 原生API,API 服务器是 Karmada 控制平面的前端。
karmada-aggregated-apiserver:聚合API服务器,使用k8s聚合API技术,实现了API服务器的扩展,从而实现了一些自定义的功能。
kube-controller-manager:精简版的k8s controller-manager。
karmada-controller-manager:自定义控制器,负责监视Karmada对象,并与底层集群的API服务器通信,以创建原生的 Kubernetes 资源。
karmada-scheduler:负责将 Kubernetes 原生API资源对象(以及CRD资源)调度到成员集群。
karmada-webhook:用于接收 karmada/Kubernetes API 请求的 HTTP 回调,并对请求进行处理
2 安装karmada
2.1 准备工作
首先准备两台阿里云ACK(默认有SLB),其中一台当主集群,另一台当成员集群,将两台集群的config保存到本地,用于访问ACK。karmada控制面组件安装在主集群上。
karmada的安装有好几种方式,常用的有两种:
1.使用karmadactl工具
karmadactl是karmada提供的专门用于操作karmada的cli工具,通过
karmadactl init \
--crds='/root/kindapp/crds.tar.gz' \
--namespace='karmada-system' \
--port 31443 \
--etcd-image='docker.io/kubesphere/etcd:v3.5.6' \
--etcd-replicas=1 \
--karmada-aggregated-apiserver-replicas=1 \
--karmada-apiserver-replicas=1 \
--karmada-controller-manager-replicas=1 \
--karmada-kube-controller-manager-replicas=1 \
--karmada-scheduler-replicas=1 \
--karmada-webhook-replicas=1 \
--karmada-aggregated-apiserver-image='docker.io/karmada/karmada-aggregated-apiserver:v1.6.4' \
--karmada-apiserver-image='docker.io/kubesphere/kube-apiserver:v1.25.4' \
--karmada-controller-manager-image='docker.io/karmada/karmada-controller-manager:v1.6.4' \
--karmada-kube-controller-manager-image='docker.io/kubesphere/kube-controller-manager:v1.25.4' \
--karmada-scheduler-image='docker.io/karmada/karmada-scheduler:v1.6.4' \
--karmada-webhook-image='docker.io/karmada/karmada-webhook:v1.6.4'
可以快速安装karmada集群。这种方式比较适合具备从公网下载镜像的能力的k8s,因为etcd有一个initcontainer的image无法在这里配置,会导致镜像下载不下来。
2.使用helm安装
将karmada的代码下载到本地,其中有一个charts文件夹,里面的karmada文件夹就是chart包。
源码地址:GitHub - karmada-io/karmada: Open, Multi-Cloud, Multi-Cluster Kubernetes Orchestration
下载下来后,将apiserver的service改为loadbalancer
因为本次操作ack,是在我本地的虚拟机通过公网config进行操作,因此安装karmada,以及将集群加入karmada都需要公网能力。
在hosts中添加主集群apiserver的地址
由于karmada签发的证书默认是针对127.0.0.1的,因此需要在hosts中loadbalancer的ip,这样生成的证书才能访问loadbalancer。否则会报如下错误:
Unable to connect to the server: x509: certificate is valid for 127.0.0.1, not 210.51.27.152
添加代码如下:
hosts: [ "kubernetes.default.svc", "*.etcd.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}", "*.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}", "*.{{ .Release.Namespace }}.svc", "localhost", "127.0.0.1", "210.51.27.152" ]
2.2 使用helm安装
将修改好的charts放置在本地服务器上。执行如下命令:
kubectl get secret karmada-kubeconfig -n karmada-system -o jsonpath={.data.kubeconfig} | base64 -d > karmada-config
之后修改karmada-config文件的server,从https://karmada-apiserver.karmada-system.svc.cluster.local:5443改为https://公网ip:5443。
之后便可以使用如下命令访问karmada了
kubectl --kubeconfig=/root/karmada/karmada-config get clusters
提示这个是因为现在karmada还没有纳管任何k8s集群。
使用如下命令,将主集群加入到karmada
karmadactl join member1 --kubeconfig=/root/karmada/karmada-config --cluster-kubeconfig='/root/.kube/config'
再次get