1. Answers
  2. Using Kubernetes Stackgres.io With Upgrade.cattle.io

Using Kubernetes Stackgres.io With Upgrade.cattle.io

Introduction

In this guide, we will set up a Kubernetes environment using Pulumi to deploy StackGres, a Kubernetes-native Postgres operator, and integrate it with Rancher’s upgrade controller (upgrade.cattle.io). This setup will involve creating a Kubernetes cluster, deploying StackGres, and configuring the upgrade controller to manage StackGres upgrades.

Step-by-Step Explanation

Step 1: Setting Up the Kubernetes Cluster

First, we need to create a Kubernetes cluster. We will use AWS EKS for this purpose.

Step 2: Deploying StackGres

Next, we will deploy StackGres to the Kubernetes cluster. This involves creating the necessary namespaces, CRDs, and deploying the StackGres operator.

Step 3: Configuring the Upgrade Controller

Finally, we will configure Rancher’s upgrade controller (upgrade.cattle.io) to manage StackGres upgrades. This involves setting up the necessary CRDs and configurations.

Conclusion

By following these steps, you will have a Kubernetes environment with StackGres deployed and managed by Rancher’s upgrade controller. This setup ensures that your Postgres instances are always up-to-date and managed efficiently.

Full Code Example

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
import * as eks from "@pulumi/eks";
import * as k8s from "@pulumi/kubernetes";

// Step 1: Setting Up the Kubernetes Cluster
const vpc = aws.ec2.getVpc({ default: true });
const subnets = vpc.then(vpc => aws.ec2.getSubnets({ filters: [{ name: "vpc-id", values: [vpc.id] }] }));

const cluster = new eks.Cluster("eksCluster", {
    instanceType: "t2.medium",
    desiredCapacity: 2,
    minSize: 1,
    maxSize: 3,
    vpcId: vpc.then(vpc => vpc.id),
    subnetIds: subnets.then(subnets => subnets.ids),
});

// Export the cluster's kubeconfig
export const kubeconfig = cluster.kubeconfig;

// Create a Kubernetes provider instance
const k8sProvider = new k8s.Provider("k8sProvider", {
    kubeconfig: cluster.kubeconfig,
});

// Step 2: Deploying StackGres
const stackgresNamespace = new k8s.core.v1.Namespace("stackgresNamespace", {
    metadata: { name: "stackgres" },
}, { provider: k8sProvider });

const stackgresCrd = new k8s.apiextensions.v1.CustomResourceDefinition("stackgresCrd", {
    metadata: { name: "stackgresclusters.stackgres.io" },
    spec: {
        group: "stackgres.io",
        versions: [{ name: "v1", served: true, storage: true }],
        scope: "Namespaced",
        names: {
            plural: "stackgresclusters",
            singular: "stackgrescluster",
            kind: "StackGresCluster",
            shortNames: ["sgc"],
        },
    },
}, { provider: k8sProvider });

const stackgresOperator = new k8s.apps.v1.Deployment("stackgresOperator", {
    metadata: { namespace: stackgresNamespace.metadata.name },
    spec: {
        selector: { matchLabels: { app: "stackgres-operator" } },
        replicas: 1,
        template: {
            metadata: { labels: { app: "stackgres-operator" } },
            spec: {
                containers: [{
                    name: "stackgres-operator",
                    image: "stackgres/stackgres-operator:latest",
                }],
            },
        },
    },
}, { provider: k8sProvider });

// Step 3: Configuring the Upgrade Controller
const upgradeControllerCrd = new k8s.apiextensions.v1.CustomResourceDefinition("upgradeControllerCrd", {
    metadata: { name: "upgrades.upgrade.cattle.io" },
    spec: {
        group: "upgrade.cattle.io",
        versions: [{ name: "v1", served: true, storage: true }],
        scope: "Namespaced",
        names: {
            plural: "upgrades",
            singular: "upgrade",
            kind: "Upgrade",
            shortNames: ["upg"],
        },
    },
}, { provider: k8sProvider });

const upgradeControllerDeployment = new k8s.apps.v1.Deployment("upgradeControllerDeployment", {
    metadata: { namespace: stackgresNamespace.metadata.name },
    spec: {
        selector: { matchLabels: { app: "upgrade-controller" } },
        replicas: 1,
        template: {
            metadata: { labels: { app: "upgrade-controller" } },
            spec: {
                containers: [{
                    name: "upgrade-controller",
                    image: "rancher/upgrade-controller:latest",
                }],
            },
        },
    },
}, { provider: k8sProvider });

Deploy this code

Want to deploy this code? Sign up for a free Pulumi account to deploy in a few clicks.

Sign up

New to Pulumi?

Want to deploy this code? Sign up with Pulumi to deploy in a few clicks.

Sign up