Deploy & Upgrade using Helm Charts on K8s
Helm is a powerful package manager for Kubernetes, designed to simplify the process of deploying, managing, and configuring applications on Kubernetes clusters. By using Helm charts, developers and operations teams can define, install, and upgrade even the most complex Kubernetes applications with ease.
This introduction will cover the basics of Helm charts, including prerequisites and an important feature: upgradeability via Helm.
If you are highly familiar with k8s, you can use directly the helm chart available here.
Prerequisites
Before diving into Helm charts, ensure you have the following prerequisites in place:
helm: Install Helm on your local machine. The installation instructions for different operating systems are available on the Helm official website.
kubectl: The Kubernetes command-line tool, kubectl, should be installed and configured to interact with your Kubernetes cluster. You can download it from the Kubernetes official site: Linux, MacOS.
Get familiar with Kubernetes: A tutorial to present the basics is available here.
Access Rights: Ensure you have sufficient permissions to create resources in the Kubernetes cluster and install Helm charts.
Understanding Helm Charts
A Helm chart is a collection of files that describe a set of Kubernetes resources. Helm uses these charts to deploy applications or services on Kubernetes. Each chart contains the following essential components:
Chart.yaml
: This file contains metadata about the chart, such as the name, version, and description.Values.yaml
: This file includes default values for the chart’s variables, which can be overridden by users during deployment.
Server Deployment
Step 1. Add Helm Repo
A Helm repository is a collection of packaged charts that can be shared and accessed publicly or privately. These repositories are similar to package repositories in other ecosystems, like npm for Node.js or PyPI for Python. Helm repositories make it easy to distribute charts and manage their versions.
To use a Helm repository, you need to add it to your local Helm client. Here we are adding PySyft’s helm repository:
helm repo add openmined https://openmined.github.io/PySyft/helm
Make sure your repo is up to date before moving forward:
helm repo update openmined
Step 2. Search for available Chart versions
You can search for available charts in the added repositories using the helm search command. For instance, to search for various versions of the Syft charts, you can use:
helm search repo openmined/syft --versions --devel
Adding --devel
allows the search to include beta
versions of syft.
Step 3. Setup a registry
To setup a k8s deployment, you need a running Kubernetes cluster. This can be a local setup using tools like Minikube or a managed Kubernetes service such as Google Kubernetes Engine (GKE), Amazon EKS, or Azure Kubernetes Service (AKS).
We will cover here the setup of a local registry using k3d. First, we need to create the registry:
k3d registry create registry.localhost --port 12345 -v `pwd`/k3d-registry:/var/lib/registry || true
Now we can create the cluster for illustration purposes:
CLUSTER_NAME=syft SERVER_PORT=8080 && \
k3d cluster create CLUSTER_NAME -p "$SERVER_PORT:80@loadbalancer" --registry-use k3d-registry.localhost || true \
k3d cluster start CLUSTER_NAME
Step 4. Install using Helm
To install a chart from a repository, use the helm install command along with the repository name and the chart name.
First, we should set a version for deployment, as:
export SYFT_VERSION="<paste your version here>"
helm install my-server openmined/syft --version $SYFT_VERSION --namespace syft --create-namespace --set ingress.ingressClass=traefik
Depending on your cloud system, you can configure ingress differently. To pass a local values.yaml
file, you can specify to the above:
-f $PATH_TO_VALUES \
--value_name $VALUE
Upgrading your server using Helm
One of Helm’s key features is the ability to upgrade applications with minimal downtime and effort. Helm manages upgrades through a concept called “releases.” Each time you install a chart, Helm creates a new release. When you upgrade a release, Helm performs a rolling update, applying the new configuration while keeping the application running.
Steps to Upgrade a Helm Release
Update repository to have the latest versions & search
Modify Values: Update the values.yaml file or provide a new set of values that reflect the desired state of the application.
Upgrade Command: Use the helm upgrade command to apply the changes.
Step 1. Update local repository
helm repo add openmined https://openmined.github.io/PySyft/helm
helm repo update openmined
helm search repo openmined/syft --versions --devel
Step 2. Set the target version and release name
export TARGET_VERSION="<paste your target version>"
# User Defined
export RELEASE_NAME="<paste the release name>"
export NAMESPACE="<paste the namespace>"
helm get values $RELEASE_NAME -n $NAMESPACE -o yaml > values.yaml
Step 3. Upgrade the Helm Chart
export PATH_TO_VALUES=usr/tmp/values.yaml
helm upgrade $RELEASE_NAME openmined/syft \
--version $TARGET_VERSION \
-f $PATH_TO_VALUES \
--namespace $NAMESPACE
Test your deployment
Check ingress run
To confirm the health of the ingress run:
kubectl describe ingress -n syft
Check running pods
kubectl get pods -n syft
Launch your Jupyter Notebook Instance
In this step, you need a client server in order to interact with the PySyft server you just deployed. Here, the client consists of a Jupyter notebook running the same version of PySyft as the server served as a container. This is a convenient setup, but you can as well launch your own Jupyter Notebook in an environment with Python3.10+ and the desired PySyft version.
We need to start the client as follows:
docker run --rm -it --network=host openmined/syft-client:${VERSION}
where ${VERSION}
is the version of PySyft Client you’d like to run. It must be the same as you passed before at deployment step.
If this step is successful, you will be taken to a Jupyter notebook interface in the browser. Please create a new notebook and run the following command to test your full setup is ready to be used:
Connect to your launched server
import syft as sy
sy.login(url="localhost:80", email="[email protected]", password="changethis")
# Please pass the URL, the email and password used to create the server. The above are the default ones used during server creation.
If everything works well, you should be able to login to your server. You can now start running PySyft commands on the client server to interact with the PySyft server you just deployed.