在K8s集群上部署

为了在分布式环境中处理大规模图数据,GraphScope被设计为可部署在Kubernetes(K8s)集群上。

如图所示,您可以通过Python客户端部署和管理GraphScope的工作负载,该客户端通过gRPC服务与K8s集群上的GraphScope引擎进行通信。

GraphScope on K8s

GraphScope 在 Kubernetes 上的部署。

k8s上的集群包含一个运行协调器的pod,以及一个GraphScope引擎的deployment

GraphScope中的协调器是后端的端点。它通过grpc管理来自Python客户端的连接,并负责为交互式、分析和学习引擎申请或释放pod资源。

本文档介绍如何在K8s集群上部署GraphScope。

前提条件

  • Linux 或 macOS 系统。

  • Python 3.7 ~ 3.11。

安装GraphScope客户端

与独立模式不同,您只需安装GraphScope的客户端包。

python3 -m pip install graphscope-client

提示

如需加速下载,可使用阿里云镜像。

python3 -m pip install graphscope-client -i http://mirrors.aliyun.com/pypi/simple/ \
    --trusted-host=mirrors.aliyun.com

准备一个Kubernetes集群

要在Kubernetes上部署GraphScope,您必须拥有一个kubernetes集群。

提示

如果您已经拥有K8s集群,可以直接跳过本节继续部署。

我们推荐使用minikube。 请按照minikube的说明为您的平台下载合适的二进制文件。

然后,通过以下命令启动minikube

minikube start

在macOS上,您可以直接使用Docker Desktop,它包含一个独立的Kubernetes服务器和客户端。

使用此命令验证minikube是否正在运行。

minikube status

正常状态应如下所示

Minikube Status

minikube 状态

输出应显示集群正在运行,且kubectl上下文已设置为minikube上下文。 启动后,minikube会生成一个kubeconfig文件供您与集群通信和交互。

该文件的默认位置是 ~/.kube/config,其内容应如下所示:

apiVersion: v1
clusters:
- cluster:
    certificate-authority: /root/.minikube/ca.crt
    extensions:
    - extension:
        last-update: Thu, 16 Mar 2023 16:44:05 CST
        provider: minikube.sigs.k8s.io
        version: v1.28.0
      name: cluster_info
    server: https://172.21.67.111:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    extensions:
    - extension:
        last-update: Thu, 16 Mar 2023 16:44:05 CST
        provider: minikube.sigs.k8s.io
        version: v1.28.0
      name: context_info
    namespace: default
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /root/.minikube/profiles/minikube/client.crt
    client-key: /root/.minikube/profiles/minikube/client.key

部署GraphScope

使用默认参数启动

GraphScope的引擎以Docker镜像形式分发。graphscope Python客户端会在镜像不存在时自动拉取。如果您在k8s集群上运行GraphScope,请确保集群能够访问公共镜像仓库。

会话(session)封装了GraphScope引擎的控制和状态。它作为Python客户端访问GraphScope的入口点。通过会话,您可以在k8s集群上部署和连接GraphScope。

import graphscope

sess = graphscope.session()

默认情况下,它会在~/.kube/config中查找kubeconfig文件,将使用上一步中由minikube生成的文件。

如上所示,一个会话可以轻松在k8s上启动集群。

常用参数

自定义镜像URI

考虑到您可能希望使用默认标签以外的其他标签,或在无法访问互联网的内网环境中部署,可能需要自定义镜像URI。

您可以通过一组与镜像相关的参数来配置引擎的镜像URI。默认配置如下:

sess = graphscope.session(
    k8s_image_registry="registry.cn-hongkong.aliyuncs.com",
    k8s_image_repository="graphscope",   
    k8s_image_tag="0.20.0",
)

更多详情请参阅Session

指定工作节点数量

GraphScope 旨在处理无法容纳在单个工作节点内存中的超大规模图数据。要处理此类图数据,您可以增加工作节点数量以及各节点的CPU和内存资源。

要实现这一点,请使用num_workers参数:

sess = graphscope.session(
    num_workers=4,
    k8s_engine_cpu=32,
    k8s_engine_mem="256Gi",
    vineyard_shared_mem="256Gi",
)

提供默认以外的kubeconfig配置文件

如果您想在已有集群上部署,且kubeconfig文件位于非默认位置,可以手动指定kubeconfig文件路径如下:

sess = graphscope.session(k8s_client_config='/path/to/config')

挂载卷

有时您可能希望使用本地磁盘上的数据集,为此我们提供了将主机目录挂载到集群的选项。

假设我们希望将主机上的~/test_data挂载到pod中的/testingdata目录,可以按如下方式定义一个dict,然后将其作为k8s_volumes参数传入session构造函数。

请注意,主机路径是相对于Kubernetes节点的,也就是说,如果您有一个通过VM驱动创建的集群,那么您需要将该目录复制到minikube虚拟机,或者将该路径挂载到minikube虚拟机。更多详情请参见此处

import os
import graphscope

k8s_volumes = {
    "data": {
        "type": "hostPath",
        "field": {
            "path": os.path.expanduser("~/test_data/"),
            "type": "Directory"
        },
        "mounts": {
        "mountPath": "/testingdata"
        }
    }
}

sess = graphscope.session(k8s_volumes=k8s_volumes)

提示

您也可以通过none driver创建集群。

minikube start --driver=none

检查部署情况

GraphScope的启动时间取决于拉取所需Docker镜像的耗时。 拉取时间受网络条件影响。 一旦镜像拉取完成,GraphScope将在10秒内完成启动并运行。

使用以下命令监控部署状态:

kubectl get pods

输出应显示GraphScope pod的状态。以下是一个示例

Pods of GraphScope

GraphScope的Pods

在继续之前,请等待所有pod都处于运行状态。

您可以使用kubectl describe pod 进一步检查pod的状态。

搞定!您现在已经在Kubernetes集群中运行了一个GraphScope实例。

您可以像往常一样使用GraphScope分析图数据。 更多详情请参阅入门指南

清理

当您完成使用GraphScope后,可以通过执行以下命令来移除部署。

sess.close()

您可以通过以下方式检查是否还有剩余资源:

kubectl get deployments
kubectl get statefulsets
kubectl get svc

如果仍有资源剩余,您可能需要手动删除它们:

kubectl delete deployment <deployment-name>
kubectl delete statefulsets <statefulsets-name>
kubectl delete svc <svc-name>

要停止并删除minikube集群,请运行:

minikube stop
minikube delete