Skip to content

Commit

Permalink
K8s deploy script (BFT-397) (#62)
Browse files Browse the repository at this point in the history
## What ❔

Deploy script for Kubernetes

## Why ❔

Test framework will require to deploy a number of nodes into a
Kubernetes cluster

---------

Co-authored-by: IAvecilla <[email protected]>
Co-authored-by: Nacho Avecilla <[email protected]>
Co-authored-by: Bruno França <[email protected]>
Co-authored-by: Grzegorz Prusak <[email protected]>
  • Loading branch information
5 people committed Feb 27, 2024
1 parent 842d4fd commit f03b302
Show file tree
Hide file tree
Showing 22 changed files with 1,490 additions and 140 deletions.
15 changes: 10 additions & 5 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,21 +1,26 @@
# Build Stage
FROM rust:latest as build
FROM rust:latest as builder
COPY /node/ /node/
COPY Makefile .
WORKDIR /node
RUN apt-get update && apt-get install -y libclang-dev
RUN cargo build --release
RUN cd .. && make docker_node_configs

# Binary copy stage
FROM scratch as binary
COPY --from=builder /node/target/release/executor .

# Runtime Stage
FROM debian:stable-slim as runtime

COPY --from=build /node/target/release/executor /node/
COPY --from=build /node/tools/docker-config/nodes-config /node/
COPY /node/tools/docker_binaries/executor /node/
COPY /node/tools/k8s_configs/ /node/k8s_config
COPY /node/tools/docker-config/ /node/docker_config
COPY docker-entrypoint.sh /node/
COPY k8s_entrypoint.sh /node/

WORKDIR /node
RUN chmod +x docker-entrypoint.sh
RUN chmod +x k8s_entrypoint.sh

ENTRYPOINT ["./docker-entrypoint.sh"]

Expand Down
58 changes: 45 additions & 13 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,44 +1,76 @@
.PHONY: node nodes_config docker_node_configs node_docker consensus_docker_example clean clean_docker
IP?=127.0.0.1:3054
.PHONY: node nodes_config docker_nodes_config node_docker consensus_docker_example clean clean_docker addresses_file blank_configs
NODE?=0
DOCKER_IP=172.12.0.10
EXECUTABLE_NODE_DIR=node/tools
NODES=4
SEED_NODES=1

# Locally run commands

node:
export RUST_LOG=INFO && cd ${EXECUTABLE_NODE_DIR}/nodes-config/${IP} && cargo run -- --database ../../database/${IP}
export RUST_LOG=INFO && cd ${EXECUTABLE_NODE_DIR}/nodes-config/node_${NODE} && cargo run -- --database ../../database/node_${NODE}

nodes_config:
cd ${EXECUTABLE_NODE_DIR} && cargo run --bin localnet_config -- --input-addrs addresses.txt --output-dir nodes-config

# Docker commands

# This command will run inside the Dockerfile and it's not necessary to use it outside there.
docker_node_configs:
cd ${EXECUTABLE_NODE_DIR} && cargo run --release --bin localnet_config -- --input-addrs docker-config/addresses.txt --output-dir docker-config/nodes-config
docker_build_executor:
docker build --output=node/tools/docker_binaries --target=binary .

node_docker:
mkdir -p ${EXECUTABLE_NODE_DIR}/docker-config
cd ${EXECUTABLE_NODE_DIR}/docker-config && rm -rf addresses.txt && echo ${DOCKER_IP}:3054 >> addresses.txt
docker-compose up -d node-1
docker_node_image:
docker build -t consensus-node --target=runtime .

docker_nodes_config:
cd ${EXECUTABLE_NODE_DIR} && cargo run --release --bin localnet_config -- --input-addrs docker-config/addresses.txt --output-dir docker-config

docker_node:
$(MAKE) docker_node_image
docker run -d --name consensus-node-${NODE} --env NODE_ID="consensus-node-${NODE}" consensus-node

consensus_docker_example:
mkdir -p ${EXECUTABLE_NODE_DIR}/docker-config
cd ${EXECUTABLE_NODE_DIR}/docker-config && rm -rf addresses.txt && touch addresses.txt && echo 172.12.0.10:3054 >> addresses.txt && echo 172.12.0.11:3054 >> addresses.txt
cd ${EXECUTABLE_NODE_DIR}/docker-config && rm -rf addresses.txt && echo 172.12.0.10:3054 >> addresses.txt && echo 172.12.0.11:3054 >> addresses.txt
$(MAKE) docker_nodes_config
$(MAKE) docker_node_image
docker-compose up -d

stop_docker_nodes:
docker stop consensus-node-1 consensus-node-2

start_k8s_nodes:
cd ${EXECUTABLE_NODE_DIR} && cargo run --release --bin deployer generate-config --nodes ${NODES}
$(MAKE) docker_node_image
minikube image load consensus-node:latest
cd ${EXECUTABLE_NODE_DIR} && cargo run --release --bin deployer deploy --nodes ${NODES} --seed-nodes ${SEED_NODES}

# Clean commands

clean: clean_docker
clean: clean_docker clean_k8s
rm -rf ${EXECUTABLE_NODE_DIR}/nodes-config
rm -rf ${EXECUTABLE_NODE_DIR}/database

clean_k8s:
rm -rf ${EXECUTABLE_NODE_DIR}/k8s_configs
kubectl delete deployments --all
kubectl delete pods --all

clean_docker:
rm -rf ${EXECUTABLE_NODE_DIR}/docker-config
docker rm -f consensus-node-1
docker rm -f consensus-node-2
docker network rm -f node-net
docker image rm -f consensus-node

addresses_file:
mkdir -p ${EXECUTABLE_NODE_DIR}/docker-config
cd ${EXECUTABLE_NODE_DIR}/docker-config && \
rm -rf addresses.txt && \
touch addresses.txt && \
for n in $$(seq 0 $$((${NODES} - 1))); do echo 0.0.0.$$n:3054 >> addresses.txt; done

blank_configs: addresses_file docker_node_configs
for n in $$(seq 0 $$((${NODES} - 1))); do \
jq '.publicAddr = "0.0.0.0:3054"' node/tools/docker-config/nodes-config/node_$$n/config.json | \
jq '.gossipStaticOutbound = "[]"' > node/tools/docker-config/nodes-config/node_$$n/config.tmp && \
mv -f node/tools/docker-config/nodes-config/node_$$n/config.tmp node/tools/docker-config/nodes-config/node_$$n/config.json; \
done
4 changes: 3 additions & 1 deletion compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ version: "3.9"

services:
node-1:
build: .
build:
context: .
target: runtime
image: consensus-node
container_name: consensus-node-1
ports:
Expand Down
4 changes: 2 additions & 2 deletions docker-entrypoint.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/bin/bash
# This file works as an entrypoint of the docker container running the node binary copied inside of it.

cd $(hostname -i):3054
cd docker_config/${NODE_ID}
export RUST_LOG=INFO
../executor
../../executor $@
5 changes: 0 additions & 5 deletions entrypoint.sh

This file was deleted.

6 changes: 6 additions & 0 deletions k8s_entrypoint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/bin/bash
# This file works as an entrypoint of the kubernetes cluster running the node binary copied inside of it.

cd k8s_config/${NODE_ID}
export RUST_LOG=INFO
../../executor $@
Loading

0 comments on commit f03b302

Please sign in to comment.