Deploy the laravel-helm helm chart on Azure Kubernetes Service (AKS)
TypeScriptTo deploy the Laravel Helm chart on an Azure Kubernetes Service (AKS) cluster, we will go through a multi-step process:
- Provision an AKS cluster: We will use the
azure-native
Pulumi provider to create an AKS cluster. This cluster will be the environment where our Laravel application will run. - Deploy a Laravel Helm chart to AKS: Using the
kubernetes
Pulumi provider, we will deploy the Laravel Helm chart to our freshly provisioned AKS cluster.
Here's a detailed Pulumi program that performs these tasks. Follow the comments in the code to understand what each section does:
import * as pulumi from "@pulumi/pulumi"; import * as azure_native from "@pulumi/azure-native"; import * as k8s from "@pulumi/kubernetes"; // Step 1: Create an Azure Resource Group const resourceGroup = new azure_native.resources.ResourceGroup("myResourceGroup"); // Step 2: Create an AKS Cluster const aksCluster = new azure_native.containerservice.ManagedCluster("myAKSCluster", { resourceGroupName: resourceGroup.name, // Specify the location to deploy the resources location: resourceGroup.location, // Configuration for the AKS cluster agentPoolProfiles: [{ count: 1, vmSize: "Standard_B2s", name: "agentpool", mode: "System", }], // Enable RBAC for secure access to K8s resources enableRbac: true, // Delete AKS cluster service principal profile if not required // Service principal or managed identity is required to create and manage resources // servicePrincipalProfile: { // clientId: "<client-id>", // secret: "<secret>", // }, // Define the Kubernetes version kubernetesVersion: "1.18.14", }); // Export the AKS cluster name and kubeconfig export const aksClusterName = aksCluster.name; // Step 3: Use the AKS cluster with the Kubernetes provider const k8sProvider = new k8s.Provider("k8sProvider", { // Leverage the generated kubeconfig to connect to the AKS Kubernetes cluster kubeconfig: aksCluster.kubeconfig, }); // Step 4: Deploy the Laravel Helm chart const laravelChart = new k8s.helm.v3.Chart("laravel-helm-chart", { repo: "bitnami", chart: "laravel", version: "9.1.4", }, { provider: k8sProvider }); // Export the public endpoint of the Laravel application export const laravelEndpoint = laravelChart.getResourceProperty("v1/Service", "laravel-helm-chart", "status").apply(status => status.loadBalancer.ingress[0].ip);
Let's break down the code:
-
ResourceGroup: We start by creating a resource group, which is a container that holds related resources for an Azure solution.
-
ManagedCluster: Next, we create an AKS cluster within the resource group. The
agentPoolProfiles
array configures node pools that contain the underlying VMs which will host the Kubernetes pods. Here, we specify the size of the VMs and the desired number of nodes. -
Provider: We then create an instance of the Kubernetes Provider which uses the
kubeconfig
attribute from the created AKS cluster to establish a connection. -
Helm Chart: Finally, we deploy the Laravel application using a Helm chart. The
repo
,chart
, andversion
detail which Helm chart to deploy.
The code also exports the AKS cluster name and the public endpoint of the Laravel application, allowing you to interact with them outside of Pulumi.
After you have your code ready, you can run it using the Pulumi CLI. Ensure that Pulumi is configured with the correct Azure credentials before running the deployment with the following commands:
pulumi up # to preview and deploy the changes
Once deployment completes, you can verify that the Laravel application is running by navigating to the public IP address that's exported by the
laravelEndpoint
.Remember that Helm charts can have configurable values, such as database credentials, application settings, etc. In real scenarios, you would configure these either by passing a custom values file to the
Chart
resource or by setting them directly in thevalues
argument. Always ensure sensitive data is securely managed with Pulumi's secret handling or external secret management solutions.- Provision an AKS cluster: We will use the