![見出し画像](https://assets.st-note.com/production/uploads/images/93627571/rectangle_large_type_2_c20fb0b5c702c7e72272bbfdcfac3b66.jpeg?width=1200)
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
開発・テスト用には、オプションがあります。
(推奨) KubernetesをサポートしているDocker Desktopをインストールする (設定でK8sを有効にするだけで、kubectlもインストールされます)
制作目的として、オプションは
Google Kubernetes Engine(GKE)、Amazon Elastic Kubernetes Service(EKS)、Azure Kubernetes Service(AKS)などのマネージドKubernetesサービスを使って。これらのサービスでは、基盤となるインフラストラクチャを気にすることなく、ノードのクラスタを簡単に作成および管理することができます。
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
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
以下は、デプロイに成功したときのスクリーンショットです。
![](https://assets.st-note.com/img/1671418874655-7nnNS8Qczq.png?width=1200)
また、ノードが正しい設定で動作していることを確認するために、以下のコマンドを実行します。
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.