This tutorial expects that the tutorial Deploying MSSQL in the Kyma Runtime has been completed and relies on the database running either locally or within the Kyma runtime. If you run the database in the Kyma runtime, make sure to use the port-forward
feature presented in the tutorial to expose the database to your local environment.
Deploying the image includes:
- A Kubernetes Secret to store the database user/password
- A Kubernetes
ConfigMap
to store the database configuration in
- A Kubernetes Service used to expose the Go application to other Kubernetes resources
- A Kyma
APIRule
to expose the API to the Internet
Step 1: Clone the Git repository
- Copy the repository URL.
In your browser, go to kyma-runtime-extension-samples. This repository contains a collection of Kyma sample applications which will be used during the tutorial.
Choose the Code button and choose one of the options to download the code locally or simply run the following command within your CLI at your desired folder location:
git clone https://github.com/SAP-samples/kyma-runtime-extension-samples
Step 2: Explore the sample
-
Open the api-mssql-go
directory in your desired editor.
-
Explore the content of the sample.
-
Within the cmd/api
directory, you can find main.go
which is the main entry point of the Go application.
-
The docker
directory contains the Dockerfile used to generate the Docker image. The image is built in two stages to create an image with a small file size.
In the first stage, a Go image is used. It copies the related content of the project into the image and builds the application. The built application is then copied into the Docker scratch
image and exposed on port 8000. The scratch
image is an empty image containing no other tools within it so obtaining a shell/bash session is not possible. If desired, the following lines could be commented out to build an image with more included tools, but this results in a larger image.
FROM scratch
WORKDIR /app
COPY --from=builder /app/api-mssql-go /app/
-
The internal
directory contains the rest of the Go application, which is broken down into three packages: api
, config
and db
. Explore these contents to understand the structure and functionality.
-
Within the k8s
directory you can find the Kubernetes/Kyma resources you will apply to your Kyma runtime.
-
Within the root you can find go.mod
and go.sum
files that are used to manage the dependencies the application uses.
Step 3: Run the application locally
Run the following commands from the api-mssql-go
directory using your CLI.
-
The application expects that the following environment variables are set as they are required for the database connection. Make sure to adjust them for your environment. Review the the tutorial Deploying MSSQL in the Kyma Runtime for the different configurations to run the database.
export MYAPP_username=sa
export MYAPP_password=Yukon900
export MYAPP_database=DemoDB
export MYAPP_host=localhost
export MYAPP_port=1433
-
To run the application, use the following command:
go run ./cmd/api/main.go
-
The application is available at http://localhost:8000/orders. You can use a tool such as curl to test the different HTTP methods, for example:
To GET data:
curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET http://localhost:8000/orders
To POST data:
curl --data '{"order_id":"10000003","description":"test from curl"}' http://localhost:8000/orders
Step 4: Build the Docker image
Run the following commands from the api-mssql-go
directory within your CLI.
Make sure to replace the value of <your-docker-id>
with your Docker account ID.
-
To build the Docker image, run this command:
docker build -t <your-docker-id>/api-mssql-go -f docker/Dockerfile .
-
To push the Docker image to your Docker repository, run this command:
docker push <your-docker-id>/api-mssql-go
Step 5: Use the Docker image locally
Run the following commands from the api-mssql-go
directory within your CLI.
Make sure to replace the value of <your-docker-id>
with your Docker account ID.
-
Start the image locally by running the following command:
docker run -p 8000:8000 --name api-mssql-go \
-e MYAPP_username="sa" \
-e MYAPP_password="Yukon900" \
-e MYAPP_database="DemoDB" \
-e MYAPP_host="host.docker.internal" \
-e MYAPP_port="1433" \
-d <your-docker-id>/api-mssql-go:latest
The command is expecting that the database is available at localhost:1433
on the host machine. This is denoted by the host.docker.internal
value. Review the tutorial Deploying MSSQL in the Kyma Runtime for the different configurations to run the database.
-
The application is available at http://localhost:8000/orders. You can use a tool such as curl to test the different HTTP methods, for example:
To GET data:
curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET http://localhost:8000/orders
To POST data - make sure to use a unique value for the order_id:
curl --data '{"order_id":"10000003","description":"test from curl"}' http://localhost:8000/orders
-
Stop the Docker container by running:
docker stop api-mssql-go
-
Here are some additional commands that you can use:
To restart the Docker container, run:
docker start api-mssql-go
To remove the Docker container, run:
docker rm api-mssql-go
Step 6: Apply resources to Kyma runtime
You can find the resource definitions in the k8s
folder. If you performed any changes in the configuration, these files may also need to be updated. The folder contains the following files that are relevant to this tutorial:
apirule.yaml
: defines the API endpoint which exposes the application to the Internet. This endpoint does not define any authentication access strategy and should be disabled when not in use.
configmap.yaml
: defines the name of the database, host, and port. The host value assumes that the service for the database is named mssql
and is defined in the dev
Namespace. Make sure to adjust this if you made any changes.
deployment.yaml
: defines the deployment definition for the Go API, as well as a service used for communication. This definition references both the secret.yaml
, which was defined in the previous tutorial and also included in this directory, and the configmap.yaml
by name.
-
Start by creating the dev
Namespace if it doesn’t already exist:
kubectl create namespace dev
-
Within the deployment.yaml
, adjust the value of spec.template.spec.containers.image
to use your Docker image. Apply the Deployment:
kubectl -n dev apply -f ./k8s/deployment.yaml
-
Check the status of the Pod by running:
kubectl -n dev get po
This command results in a table similar to the one below, showing a Pod with the name api-mssql-go-
ending with a random hash. Make sure to adjust this value in the subsequent commands. Notice that STATUS is reporting CreateContainerConfigError
.
NAME READY STATUS RESTARTS AGE
api-mssql-go-c694bc847-tkthc 1/2 CreateContainerConfigError 0 23s
You can also see the logs that report the same STATUS CreateContainerConfigError
:
kubectl logs api-mssql-go-c694bc847-tkthc -c api-mssql-go -n dev
To find the reason for the STATUS CreateContainerConfigError
, review the Pod definition:
kubectl get pod api-mssql-go-c694bc847-tkthc -n dev -o yaml
Find the containerStatuses.state.waiting.message
property for the api-mssql-go
image to determine the issue.
-
Apply the ConfigMap
:
kubectl -n dev apply -f ./k8s/configmap.yaml
-
Verify the status of the Pod by running:
kubectl -n dev get po
The Pod should now be running.
NAME READY STATUS RESTARTS AGE
api-mssql-go-c694bc847-tkthc 2/2 Running 0 23m
-
Apply the APIRule
:
kubectl -n dev apply -f ./k8s/apirule.yaml
The APIRule creates an endpoint similar to the one below. You can use it to test within your browser or by using a tool such as curl
.
https://api-mssql-go.<cluster>.kyma.shoot.live.k8s-hana.ondemand.com/orders