Helm* for Tutorial Server
-------------------------
In the previous step we created generic Helm\* Chart for the Tutorial Server.
In this step we will customize the Tutorial Server Deployment in the Helm
Chart and will do the same to the Tutorial Web UI in the next step.
Remove Unwanted Files
~~~~~~~~~~~~~~~~~~~~~~~
To simplify the deployment, you must remove the following files from the **templates** directory:
.. code:: shell
cd tutorial-server
rm templates/hpa.yaml
rm templates/ingress.yaml
Modify the Deployment
~~~~~~~~~~~~~~~~~~~~~~~~
values.yaml
*************
#. Add Values: Add to **values.yaml** file the following variables to be used in the template:
.. code:: yaml
# Add this to the values.yaml file at the top before "replicaCount:"
tutorialServer:
greeting: "Deployed by Helm"
initialCount: 0
#. Change Port: There is also a change in **service.port** needs to be made to the values.yaml file
to match the port used in the Dockerfile and the FastAPI application.
.. code:: yaml
# Change this to the values.yaml file under "service:"
service:
type: ClusterIP
port: 8000
.. note::
Here, you must leave the service type as **ClusterIP**. This is the default type and
means that the service is only accessible from within the cluster. This is suitable for
a backend server that is not exposed to the outside world.
#. Update Repository: The **image.repository** needs to be changed to match the container image:
.. code:: yaml
# Change this to the values.yaml file under "image:"
image:
repository: tutorial-server-image
pullPolicy: IfNotPresent
#. Update Security Context: Update **securityContext** to secure the deployment:
.. code:: yaml
securityContext:
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 65534 # nobody
Chart.yaml
*************
#. Update AppVersion: Modify the **Chart.yaml** file changing the `appVersion` to match the tag **0.1.0** we will give the
docker image in :doc:`../deploying-applications/pushing_charts_and_images`:
.. code:: yaml
# Change this to the Chart.yaml file under "appVersion:"
appVersion: "0.1.0"
templates/deployment.yaml
**************************
The **deployment.yaml** file contains the Deployment definition for the Tutorial Server.
#. Add environment variables: Modify the **templates/deployment.yaml** file to use these variables:
.. code:: yaml
# Add this to the deployment.yaml file under "spec.template.spec.containers" after "imagePullPolicy:" indented by 10 spaces
env:
- name: TUTORIAL_GREETING
value: {{ .Values.tutorialServer.greeting | quote }}
- name: INITIAL_COUNT
value: {{ .Values.tutorialServer.initialCount | quote }}
Checking the Helm chart
~~~~~~~~~~~~~~~~~~~~~~~
Running **helm lint** (while back out to the **tutorial-charts** directory) on the chart is recommended to check for
any errors.
.. code:: shell
helm lint ./tutorial-server
Then run the helm template to check the output of the chart.
.. code:: shell
helm -n tutorial template --release-name foobar ./tutorial-server --set image.tag=latest
The output under Deployment -> spec.templates.spec.containers should look like the following
where the environment variables, image, and port are set properly:
.. code:: yaml
containers:
- name: tutorial-server
securityContext:
{}
image: "tutorial-server-image:latest"
imagePullPolicy: IfNotPresent
env:
- name: TUTORIAL_GREETING
value: "Deployed by Helm"
- name: INITIAL_COUNT
value: "0"
ports:
- name: http
containerPort: 8000
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
{}
.. note::
Here the root endpoint **/** is the testing point for liveness and readiness. This will
retrieve the greeting message. It does not matter what the content is, but if the status message
is not 200, then Kubernetes\* platform will regard the pod as unhealthy and restart it.
Testing the Helm chart
~~~~~~~~~~~~~~~~~~~~~~
At this stage, it is possible to test the Helm chart by installing it on a Kubernetes cluster.
.. note::
This level of testing is included for demonstration purposes. Many developers will be able to
skip this step and go straight to the next step of deploying through |software_prod_name|.
There are many frameworks that allow you run Kubernetes cluster on your local machine. In this example, use
`KinD `_
Once it is installed on your system, you can create a cluster with the command:
.. code:: shell
kind version
kind create cluster
kubectl cluster-info
kubectl get nodes
KinD does not have access to the local Container images so we need to load the image into the KinD cluster.
.. code:: shell
kind load docker-image tutorial-server-image:latest
Then you can install the Helm chart on the KinD cluster.
.. code:: shell
helm -n tutorial install --create-namespace tutorial-server ./tutorial-server --set image.tag=latest
This should deploy within a few seconds and we can check the status and get the service details:
.. code:: shell
kubectl -n tutorial get all
NAME READY STATUS RESTARTS AGE
pod/tutorial-server-dc55b9b9f-87hnr 1/1 Running 0 5m24s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/tutorial-server ClusterIP 10.96.218.220 8000/TCP 5m24s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/tutorial-server 1/1 1 1 5m24s
NAME DESIRED CURRENT READY AGE
replicaset.apps/tutorial-server-dc55b9b9f 1 1 1 5m24s
At this stage, it is possible to test the application using curl or a web browser through a port-forward:
.. code:: shell
kubectl -n tutorial port-forward service/tutorial-server 8000:8000
And in another terminal window, you can test the application with the command:
.. code:: shell
curl -X GET http://localhost:8000/counter
curl -X POST http://localhost:8000/increment
The next step create the Helm Chart for the Tutorial Web UI.