首页
/ SubQuery项目在Kubernetes中的部署指南

SubQuery项目在Kubernetes中的部署指南

2025-07-05 07:41:15作者:董灵辛Dennis

概述

SubQuery是一个用于区块链数据索引和查询的开源项目,它允许开发者从区块链网络中提取、转换和持久化数据。本文将详细介绍如何在Kubernetes集群中部署SubQuery的完整解决方案,包括数据索引节点、PostgreSQL数据库和Hasura GraphQL服务。

核心组件架构

在Kubernetes中部署SubQuery项目需要三个主要组件协同工作:

  1. SubQuery节点:负责从区块链网络获取数据并进行索引
  2. PostgreSQL数据库:存储索引后的结构化数据
  3. Hasura服务:提供GraphQL接口供客户端查询数据

详细部署步骤

1. 部署SubQuery索引节点

SubQuery节点的部署采用Deployment资源,配置要点如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: subql-node-1
spec:
  template:
    spec:
      volumes:
        - name: project-dir
          emptyDir: {medium: Memory}
      initContainers:
        - name: prepare
          image: node:lts-alpine
          command: [sh, -c, "apk add git && git clone 项目示例仓库 /subquery && cd /subquery/block-timestamp && npm i -g @subql/cli && yarn && subql codegen && yarn build"]
      containers:
        - name: indexer
          image: onfinality/subql-node:v0.4.0
          args: ["-f", "/subquery/block-timestamp", "--local"]
          env:
            - name: DB_HOST
              value: subquery-db-svc
            - name: DB_PORT
              value: "5432"

关键配置说明

  • 使用initContainer准备项目代码和依赖
  • 主容器运行SubQuery节点服务
  • --local参数表示在公共schema中创建表
  • 内存型emptyDir卷提高临时文件访问速度

2. 部署PostgreSQL数据库

数据库采用StatefulSet确保数据持久化:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: subquery-db
spec:
  serviceName: subquery-db-svc
  volumeClaimTemplates:
    - metadata:
        name: subquery-db-pvc
      spec:
        accessModes: [ReadWriteOnce]
        resources:
          requests:
            storage: 20G
  template:
    spec:
      containers:
        - name: db
          image: postgres:12-alpine
          env:
            - name: POSTGRES_PASSWORD
              value: postgres

生产环境建议

  • 使用专用数据库实例而非容器
  • 根据数据量调整存储大小
  • 考虑配置定期备份策略

3. 部署Hasura GraphQL服务

Hasura提供数据查询接口:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hasura-deploy
spec:
  template:
    spec:
      containers:
        - name: hasura
          image: hasura/graphql-engine:v1.3.3
          env:
            - name: HASURA_GRAPHQL_DATABASE_URL
              value: postgres://postgres:postgres@subquery-db-svc:5432/postgres
            - name: HASURA_GRAPHQL_ENABLE_CONSOLE
              value: 'true'

安全建议

  • 生产环境应将HASURA_GRAPHQL_ENABLE_CONSOLE设为false
  • 配置适当的访问控制
  • 启用HTTPS

安全增强配置

建议添加网络策略限制不必要的网络访问:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: subquery-node-egress
spec:
  podSelector:
    matchLabels:
      release: subql-node-1
  egress:
    - to:
        - ipBlock:
            cidr: 10.0.0.0/8

该策略限制SubQuery节点只能访问内部网络(10.0.0.0/8)。

性能优化建议

  1. 索引节点

    • 根据区块链数据量调整节点资源请求
    • 考虑使用更快的存储后端
    • 监控索引进度和性能指标
  2. 数据库

    • 配置适当的索引
    • 调整PostgreSQL内存参数
    • 考虑读写分离
  3. 查询服务

    • 根据查询负载调整Hasura副本数
    • 启用查询缓存
    • 配置合理的限流策略

总结

本文详细介绍了在Kubernetes中部署SubQuery项目的完整方案,涵盖了从数据索引到查询接口的整个流程。生产环境部署时,建议根据实际业务需求调整资源配置和安全策略,并建立完善的监控体系。通过Kubernetes的编排能力,可以轻松实现SubQuery服务的高可用和弹性扩展。