見出し画像

Kubernetes上の新しいNEMテストネット

この記事はSymbol/NEMの技術者Bahaさんの記事「New NEM Testnet on Kubernetes」を機械翻訳したものです。


NEM testnet ネットワークを Kubernetes 上で稼働させる準備はできましたか?このガイドでは、Helm Charts を使用してそのプロセスを説明します。

まず、KubernetesとHelmがどのようなものかを簡単に説明します。

Kubernetes(K8sと略されるが、なぜかはこちら?)は、コンテナ化されたアプリケーションの展開、スケーリング、および管理を自動化するための強力なオープンソースシステムです。Kubernetesは、サーバーのクラスタ上でコンテナをデプロイ、実行、管理するためのプラットフォームを提供し、開発者は、基盤となるインフラストラクチャを気にすることなく、複雑で拡張性の高いアプリケーションを簡単に構築、デプロイ、管理できるようにします。Kubernetesを使用することで、一貫性があり、信頼性が高く、スケーラブルな方法でアプリケーションを構築、デプロイ、管理できるため、最新のクラウドネイティブ開発には欠かせないツールとなっています。

HelmはKubernetes用のパッケージマネージャで、開発者はKubernetesクラスタ上のアプリケーションやサービスを簡単にパッケージ化、設定、デプロイすることができます。Helm Chartsは、Kubernetesリソースの設定済みパッケージで、グループとしてデプロイすることができます。これにより、共通の設定の再利用や共有が容易になり、Kubernetes上の複雑なアプリケーションのデプロイプロセスが簡素化されます。Helm Chartsを使用することで、Kubernetes上にアプリケーションをデプロイする際の時間と労力を節約できるほか、アプリケーションの長期的な保守と更新も容易になります。

環境設定

必要条件

  • コンテナ化環境としてのDocker v20.10.21

  • コンテナオーケストレーションプラットフォームとしてのKubernetes v1.21

  • KubernetesのパッケージマネージャとしてHelm v3

  • Kubernetesクラスタに対してコマンドを実行するためのkubectl

インストール方法は?

Docker & Kubernetes

開発・テスト用には、オプションがあります。

  1. (推奨) KubernetesをサポートしているDocker Desktopをインストールする (設定でK8sを有効にするだけで、kubectlもインストールされます)

  2. Docker、minikubekubectlを個別にインストールする。

制作目的として、オプションは

  1. Google Kubernetes Engine(GKE)、Amazon Elastic Kubernetes Service(EKS)、Azure Kubernetes Service(AKS)などのマネージドKubernetesサービスを使って。これらのサービスでは、基盤となるインフラストラクチャを気にすることなく、ノードのクラスタを簡単に作成および管理することができます。

  2. kubeadmのようなツールを使用して、独自のサーバーまたは仮想マシン上にクラスターをセットアップする。このオプションでは、インストールプロセスをより詳細に制御でき、特定のニーズに合わせてクラスタをカスタマイズすることができます。

この記事はローカル環境へのnis-clientのデプロイメントに焦点を当てているので、本番環境のセットアップにはより多くの調査が必要であることに注意してください。

Helm

インストールするオプションは、https://helm.sh/docs/intro/install/  をご確認ください。

Kubernetes Controllers

K8s Ingress Nginxコントローラ

クラスタ外からのリクエストを受け取るためには、Helm Chart の値で ingress を有効にする必要があります(以下のセクションで詳しく説明します)。ローカルで設定する場合は、Ingress NGINX Controllerをインストールする必要があります。(その他のオプションは Ingress Controllers list を参照してください)

まず、カレントディレクトリに values-nginx-controller.yaml というファイルを作成し、以下の内容を記述します。

 # configure the tcp configmap
 tcp:
   7778: localhost:7778

 # enable the service and expose the tcp ports.
 # be careful as this will potentially make them
 # available on the public web
 controller:
   service:
     enabled: true
     ports:
       http: 7890
       https: 7891
     targetPorts:
       http: http
       https: https

次に以下のコマンドを実行してください。

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
 helm repo update
 helm install ingress-nginx ingress-nginx/ingress-nginx --create-namespace --namespace=ingress-nginx -f ./values-nginx-controller.yaml

