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

作者:吕涛,中国移动云能力中心软件研发工程师,专注于云原生、微服务、算力网络等

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:指定要对一个或多个资源执行的操作,例如 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: 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部署及无状态工作负载跨集群平滑扩展方案便结束了,感谢大家的阅读实践。

联系我们

扫描二维码联系我们!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值