Step by Step Guide
For those who would like to have more control or need some customized setups, here are some step by step instructions of how to setup and deploy a solo network.
- You may use remote kubernetes cluster. In this case, ensure kubernetes context is set up correctly.
kubectl config use-context <context-name>
- You may use
kind
or
microk8s
to create a cluster. In this case,
ensure your Docker engine has enough resources (e.g. Memory >=8Gb, CPU: >=4). Below we show how you can use
kind
to create a cluster
First, use the following command to set up the environment variables:
export SOLO_CLUSTER_NAME=solo
export SOLO_NAMESPACE=solo
export SOLO_CLUSTER_SETUP_NAMESPACE=solo-cluster
Then run the following command to set the kubectl context to the new cluster:
kind create cluster -n "${SOLO_CLUSTER_NAME}"
Example output
Creating cluster "solo" ...
β Ensuring node image (kindest/node:v1.29.1) πΌ
β Preparing nodes π¦
β Writing configuration π
β Starting control-plane πΉοΈ
β Installing CNI π
β Installing StorageClass πΎ
Set kubectl context to "kind-solo"
You can now use your cluster with:
kubectl cluster-info --context kind-solo
Thanks for using kind! π
You may now view pods in your cluster using k9s -A
as below:
Context: kind-solo <0> all <a> Attach <ctr⦠____ __.________
Cluster: kind-solo <ctrl-d> Delete <l> | |/ _/ __ \______
User: kind-solo <d> Describe <p> | < \____ / ___/
K9s Rev: v0.32.5 <e> Edit <shif| | \ / /\___ \
K8s Rev: v1.27.3 <?> Help <z> |____|__ \ /____//____ >
CPU: n/a <shift-j> Jump Owner <s> \/ \/
MEM: n/a
ββββββββββββββββββββββββββββββββββββββββββββββββββ Pods(all)[11] ββββββββββββββββββββββββββββββββββββββββββββββββββ
β NAMESPACEβ NAME PF READY STATUS RESTARTS IP NODE β
β solo-setup console-557956d575-4r5xm β 1/1 Running 0 10.244.0.5 solo-con β
β solo-setup minio-operator-7d575c5f84-8shc9 β 1/1 Running 0 10.244.0.6 solo-con β
β kube-system coredns-5d78c9869d-6cfbg β 1/1 Running 0 10.244.0.4 solo-con β
β kube-system coredns-5d78c9869d-gxcjz β 1/1 Running 0 10.244.0.3 solo-con β
β kube-system etcd-solo-control-plane β 1/1 Running 0 172.18.0.2 solo-con β
β kube-system kindnet-k75z6 β 1/1 Running 0 172.18.0.2 solo-con β
β kube-system kube-apiserver-solo-control-plane β 1/1 Running 0 172.18.0.2 solo-con β
β kube-system kube-controller-manager-solo-control-plane β 1/1 Running 0 172.18.0.2 solo-con β
β kube-system kube-proxy-cct7t β 1/1 Running 0 172.18.0.2 solo-con β
β kube-system kube-scheduler-solo-control-plane β 1/1 Running 0 172.18.0.2 solo-con β
β local-path-storage local-path-provisioner-6bc4bddd6b-gwdp6 β 1/1 Running 0 10.244.0.2 solo-con β
β β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Initialize
solo
directories:
# reset .solo directory
rm -rf ~/.solo
solo init
- Example output
******************************* Solo *********************************************
Version : 0.33.0
Kubernetes Context : kind-solo
Kubernetes Cluster : kind-solo
**********************************************************************************
β Setup home directory and cache
β Check dependency: helm [OS: linux, Release: 5.15.0-125-generic, Arch: x64]
β Check dependencies
β Setup chart manager
***************************************************************************************
Note: solo stores various artifacts (config, logs, keys etc.) in its home directory: /home/runner/.solo
If a full reset is needed, delete the directory or relevant sub-directories before running 'solo init'.
***************************************************************************************
β Copy templates in '/home/runner/.solo/cache'
- Generate
pem
formatted node keys
solo node keys --gossip-keys --tls-keys -i node1,node2,node3
- Example output
******************************* Solo *********************************************
Version : 0.33.0
Kubernetes Context : kind-solo
Kubernetes Cluster : kind-solo
**********************************************************************************
β Initialize
β Backup old files
β Gossip key for node: node1
β Gossip key for node: node2
β Gossip key for node: node3
β Generate gossip keys
β Backup old files
β TLS key for node: node3
β TLS key for node: node2
β TLS key for node: node1
β Generate gRPC TLS Keys
β Finalize
PEM key files are generated in ~/.solo/keys
directory.
hedera-node1.crt hedera-node3.crt s-private-node1.pem s-public-node1.pem unused-gossip-pem
hedera-node1.key hedera-node3.key s-private-node2.pem s-public-node2.pem unused-tls
hedera-node2.crt hedera-node4.crt s-private-node3.pem s-public-node3.pem
hedera-node2.key hedera-node4.key s-private-node4.pem s-public-node4.pem
- Setup cluster with shared components
solo cluster setup -s "${SOLO_CLUSTER_SETUP_NAMESPACE}"
- Example output
******************************* Solo *********************************************
Version : 0.33.0
Kubernetes Context : kind-solo
Kubernetes Cluster : kind-solo
**********************************************************************************
β Initialize
β Prepare chart values
β Install 'solo-cluster-setup' chart
In a separate terminal, you may run k9s
to view the pod status.
- Deploy helm chart with Hedera network components
It may take a while (5~15 minutes depending on your internet speed) to download various docker images and get the pods started.
If it fails, ensure you have enough resources allocated for Docker engine and retry the command.
solo network deploy -i node1,node2,node3 -n "${SOLO_NAMESPACE}"
- Example output
******************************* Solo *********************************************
Version : 0.33.0
Kubernetes Context : kind-solo
Kubernetes Cluster : kind-solo
Kubernetes Namespace : solo
**********************************************************************************
β Acquire lease - lease acquired successfully, attempt: 1/10
β Initialize
β Load remote config - remote config not found
β Check if cluster setup chart is installed
β Copy Gossip keys to staging
β Copy gRPC TLS keys to staging
β Prepare staging directory
β Copy Gossip keys
β Node: node2
β Copy TLS keys
β Copy Gossip keys
β Node: node3
β Copy Gossip keys
β Node: node1
β Copy node keys to secrets
β Install chart 'solo-deployment'
β Check Node: node1
β Check Node: node2
β Check Node: node3
β Check node pods are running
β Check Envoy Proxy for: node1
β Check Envoy Proxy for: node2
β Check HAProxy for: node1
β Check Envoy Proxy for: node3
β Check HAProxy for: node2
β Check HAProxy for: node3
β Check proxy pods are running
β Check MinIO
β Check auxiliary pods are ready
- Setup node with Hedera platform software.
- It may take a while as it download the hedera platform code from https://builds.hedera.com/
solo node setup -i node1,node2,node3 -n "${SOLO_NAMESPACE}"
- Example output
******************************* Solo *********************************************
Version : 0.33.0
Kubernetes Context : kind-solo
Kubernetes Cluster : kind-solo
Kubernetes Namespace : solo
**********************************************************************************
β Acquire lease - lease acquired successfully, attempt: 1/10
β Initialize
β Load remote config - remote config not found
β Check network pod: node1
β Check network pod: node2
β Check network pod: node3
β Identify network pods
β Update node: node2 [ platformVersion = v0.58.3 ]
β Update node: node3 [ platformVersion = v0.58.3 ]
β Update node: node1 [ platformVersion = v0.58.3 ]
β Fetch platform software into network nodes
β Copy configuration files
β Copy configuration files
β Copy configuration files
β Set file permissions
β Node: node1
β Set file permissions
β Node: node3
β Set file permissions
β Node: node2
β Setup network nodes
- Start the nodes
solo node start -i node1,node2,node3 -n "${SOLO_NAMESPACE}"
- Example output
******************************* Solo *********************************************
Version : 0.33.0
Kubernetes Context : kind-solo
Kubernetes Cluster : kind-solo
Kubernetes Namespace : solo
**********************************************************************************
β Acquire lease - lease acquired successfully, attempt: 1/10
β Initialize
β Load remote config - remote config not found
β Check network pod: node3
β Check network pod: node1
β Check network pod: node2
β Identify existing network nodes
β Start node: node1
β Start node: node3
β Start node: node2
β Starting nodes
β Check network pod: node2 - status ACTIVE, attempt: 18/120
β Check network pod: node1 - status ACTIVE, attempt: 18/120
β Check network pod: node3 - status ACTIVE, attempt: 18/120
β Check all nodes are ACTIVE
β Check proxy for node: node1
β Check proxy for node: node2
β Check proxy for node: node3
β Check node proxies are ACTIVE
β Adding stake for node: node1
β Adding stake for node: node2
β Adding stake for node: node3
β Add node stakes
- Deploy mirror node
solo mirror-node deploy -n "${SOLO_NAMESPACE}"
- Example output
******************************* Solo *********************************************
Version : 0.33.0
Kubernetes Context : kind-solo
Kubernetes Cluster : kind-solo
Kubernetes Namespace : solo
**********************************************************************************
β Acquire lease - lease acquired successfully, attempt: 1/10
β Initialize
β Load remote config - remote config not found
β Prepare address book
β Deploy mirror-node
β Deploy hedera-explorer
β Enable mirror-node
β Check Hedera Explorer
β Check Postgres DB
β Check REST API
β Check GRPC
β Check Importer
β Check Monitor
β Check pods are ready
β Insert data in public.file_data
β Seed DB data
- Deploy a JSON RPC relay
solo relay deploy -i node1 -n "${SOLO_NAMESPACE}"
- Example output
******************************* Solo *********************************************
Version : 0.33.0
Kubernetes Context : kind-solo
Kubernetes Cluster : kind-solo
Kubernetes Namespace : solo
**********************************************************************************
β Acquire lease - lease acquired successfully, attempt: 1/10
β Initialize
β Load remote config - remote config not found
β Prepare chart values
β Deploy JSON RPC Relay
β Check relay is ready
You may view the list of pods using k9s
as below:
Context: kind-solo <0> all <a> Attach <ctr⦠____ __.________
Cluster: kind-solo <ctrl-d> Delete <l> | |/ _/ __ \______
User: kind-solo <d> Describe <p> | < \____ / ___/
K9s Rev: v0.32.5 <e> Edit <shif| | \ / /\___ \
K8s Rev: v1.27.3 <?> Help <z> |____|__ \ /____//____ >
CPU: n/a <shift-j> Jump Owner <s> \/ \/
MEM: n/a
ββββββββββββββββββββββββββββββββββββββββββββββββββ Pods(all)[31] ββββββββββββββββββββββββββββββββββββββββββββββββββ
β NAMESPACEβ NAME PF READY STATUS RESTARTS I β
β kube-system coredns-5d78c9869d-994t4 β 1/1 Running 0 1 β
β kube-system coredns-5d78c9869d-vgt4q β 1/1 Running 0 1 β
β kube-system etcd-solo-control-plane β 1/1 Running 0 1 β
β kube-system kindnet-q26c9 β 1/1 Running 0 1 β
β kube-system kube-apiserver-solo-control-plane β 1/1 Running 0 1 β
β kube-system kube-controller-manager-solo-control-plane β 1/1 Running 0 1 β
β kube-system kube-proxy-9b27j β 1/1 Running 0 1 β
β kube-system kube-scheduler-solo-control-plane β 1/1 Running 0 1 β
β local-path-storage local-path-provisioner-6bc4bddd6b-4mv8c β 1/1 Running 0 1 β
β solo envoy-proxy-node1-65f8879dcc-rwg97 β 1/1 Running 0 1 β
β solo envoy-proxy-node2-667f848689-628cx β 1/1 Running 0 1 β
β solo envoy-proxy-node3-6bb4b4cbdf-dmwtr β 1/1 Running 0 1 β
β solo solo-deployment-grpc-75bb9c6c55-l7kvt β 1/1 Running 0 1 β
β solo solo-deployment-hedera-explorer-6565ccb4cb-9dbw2 β 1/1 Running 0 1 β
β solo solo-deployment-importer-dd74fd466-vs4mb β 1/1 Running 0 1 β
β solo solo-deployment-monitor-54b8f57db9-fn5qq β 1/1 Running 0 1 β
β solo solo-deployment-postgres-postgresql-0 β 1/1 Running 0 1 β
β solo solo-deployment-redis-node-0 β 2/2 Running 0 1 β
β solo solo-deployment-rest-6d48f8dbfc-plbp2 β 1/1 Running 0 1 β
β solo solo-deployment-restjava-5d6c4cb648-r597f β 1/1 Running 0 1 β
β solo solo-deployment-web3-55fdfbc7f7-lzhfl β 1/1 Running 0 1 β
β solo haproxy-node1-785b9b6f9b-676mr β 1/1 Running 1 1 β
β solo haproxy-node2-644b8c76d-v9mg6 β 1/1 Running 1 1 β
β solo haproxy-node3-fbffdb64-272t2 β 1/1 Running 1 1 β
β solo minio-pool-1-0 β 2/2 Running 1 1 β
β solo network-node1-0 β 5/5 Running 2 1 β
β solo network-node2-0 β 5/5 Running 2 1 β
β solo network-node3-0 β 5/5 Running 2 1 β
β solo relay-node1-node2-node3-hedera-json-rpc-relay-ddd4c8d8b-hdlpb β 1/1 Running 0 1 β
β solo-cluster console-557956d575-c5qp7 β 1/1 Running 0 1 β
β solo-cluster minio-operator-7d575c5f84-xdwwz β 1/1 Running 0 1 β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