共计 5436 个字符,预计需要花费 14 分钟才能阅读完成。
本文将具体介绍:
1、如何基于 Kubernetes 集群部署 GraphScope ;
2、背地的工作细节;
3、如何在分布式环境中应用本人构建的 GraphScope 开发镜像。快速访问:https://github.com/alibaba/GraphScope
上篇文章介绍了 GraphScope 能够很容易在单机环境下进行部署。然而在实在的工业场景中,须要解决的图数据规模非常微小,已远远超过了单机的解决能力。因而除单机部署形式外,借助 vineyard 提供的分布式内存数据管理能力,GraphScope 也反对在 Kubernetes 集群上运行。
前置筹备 在开始之前,请确保以后环境满足下述条件之一:
Linux 零碎:ubuntu18.04+ 或 centos7+;macOS (Big Sur) 11.2.1+。以及具备以下依赖:
Docker kubectl 一套可用的 K8s 环境,能够是 一个 K8s 集群 或者是 kind/minikube 之类的单机模仿集群的工具 因为 minikube 在服务裸露上与 Kubernetes 不兼容,因而本文以 Kind[1] 为例,介绍如何在本地单机构建一个虚构 Kubernetes 集群并做部署。如果想搭建一个实在的多节点集群,能够参照 K8s 官网反对的文档 [2] 搭建;如果你不想手动治理一个 Kubernetes 集群,也能够抉择一个通过认证的平台来托管部署服务,如 Aliyun ACK[3]、AWS EKS[4] 等。
如果曾经满足依赖并装置完 kind 之后,首先通过以下命令初始化一个本地虚构集群:
$ kind create cluster 如果你不想手动一一装置依赖,也能够应用 GraphScope 提供的脚本,来装置须要的依赖并初始化虚构集群:
$ wget -O – https://raw.githubusercontent… | bash -s – –k8s 脚本的执行过程会装置所需依赖并尝试检测通过 Kind 拉起 Kubernetes 集群。如果你抉择不应用 Kind,也能够应用社区反对的其它工具 [5] 搭建 Kubernetes 群集。
实现本地虚拟化集群的拉起后,咱们能够运行如下命令来查看 Kubernetes 配置是正确的:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION node1 Ready 5d9h v1.22.3-aliyun.1 如果上述命令报错,则阐明集群并未准备就绪。请参考 Kubernetes 相干文档 [6] 查看问题。
为了残缺运行下文中的示例,你还须要在本机上安装 GraphScope Python 客户端。
pip3 install graphscope 通过 Python 进行集群部署 GraphScope 以 docker 镜像的形式公布引擎组件。默认状况下,如果运行 GraphScope 的机器不存在对应镜像,则会拉取以后版本的最新镜像,因而,请确保你的集群能够失常拜访公共镜像仓库。
会话(session)[7] 作为 GraphScope 在客户端的入口,它治理着 GraphScope 背地的一组资源,并容许用户操作这组资源上 GraphScope 引擎的各个组件。接下来,咱们能够通过会话(session) 在 Kubernetes 集群上创立一个领有两个 Worker 节点的 GraphScope 实例:
import graphscope
sess = graphscope.session(num_workers=2)
print(sess)
{‘status’:‘active’,‘type’:‘k8s’,‘engine_hosts’:‘gs-engine-jlspyc-6k8j7,gs-engine-jlspyc-mlnvb’,‘namespace’:‘gs-xxwczb’,‘session_id’:‘session_narhaktn’,‘num_workers’: 2}
第一次部署可能会拉取镜像,因而须要期待一段时间。部署胜利后,咱们能够看到以后 sess 的状态,以及本次实例所属的命名空间 [8] 等。
在命令行窗口,咱们能够通过 kubectl get 命令查看以后 GraphScope 实例拉起的组件:
查看拉起的 Pod
$ kubectl -n gs-xxwczb get pod NAME READY STATUS RESTARTS AGE coordinator-jlspyc-6d6fd7f747-9sr7x 1/1 Running 0 8m27s gs-engine-jlspyc-6k8j7 2/2 Running 0 8m23s gs-engine-jlspyc-mlnvb 2/2 Running 0 8m23s gs-etcd-jlspyc-0 1/1 Running 0 8m24s
查看拉起的 Service
$ kubectl -n gs-xxwczb get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE coordinator-service-jlspyc NodePort 172.16.137.185 59050:32277/TCP 8m55s gs-etcd-jlspyc-0 ClusterIP 172.16.208.134 57534/TCP,58955/TCP 8m51s gs-etcd-service-jlspyc ClusterIP 172.16.248.69 58955/TCP 8m52s Session 启动各组件的流程 图片 Session 启动流程 如上图所示,在这个 sess = graphscope.session(num_workers=2) 语句背地,GraphScope 拉起各个组件的流程如下:
① 默认状况下,当创立会话 (session) 时,该办法会为尔后应用的每个 Kubernetes 对象,包含 Pod,Role 等创立一个独自的命名空间。当用户敞开会话 (session) 时,整个命名空间都会被删除。
② 命名空间创立实现后,后续的拉起过程是通过默认的服务账号 [9] 应用 Kubernetes API 实现的,因为默认的服务账号不具备读取 Pod 的权限,因而咱们在客户端创立命名空间后,在对应的命名空间内应用 RBAC API 创立了一个具备操作 Pod、ReplicaSet 等对象的角色 [10],尔后将其绑定到默认服务账号中。这使得 GraphScope 创立的容器能够拜访所属命名空间下的其余 kubernetes 对象。
③ 之后客户端会拉起 Coordinator Pod,作为 GraphScope 后端服务的总入口,通过 GRPC 与客户端通信,并治理着图剖析引擎(GAE)、图查问引擎(GIE),图学习引擎(GLE) 的生命周期。
④ Coordinator Pod 拉起后,会依据客户端传入的会话 (session) 参数,在以后命名空间下拉起服务端组件,包含 1) 一组运行 Etcd 的 Pod,负责图数据元信息的同步;2) 一组运行图计算引擎和 Vineyard 容器的 ReplicaSet 对象。
⑤ 最初,GraphScope Coordinator 应用 Kubernetes Service[11] 对外 (客户端) 裸露服务,目前反对 NodePort 和 LoadBalancer 两种模式,具体的配置细节可参考上面的参数详情。
Session 的参数 Session 能够接管一系列参数用于定制集群的配置。例如,k8s_gs_image 参数能够定义引擎 Pod 应用的镜像、timeout_seconds 参数定义创立集群的超时工夫等,一些罕用参数的含意、默认值如下,全副参数细节可参考文档 [12]。
参数 形容 默认值 addr 用于连贯已有的 GraphScope 集群,通常联合 Helm 部署形式应用 None k8s_namespace 指定命名空间,如果存在,则在该命名空间内部署 GraphScope 实例,否则创立一个新的命名空间 None k8s_gs_image 引擎 Pod 镜像 registry.cn-hongkong.aliyuncs.com/graphscope/graphscope:tag k8s_image_pull_policy 拉取镜像的策略,可选项是‘IfNotPresent’和‘Always’IfNotPresent k8s_service_type 服务裸露类型,可选项是‘NodePort’和‘LoadBalancer’NodePort num_workers 引擎 Pod 数量 2 show_log 客户端是否输入日志信息 False log_level 日志信息等级,可选项是‘INFO’和‘DEBUG’‘INFO’timeout_seconds 创立集群的超时工夫 600 在上述参数中,通常须要留神的是 k8s_service_type,你能够参考以下介绍抉择适宜你的服务类型:
NodePort 类型作为将内部流量导入 Kubernetes 服务最原始的形式,正如其名字所示,它会在对应 Kubernetes 节点上凋谢一个特定端口 (范畴 30000 ~ 32767),任何发送到该端口的流量均会转发给对应的服务 (即 GraphScope 中的 Coordinator 服务),因而如果应用 NodePort 类型,请确保 Python 客户端所在的机器可与 Kubernetes 集群节点进行通信;
LoadBalancer 类型是裸露服务到 Internet 的规范形式,然而目前默认部署的 Kubernetes 集群通常不具备 LoadBalancer 的能力,你须要本人手动部署,能够参考 METALLB[13]。此外,诸如 Aliyun ACK 或 AWS EKS 等通过认证的平台通常间接提供 LoadBalancer 的能力,此时也要留神该形式下的 GraphScope 会为每一个实例申请 LoadBalancer 调配一个独自的 IP 地址,这个过程是免费的。
离线部署 基于 Kubernetes 离线部署 GraphScope 波及两局部:服务端和客户端局部。
服务端: GraphScope 的服务端局部蕴含 Etcd 镜像和引擎镜像,其中引擎镜像局部默认会应用 registry.cn-hongkong.aliyuncs.com/graphscope/graphscope 中的镜像,并且每个 GraphScope 公布的版本均会蕴含一个镜像,例如 v0.11.0 版本对应的镜像是 registry.cn-hongkong.aliyuncs.com/graphscope/graphscope:0.11.0,因而若想离线部署 GraphScope,只须要满足相干 Kubernetes 节点存在对应版本的镜像即可,镜像地址如下:
引擎镜像: registry.cn-hongkong.aliyuncs.com/graphscope/graphscope:0.11.0 Etcd 镜像: quay.io/coreos/etcd:v3.4.13 具体的,你能够在有网的环境预下载对应镜像,通过 scp 等命令传到集群并载入,命令参考如下:
有网环境 下载镜像
docker pull registry.cn-hongkong.aliyuncs.com/graphscope/graphscope:0.11.0
通过 docker save 命令将镜像压缩成文件
docker save registry.cn-hongkong.aliyuncs.com/graphscope/graphscope:0.11.0 > gs0.11.0.image
传输文件到集群
scp gs0.11.0.image :</path/gs0.11.0.image>
通过 docker load 命令在集群上载入镜像
docker load < gs0.11.0.image 同样 Etcd 镜像也能够用应用该形式进行预导入。
客户端: 你能够间接通过 PYPI[14] 抉择你须要 GraphScope 客户端并下载对应环境的 whl 包。下载实现后,通过如下命令装置:
pip3 install ./graphscope_client-0.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 构建自定义开发镜像 下面提到,每个 GraphScope 公布的版本均会蕴含一个镜像,而如果你心愿从源码构建一个镜像,能够应用如下命令:
$ git clone https://github.com/alibaba/GraphScope.git && cd GraphScope $ make graphscope-image build graphscope/graphscope:<GIT_SHORT_SHA> 此时一个应用以后代码空间 Git Commit 信息作为标签的 Docker 镜像将被构建进去。接下来便能够通过 k8s_gs_image 参数应用该镜像。
import graphscope
sess = graphscope.session(k8s_gs_image=‘graphscope/graphscope:<GIT_SHORT_SHA>’)
结语 作为一款可在云原生环境下高效地解决超大规模数据的图计算引擎,本文重点介绍了如何基于 Kubernetes 环境部署 GraphScope,同时,本文也具体介绍了 GraphScope 在 Kubernetes 上部署的背地细节,以及如何构建并运行自定义镜像。此外 GraphScope 也反对以 Helm[15] 的形式进行部署,届时能够容许客户端连贯到一个曾经部署好的服务,咱们也会在后续的文章中具体介绍这一部分。最初真挚的欢送大家应用 GraphScope,并点击浏览原文反馈遇到的任何问题。