Sitemap
Dev Genius

Coding, Tutorials, News, UX, UI and much more related to development

Cluster-Wizard Deployment

With provided server certificates and load balancer

5 min readAug 26, 2025

--

In this article, we will deploy Cluster Wizard and Wizard Client WebUI. Cluster Wizard is a simple server virtualization platform with network management. Wizard Client WebUI is a web client for Cluster Wizard.

Environment for Deployment

Here, we assume that we have server certificates for both Cluster Wizard and Wizard Client WebUI. We also assume that a load balancer and CloudNativePG are installed on a Kubernetes cluster.

Cluster Wizard Deployment

First, we create a namespace called cluster-wizard.

kubectl create namespace cluster-wizard

Secrets for Cluster Wizard License and Ceph Configuration

A trial license can be requested in the cluster-wizard website. Once a license file is obtained, we create a secret that holds the license file.

kubectl -n cluster-wizard create secret generic cw-license \
--from-file=license=[license file]

Now, if you have a Ceph RBD pool for VM image storage, we need to provide another secret for a Ceph configuration.

kubectl -n cluster-wizard create secret generic cluster-wizard-ceph \
--from-file=conf=[ceph.conf] --from-file=keyring=[keyring file]

How to obtain these files is shown in the basic Ceph tutorial for Cluster Wizard page. Please note that this is an optional step if you decide to use Ceph as a VM image storage.

Secrets for Server/Client CA Certificates

We assume that we have a trusted certificate for Cluster Wizard server. Here, we will create a TLS Kubernetes secret.

kubectl -n cluster-wizard create secret tls cw-server-cert \
--cert=[cert file] --key=[key file]

Cluster Wizard authenticate users with certificates, so it establish mTLS (Mutual TLS) communication between Cluster Wizard and Wizard Client. For this purpose, we create a CA certificate for client certificates using cert manager. If it is not installed, the following command will install it.

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.18.2/cert-manager.yaml

First, we create an issuer.

---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: cluster-wizard-issuer
namespace: cluster-wizard
spec:
selfSigned: {}

Then, we create a CA certificate for client certificates.

---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: cw-client-ca
namespace: cluster-wizard
spec:
isCA: true
commonName: CORESPEQ INC
secretName: cw-client-ca
privateKey:
algorithm: RSA
encoding: PKCS8
size: 2048
rotationPolicy: Never
duration: 87600h
issuerRef:
name: cluster-wizard-issuer
kind: Issuer

CloudNativePG Postgresql Database (Optional)

By default, a new Postgresql database will be deployed if postgres.install is true. Here, we want to use an external database created by CloudNativePG. A guide to install CloudNativePG can be found here.

---
apiVersion: v1
kind: Secret
metadata:
namespace: cluster-wizard
name: postgres-admin-secret
type: kubernetes.io/basic-auth
stringData:
username: "postgres"
password: "[your-password]"
---
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
namespace: cluster-wizard
name: cnpg-postgres
spec:
imageName: ghcr.io/cloudnative-pg/postgresql:17.5
instances: 2
enablePDB: false
enableSuperuserAccess: true
superuserSecret:
name: postgres-admin-secret
storage:
storageClass: rook-ceph-block
size: 2Gi
bootstrap:
initdb:
localeCollate: 'en_US.UTF-8'
localeCType: 'en_US.UTF-8'

Once we apply these two yaml files, it will take a few minutes for the database to be ready.

Cluster Wizard Deployment

We use a helm chart to deploy Cluster Wizard. We will download the latest chart (version 0.1.0).

helm repo add cluster-wizard https://charts.cluster-wizard.com/
helm repo update cluster-wizard
helm search repo cluster-wizard/cluster-wizard --versions
helm fetch cluster-wizard/cluster-wizard --version 0.1.0 --untar

We need to prepare override values.

