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. This is demonstrated in Python.
To follow this example, you will need:
- Install Pulumi
- Register for a DigitalOcean Account
- Generate a DigitalOcean personal access token
- Install
kubectl
for accessing your cluster
If you want to configure the optional DigitalOcean DNS records at the end, you will also need:
- Obtain a domain name and configure it to use DigitalOcean nameservers
After cloning this repo, from this working directory, run these commands:```
-
Create a new Pulumi stack, which is an isolated deployment target for this example:
$ pulumi stack init dev
-
Create a Python virtualenv, activate it, and install dependencies:
This installs the dependent packages needed for our Pulumi program.
$ python3 -m venv venv $ source venv/bin/activate $ pip3 install -r requirements.txt
-
Configure Pulumi to use your DigitalOcean personal access token:
$ pulumi config set digitalocean:token <YOUR_TOKEN_HERE> --secret
-
(Optional) If you wish to use a custom domain name, configure it now:
$ pulumi config set domainName <YOUR_DOMAIN_NAME>
-
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.
$ 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: + ingressIp : "157.230.199.202" Resources: + 7 created Duration: 6m5s
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 LoadBalancerService
to publicly access NGINX, for example. -
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 thekubectl
command. For instance, this lists your pods:$ pulumi stack output kubeconfig > kubeconfig $ KUBECONFIG=./kubeconfig kubectl get pods
-
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:
$ 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. -
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:
$ 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.