25. Deployment with kubernetes and K3S¶
NOTE This is now a little out of date and is superceeded by using KIND and the starling CLI. Please see that for local testing while this is being updated.
25.1 Contents¶
This system is intended to run as a cloud platform. We utilse k3s as our kubernetes manager.
Key concepts are as follows: - pods are a k8 concept. A pod contains one or more containers and has its own ip address. Containers within a pod communicate over localhost - node is the machine (physical e.g. pi or virtual machine) upon which pods are run. (Separate from 'ros2 nodes' or 'ros nodes') - kubectl is the command line program required to interface with kubernetes. - cni container networking interface (default is flannel for k3s) is the underlying networking for all containers - dds/ fast-rtps Is the default communications middleware for ros2 comms.
Refer to the kubernetes notes with the onenote notebook for more usage information.
25.2 Quick Reference to files:¶
The .yaml files in this directory are all kubernetes configurations for various combinations of systems. The cpu architecture refers to where the containers have been specified to run - amd64 specifies for running on master machine, and arm64 specifies for running on the raspberry pi node over the network (see below for setup). All of these config files pull their images from the uobflightlabstarling docker hub.
25.2.1 Files¶
- k8.gazebo-iris.amd64.yaml :- Currently runs the
starling-sim-iris
image and a Service which exposes the gzweb statically onlocalhost:8080
. This service has a cluster internal hostname ofsim-gazebo.gazebo-srv
- k8.px4-sitl.amd64.yaml :- Currently runs a pod containing two containers
starling-sim-px4-sitl
- emulating px4-sitl. Talks to GCS software on port 14550 with replies on 18570.starling-mavros
- contains a ROS2 mavros node connected via udp://localhost:14540 to sitl. Talks to GCS on udp broadcast port 14553.
- k8.ap-sitl.amd64.yaml :- [Needs updating]Currently runs a pod containing two containers
starling-ardupilot-sitl
- emulating ardupilot-sitl. Talks to GCS over 14553 as well.starling-mavros
- contains a ROS2 mavros node connected via tcp://localhost:5762 to sitl. Talks to GCS on udp broadcast port 14553.
- k8.mavros.arm64.yaml :- A mavros node designed to run on the raspberry pi/ drone control computer. This pod contains a single
starling-mavros
container. It reads of a px4 pixhawk assumed to be talking over usb serial connection/dev/px4fmu
(set up via udev symlinks). Currently assumes mavlink sysid is 1. - k8.ros_monitor.amd64.yaml :- runs
starling-mavros
and a network-tools container. Can be used for debugging ROS2 and networking issues
25.2.2 Using files¶
Once k3s has been installed (see below, or run ./run_k3s.sh
in the home directory), these configurations can be used in the cluster as follows:
# Applying/ Creating them
sudo k3s kubectl apply -f <filename.yaml>
# Deleting the deployment
sudo k3s kubectl delete -f <filename.yaml> -f <filename.yaml>
This can also be done in the gui dashboard application.
Note: Local images can be used if
imagePullPolicy
is set toifNotPresent
instead ofAlways
. In that case it will attempt to find a local image with the given image name.arm64 images must be cross compiled using docker buildx (make multi-arch or make cross-compile or similar in the relevant docker files) and always pulled from docker hub.
25.3 Installation instructions¶
It is recommended that you use the ./run_k3s.sh
script in the root of the repository. This script can be re-run at any time after install. If k3s is already installed and the relevant pods are running it will not do anything
Install k3s using the install script, this will fetch k3s and run the kubernetes master node immediately in the background:
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--docker" sh -
For the raspberry pi, ensure docker is installed, and then these instructions are the same on the raspberry pi (64 bit os).
For testing purposes (inside testing dir), the containers have already been built for both amd64 and arm64 and uploaded onto hub.docker: mickeyli789/ros_demo.
Also recommended you alias kubectl (kubernetes cli) in your bashrc
alias kubectl='sudo k3s kubectl
25.4 Running instructions¶
25.4.1 Laptop¶
It is recommended that you use the ./run_k3s.sh
script in the root of the repository.
This script will download the latest version of k3s run the master kubernetes server using docker (instead of containerd if you need access to local images)
'curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--docker" sh -
'
(will run in background as systemd - check systemctl status k3s
)
This will open up a server with entrypoint on 0.0.0.0:6443
which corresponds to <host local ip address>:6443
25.4.2 Pi / Drone / Agent¶
First ensure that the pi has been correctly set up with an airgapped installation of k3s, see here for installation instructions. Follow the Manually Deploy Images Method. The script below assumes that the the images file and the k3s executable are in the user home directory.
25.4.2.1 Setup script via ssh¶
Identify the ip address of the pi, the root enabled (possibly password disabled) username. Then from this directory run
./start_k3s_agent.sh <remote username> <remote ip address> <node name>
e.g.
./start_k8_agent.sh ubuntu 192.168.0.110 clover1
You can specify the k3s server address by setting the environment variable before calling:
K3S_SERVER=https://192.168.0.63:6443 k3s_agent ubuntu 192.168.0.96 raspi1
25.4.2.2 Manual, old setup method.¶
First SSH onto the pi
First ensure you run k3s-killall.sh
to make sure there is no master server running as you only want k3s agent
to run.
The K3S_TOKEN is the contents of the file /var/lib/rancher/k3s/server/node-token
K3S_TOKEN=<contents of the file /var/lib/rancher/k3s/server/node-token>
#e.g. K3S_TOKEN=K103b62838822f40f3e41j51f10cb127236f2c3014c120ede19263da9f33fbfc859::server:2dcbb32a4cad16e20d714d88dbce4af8
K3S_SERVER=https://<Your main machine ip address>:6443
K3S_NODE_NAME=clover1
echo "Killing all k3s services and instances first"
k3s-killall.sh
echo "Starting k3s agent only"
sudo k3s agent -t ${K3S_TOKEN} -s ${K3S_SERVER} --node-name ${K3S_NODE_NAME}
The Pi should now be setup
Consider running the above using screen or somehow in the background just in case your ssh connection is unstable or you want to close it.
25.4.3 Post actions¶
If you want to stop kubernetes completely, the internet install script comes with two options which are on the PATH and can be run in the terminal.
1. k3s-killall.sh
will stop all k3s nodes and the systemd
2. k3s-uninstall.sh
will delete everything k3s and remove the systemd
25.4.3.1 Dashboard¶
See the k3s docs for info on how to run
Are started automatically in the ./run_k3s.sh
script.