Firebird/GettingStarted: Difference between revisions

From stonehomewiki
Jump to navigationJump to search
No edit summary
 
(27 intermediate revisions by the same user not shown)
Line 1: Line 1:
<p> [[Firebird]] </p>
= Setup Firebird Kubernete Cluster =
<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="mw-collapsible-preview">Preparation</div>
<div class="mw-collapsible-preview">Brief</div>
<div class="mw-collapsible-content">
<div class="mw-collapsible-content">
* Assuming you are using a linux based machine. (I am using a Ubuntu 22.04)
This section talks about how to setup firebird environment. Files references could be found at [https://github.com/stonezhong/firebird/tree/master/examples/getting-started https://github.com/stonezhong/firebird/tree/master/examples/getting-started]
* Assuming you can ssh to this machine with a private ssh key
 
* Create a docker network called "streaming"
* Assuming you have a kubernete cluster already created. In this example, we are using Kubernete provided by Oracle Cloud Infrastructure (aka OKE).
* Assuming you have a machine with kubectl installed, from which you can control the kubernete cluster
</div>
</div>
<p></p>


<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="mw-collapsible-preview">Create kubernete namespace: firebird</div>
<div class="mw-collapsible-content">
* We are going to deploy in this namespace
* [https://github.com/stonezhong/firebird/blob/master/examples/getting-started/namespace.yaml namespace.yaml]
<pre><nowiki>
<pre><nowiki>
docker network create -d bridge streaming
kubectl apply -f namespace.yaml
# Then check it, you should see firebird as namespace
kubectl get namespaces
 
# Then you can set firebird as your currrent namespace
kubectl config set-context --current --namespace=firebird
</nowiki></pre>
</nowiki></pre>
</div>
</div>
Line 14: Line 31:


<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="mw-collapsible-preview">Step 1: checkout the example</div>
<div class="mw-collapsible-preview">Setup rabbitmq and zookeeper</div>
<div class="mw-collapsible-content">
<div class="mw-collapsible-content">
* [https://github.com/stonezhong/firebird/blob/master/examples/getting-started/rabbitmq.yaml rabbitmq.yaml]
* [https://github.com/stonezhong/firebird/blob/master/examples/getting-started/zookeeper.yaml zookeeper.yaml]
<pre><nowiki>
<pre><nowiki>
git clone https://github.com/stonezhong/firebird.git
# the rabbitmq.yaml has specified the admin username and password
 
cd infra
# then enters the example home directory
kubectl apply -f rabbitmq.yaml
cd firebird/examples/getting-started/
kubectl apply -f zookeeper.yaml
</nowiki></pre>
</nowiki></pre>
</div>
</div>
Line 27: Line 46:


<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="mw-collapsible-preview">Step 2: customize your ssh config</div>
<div class="mw-collapsible-preview">Setup firebird web console: create database</div>
<div class="mw-collapsible-content">
<div class="mw-collapsible-content">
You need to edit app/ssh_config/config and app/ssh_config/keys/devbox
Although you can create a MySQL instance in your kubernetes cluster, it is easier to create a MySQL instance if you are using a cloud provider, such as AWS, GCP, etc.
<pre><nowiki>
# assuming you have a MySQL 8.x installed
 
# create database user stonezhong
CREATE USER 'stonezhong'@'%' IDENTIFIED WITH mysql_native_password BY 'dbpassword';
 
# connect to mysql instance (e.g. using MySQL workbench)
CREATE SCHEMA `firebird` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
 
# give stonezhong full access to this db
GRANT ALL ON `firebird`.* TO 'stonezhong'@'%';
</nowiki></pre>
</div>
</div>
</div>
</div>
Line 35: Line 66:


<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="mw-collapsible-preview">Step 3: start zookeeper and rabbitmq</div>
<div class="mw-collapsible-preview">Setup firebird web console: build docker image</div>
<div class="mw-collapsible-content">
<div class="mw-collapsible-content">
* [https://github.com/stonezhong/firebird/tree/master/examples/getting-started/console github]
<pre><nowiki>
<pre><nowiki>
docker-compose -f infra/docker-compose.yaml up -d
cd console
docker build -t firebird-console .
# now push this image to your private repo
docker tag firebird-console iad.ocir.io/idrnu3akjpv5/firebird-console
docker push iad.ocir.io/idrnu3akjpv5/firebird-console
</nowiki></pre>
</nowiki></pre>
</div>
</div>
Line 45: Line 81:


<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="mw-collapsible-preview">Step 4: build docker image for your streaming application</div>
<div class="mw-collapsible-preview">Create Secrets</div>
<div class="mw-collapsible-content">
<div class="mw-collapsible-content">
<pre><nowiki>
<pre><nowiki>
# Build docker image for the streaming application
kubectl create secret generic \
docker-compose -f app/docker-compose.yaml build
    firebird \
    --from-file=app_config.json=secrets/app_config.json \
    --from-file=kube_config=secrets/kube_config \
    --from-file=oci_config=secrets/oci_config \
    --from-file=oci_api_key.pem=secrets/oci_api_key.pem
</nowiki></pre>


# start the console container
* <code>secrets/app_config.json</code>, it contains information about zookeeper, rabbitmq and mysql
docker-compose -f app/docker-compose.yaml up -d
<pre><nowiki>
{
    "zookeeper": {
        "hosts": "zookeeper:2181"
    },
    "rabbitmq": {
        "username": "stonezhong",
        "password": "changeme",
        "host": "rabbitmq",
        "port": 5672,
        "heartbeat": 300
    },
    "mysql": {
        "db_name": "firebird",
        "username": "stonezhong",
        "password": "foobar",
        "server": "10.2.0.29"
    }
}
</nowiki></pre>
</nowiki></pre>
* <code>secrets/kube_config</code>: this is your kubernete config file, usually you can copy it from ~/.kube/config from machine which you run kubectl
* <code>secrets/oci_config</code> and <code>secrets/oci_api_key.pem</code> are your OCI configs. (this demo is about using firebird on Oracle Cloud Infracture)
</div>
</div>
</div>
</div>
Line 59: Line 121:


<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="mw-collapsible-preview">step 5: register your pipeline</div>
<div class="mw-collapsible-preview">Setup firebird web console: iniialize database</div>
<div class="mw-collapsible-content">
<div class="mw-collapsible-content">
<pre><nowiki>
<pre><nowiki>
# Before we can use any pipeline, we need to register the pipeline with the system
kubectl run myshell --rm -it --image iad.ocir.io/idrnu3akjpv5/firebird-console:latest -- sh
# A pipeline module is a python module which implements function get_pipeline(..) which returns a pipeline
fbconsole migrate
# see app/src/pipe.py, since we use pipe.py, so the pipeline module name is "pipe"
docker exec -it console pipeline register -pmn pipe
</nowiki></pre>
</nowiki></pre>
</div>
</div>
Line 72: Line 132:


<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="mw-collapsible-preview">step 7: list pipelines</div>
<div class="mw-collapsible-preview">Deploy firebird web console</div>
<div class="mw-collapsible-content">
<div class="mw-collapsible-content">
<pre><nowiki>
<pre><nowiki>
docker exec -it console pipeline list
cd console
kubectl apply -f console.yaml
# once deployment is done, you can try to access it
curl http://<service-external-ip>/
# and make sure you see the page, you can latter create a ssh tunnel to access the Firebird Web Console.
</nowiki></pre>
</div>
</div>
<p></p>


test:
= Deployment Sample Streaming Application =
    module: pipe
<div class="toccolours mw-collapsible mw-collapsed expandable">
    executors: None
<div class="mw-collapsible-preview">Streaming app: build image</div>
<div class="mw-collapsible-content">
<pre><nowiki>
cd app
docker build -t firebird-app1 .
# now push this image to your private repo
docker tag firebird-app1 iad.ocir.io/idrnu3akjpv5/firebird-app1
docker push iad.ocir.io/idrnu3akjpv5/firebird-app1
</nowiki></pre>
</nowiki></pre>
* Now you can see pipeline "test" has been registered, the id is returned from <code>app/src/pipe.py</code>
</div>
</div>
</div>
</div>
Line 87: Line 161:


<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="mw-collapsible-preview">step 8: execute pipeline</div>
<div class="mw-collapsible-preview">Streaming app: register your pipeline</div>
<div class="mw-collapsible-content">
<div class="mw-collapsible-content">
<pre><nowiki>
<pre><nowiki>
# We are executing "test", using docker host "devbox", and let the container name be "foo"
# Before we can use any pipeline, we need to register the pipeline with the system
docker exec -it console pipeline execute -pid test -dhn devbox -dcn foo
# A pipeline module is a python module which implements function get_pipeline(..) which returns a pipeline
 
# see app/src/pipe.py, since we use pipe.py, so the pipeline module name is "pipe"
# once it is done, you can
docker ps # you can see the container with name "foo"


# check the logs
kubectl run myshell --rm -it --image iad.ocir.io/idrnu3akjpv5/firebird-app1 -- sh
docker logs -f foo
pipeline register \
 
    --pipeline-module-name pipe \
# you can also list pipelines
    --pipeline-namespace-name firebird \
docker exec -it console pipeline list
    --pipeline-image-name iad.ocir.io/idrnu3akjpv5/firebird-app1


# now you can list pipeline to make sure it is registered
/usr/src/app # pipeline list
test:
test:
     module: pipe
    namespace: firebird
     executors:
    image    : iad.ocir.io/idrnu3akjpv5/firebird-app1
         58a6fb38-1bf7-4c77-8f08-377c3162a101:
     module   : pipe
            docker_host_name      = devbox
     running  : No
            docker_container_name = foo
    Kubernetes
            worker_count          = 1
         618a0014-f9fb-475c-9d3f-840dc80d7821: src
            start_time            = 2023-05-04 02:01:27
        c3cbcea2-0936-4f80-9635-41fc7d49650e: puller
            pid                  = 1
    executors: None
</nowiki></pre>
</div>
</div>
<p></p>


# You can see one executor has been registered.
<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="mw-collapsible-preview">Streaming app: start pipeline</div>
<div class="mw-collapsible-content">
<pre><nowiki>
kubectl run myshell --rm -it --image iad.ocir.io/idrnu3akjpv5/firebird-console -- sh
# or
# kubectl exec -it <console_pod_name> -- sh
pipeline start -pid test
</nowiki></pre>
</nowiki></pre>
</div>
</div>
Line 119: Line 204:


<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="toccolours mw-collapsible mw-collapsed expandable">
<div class="mw-collapsible-preview">step 9: stop an executor</div>
<div class="mw-collapsible-preview">Streaming app: stop pipeline</div>
<div class="mw-collapsible-content">
<div class="mw-collapsible-content">
<pre><nowiki>
<pre><nowiki>
# if we want to stop an executor, we can do
kubectl run myshell --rm -it --image iad.ocir.io/idrnu3akjpv5/firebird-console -- sh
docker exec -it console pipeline stop -pid test -eid 58a6fb38-1bf7-4c77-8f08-377c3162a101
# or
# This command just send a signal to the executor so it will quit after proper cleanup.
# kubectl exec -it <console_pod_name> -- sh
# after a while, you can list the pipe again you will see the executor is gone:
pipeline stop -pid test
 
docker exec -it console pipeline list
test:
    module: pipe
    executors: None
</nowiki></pre>
</nowiki></pre>
</div>
</div>
</div>
</div>
<p></p>
<p></p>

Latest revision as of 10:31, 15 September 2023

Firebird

Setup Firebird Kubernete Cluster

Deployment Sample Streaming Application