Kubernetes
This document demonstrates a deployment of an EdgeLake node as a Kubernetes instance with Minikube and Helm. The deployment makes EdgeLake scripts persistent (using PersistentVolumeClaim). In a customer deployment, it is recommended to predefine the services for each Pod.
Requirements
- Kubernetes Cluster manager - deploy Minikube with Docker
- helm
- kubectl
- Hardware Requirements - based on official documentation
Requirements |
---|
2 GB or more RAM |
2 or more CPUs |
Network connectivity between machines in cluster |
Unique hostname / MAC address for every physical node |
Disable swap on machine |
Deploy EdgeLake
Steps to deploy an EdgeLake container using the deployment script
- Clone deployment-k8s
git clone https://github.com/EdgeLake/deployment-k8s
- Update Configurations - located in deploymnet-k8s//configurations
- (Optional) build helm package - The Github repository already has a Helm package for both the node and volume.
bash deploy_node.sh package deployment-k8s/configurations/edgelake_master.yaml
- Deploy Kubernetes volume and container for the EdgeLake Node - the deployment script enables port-forwarding with and optional specification of the IP that identifies the proxy. If an address is not set, then the port-forwarding is done against localhost (127.0.0.1).
bash deploy_node.sh start deployment-k8s/configurations/edgelake_master.yaml [--address={INTERNAL_IP}]
- (Optional) Stop deplyment and corresponding proxy process, this will not remove volumes
bash deploy_node.sh stop deployment-k8s/configurations/edgelake_master.yaml
Configuration file
Since Kubernetes containers use a unique internal IP with each deployment, we recommend setting the machine’s internal IP address as the overlay IP value in the configurations; otherwise a new EdgeLake policy will be declared when the EdgeLake node reboots.
The configuration is seprated into the 3 parts
metadata
- Kubernetes information such as component names and network service type (ClusterIP)image
- EdgeLake docker image informationnode_configs
- Environment variables used by EdgeLake. The environment variables are broken up into relevant sections
Sample Configuration file for Operator Node
metadata:
# Kubernetes Instance namespace
namespace: default
# hostname for deployment
hostname: edgelake-operator
# deployment application name / Name of the edgelake instance
app_name: edgelake-operator
service_name: edgelake-operator-service
# Configuration file mapping name
configmap_name: edgelake-operator-configmap
# Allows running Kubernetes remotely. If commented out, code will ignore it
node_selector: ""
service_type: ClusterIP
image:
# Image secret naming
secret_name: imagepullsecret
# (Docker Hub) Image Path
repository: anylogco/edgelake-network
# Image version
tag: latest
# Image pulling policy
pull_policy: IfNotPresent
node_configs:
general:
# Information regarding which edgelake node configurations to enable. By default, even if everything is disabled, edgelake starts TCP and REST connection protocols
NODE_TYPE: operator
# Name of the edgelake instance
NODE_NAME: edgelake-operator
# Owner of the edgelake instance
COMPANY_NAME: New Company
networking:
# Port address used by edgelake's TCP protocol to communicate with other nodes in the network
ANYLOG_SERVER_PORT: 32148
# Port address used by edgelake's REST protocol
ANYLOG_REST_PORT: 32149
# Port value to be used as an MQTT broker, or some other third-party broker
ANYLOG_BROKER_PORT: 32150
# Internal IP address of the machine the container is running on - if not set, then a unique IP will be used each time
OVERLAY_IP: ""
# A bool value that determines if to bind to a specific IP and Port (a false value binds to all IPs)
TCP_BIND: false
# A bool value that determines if to bind to a specific IP and Port (a false value binds to all IPs)
REST_BIND: false
# A bool value that determines if to bind to a specific IP and Port (a false value binds to all IPs)
BROKER_BIND: false
database:
# Physical database type (sqlite or psql)
DB_TYPE: sqlite
# Username for SQL database connection
DB_USER: ""
# Password correlated to database user
DB_PASSWD: ""
# Database IP address
DB_IP: 127.0.0.1
# Database port number
DB_PORT: 5432
# Whether to set autocommit data
AUTOCOMMIT: false
# Whether to enable NoSQL logical database
ENABLE_NOSQL: false
blockchain:
# TCP connection information for Master Node
LEDGER_CONN: 127.0.0.1:32048
operator:
# Owner of the cluster
CLUSTER_NAME: new-company-cluster1
# Logical database name
DEFAULT_DBMS: new_company
mqtt:
# Whether to enable the default MQTT process
ENABLE_MQTT: false
# IP address of MQTT broker
MQTT_BROKER: 139.144.46.246
# Port associated with MQTT broker
MQTT_PORT: 1883
# User associated with MQTT broker
MQTT_USER: edgelakeuser
# Password associated with MQTT user
MQTT_PASSWD: mqtt4edgelake!
# Whether to enable MQTT logging process
MQTT_LOG: false
# Topic to get data for
MSG_TOPIC: edgelake-demo
# Logical database name
MSG_DBMS: new_company
# Table where to store data
MSG_TABLE: bring [table]
# Timestamp column name
MSG_TIMESTAMP_COLUMN: now
# Value column name
MSG_VALUE_COLUMN: bring [value]
# Column value type
MSG_VALUE_COLUMN_TYPE: float
advanced:
# Whether to automatically run a local (or personalized) script at the end of the process
DEPLOY_LOCAL_SCRIPT: false
# Whether to monitor the node or not
MONITOR_NODES: false
Deployment Script Explained
The deploy_node.sh
script is a tool that allows to easily prepare and deploy a Kubernetes deployment based on user-defined configurations. The code has 3 basic options:
- package - Package both the EdgeLake deployment and volume helm charts
helm package edgelake-node helm package edgelake-node-volume
- start - Deploy the Helm chart based on user-defined configuration file, then set up Kubernetes port-forwarding. The script will wait for the deployment to finish before setting up port-forwarding.
- Install volume
helm install ./edgelake-node-volumes-0.0.0.tgz -f ${CONFIG_FILE} --name-template ${APP_NAME}-volume
- Install deployment
helm install ./edgelake-node-0.0.0.tgz -f ${CONFIG_FILE} --name-template ${APP_NAME}
- Declare port forwarding - the port(s) to open for port-forwarding depends on whether the port is trying to communicate with services outside the Kubernetes network. The deploy_node.sh script will open ports for the EdgeLake services: TCP, REST and Broker (if set).
# example without a specified IP address kubectl port-forward -n ${NAMESPACE} service/${SERVICE_NAME} ${ANYLOG_SERVER_PORT}:${ANYLOG_SERVER_PORT} > /dev/null 2>&1 &
# example with a specified IP address kubectl port-forward -n ${NAMESPACE} service/${SERVICE_NAME} ${ANYLOG_SERVER_PORT}:${ANYLOG_SERVER_PORT} --address=${INTERNAL_IP} > /dev/null 2>&1 &
- Install volume
- stop - Based on used-defined configurations, stop Kubernetes instance and kill port-forwarding process. It will not remove the Helm volumes used by Kubernetes.
helm delete ${APP_NAME} kill -15 `ps -ef | grep port-forward | grep ${ANYLOG_SERVER_PORT} | awk -F " " '{print $2}'`
To remove a Helm/Kubernetes volume simply run:
helm delete ${VOLUME_NAME}
Using Node
- Attach to EdgeLake CLI
# to detach ctrl-p-q kubectl attach -it pod/edgeLake-master-deployment-7b4ff75fb7-mnsxf
- Attach to the shell interface of the node
# to detach ctrl-p-q kubectl attach -it pod/edgeLake-master-deployment-7b4ff75fb7-mnsxf
- Sample Insert Data - Sample Python Code
curl -X PUT http://127.0.0.1:32149 \ -H "type: json" -H "dbms: new_company" \ -H "table: rand_data" \ -H "mode: streaming" \ -H "Content-Type: text/plain" \ -H "User-Agent: AnyLog/1.23" \ --data-raw "[{\"value\": 50, \"ts\": \"2019-10-14T17:22:13.051101Z\"}, {\"value\": 501, \"ts\": \"2019-10-14T17:22:13.050101Z\"}, {\"value\": 501, \"ts\": \"2019-10-14T17:22:13.050101Z\"}]"
- Check Node Status
curl -X GET http://127.0.0.1:32149
- Check data coming in
# data being processed curl -X GET http://127.0.0.1:32149 -H "command: get streaming" # validate data was stored curl -X GET http://127.0.0.1:32149 -H "command: get streaming"
- Query — notice the request is running against the query node via REST
curl -X GET http://127.0.0.1:32349 \ -H "command: sql new_company select * from rand_data;" -H "User-Agent: AnyLog/1.23" -H "destination: network"