---
ceph:
enabled: true # change to false if ceph is not used
secretName: "cluster-wizard-ceph"
pool: "[libvirt-pool]"
user: "[user name]"

licenseSecretName: "cw-license"

clusterWizardCert:
clientCASecretName: "cw-client-ca"
serverSecretName: "cw-server-cert"

adminUser: "[admin user name]"
adminEmail: "[admin email account]"

postgres:
ssl: false
install:
install: false # change to true if an external database is not available.
tag: "17.5"
populateDB: true
password: "[your-password]"
cwUser: "app"
cwPassword: "[app user password]"
cwDBName: "app"
host: "cnpg-postgres-rw.cluster-wizard.svc.cluster.local"

expose:
type: loadBalancer
loadBalancer:
IP: "[your load balancer IP address]"

In the override.yaml file above, the only missing information is the value of cwPassword, [app user password]. This password can be extracted from this command.

kubectl -n cluster-wizard get secrets cnpg-postgres-app \
-ojsonpath={.data.password} | base64 -d

Secret cnpg-postgres-app was automatically created when CloudNativePG deploy cnpg-postgres Postgresql cluster.

Get DaeGon Kim’s stories in your inbox

Join Medium for free to get updates from this writer.

Finally, we are ready to install Cluster Wizard.



helm -n cluster-wizard install cluster-wizard ./cluster-wizard \
-f ./override.yaml

This completes Cluster Wizard Deployment.

Press enter or click to view image in full size
Cluster Wizard Deployment with CloudNativePG Postgres database

Wizard Client Web UI Deployment

Now, we will deploy Wizard Client WebUI for Cluster Wizard.

First, we create a namespace called wizard-client.

kubectl create namespace wizard-client

Secrets for Server CA Certificate

Assume that we have certificate and key for wizard-client WebUI server.

kubectl -n wizard-client create secret tls wc-server-cert \
--cert=[path to cert file] --key=[path to private key file]

Wizard Client WebUI Deployment

We have already added helm repo and updated the repo in Cluster Wizard deployment. We will get the latest helm chart (chart version 0.1.0).

helm search repo cluster-wizard/wizard-client-webui --versions
helm fetch cluster-wizard/wizard-client-webui --version 0.1.0 --untar

Now, we need to write an override values file.

---
configMap:
backendUrl: "[URL for wizard-client webUI web server]:23051"
frontendUrl: "[URL for wizard-client webUI web server]"

clusterWizardHost: &clusterWizardHost "[cluster wizard URL or address]"
clusterWizardPort: "50001"

expose:
type: loadBalancer
internalTLS:
enabled: true
secretName: "wc-server-cert"
loadBalancer:
IP: "[load balancer IP address for wizard-client webUI web server]"
ports:
frontPort: 443
backPort: 23051

Now, we are ready to deploy Wizard Client.

helm -n wizard-client install wizard-client ./wizard-client-webui \
--values ./override.yaml

Please note that we assume that DNS entries for Cluster-Wizard and Wizard-Client have been registered (as public/private DNS entries or in /etc/hosts).

This completes Wizard Client WebUI deployment.

Press enter or click to view image in full size
Wizard Client Deployment

Access to Wizard Client WebUI

Press enter or click to view image in full size
Wizard Client WebUI — login page

Now, we can access Wizard Client WebUI server. The admin certificate file and admin private key file can be extracted from Cluster Wizard Deployment with the following commands.

kubectl -n cluster-wizard get secrets admin-cred -ojsonpath={.data.cert} \
| base64 -d > admin.crt
kubectl -n cluster-wizard get secrets admin-cred -ojsonpath={.data.private_key} \
| base64 -d > system-cw-daegon.key
Press enter or click to view image in full size
The first page after the login

Please note that five bare-metal hosts has already been added. To add KVM hosts to Wizard cluster system, Node Wizard needs to be installed on the hosts. The installation is simple and the installation instructions are available in the Node Wizard Installation page.

More Articles

--