在 kubernetes 集群中运行比特币节点

在 kubernetes 集群中运行比特币节点

最近在研究矿池的架构的K8s上的迁移,在尝试在集群上运行比特币节点。

通过K8s来跑节点存在的一些收益:

  1. 共用Prometheus系统来监控的比特币节点状态。
  2. 可以和其他的服务快速的集成通过Service
  3. 对比专用实例独立部署的话需要更少的资源

到目前为止,节点的pod 已经运行超过 164 天,没有遇到中断问题。下图是 bitcoind pod 状态:

img

资源准备

B基础镜像

使用dockerhub 的基础镜像ruimarinho/bitcoin-core 时刻保持和官网的最新版本的同步更新

磁盘大小和类型

到 2020 年初,比特币数据的大小约为 333GB [1]

所以节点需要分配了一个 600 GB 的 EBS 卷来作为存储。

使用sc1 EBS 类型。虽然速度不是最快。但是节点完全同步之后,IO 需求就会大大减少,后面就足够使用了

硬盘空间目前是足够使用的后面还需要进行继续的扩容。但我们需要再次扩展该卷

集群节点规格

目前所有的 k8s 节点都使用m5.xlarge节点。

所以 bitcoind pod 在m5.xlarge上运行。没有专用节点

部署

SVC

bitcoind RPC服务 暴露的yaml 文件:

kind: Service
apiVersion: v1
metadata:
  name: bitcoind-mainnet
spec:
  selector:
    app: bitcoind-mainnet
  ports:
  - name: rpc
    port: 8332
  - name: zmq
    port: 28332

Deploy

bitcoind Deployment 的 yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: bitcoind-mainnet
spec:
  replicas: 2
  selector:
    matchLabels:
      app: bitcoind-mainnet
  template:
    metadata:
      labels:
        app: bitcoind-mainnet
    spec:
      hostname: bitcoind-mainnet
      containers:
      - name: bitcoind-mainnet
        image: ruimarinho/bitcoin-core:0.18.0
        args:
          - -zmqpubrawtx=tcp://0.0.0.0:28332
          - -zmqpubrawblock=tcp://0.0.0.0:28332
          - -zmqpubhashblock=tcp://0.0.0.0:28332
          - -zmqpubhashtx=tcp://0.0.0.0:28332
          - -rpcport=8332
          - -rpcallowip=0.0.0.0/0
          - -server=1
          - -rpcbind=127.0.0.1
          - -rpcbind=bitcoind-mainnet
          - -rpcauth=bleevin:<password>
        env:
        - name: BITCOIN_DATA
          value: /data
        imagePullPolicy: Always
        volumeMounts:
        - mountPath: /data
          name: bitcoind
      restartPolicy: Always
      volumes:
      - name: bitcoind
        persistentVolumeClaim:
          claimName: bitcoind-pvc
      imagePullSecrets:
      - name: docker-hub

对于其中的字段的说明:

  • apiVersionkind 字段将 ReplicationController 改为 Deployment。
  • metadata 部分定义了这个 Deployment 的名称。
  • spec 部分定义了这个 Deployment 的规格,包括副本数量、选择器和 Pod 模板。
  • replicas 字段指定了要启动的 Pod 副本数量。
  • selector 字段定义了选择器,用于将这个 Deployment 管理的 Pod 与其他资源(如 Service)关联起来。
  • template 字段定义了 Pod 模板,包括容器定义和标签。
  • containers 字段定义了要运行的容器,包括容器名称、镜像和端口。
  • metadata 中的 name 字段被移动到 templatemetadata 中,并且不再需要指定 spec.selector.matchLabels
  • 其他字段保持不变。

之后直接进行资源的应用以及创建就可以了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注