写点什么

Kosmos 实现无状态工作负载跨集群平滑扩展

作者:畅聊云原生
  • 2023-12-01
    江苏
  • 本文字数:4214 字

    阅读完需:约 14 分钟

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:指定要对一个或多个资源执行的操作,例如 installjoindrgetuninstallunjoinhelpcompletionanalysischeck


注意:


  • 从命令行指定的参数会覆盖默认值和任何相应的环境变量。

  • 针对配置信息,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 样例如下:


---apiVersion: v1kind: Namespacemetadata:  name: test---apiVersion: apps/v1kind: Deploymentmetadata:  name: nginx-deployment  namespace: testspec:  replicas: 2  selector:    matchLabels:      app: nginx  template:    metadata:      labels:        app: nginx    spec:      affinity:        podAntiAffinity:          requiredDuringSchedulingIgnoredDuringExecution:            - labelSelector:                matchExpressions:                  - key: app                    operator: In                    values:                      - nginx              topologyKey: "kubernetes.io/hostname"      containers:      - name: nginx        image: nginx:latest        ports:        - containerPort: 80---apiVersion: v1kind: Servicemetadata:  name: nginx-svc  namespace: testspec:  selector:    app: nginx  ports:    - protocol: TCP      port: 80      targetPort: 80  type: ClusterIP  ipFamilyPolicy: SingleStack  ipFamilies:    - IPv4
复制代码

启动 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 样例如下:


---apiVersion: v1kind: Namespacemetadata:  name: test---apiVersion: apps/v1kind: Deploymentmetadata:  name: nginx-deployment  namespace: testspec:  replicas: 2  selector:    matchLabels:      app: nginx  template:    metadata:      labels:        app: nginx    spec:      tolerations:      - key: "kosmos.io/node"        operator: "Equal"        value: "true"        effect: "NoSchedule"      affinity:        podAntiAffinity:          requiredDuringSchedulingIgnoredDuringExecution:            - labelSelector:                matchExpressions:                  - key: app                    operator: In                    values:                      - nginx              topologyKey: "kubernetes.io/hostname"      containers:      - name: nginx        image: nginx:latest        ports:        - containerPort: 80---apiVersion: v1kind: Servicemetadata:  name: nginx-svc  namespace: testspec:  selector:    app: nginx  ports:    - protocol: TCP      port: 80      targetPort: 80  type: ClusterIP  ipFamilyPolicy: SingleStack  ipFamilies:    - IPv4
复制代码


编辑 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 网站。


扫描二维码联系我们!


发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2023-10-13 加入

还未添加个人简介

评论

发布
暂无评论
Kosmos实现无状态工作负载跨集群平滑扩展_畅聊云原生_InfoQ写作社区