Local Path Provisioner

Kubernetesのローカルパスプロビジョナーは、クラスタ内のノードでローカルストレージをバックにした永続的なストレージボリュームを作成・管理することができるストレージプロビジョナーです。

kubernetesクラスタにインストールする場合は、カレントディレクトリで以下のコマンドを実行します。

(オプション) ソースから nis-client の docker イメージをビルド

デフォルトでは、helm パッケージは nemofficial/nis-client  Docker Hub リポから必要なイメージを自動的に取得します。

しかし、ソースコードからビルドしたい場合は、以下のコマンドを実行する必要があります。

git clone https://github.com/NemProject/nem
cd nem
git checkout dev
cd ./infra/docker
docker build -t nis-client .

Deployment

nem-helm-charts パッケージをプル

現在、nem-helm-charts helm パッケージは公開されていませんので、nem-helm-charts リポジトリをローカルにチェックアウトする必要があります。

mkdir -p workdir-new-nem-testnet
cd workdir-new-nem-testnet
git clone https://github.com/yilmazbahadir/nem-helm-charts.git
cd nem-helm-charts

Nemesisのブロックとノードの構成を生成する

nemesis-generatorを使用して、初期ブロックとネットワーク構成用のカスタムnemesisファイルを生成する必要があります。

cd ../workdir-new-nem-testnet
git clone https://github.com/NemProject/nemesis-generator.git
cd nemesis-generator

Pyhton3がローカルにインストールされている必要があります(python3 --versionでバージョンを確認できます)。
インストールは、以下の手順でLinuxにインストールします(他のOSについてはオンラインで検索してください)。

依存関係のインストール

python3 -m pip install -r requirements.txt

ジェネレーター用のコンフィギュレーションを生成する

なお、ノードが正常に収穫できるようにするには、総供給量が9B程度である必要があります。そのため、以下の20アカウントはそれぞれ残高を4億5000万に設定しています。

python3 -m configuration_generator --count 20 --seed 450000000000000 --network-name testnet --output nemesis.yaml --accounts-output user.yaml

NEMネメシスバイナリを生成する

python3 -m generator --input ./nemesis.yaml --output nemesis.bi

NEMノード構成の生成

ノード情報用の nodes.yaml ファイルを以下のフォーマットで作成します。

nodes:
  - host: localhost-node1
    name: node1
  - host: localhost-node2
    name: node2

これはローカルな展開なので、一般に利用可能なドメイン名を所有する必要はありません。
ローカルに localhost-node1 と localhost-node2 のエイリアスを設定するには、次の手順に従います。

まず、ifconfig(linux, mac) または ipconfig(windows) を実行して、ローカルネットワークのIPを取得します。

ifconfig
# find the IP in the output, should be something like 192.168.0.12

次にエイリアスを設定します。

sudo vi /etc/hosts
# add the following lines, save and quit
# Please replace 192.168.0.12 with your actual internal network IP below
192.168.0.12 localhost-node1
192.168.0.12 localhost-node2

ネットワークIPの代わりに127.0.0.1を使用すると動作しないので注意してください。そのため、内部ネットワークIPを使用してください。

そして、以下のコマンドを実行して、./outputフォルダにノードコンフィギュレーションを生成します。

python3 -m node_configuration_generator --accounts-file user.yaml --nodes-file nodes.yaml --nemesis-file ./nemesis.yaml --seed ./nemesis.bin --network-friendly-name ship --output-path ./output

出力ファイルは、以下のような構造で生成される必要があります。

./output
  |--node1
     |--config.user.properties
     |--nemesis.bin
     |--peers-config_testnet_ship.json
  |--node2
     |--config.user.properties
     |--nemesis.bin
     |--peers-config_testnet_ship.json

Helm configurations

カスタム設定を適用するためには、デフォルト値のいくつかをオーバーライドする値をyamlファイルで作成し、helm installコマンドに渡す必要があります。

ここでは、前のステップ(nemesis generation & node config)で作成したファイルを使用します。

