作者:吕涛,中国移动云能力中心软件研发工程师,专注于云原生、微服务、算力网络等
Kosmos自开源以来,备受大家的关注,也有不少开发人员试用Kosmos,将多副本工作负载,平滑扩展到多个K8s上,以达到容灾,或者多云部署的能力。本文旨在为用户提供Kosmos简单快捷的使用方式,以及一些简单的使用场景,以便满足大家自身多集群的需求,同时也能快速的融入到Kosmos的开源实践中来。
前置条件
1. 单个Kubernetes集群的要求:
• 2核CPU或更多
• 2GB的可用内存
• 互联网连接
2. 两个及以上网段不冲突可用的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样例如下:
---
apiVersion: v1
kind: Namespace
metadata:
name: test
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: test
spec:
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: v1
kind: Service
metadata:
name: nginx-svc
namespace: test
spec:
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: v1
kind: Namespace
metadata:
name: test
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: test
spec:
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: v1
kind: Service
metadata:
name: nginx-svc
namespace: test
spec:
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部署及无状态工作负载跨集群平滑扩展方案便结束了,感谢大家的阅读实践。
联系我们
扫描二维码联系我们!