Links

Deploy Kusama Validator

Deploy Kusama Node

The following manifest describes Kusama node that syncs Kusama relay chain network: kusama, in archive mode pruning: false, and uses Parity Polkadot client:
By default, Validator nodes are in archive mode, but Kotal requires that node explicitly mark the node as archive node by setting pruning: false.
kusama.yaml
apiVersion: polkadot.kotal.io/v1alpha1
kind: Node
metadata:
name: kusama-node
spec:
network: kusama
pruning: false
Apply kusama.yaml manifest:
kubectl apply -f kusama.yaml
Kotal operator will notice your kusama-node and will create all the necessary pods, persistent volumes, services, configmaps, and secrets neccessary.
You can fetch the deployed Polkadot Node using:
kubectl get nodes.polkadot
It will return an output similar to the following:
NAME NETWORK VALIDATOR
kusama-node kusama fasle

Fetch Node Logs

Get the pods that has been created by Kotal for the node:
kubectl get pods
It will return an output similar to the following:
NAME READY STATUS RESTARTS AGE
kusama-node-0 1/1 Running 0 1m
Get the logs of the running node:
kubectl logs -f kusama-node-0
It will return node logs similar to the following:
2021-10-18 15:32:38 ----------------------------
2021-10-18 15:32:38 This chain is not in any way
2021-10-18 15:32:38 endorsed by the
2021-10-18 15:32:38 KUSAMA FOUNDATION
2021-10-18 15:32:38 ----------------------------
2021-10-18 15:32:38 Parity Polkadot
2021-10-18 15:32:38 ✌️ version 0.9.11-bfd38ed62-x86_64-linux-gnu
2021-10-18 15:32:38 ❤️ by Parity Technologies <[email protected]>, 2017-2021
2021-10-18 15:32:38 📋 Chain specification: Kusama
2021-10-18 15:32:38 🏷 Node name: validator-node-sample
2021-10-18 15:32:38 👤 Role: AUTHORITY
2021-10-18 15:32:38 💾 Database: RocksDb at /polkadot/kotal-data/chains/ksmcc3/db/full
2021-10-18 15:32:38 ⛓ Native runtime: kusama-9110 (parity-kusama-0.tx7.au2)
2021-10-18 15:32:38 🔨 Initializing Genesis block/state (state: 0xb000…ef6b, header-hash: 0xb0a8…dafe)
2021-10-18 15:32:38 👴 Loading GRANDPA authority set from genesis on what appears to be first startup.
2021-10-18 15:32:39 ⏱ Loaded block-time = 6s from block 0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe
2021-10-18 15:32:39 👶 Creating empty BABE epoch changes on what appears to be first startup.
2021-10-18 15:32:39 🏷 Local node identity is: 12D3KooWFEHU9FXqGCL6ify4rqcon31WYViCnUfA6aVYTjRXqJ5F
2021-10-18 15:32:39 📦 Highest known block at #0
2021-10-18 15:32:39 〽️ Prometheus exporter started at 0.0.0.0:9615
2021-10-18 15:32:39 Listening for new connections on 127.0.0.1:9944.
2021-10-18 15:32:39 👶 Starting BABE Authorship worker
...

Enable Validator

Once the node is fully synced, enable validator by updating the node with validator: true:
kusama.yaml
apiVersion: polkadot.kotal.io/v1alpha1
kind: Node
metadata:
name: kusama-node
spec:
network: kusama
pruning: false
validator: true
Apply the updated kusama.yaml Node manifest:
kubectl apply -f kusama.yaml
Fetch the deployed Polkadot Node using:
kubectl get nodes.polkadot
It will return an output similar to the following:
NAME NETWORK VALIDATOR
kusama-node kusama true
Note that validator has changed from false to true.

Remaining Steps

The remainig steps in setting up a validator are:
  • Bonding KSM
  • Generating Session Keys
  • Setting Session Keys by signing and submitting an extrinsic
  • Relax 🏝️
These steps are documented in Polkadot Wiki.
We will cover next how to generate a session key.

Generating Session Key

Validator nodes can't enable external HTTP or WS JSON-RPC servers.
Session key can be generated by calling author_rotateKeys JSON-RPC method.
Forward localhost:9933 calls to the node pod because rpcPort: 9933:
kubectl port-forward polkadot-node-0 9933
9933 is the default HTTP JSON-RPC server listening port, can be changed by setting node .spec.rpcPort
In another terminal window call author_rotateKeys JSON-RPC method to get a new session key:
curl -H "Content-Type: application/json" -d '{"id":1, "jsonrpc":"2.0", "method": "author_rotateKeys", "params":[]}' http://127.0.0.1:9933
You will get JSON result similar to the following:
{
"jsonrpc": "2.0",
"result": "0x159256d69a61b523a211d7845a92d5a238f6a97b53627c4aa92665eb6bc2959dc88c9c279ad01b8acf90573ca005f6565c4a0d88d19951740b8f8ec38c63b344b2c186e703ce88f0f4b628263265ffefa1cdc148c79a5608ccc7734e6a0bfb077076c5f370491331819d17884b9aa4e41d4e2bec774b5c31251203266c446a2ec02d89f5ecefcc75777d4de74766a57fbafe65b1850500875e8cf2fed3325f65",
"id": 1
}
You can set the sesison key as documented in Polkadot Wiki.
Finally you can delete the node by:
kubectl delete -f kusama.yaml
node.polkadot.kotal.io "kusama-node" deleted
Kubernetes garbage collector will delete all the resources that has been created by Kotal Polkadot Node controller.