In this final part of the Azure Arc series, we will deploy the data controller followed by PostgreSQL-Hyperscale.
Though there are multiple techniques available for deploying Azure Arc enabled data services, we are using the native Kubernetes deployment model.
This article assumes that you have a Kubernetes cluster running version 1.17 or above with a storage class called local-storage is configured. I am using PX-Essentials, the free storage option from Portworx by Pure Storage as the storage layer. You are free to use any Kubernetes compatible storage engine.
Azure Arc enabled data services rely on a data controller for lifecycle management. All the objects of this service are deployed as Custom Resource Definitions (CRD). You need Kubernetes cluster administration permissions to deal with this deployment.
Installing the Data Controller
Let’s start by deploying the required CRDs:
1 | kubectl create –f https://raw.githubusercontent.com/microsoft/azure_arc/master/arc_data_services/deploy/yaml/custom-resource-definitions.yaml |
Azure Arc enabled data services are typically installed within a namespace called arc
. Let’s create that:
1 | kubectl create namespace arc |
The next step is to deploy a bootstrapper that handles incoming requests for creating, editing, and deleting custom resources:
1 | kubectl create —namespace arc –f https://raw.githubusercontent.com/microsoft/azure_arc/master/arc_data_services/deploy/yaml/bootstrapper.yaml |
You should now have the bootstrapper up and running in the arc
namespace.
We have to create a secret that holds the username and password of the data controller. On macOS, you can run the below commands to generate a base64 encoded string for username and password:
1 2 | #prints YWRtaW4= echo “admin” | tr –d n | base64 |
1 2 | #prints UGFzc3dvcmRAMTIz echo “[email protected]” | tr –d n | base64 |
Take the values from the above commands to create a secret:
1 2 3 4 5 6 7 | apiVersion: v1 data:   password: UGFzc3dvcmRAMTIz   username: YWRtaW4= kind: Secret metadata:   name: controller–login–secret |
1 | kubectl create –f controller–login–secret.yaml |
Download the data controller YAML file and modify it to reflect your connectivity and storage options:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | apiVersion: arcdata.microsoft.com/v1alpha1 kind: datacontroller metadata:   generation: 1   name: arc spec:   credentials:     controllerAdmin: controller–login–secret     serviceAccount: sa–mssql–controller   docker:     imagePullPolicy: Always     imageTag: public–preview–sep–2020     registry: mcr.microsoft.com     repository: arcdata   security:     allowDumps: true     allowNodeMetricsCollection: true     allowPodMetricsCollection: true     allowRunAsRoot: false   services:   – name: controller     port: 30080     serviceType: LoadBalancer   – name: serviceProxy     port: 30777     serviceType: LoadBalancer   settings:     ElasticSearch:       vm.max_map_count: “-1”     azure:       connectionMode: Indirect       location: westeurope       resourceGroup:       subscription:     controller:       displayName: arc       enableBilling: “True”       logs.rotation.days: “7”       logs.rotation.size: “5000”   storage:     data:       accessMode: ReadWriteOnce       className: local–storage       size: 15Gi     logs:       accessMode: ReadWriteOnce       className: local–storage       size: 10Gi |
Update the template with an appropriate resource group, subscription ID, and storage class name. Apply the data controller specification:
1 | kubectl apply –f data–controller.yaml |
The controller is exposed through a LoadBalancer service. Find the IP address and port of the service:
1 | kubectl get svc controller–svc–external –n arc |
We can now login into the controller with the azdata
tool. Run the below commands to install the latest version of the Azure Arc enabled data services CLI:
1 2 3 | brew tap microsoft/azdata–cli–release brew update brew install azdata–cli |
Running azdata login
will prompt us for the details:
Now that the controller is in place, we are ready to deploy PostgreSQL Hyperscale.
Installing PostgreSQL Hyperscale Instance
Start by downloading the YAML template file from the official Microsoft Git repository. Modify it based on the values of your storage class. Set the password value to a bas64 encoded string.
The following specification has a secret called [email protected] with the storage class pointed to local-storage:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | apiVersion: v1 data:   password: UGFzc3dvcmRAMTIz kind: Secret metadata:   name: pgsql–login–secret type: Opaque —– apiVersion: arcdata.microsoft.com/v1alpha1 kind: postgresql–12 metadata:   generation: 1   name: pgsql spec:   engine:     extensions:     – name: citus   scale:     shards: 3   scheduling:     default:       resources:         limits:           cpu: “4”           memory: 4Gi         requests:           cpu: “1”           memory: 2Gi   service:     type: LoadBalancer   storage:     backups:       className: local–storage       size: 10Gi     data:       className: local–storage       size: 10Gi     logs:       className: local–storage       size: 5Gi |
Apply the specification with the below kubectl command:
1 | kubectl apply –n arc –f pgsql.yaml |
In a few minutes, you will see four new pods belonging to PostgreSQL Hyperscale added to the arc
namespace:
1 | kubectl get pods –l type=postgresql –n arc |
The deployment is exposed through a service that can be used to access the database:
1 | kubectl get svc pgsql–external–svc –n arc |
We can also use azdata
to get the PostgreSQL endpoint:
1 | azdata arc postgres endpoint list –n pgsql |
We can now login into PostgreSQL using any client tools. The below screenshot shows the psql
CLI accessing the database instance:
1 | PGPASSWORD=Password@123 psql –h 10.0.0.203 –U postgres |
This tutorial walked you through the steps of deploying Azure Arc enabled database services on Kubernetes.
Janakiram MSV’s Webinar series, “Machine Intelligence and Modern Infrastructure (MI2)” offers informative and insightful sessions covering cutting-edge technologies. Sign up for the upcoming MI2 webinar at http://mi2.live.
Portworx is a sponsor of InApps Technology.