Skip to main content

DigitalOcean Kubernetes Cluster and Application

Provision a DigitalOcean Kubernetes cluster and deploy to it

This example lives in the pulumi/examples repository. Check out just this directory to use it:

Get started with this example
git clone --filter=blob:none --sparse https://github.com/pulumi/examples pulumi-examples
git -C pulumi-examples sparse-checkout set digitalocean-ts-k8s
cd pulumi-examples/digitalocean-ts-k8s

This example provisions a new DigitalOcean Kubernetes cluster, deploys a load-balanced application into it, and then optionally configures DigitalOcean DNS records to give the resulting application a stable domain-based URL.

Deploying the Example#

Prerequisites#

To follow this example, you will need:

  1. Install Pulumi
  2. Register for a DigitalOcean Account
  3. Generate a DigitalOcean personal access token
  4. Install kubectl for accessing your cluster

If you want to configure the optional DigitalOcean DNS records at the end, you will also need:

  1. Obtain a domain name and configure it to use DigitalOcean nameservers

Steps#

After cloning this repo, from this working directory, run these commands:

  1. Install the required Node.js packages:

    This installs the dependent packages needed for our Pulumi program.

    Terminal window
    npm install
  2. Create a new Pulumi stack, which is an isolated deployment target for this example:

    Terminal window
    pulumi stack init dev
  3. Configure Pulumi to use your DigitalOcean personal access token:

    Terminal window
    pulumi config set digitalocean:token <YOUR_TOKEN_HERE> --secret
  4. (Optional) If you wish to use a custom domain name, configure it now:

    Terminal window
    pulumi config set domainName <YOUR_DOMAIN_NAME>
  5. Deploy your cluster, application, and optional DNS records by running pulumi up.

    This command shows a preview of the resources that will be created and asks you whether to proceed with the deployment. Select “yes” to perform the deployment.

    Terminal window
    pulumi up
    Updating (dev):
    Type Name Status
    + pulumi:pulumi:Stack do-k8s-dev created
    + └─ digitalocean:index:KubernetesCluster do-cluster created
    + ├─ pulumi:providers:kubernetes do-k8s created
    + ├─ kubernetes:apps:Deployment do-app-dep created
    + └─ kubernetes:core:Service do-app-svc created
    + ├─ digitalocean:index:Domain do-domain created
    + └─ digitalocean:index:DnsRecord do-domain-cname created
    Outputs:
    + kubeconfig: "..."
    + ingressIp : "157.230.199.202"
    Resources:
    + 7 created
    Duration: 6m5s
    Permalink: https://app.pulumi.com/.../do-k8s/dev/updates/1

    Note that the entire deployment will typically take between 4-8 minutes.

    As part of the update, you’ll see some new objects in the output, including a Deployment resource for the NGINX app, and a LoadBalancer Service to publicly access NGINX, for example.

  6. After 3-5 minutes, your cluster will be ready, and the kubeconfig JSON you’ll use to connect to the cluster will be available as an output.

    To access your cluster, save your kubeconfig stack output to a file and then use that when running the kubectl command. For instance, this lists your pods:

    Terminal window
    pulumi stack output kubeconfig --show-secrets > kubeconfig
    KUBECONFIG=./kubeconfig kubectl get pods
  7. Pulumi understands which changes to a given cloud resource can be made in-place, and which require replacement, and computes the minimally disruptive change to achieve the desired state. Let’s make a small change:

    Terminal window
    pulumi config set appReplicaCount 7

    And then rerun pulumi up. Notice that it shows the preview of the changes, including a diff of the values changed. Select “yes” to perform the update.

  8. From here, feel free to experiment a little bit. Once you’ve finished experimenting, tear down your stack’s resources by destroying and removing it:

    Terminal window
    pulumi destroy --yes
    pulumi stack rm --yes

    This not only removes the underlying DigitalOcean cloud resources, but also deletes the stack and its history from Pulumi also.

Related

The infrastructure as code platform for any cloud.