Using kubernetes pkg.crossplane.io with clickhouse.altinity.com
TypeScriptIn this program, we will use Pulumi to deploy a Kubernetes cluster and then install a ClickHouse database on it using two different providers:
pkg.crossplane.io
for Kubernetes andclickhouse.altinity.com
for ClickHouse.To bring up a Kubernetes cluster, we'll use the Crossplane Kubernetes provider, which allows for the provisioning and management of cloud and on-premises resources in a Kubernetes way. We will configure a
ProviderConfig
resource to communicate with the cloud provider and then deploy aCluster
resource to create the actual Kubernetes cluster.Next, to deploy ClickHouse on the Kubernetes cluster we've provisioned, we will use the ClickHouse operator from Altinity, a ClickHouse technology company. This operator will manage the ClickHouse installation inside our Kubernetes cluster. We'll apply the required custom resource definitions (CRDs) and then deploy a ClickHouse cluster with a
ClickHouseInstallation
resource.Here's how we'll execute each of these steps in TypeScript using Pulumi:
import * as kubernetes from "@pulumi/kubernetes"; import * as pulumi from "@pulumi/pulumi"; import * as crossplane from "@crossplane/pulumi-provider"; // Step 1: Configure Crossplane provider to manage Kubernetes resources. // NOTE: We assume that the ProviderConfig is preconfigured in the cluster where Crossplane is installed. // Define where the provider config is located. const providerConfig = new crossplane.ProviderConfig('crossplane-provider', { metadata: { name: 'default' }, spec: { credentials: { source: 'InjectedIdentity', }, }, }); // Step 2: Create a Kubernetes cluster using the known provider. const cluster = new crossplane.kubernetes.Cluster('cluster', { spec: { forProvider: { // You'll need to configure the following parameters according to your cloud provider. // Refer to https://www.pulumi.com/docs/reference/pkg/kubernetes/cluster/ for detailed information. // For example on AWS, you might specify `clusterClassRef` and `clusterConfigRef` // that include necessary details like VPC configuration, node type, and so on. }, }, // You'll need to specify the provider configuration that Crossplane will use to create this resource. providerConfigRef: { name: providerConfig.metadata.name, }, }); // Step 3: Deploy ClickHouse operator into the Kubernetes cluster. // Here we'll use the `ClickHouseInstallation` resource from `clickhouse.altinity.com` // to deploy the ClickHouse database in the Kubernetes cluster created above. // First, we need to make sure that our Pulumi program `dependsOn` the cluster being ready. // We can use `pulumi.interpolation` to ensure that the values we need from the cluster will be // available when we attempt to use them. const clickHouseOperator = new kubernetes.yaml.ConfigGroup('clickhouse-operator', { files: ['https://raw.githubusercontent.com/Altinity/clickhouse-operator/master/deploy/operator/clickhouse-operator-install.yaml'], }, { dependsOn: cluster }); // Step 4: Define our ClickHouseInstallation // Note: Using `kubernetes.yaml.ConfigGroup` here to apply raw YAML, which would contain // ClickHouseInstallation kind. In a more practical scenario, you would construct // this resource using `kubernetes.apiextensions.CustomResource`. const clickHouseInstallation = new kubernetes.yaml.ConfigGroup('clickhouse-installation', { files: ['clickhouse-installation.yaml'], }, { dependsOn: clickHouseOperator }); // Export the kubeconfig for the newly created cluster export const kubeconfig = cluster.status.atProvider.kubeconfig;
In the above program:
- We started by setting up the Crossplane provider config which tells Crossplane how to authenticate with the cloud provider's API.
- We created a Kubernetes cluster resource through Crossplane. You must fill in the provider-specific details in the
forProvider
property. For this step, you should refer to the Crossplane's documentation for the specific provider you're using. - We used the
kubernetes.yaml.ConfigGroup
resource from the Pulumi Kubernetes SDK to apply the ClickHouse operator YAML directly from its GitHub repository. We made sure it depends on the cluster being ready. - We created another
kubernetes.yaml.ConfigGroup
resource for our ClickHouse installation, pointing to a localclickhouse-installation.yaml
file which would contain the appropriate CRD definition for a ClickHouse cluster. This also depends on the ClickHouse operator being deployed.
The result is a program that declares our intent to deploy a Kubernetes cluster and then use that cluster to host a ClickHouse database.
Please replace the placeholder comments with the actual configuration according to your cloud provider's requirements and the ClickHouse cluster specifications you desire. You will also need to create a
clickhouse-installation.yaml
file with the definition for the ClickHouse cluster as per the ClickHouse Altinity operator's requirements.