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: 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 部署及无状态工作负载跨集群平滑扩展方案便结束了,感谢大家的阅读实践。

联系我们

点击【https://github.com/kosmos-io/kosmos】到达 Kosmos 网站。

              请扫描二维码联系我们!

本文由mdnice多平台发布


畅聊云原生
1 声望2 粉丝