Work With Kubernetes ==================== The VDA can be configured as the kubernetes `persistent volume `_ via `CSI interface `_. This guide creates a minimal kubernetes cluster via minikube, and creates a minimal vda cluster, then let the kubernetes cluster claim persistent volume(s) from the vda cluster. Below are the components we will deploy: .. image:: /images/vda_and_minikube.png As a demo, We deploay both the kubernetes cluster and the vda compoents to the same server. Install all dependencies ------------------------ Install minikube ^^^^^^^^^^^^^^^^ As a demo, we deploy a minimal kuberenetes cluster via minikube. According to the `minikube installation guide `_ You should run below commands on a linux server:: curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube Prepare the dependencies of minikube none driver ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The minikube support `multiple drivers `_ to launch kuberenetes. The vda csi plugin in kuberentes need to access the /dev and /sys of the host. Here we use the minikube none driver because the other minikube drivers require additional steps to transport the /dev and /sys to the vda csi plugin. Please refer the `official doc `_ about the dependencies of none drivers. The installation steps are OS dependent. Below steps are tested on ubuntu22.04 and rocky linux 8, and they should work on other linux systems too. * Follow the `docker installation guide `_ to install docker engine. Please choose the ``Platform`` according to your OS. * Manage docker as a non-root user and configure Docker to start on boot according to the `post installation guide `_. * Disable selinux. You may run the ``getenforce`` command from command line. If the output is ``enforcing``, you should disable selinux. If your system doesn't have such a command, the selinux probably is not enabled, you may ignore this step. To disable selinux, please edit the ``/etc/selinux/config`` file, change ``SELINUX=enforcing`` to ``SELINUX=permissive``, then reboot the system. * Install cri-tools. Open the `cri-tools release page `_, download the released package according to your OS, then uncompress the package and run the install script, e.g.:: curl -L -O https://github.com/cri-o/cri-o/releases/download/v1.25.0/cri-o.amd64.v1.25.0.tar.gz tar xvf cri-o.amd64.v1.25.0.tar.gz cd cri-o sudo ./install * The crictl will be install to ``/usr/local/bin``. The minikube will invoke it over the ``sudo`` command. Please run ``sudo visudo`` and make sure the ``/usr/local/bin`` is in the ``secure_path``. If no, please add it to the ``secure_path``, e.g.:: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin * Install cri-dockerd. Open the `cri-dockerd release page `_, download the package according to your OS and install it. E.g.:: # rocky linux 8: curl -L -O https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.5/cri-dockerd-0.2.5-3.el8.x86_64.rpm sudo rpm -i cri-dockerd-0.2.5-3.el8.x86_64.rpm # ubuntu22.04: curl -L -O https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.5/cri-dockerd_0.2.5.3-0.ubuntu-jammy_amd64.deb sudo dpkg -i cri-dockerd_0.2.5.3-0.ubuntu-jammy_amd64.deb * Install conntrack. The package name might be different in different OS:: sudo dnf install -y conntrack-tools # rocky linux 8 sudo apt-get install -y conntrack # ubuntu22.04 Prepare the vda csi plugin dependencies ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ On each `kubernetes node `_ we should install the nvme-cli and load nvme-tcp kernel module:: sudo dnf install -y nvme-cli # rocky linux 8 sudo apt install -y nvme-cli # ubuntu22.04 Download etcd ^^^^^^^^^^^^^ Run below commands:: curl -L -O https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz tar xvf etcd-v3.5.0-linux-amd64.tar.gz Download vda ^^^^^^^^^^^^ Run below commands:: curl -L -O https://github.com/virtual-disk-array/vda/releases/download/v0.2.1/vda_linux_amd64_v0.2.1.tar.gz tar xvf vda_linux_amd64_v0.2.1.tar.gz Launch services --------------- Reboot system ^^^^^^^^^^^^^ The VDA dataplane code need hugepage. If the system has too many memory fragments, the hugepage initialization may fail. To avoid memory fragments, please reboot the system before we launch any services:: sudo reboot Load nvme-tcp ^^^^^^^^^^^^^ Make sure the nvme-tcp kernel module is loaded:: sudo modprobe nvme-tcp Launch VDA ^^^^^^^^^^ The steps are similar as the :ref:`Minimal Deployment `. * Create a work directory:: mkdir -p /tmp/vda_data * Launch etcd:: etcd-v3.5.0-linux-amd64/etcd --listen-client-urls http://localhost:2389 \ --advertise-client-urls http://localhost:2389 \ --listen-peer-urls http://localhost:2390 \ --name etcd0 --data-dir /tmp/vda_data/etcd0.data \ > /tmp/vda_data/etcd0.log 2>&1 & * Go to the vda directory:: cd vda_linux_amd64_v0.2.1 * Prepare SPDK environment:: sudo ./spdk/scripts/setup.sh * Launch DN dataplane:: sudo ./vda_dataplane --config ./dataplane_config.json \ --rpc-socket /tmp/vda_data/dn.sock > /tmp/vda_data/dn.log 2>&1 & * Change the ower of dn.sock:: sudo chown $(id -u):$(id -g) /tmp/vda_data/dn.sock * Launch DN controplane:: ./vda_dn_agent --network tcp --address '127.0.0.1:9720' \ --sock-path /tmp/vda_data/dn.sock --sock-timeout 10 \ --lis-conf '{"trtype":"tcp","traddr":"127.0.0.1","adrfam":"ipv4","trsvcid":"4420"}' \ --tr-conf '{"trtype":"TCP"}' \ > /tmp/vda_data/dn_agent.log 2>&1 & * Launch CN dataplane:: sudo ./vda_dataplane --config ./dataplane_config.json \ --rpc-socket /tmp/vda_data/cn.sock > /tmp/vda_data/cn.log 2>&1 & * Change the ower of cn.sock,:: sudo chown $(id -u):$(id -g) /tmp/vda_data/cn.sock * Launch CN controlplane:: ./vda_cn_agent --network tcp --address '127.0.0.1:9820' \ --sock-path /tmp/vda_data/cn.sock --sock-timeout 10 \ --lis-conf '{"trtype":"tcp","traddr":"127.0.0.1","adrfam":"ipv4","trsvcid":"4430"}' \ --tr-conf '{"trtype":"TCP"}' \ > /tmp/vda_data/cn_agent.log 2>&1 & * Launch portal:: ./vda_portal --portal-address '127.0.0.1:9520' --portal-network tcp \ --etcd-endpoints localhost:2389 \ > /tmp/vda_data/portal.log 2>&1 & * Launch monitor:: ./vda_monitor --etcd-endpoints localhost:2389 \ > /tmp/vda_data/monitor.log 2>&1 & * Create DN:: ./vda_cli dn create --sock-addr localhost:9720 \ --tr-type tcp --tr-addr 127.0.0.1 --adr-fam ipv4 --tr-svc-id 4420 * Create PD:: ./vda_cli pd create --sock-addr localhost:9720 --pd-name pd0 \ --bdev-type-key malloc --bdev-type-value 256 * Create CN:: ./vda_cli cn create --sock-addr localhost:9820 \ --tr-type tcp --tr-addr 127.0.0.1 --adr-fam ipv4 --tr-svc-id 4430 That's all. We won't create DAs and EXPs manually here. The kubernetes will create them on demand. Launch kubernetes cluster ^^^^^^^^^^^^^^^^^^^^^^^^^ Run below command:: minikube start --driver=none Run below command to check all kubernentes components are available:: minikube kubectl -- get pods -A The result should be:: NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-6d4b75cb6d-s65dv 1/1 Running 0 5s kube-system etcd-ubuntu2204b 1/1 Running 0 18s kube-system kube-apiserver-ubuntu2204b 1/1 Running 0 20s kube-system kube-controller-manager-ubuntu2204b 1/1 Running 0 20s kube-system kube-proxy-mvw4k 1/1 Running 0 6s kube-system kube-scheduler-ubuntu2204b 1/1 Running 0 18s kube-system storage-provisioner 1/1 Running 0 17s You may wait several minutes or a longer time for all components are ready. Create CSI sidecars ^^^^^^^^^^^^^^^^^^^ Make sure you are in the ``vda_linux_amd64_v0.2.1`` directory, then apply below resources to kubernetes:: minikube kubectl -- apply -f csi_sample/controller-rbac.yaml minikube kubectl -- apply -f csi_sample/controller.yaml minikube kubectl -- apply -f csi_sample/node-rbac.yaml minikube kubectl -- apply -f csi_sample/node.yaml minikube kubectl -- apply -f csi_sample/storageclass.yaml Get the status of the controller and node:: minikube kubectl -- get pods Make sure the ``READY`` of controller and node become ``3/3`` and ``2/2``:: NAME READY STATUS RESTARTS AGE vdacsi-controller-0 3/3 Running 0 17s vdacsi-node-rng9x 2/2 Running 0 17s Create testing pod ^^^^^^^^^^^^^^^^^^ Make sure you are in the ``vda_linux_amd64_v0.2.1`` directory, then apply the PVC file :: minikube kubectl -- apply -f csi_sample/testpvc.yaml List all the DAs:: ./vda_cli da list We can find that a DA is created:: { "reply_info": { "req_id": "152fd621-5ad5-4d50-a6af-1b1ce6e35b6e", "reply_msg": "succeed" }, "token": "L3ZkYS9saXN0L2RhL3B2Yy1mOWQ4Mzg5MC1iNGNhLTQwNTItOTk4Yy0zZTgxMjBjMjBlZjY=", "da_summary_list": [ { "da_name": "pvc-f9d83890-b4ca-4052-998c-3e8120c20ef6", "description": "csi created volume" } ] } Apply the Pod file :: minikube kubectl -- apply -f csi_sample/testpod.yaml Wait for a while, run below command to get the status of the testpod:: minikube kubectl -- get pods vdacsi-test You would get similar output as below:: NAME READY STATUS RESTARTS AGE vdacsi-test 1/1 Running 0 55s List the EXPs of the DA:: ./vda_cli exp list --da-name pvc-f9d83890-b4ca-4052-998c-3e8120c20ef6 We can find there is an EXP in that DA:: { "reply_info": { "req_id": "4a8c60d5-3f26-4d09-8b43-26118e537683", "reply_msg": "succeed" }, "exp_summary_list": [ { "exp_name": "ubuntu2204b" } ] } Log in to the pod:: minikube kubectl -- exec --stdin --tty vdacsi-test -- /bin/sh The DA is mounted to /vdavol, we run the ``ls`` command, we can find it is an empty directory:: ls /vdavol Create a file in the /vdavol directory:: touch /vdavol/foo Exit the pod:: exit Now we delete the pod:: minikube kubectl -- delete pod vdacsi-test Then create the pod again:: minikube kubectl -- apply -f csi_sample/testpod.yaml Run below command to check the pod status and wail until the pod is ready:: minikube kubectl -- get pods vdacsi-test Log in to the pod again:: minikube kubectl -- exec --stdin --tty vdacsi-test -- /bin/sh We can find the file /vdavol/foo exists:: ls /vdavol/foo Exit the pod:: exit Cleanup ------- Cleanup the kubernetes cluster ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Delete test pod and test PVC:: minikube kubectl -- delete pod vdacsi-test minikube kubectl -- delete pvc vdacsi-pvc * Delete the kubernentes cluster:: minikube stop minikube delete Cleanup the VDA cluster ^^^^^^^^^^^^^^^^^^^^^^^ * Kill all the processes:: killall vda_portal killall vda_monitor killall vda_dn_agent killall vda_cn_agent killall etcd ./spdk/scripts/rpc.py -s /tmp/vda_data/dn.sock spdk_kill_instance SIGTERM ./spdk/scripts/rpc.py -s /tmp/vda_data/cn.sock spdk_kill_instance SIGTERM * Delete the work directory:: rm -rf /tmp/vda_data