Kosmos 实现无状态工作负载跨集群平滑扩展
Kosmos 自开源以来,备受大家的关注,也有不少开发人员试用 Kosmos,将多副本工作负载,平滑扩展到多个 K8s 上,以达到容灾,或者多云部署的能力。本文旨在为用户提供 Kosmos 简单快捷的使用方式,以及一些简单的使用场景,以便满足大家自身多集群的需求,同时也能快速的融入到 Kosmos 的开源实践中来。
前置条件
单个 Kubernetes 集群的要求:
2 个 CPU 或更多
2GB 的可用内存
互联网连接
两个及以上网段不冲突可用的 Kubernetes 集群
注意:如不需打通多集群之间容器网络,可跳过此步
可通过如下命令简单校验集群网段是否冲突,命令如下:
cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep -E "cluster-cidr|service-cluster-ip-range"
示例图:
图中两个集群的 podIp 和 svcIp 不在一个网段即可,符合部署条件。
安装工具 kosmosctl
kosmosctl 是 kosmos 命令行工具。 你可以使用 kosmosctl 来注册集群、拉通网络、监测和管理 Kosmos 资源。
可通过访问下面的链接,下载对应 Kosmosctl 安装包。
https://github.com/kosmos-io/kosmos/releases/tag/v0.2.0
将下载的 Kosmosctl 安装包,上传至 k8s 集群主节点指定安装路径,并修改文件名为 Kosmosctl,并增加可执行权限。
mv ./kosmosctl-linux-amd64 /usr/local/bin/kosmosctl
chmod +x /usr/local/bin/kosmosctl
本文概述了 kosmosctl
常用语法和命令操作描述,并提供了相关的示例。使用以下语法从终端窗口运行 kosmosctl
命令:
Kosmosctl [command] [flags]
其中 command
是:
command
:指定要对一个或多个资源执行的操作,例如install
、join
、dr
、get
、uninstall
、unjoin
、help
、completion
、analysis
、check
。
注意:
从命令行指定的参数会覆盖默认值和任何相应的环境变量。
针对配置信息,
kosmosctl
在$HOME/.kube
目录中查找一个名为config
的配置文件。 你可以通过设置KUBECONFIG
环境变量或设置--kubeconfig
参数来指定其它kubeconfig
文件。
Kosmos
Kosmos 部署非常简单,具体语法如下:
kosmosctl install [flags]
其中 flags
是:
flags
:指定可选的参数。例如,可以使用 -**m
** 或 --module
参数指定需要安装的模块,默认安装全部模块。
例如只需要安装 ClusterTree 模块:
kosmosctl install -m clustertree
kosmos 部署
kosmosctl install
通过该指令可以很方便的在 Kubernetes 集群中部署 Kosmos 的管理面服务。
上图表明 Kosmos 已经被成功安装了。
无状态工作负载跨集群平滑扩展过程演示:
下面以一个无状态工作负载 deployment 为例,首先是单集群 2 副本部署。
deployment 样例如下:
启动 deployment 用例:
kubectl apply -f nginx.yaml
结果如下:
1)主集群中查看:
kosmosctl get pod -n test -owide
可用性验证:
登录集群节点,验证 nginx 应用负载可用性。
curl cluster-ip:port(对应的service服务:nginx-svc)
访问成功,服务可用!
Kosmos 注入 Kubernetes 集群
集群注入命令,语法如下:
kosmosctl join cluster [flags]
其中 flags
是:
flags
:指定可选的参数。例如:
--kubeconfig
指定待加入子集群的kubeconfig
--name
指定待加入集群的名字
--cni
指定待加入子集群的网卡类型,默认使用"calico"
--default-nic
设置默认网卡接口卡
--network-type
设置集群网络连接模式,默认使用"gateway"
--private-image-registry
私有镜像仓库,从中拉取镜像。如果设置,所有所需的镜像将从该仓库下载,这在离线安装场景下非常有用。(默认值为 "ghcr.io/kosmos-io"
)。
ClusterTree 注册集群
子集群注册:
kosmosctl join cluster --name kosmos-cluster-member1-local --kubeconfig ~/kubeconfig/member1 --enable-tree
子集群注册成功提示如下:
此时,子集群已经作为 node 注册到主集群中,在主集群中可查看子集群:
kosmosctl get node
在多集群中,重新编辑该 deployment,添加tolerations污点容忍,用于容忍 cluster 上对应污点。故该 deployment 创建后,主集群能够将 pod 调度到该 node 上,kosmos 会同步该 pod 到子集群中,并实时维护主集群和子集群 pod 的状态。
修改后的 deployment 样例如下:
编辑 deployment:
kubectl edit deployment/nginx-deployment -n test
结果如下:
1)主集群中查看:
kosmosctl get all -n test -owide
2)子集群中查看:
kubectl get all -n test -owide
说明:通过测试结果可以看出,其中一个 pod 启动到主集群节点 cluster-host-local-worker,另外一个 pod 启动在本文第二步中 clustertree join 的集群kosmos-cluster-member1-local
节点上,实现无状态工作负载分布式部署多 K8s 集群的能力。
可用性验证:
本演示环境默认是打通多集群网络(可参考本文 ClusterLink 拉通网络章节),并且只下发一个 pod 到子集群。
登录任意一个集群节点,验证 nginx 应用负载可用性。
curl cluster-ip:port(对应的service服务:nginx-svc)
访问成功,服务可用!
接着,修改 deployment 样例,去掉节点反亲和,下发两个 pod 到子集群。
登录任意一个集群节点,验证 nginx 应用负载可用性。
curl cluster-ip:port(对应的service服务:nginx-svc)
访问成功,服务可用!
至此,Kosmos 完成了一个正常运行的无状态工作负载从单集群平滑扩展 pod 到多集群中的整个过程,并且不影响服务的正常使用。
ClusterLink 拉通网络(可选)
说明:如果需要打通多集群网络可按照此步骤部署,否则可跳过
注:我们规定 Kosmos 所在集群为主集群,其他加入的 Kubernetes 集群为子集群。
拉通主子集群之间的网络:
kosmosctl join cluster --name cluster-member1-local --kubeconfig ~/kubeconfig/member1 --cni calico --default-nic eth0
网络拉通成功提示如下:
查看已创建 cluster
kosmosctl get cluster
网络连通性校验
校验命令,语法如下:
kosmosctl check [flags]
其中 flags
是:
flags
:指定可选的参数。例如:
--src-kubeconfig
源端集群kubeconfig
文件路径
-r, --image-repository
源端集群Kosmos
镜像仓库地址Image repository
(默认 "ghcr.io/kosmos-io"
)
--dst-kubeconfig
目的集群kubeconfig
文件路径
--dst-image-repository
目的集群Kosmos
镜像仓库地址Image repository
(默认 "ghcr.io/kosmos-io"
)
通过执行以下命令,可以很方便的在一键校验多个 Kubernetes 集群之间的网络联通性,示例如下:
kosmosctl check -r ghcr.io/kosmos-io --src-kubeconfig ~/kubeconfig/host --dst-kubeconfig ~/kubeconfig/member1
Kosmos 卸载
注销命令语法如下:
kosmosctl unjoin cluster [flags]
其中 flags
是:
flags
:指定可选的参数。例如:
--name
指定待移除集群的名字
--kubeconfig
子集群的kubeconfig
文件路径
卸载命令语法如下:
kosmosctl uninstall [flags]
其中 flags
是:
flags
:指定可选的参数。例如:
-m, --module
指定待卸载模块
-n, --namespace
指定kosmos
命名空间(默认使用"kosmos-system"
)
注销 clustertree 创建的 cluster:
kosmosctl unjoin cluster --name kosmos-cluster-member1-local --kubeconfig ~/kubeconfig/member1
注销 clusterlink 创建的 cluster(可选)
说明:如果未使用 clusterlink,可以跳过该步。
kosmosctl unjoin cluster --name cluster-member1-local --kubeconfig ~/kubeconfig/member1
卸载 Kosmos
kosmosctl uninstall
附:同样可以使用-m 参数指定需要卸载的模块
kosmosctl uninstall -m clusterlink/clustertree
总结
本文针对移动云开源的 Kosmos,通过其提供的命令行工具 Kosmosctl,执行 Kosmosctl 相关命令,可以简单快速的部署好 Kosmos 服务。ClusterLink 轻松实现多集群之间容器网络的连通,ClusterTree 实现了应用运行在多集群上的能力。最终,快速实现将一个无状态工作负载部署到多 K8s 集群上。至此,本期 Kosmos 部署及无状态工作负载跨集群平滑扩展方案便结束了,感谢大家的阅读实践。
联系我们
点击【https://github.com/kosmos-io/kosmos】到达 Kosmos 网站。
扫描二维码联系我们!
版权声明: 本文为 InfoQ 作者【畅聊云原生】的原创文章。
原文链接:【http://xie.infoq.cn/article/c5177e6f38e1c8eec4de751f8】。文章转载请联系作者。
评论