1. Deploy the capi helm chart on Kubernetes


    To deploy the Cluster API (CAPI) Helm chart on a Kubernetes cluster using Pulumi, we'll use the kubernetes.helm.v3.Chart resource from the Pulumi Kubernetes provider. This provider allows you to manage Kubernetes resources using Pulumi's infrastructure as code approach.

    The kubernetes.helm.v3.Chart resource is specifically designed to deploy Helm charts to a Kubernetes cluster. It takes the name of the Helm chart, the repository where the Helm chart is located (if it's not a locally stored chart), and any additional configurations or values you might want to apply.

    Before we proceed with the Pulumi program, make sure you have the following prerequisites in place:

    1. Helm must be installed on your system if you intend to use a local Helm chart or need to fetch Helm charts from repositories that require authentication.
    2. Pulumi CLI must be installed on your system.
    3. You should have a working Kubernetes cluster, and your kubectl must be configured to connect to it.
    4. You must be authenticated with any cloud provider if your Kubernetes cluster is hosted on one, and this provider must be set up and configured.

    We'll now write a Pulumi program in TypeScript that defines a Pulumi stack to deploy the CAPI Helm chart. The specifics of the chart like Helm chart version, values to override, and the Kubernetes namespace are typically provided by user prompt or configuration. For the sake of this example, we'll assume we're deploying the default settings of the CAPI Helm chart from its stable repository.

    import * as k8s from '@pulumi/kubernetes'; // Define the settings for the CAPI Helm chart const capiChart = new k8s.helm.v3.Chart('capi-chart', { // Assuming 'capi' is the name of the Cluster API chart you want to deploy. // You would replace this with the actual name of the chart. chart: 'capi', // Specify the Helm chart version you want to deploy. version: 'version_number', // e.g., '0.6.0' // Usually, Helm charts are hosted in a chart repository, you need to provide the repository URL. // Replace 'chart_repository_url' with the actual URL of the CAPI Helm chart repository, // for example, 'https://kubernetes-sigs.github.io/cluster-api/' fetchOpts: { repo: 'chart_repository_url', }, // If you wish to specify any values to override the chart defaults, use `values`. values: {}, // Namespace where the chart should be deployed. // Make sure this namespace already exists in your Kubernetes cluster, or set 'createNamespace: true'. namespace: 'default', }); // Export the name of the chart. // This export makes the output of this command visible on the CLI when this program is deployed. export const chartName = capiChart.getResourceName();

    Please replace 'version_number', 'chart_repository_url', and any other placeholders with the actual values relevant to the CAPI Helm chart you are deploying.

    In this program:

    • We import the Pulumi Kubernetes package which provides the necessary resources for interacting with Kubernetes.
    • We create a new instance of k8s.helm.v3.Chart named 'capi-chart'.
    • We specify the name of the chart 'capi'. This name should match the name in the Helm chart repository.
    • We define the version of the chart you want to deploy using version. The version needs to be a string representing a version available in the chart repository.
    • We provide the URL of the Helm chart's repository via fetchOpts.repo. This is where Helm will fetch the chart.
    • The values field can hold a configuration object to override default chart values, but we've left it empty, assuming defaults are acceptable.
    • The namespace indicates which Kubernetes namespace the chart should be installed into. By default, Helm installs charts into the default namespace.

    If you want to provide custom values or configuration, you supply an object to the values field of the chart that specifies those custom settings.

    After running the program using pulumi up, the Cluster API Helm chart will be deployed to your Kubernetes cluster. The getResourceName() function is used to get the initialized name of the resource which can be seen as output from the CLI.