Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
BJarkowski
Active Contributor
Using a docker image to install SAP HANA express edition can shorten the deployment time and ensure the consistency between environments. The easy way to use it is to build a Kubernetes cluster using Microsoft Azure Container Service and deploy containers in the cloud.







Did you know that you can like this post? It's the easiest way to show your support! Just scroll up a bit and click on the big Like button.
Thanks!


A docker container is a package of libraries and system settings required to run an application. It allows to save the time needed to provide a working environment and you can focus on the target database configuration. It’s great especially in environments where you need to provide separated HANA instances for many developers.



Azure Container Service simplifies the creation and configuration of the Kubernetes cluster and management of the entire docker environment. The nodes of the cluster are managed by Azure while your responsibility is to maintain the running application.

CREATE THE KUBERNETES CLUSTER

Creation of Kubernetes cluster in Microsoft Azure is a relatively easy task. During the initial configuration, you will be asked to provide a service principal that will be used to manage the Azure resources. Log in to the portal, go to the Azure Active Directory and create new application registration:



Save the settings. It is not important what you type in the Sign-on URL. Generate the key in the application settings – copy it together with the application ID – you will be asked for those details in few minutes.



To deploy Kubernetes cluster you need to create an Azure Cluster Service (preview). In the first step, you are asked to choose a cluster name and select a resource group in which it will be created.



You need to provide the basic configuration on the second screen. In the Service Principal ID and Service Principal Client Secret enter the information generated during the app registration. Choose the number of nodes and their size – I chose two DS11_V2 servers which fulfill the SAP HANA database memory and CPU requirements:



To connect to the cluster you require the Azure CLI. You need also to install the AKS libraries.
az aks install-cli



Log in to your Azure account and connect with the Kubernetes cluster
az login 
az aks get-credentials --resource-group=<resource group name> --name=<cluster name>



Once we have established the connection we can display the Kubernetes cluster nodes:
kubectl get nodes



You can validate the information in the Azure portal:



The nodes of the clusters are standard virtual machines in a single Availability Set:



DEPLOY SAP HANA

Downloading an SAP HANA database image from the Docker website requires an authentication. Provide your username and password to create a secret:
kubectl create secret docker-registry docker-secret --docker-server=https://index.docker.io/v1/ --docker-username=<username> --docker-password=<password> --docker-email=<e-mail>

Copy the deployment script and save it to your local drive:
kind: ConfigMap
apiVersion: v1
metadata:
creationTimestamp: 2018-01-18T19:14:38Z
name: hxe-pass
data:
password.json: |+
{"master_password" : "HXEHana1"}
---
kind: PersistentVolume
apiVersion: v1
metadata:
name: persistent-vol-hxe
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 150Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/data/hxe_pv"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: hxe-pvc
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
---
apiVersion: v1
kind: Pod
metadata:
name: hxe-pod
labels:
name: hxe-pod
spec:
initContainers:
- name: install
image: busybox
command: [ 'sh', '-c', 'chown 12000:79 /hana/mounts' ]
volumeMounts:
- name: hxe-data
mountPath: /hana/mounts
restartPolicy: OnFailure
volumes:
- name: hxe-data
persistentVolumeClaim:
claimName: hxe-pvc
- name: hxe-config
configMap:
name: hxe-pass
imagePullSecrets:
- name: docker-secret
containers:
- name: hxe-container
image: "store/saplabs/hanaexpress:2.00.022.00.20171211.1"
ports:
- containerPort: 39013
name: port1
- containerPort: 39015
name: port2
- containerPort: 39017
name: port3
- containerPort: 8090
name: port4
- containerPort: 39041
name: port5
- containerPort: 59013
name: port6
args: [ "--agree-to-sap-license", "--dont-check-system", "--passwords-url", "file:///hana/hxeconfig/password.json" ]
volumeMounts:
- name: hxe-data
mountPath: /hana/mounts
- name: hxe-config
mountPath: /hana/hxeconfig

(source: sap.com)


Deploy the image using the command:
kubectl create -f hana.yaml



The deployment takes several minutes to finish and can be monitored using the below command. If you see the message Started Container it means the process is completed.
kubectl describe pod hana-pod



You can now log in to the container and verify that the instance is running:
kubectl exec -it hxe-pod bash
HDB info
hdbsql -i 90 -d HXE -u SYSTEM -p <password>



You can see on which node the pod is running by executing:
kubectl get pods -o wide



NODE SELECTION: DIRECT ASSIGNMENT

You can directly assign the node to which the container should be deployed by a Node Selector segment:
  containers:
- name: hxe-container
image: "store/saplabs/hanaexpress:2.00.022.00.20171211.1"
ports:
- containerPort: 39013
name: port1
- containerPort: 39015
name: port2
- containerPort: 39017
name: port3
- containerPort: 8090
name: port4
- containerPort: 39041
name: port5
- containerPort: 59013
name: port6
args: [ "--agree-to-sap-license", "--dont-check-system", "--passwords-url", "file:///hana/hxeconfig/password.json" ]
volumeMounts:
- name: hxe-data
mountPath: /hana/mounts
- name: hxe-config
mountPath: /hana/hxeconfig
nodeSelector:
kubernetes.io/hostname: aks-agentpool-25335148-1

Deploy the cluster using the modified configuration file.



NODE SELECTION: MEMORY REQUIREMENTS


The other possibility to help the cluster to choose good node is to specify a minimum memory requirement. The virtual machine with SAP HANA express edition requires at least 8GB of memory, but as the docker should consume a smaller amount of RAM I have requested only 7GB.
  containers:
- name: hxe-container
image: "store/saplabs/hanaexpress:2.00.022.00.20171211.1"
ports:
- containerPort: 39013
name: port1
- containerPort: 39015
name: port2
- containerPort: 39017
name: port3
- containerPort: 8090
name: port4
- containerPort: 39041
name: port5
- containerPort: 59013
name: port6
args: [ "--agree-to-sap-license", "--dont-check-system", "--passwords-url", "file:///hana/hxeconfig/password.json" ]
volumeMounts:
- name: hxe-data
mountPath: /hana/mounts
- name: hxe-config
mountPath: /hana/hxeconfig
resources:
requests:
memory: "7Gi"

The current hardware utilization can be displayed using:
kubectl top nodes



The two previously deployed containers consume more than 10 GB of memory on node 1, therefore, the cluster creates the third HANA instance on node 0.



SCALE-OUT THE KUBERENETES CLUSTER

Let’s try to create one more instance:



As there is not enough available memory on any of the node, the container was not deployed and has status pending. In that case, you can scale-out the Kubernetes cluster and add the third node:
az aks scale --name <resource name> --resource-group <resource group> --node-count <nodes>



When we check the pod status again, we can see that the hxe-pod4 is assigned to the newly created node 2.



KUBERNETES CLUSTER DASHBOARD

Instead of using the command line interface some tasks can be executed from the Kubernetes Dashboard. The bellow command creates a proxy to the Kubernetes engine in Azure and allows you to contact the webpage through a localhost:
az aks browse --resource-group <resource group> --name <cluster name>



Open a browser and navigate to http://127.0.0.1:8001/ to display the dashboard.



REMOTE DATABASE ACCESS

If you wish to access the database from the Internet you can configure the load balancer. Execution of bellow command creates a new service and assigns the Public IP.
kubectl expose pod <pod name> --name=<service name> --type=LoadBalancer
kubectl get service <service name>

6 Comments
Labels in this area