nemesis-generator/outputフォルダをnem-helm-chartsディレクトリにコピーします。

cd workdir-new-nem-testnet/nem-helm-charts
cp -R ../nemesis-generator/output .

base64エンコードされたnemesisファイルを用意する。

nemesisのバイナリファイルをBase64でエンコードして(nemesis-base64.)txtファイルを作成する(全ノードで同じになる)。

base64 -i output/node1/nemesis.bin -o nemesis-base64.txt

このテキストファイルは、以下の節で helm install コマンドに値 (-set-file) として渡すことになります。

ノード用のvalues.yamlファイルを準備する

node1には、values-node1.yamlというファイルを作成し(workdir-new-nem-testnet/nem-helm-charts内)、以下の内容で、コメントに注意して、ファイルを更新してください。

config:
  user:
    nis.bootKey: # nis.bootKey from ./output/node1/config-user.properties
    nis.bootName: # nis.bootName from ./output/node1/config-user.properties
    nem.host: # nem.host from ./output/node1/config-user.properties
    nis.ipDetectionMode: Disabled

    nem.network: # nem.network from ./output/node1/config-user.properties
    nem.network.version: # nem.network.version from ./output/node1/config-user.properties
    nem.network.addressStartChar: # from ./output/node1/config-user.properties
    nem.network.generationHash: # from ./output/node1/config-user.properties
    nem.network.nemesisSignerAddress: # from ./output/node1/config-user.properties
    nem.network.totalAmount: "" # amount should be btw quotes, from ./output/node1/config-user.properties
    nem.network.nemesisFilePath: custom-nemesis.bin # don't change this

ingress:
  enabled: true
  className: "nginx"
  annotations:
  hosts:
  # update the hostname below!
    - host: # nem.host from ./output/node1/config-user.properties
      paths:
        - path: /
          pathType: ImplementationSpecific
          backend:
            service:
              port: 7890
        - path: /
          pathType: ImplementationSpecific
          backend:
            service:
              port: 7891
        - path: /
          pathType: ImplementationSpecific
          backend:
            service:
              port: 7778
  tls: []

同じ手順で、values-node2.yamlファイルを作成します(今回は./output/node2/config-user.propertiesを使用します)。

さらに設定が必要な場合は、レポで利用可能なすべての値をチェックアウトすることができます。

helmパッケージのインストールとノードのデプロイ

Node1:

helm install testnet-node1 ./charts/nem-client --create-namespace --namespace=testnet-node1  --set-file config.customNemesisFileBase64=./nemesis-base64.txt --set-file config.peersConfigJson=./output/node1/peers-config_testnet_ship.json -f ./charts/nem-client/values.yaml -f ./values-node1.yaml

Node2:

helm install testnet-node2 ./charts/nem-client --create-namespace --namespace=testnet-node2  --set-file config.customNemesisFileBase64=./nemesis-base64.txt --set-file config.peersConfigJson=./output/node2/peers-config_testnet_ship.json -f ./charts/nem-client/values.yaml -f ./values-node2.yaml

これらのコマンドの後、以下のコマンドを実行し、デプロイが完了したことを確認します。

kubectl get all --namespace testnet-node1
kubectl get all --namespace testnet-node2

以下は、デプロイに成功したときのスクリーンショットです。

また、ノードが正しい設定で動作していることを確認するために、以下のコマンドを実行します。

curl http://localhost-node1:7890/node/info
curl http://localhost-node2:7890/node/info

ノードがハーベストしていることを確認するためには、実行によって1分ごとに高さが増加していることを観察する必要があります。

curl http://localhost-node1:7890/chain/height
curl http://localhost-node2:7890/chain/height

アンインストール

何か問題が発生した場合やデプロイが完了した場合、K8sクラスタからhelmパッケージをアンインストールするには、次のコマンドを実行します。

helm uninstall testnet-node1 --namespace=testnet-node1
helm uninstall testnet-node2 --namespace=testnet-node2

アンインストールが正常に行われたことは、実行することで確認できます。

kubectl get all --namespace testnet-node1
# No resources found in testnet-node1 namespace.

この記事が気に入ったらサポートをしてみませんか?