Skip to Content

Deploy a Go MSSQL API Endpoint in SAP BTP, Kyma Runtime

Develop and deploy an MSSQL API endpoint written in Go to SAP BTP, Kyma runtime.
You will learn
  • How to configure and build a Go Docker image
  • How to deploy the Go Docker image to SAP BTP, Kyma runtime
grego952Grzegorz KaraluchMay 26, 2025
Created by
grego952
May 8, 2024
Contributors
grego952

This tutorial expects that the tutorial Deploy MSSQL in SAP BTP, Kyma Runtime has been completed and relies on the database running either locally or within SAP BTP, Kyma runtime. If you run the database in SAP BTP, 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 to expose the Go application to other Kubernetes resources
  • A Kyma APIRule to expose the API to the Internet
  • Step 1
    1. 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.

    2. Use the Code button to choose one of the options to download the code locally, or simply run the following command within your CLI at your desired folder location:

      Shell/Bash
      Copy
      git clone https://github.com/SAP-samples/kyma-runtime-extension-samples
      
  • Step 2
    1. Open the api-mssql-go directory in your desired editor.

    2. 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.

      Shell/Bash
      Copy
      FROM scratch
      WORKDIR /app
      COPY --from=builder /app/api-mssql-go /app/
      

      The internal directory contains the rest of the Go application, broken down into three packages: api, config, and db. You can explore their contents to understand the structure and functionality.

      Within the k8s directory you can find the Kubernetes/Kyma resources you will apply to your SAP BTP, 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
  • Step 4

    Run the following commands from the api-mssql-go directory in your CLI.

    Make sure to replace the value of <your-docker-id> with your Docker account ID.

    1. To build the Docker image, run this command:

      Shell/Bash
      Copy
      docker build -t <your-docker-id>/api-mssql-go -f docker/Dockerfile .
      
    2. To push the Docker image to your Docker repository, run this command:

      Shell/Bash
      Copy
      docker push <your-docker-id>/api-mssql-go
      
  • Step 5

    Run the following commands from the api-mssql-go directory in your CLI.

    Make sure to replace the value of <your-docker-id> with your Docker account ID.

    You can also check the following additional commands:

    • To restart the Docker container, run:

      Shell/Bash
      Copy
      docker start api-mssql-go
      
    • To remove the Docker container, run:

      Shell/Bash
      Copy
      docker rm api-mssql-go
      
  • Step 6

    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.
    • authorizationpolicy.yaml: allows internal traffic to the service api-mssql-go in the dev namespace.
    • 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 secret.yaml, which was defined in the previous tutorial and also included in this directory, and configmap.yaml by name.
    1. Within the deployment.yaml, adjust the value of spec.template.spec.containers.image, commented with #change it to your image, to use your Docker image. Apply the Deployment which will cause an error which we will further explore:

      Shell/Bash
      Copy
      kubectl -n dev apply -f ./k8s/deployment.yaml
      
    2. Check the status of the Pod by running:

      Shell/Bash
      Copy
      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.

      Shell/Bash
      Copy
      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:

      Shell/Bash
      Copy
      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:

      Shell/Bash
      Copy
      kubectl describe pod api-mssql-go-c694bc847-tkthc -n dev
      

      Within the Events of the Pods, you should find the message Error: configmap "api-mssql-go" not found.

    3. Apply the ConfigMap:

      Shell/Bash
      Copy
      kubectl -n dev apply -f ./k8s/configmap.yaml
      
    4. Verify the status of the Pod by running:

      Shell/Bash
      Copy
      kubectl -n dev get po
      

      The Pod should now be running.

      Shell/Bash
      Copy
      NAME                           READY   STATUS    RESTARTS   AGE
      api-mssql-go-c694bc847-tkthc   2/2     Running   0          23m
      
    5. In apirule.yaml. modify allowOrigins.regex, to match your domain, and add the exact: http://localhost:8080 key-value pair. For example:

      yaml
      Copy
        ... 
          allowOrigins:
            - regex: ".*xyz123456.kyma.ondemand.com"
            - exact: http://localhost:8080
        ...
      

      exact: http://localhost:8080 is only required if you want to locally test the frontend of your application as part of the Deploy the SAPUI5 Frontend in SAP BTP, Kyma Runtime tutorial.

    6. Apply the APIRule:

      Shell/Bash
      Copy
      kubectl -n dev apply -f ./k8s/apirule.yaml
      
    7. Apply the AuthorizationPolicy:

      Shell/Bash
      Copy
      kubectl -n dev apply -f ./k8s/authorizationpolicy.yaml
      

    What port is the api-mssql-go pod exposed on?

  • Step 7

    To access the API, use the APIRule you created in the previous step.

    1. Open Kyma dashboard.

    2. From the menu, choose Namespaces.

    3. Choose the dev namespace.

    4. From the menu, choose Discovery and Network > API Rules.

    5. Choose the Host entry for the api-mssql-go APIRule to open the application in the browser, which will produce a 404 error. Append /orders to the end of the URL and refresh the page to successfully access the API. The URL should be similar to:

      https://api-mssql-go.<cluster>.kyma.ondemand.com/orders

      You can use a tool such as curl to test the various HTTP methods of the API.


    Why was the STATUS of the pod reporting CreateContainerConfigError?

Back to top