KubeBlocks
BlogsKubeBlocks Cloud
Overview
Quickstart

Topologies

MySQL Semi-Synchronous Cluster
MySQL Cluster with ProxySQL
MySQL Group Replication Cluster
MySQL Group Replication with ProxySQL
MySQL Cluster with Orchestrator
MySQL with Orchestrator & ProxySQL

Operations

Lifecycle Management
Vertical Scaling
Horizontal Scaling
Volume Expansion
Manage MySQL Services
Minor Version Upgrade
Modify MySQL Parameters
Planned Switchover in MySQL
Decommission MySQL Replica
Recovering MySQL Replica

Backup And Restores

Create BackupRepo
Create Full Backup
Scheduled Backups
Scheduled Continuous Backup
Restore MySQL Cluster
Restore with PITR

Custom Secret

Custom Password
Custom Password Policy

TLS

MySQL Cluster with TLS
MySQL Cluster with User-Provided TLS
MySQL Cluster with mTLS

Monitoring

Observability for MySQL Clusters

Advanced Pod Management

Custom Scheduling Policies
Custom Pod Resources
Pod Management Parallelism
Using OnDelete for Controlled Pod Updates
Gradual Rolling Update
  1. Prerequisites
  2. Deploy a MySQL Semi-Synchronous Cluster
  3. Verifying the Deployment
  4. Add a Custom Replica with Different Resource Configurations
  5. Verifying the Deployment
  6. Expose the custom Pod as a Service
    1. Verify the Update
    2. Accessing Your Custom Pod via the Service
  7. Cleanup
  8. Conclusion

Customizing Pod Resource Configurations and Labels in a MySQL Cluster Managed by KubeBlocks

In certain scenarios, different Pods within the same database cluster may require varying resource allocations. For example:

  • Some replicas dedicated to report generation might leverage additional resources to handle analytical queries efficiently.

With KubeBlocks, you can customize Pod resource configurations and labels to tailor each instance to meet its unique requirements. This guide demonstrates how to deploy a MySQL cluster with a custom replica provisioned with higher CPU and memory resources.

Prerequisites

Before proceeding, ensure the following:

  • Environment Setup:
    • A Kubernetes cluster is up and running.
    • The kubectl CLI tool is configured to communicate with your cluster.
    • KubeBlocks CLI and KubeBlocks Operator are installed. Follow the installation instructions here.
  • Namespace Preparation: To keep resources isolated, create a dedicated namespace for this tutorial:
kubectl create ns demo
namespace/demo created

Deploy a MySQL Semi-Synchronous Cluster

Deploy a 2-node semi-sync MySQL cluster (1 primary, 1 secondary):

kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1
kind: Cluster
metadata:
  name: example-mysql-cluster
  namespace: demo
spec:
  clusterDef: mysql
  topology: semisync
  terminationPolicy: Delete
  componentSpecs:
    - name: mysql
      serviceVersion: 8.0.35
      replicas: 2
      resources:
        limits:
          cpu: '0.5'
          memory: 0.5Gi
        requests:
          cpu: '0.5'
          memory: 0.5Gi
      volumeClaimTemplates:
        - name: data
          spec:
            storageClassName: ""
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 20Gi
EOF

Verifying the Deployment

Monitor the cluster status and wait until the STATUS changes to Running:

kubectl get cluster example-mysql-cluster -n demo -w

Expected Output:

NAME                    CLUSTER-DEFINITION   TERMINATION-POLICY   STATUS    AGE
example-mysql-cluster   mysql                Delete               Creating   17s
example-mysql-cluster   mysql                Delete               Running   2m33s

Add a Custom Replica with Different Resource Configurations

To add a new replica with higher CPU and memory allocations, update the cluster specification as follows:

kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1
kind: Cluster
metadata:
  name: example-mysql-cluster
  namespace: demo
spec:
  clusterDef: mysql
  topology: semisync
  terminationPolicy: Delete
  componentSpecs:
    - name: mysql
      serviceVersion: 8.0.35
      replicas: 3
      resources:
        limits:
          cpu: '0.5'
          memory: 0.5Gi
        requests:
          cpu: '0.5'
          memory: 0.5Gi
      volumeClaimTemplates:
        - name: data
          spec:
            storageClassName: ""
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 20Gi
      instances:
        - name: custom
          replicas: 1
          labels:
            custom-resource-config: "true"
          resources:
            limits:
              cpu: 1
              memory: 1Gi
            requests:
              cpu: 1
              memory: 1Gi
EOF

Explanation:

  • Default Resource Configuration: The mysql component is configured with 0.5 CPU and 0.5Gi memory per Pod.
  • Custom Resource Configuration: A single instance (custom) is configured with 1 CPU and 1Gi memory.

Verifying the Deployment

Monitor the cluster status until it returns to Running:

kubectl get cluster -n demo -w

Example Output:

NAME                    CLUSTER-DEFINITION   TERMINATION-POLICY   STATUS     AGE
example-mysql-cluster   mysql                Delete               Updating   79s
example-mysql-cluster   mysql                Delete               Running   2m44s

List all the Pods in the cluster:

kubectl get pods -n demo

Expected Output:

NAME                                   READY   STATUS    RESTARTS   AGE
example-mysql-cluster-mysql-0          4/4     Running   0          2m49s
example-mysql-cluster-mysql-1          4/4     Running   0          2m49s
example-mysql-cluster-mysql-custom-0   4/4     Running   0          97s

Observation:

  • The custom Pod name includes "-custom" in the middle (e.g., 'example-mysql-cluster-mysql-custom-0'), reflecting the instance template name "custom".

Use the KubeBlocks CLI to check the cluster and verify the resource configurations:

kbcli cluster describe example-mysql-cluster -n demo

Expected Output:

Resources Allocation:
COMPONENT   INSTANCE-TEMPLATE   CPU(REQUEST/LIMIT)   MEMORY(REQUEST/LIMIT)   STORAGE-SIZE   STORAGE-CLASS
mysql       custom              1 / 1                1Gi / 1Gi               data:20Gi      <none>
mysql                           500m / 500m          512Mi / 512Mi           data:20Gi      <none>

Observation:

  • The default replica has 0.5 CPU and 0.5Gi memory.
  • The custom replica has 1 CPU and 1Gi memory.

Expose the custom Pod as a Service

To expose the custom Pod via a separate Service, use the following configuration:

kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1
kind: Cluster
metadata:
  name: example-mysql-cluster
  namespace: demo
spec:
  clusterDef: mysql
  topology: semisync
  terminationPolicy: Delete
  # expose a service
  services:
    - name: custom-pod
      componentSelector: mysql
      serviceName: custom-pod
      spec:
        selector:
          custom-resource-config: "true"
        ipFamilyPolicy: PreferDualStack
        ports:
          - name: tcp-mysql
            port: 3306
            protocol: TCP
            targetPort: mysql
        type: ClusterIP
  componentSpecs:
    - name: mysql
      serviceVersion: 8.0.35
      replicas: 3
      resources:
        limits:
          cpu: '0.5'
          memory: 0.5Gi
        requests:
          cpu: '0.5'
          memory: 0.5Gi
      volumeClaimTemplates:
        - name: data
          spec:
            storageClassName: ""
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 20Gi
      instances:
        - name: custom
          replicas: 1
          labels:
            custom-resource-config: "true"
          resources:
            limits:
              cpu: 1
              memory: 1Gi
            requests:
              cpu: 1
              memory: 1Gi
EOF

Verify the Update

Check the Cluster status:

kubectl get cluster -n demo -w

Example Output:

NAME                    CLUSTER-DEFINITION   TERMINATION-POLICY   STATUS     AGE
example-mysql-cluster   mysql                Delete               Updating   16m
example-mysql-cluster   mysql                Delete               Running    17m

Then list the Services:

kubectl get svc -n demo

Example Output:

NAME                                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                 AGE
example-mysql-cluster-custom-pod       ClusterIP   172.20.202.249   <none>        3306/TCP                                                12m
example-mysql-cluster-mysql            ClusterIP   172.20.11.166    <none>        3306/TCP                                                12m
example-mysql-cluster-mysql-headless   ClusterIP   None             <none>        3306/TCP,3601/TCP,9104/TCP,3501/TCP,3502/TCP,9901/TCP   12m

Accessing Your Custom Pod via the Service

Retrieve the root credentials:

kubectl get secrets -n demo  example-semisync-mysql-mysql-account-root -o jsonpath='{.data.username}' | base64 -d

kubectl get secrets -n demo example-mysql-cluster-mysql-account-root -o jsonpath='{.data.password}' | base64 -d

Expected Output:

root

uk263gR24s

Connect to the custom Pod from inside one of the MySQL containers:

kubectl exec -it example-mysql-cluster-mysql-0 -n demo -- mysql -hexample-mysql-cluster-custom-pod -uroot -puk263gR24s

This custom Pod is provisioned with additional resources, making it ideal for running complex queries or analytical workloads.

Cleanup

To remove all created resources, delete the MySQL cluster along with its namespace:

kubectl delete cluster example-mysql-cluster -n demo
kubectl delete ns demo

Conclusion

By customizing Pod resource configurations and labels through KubeBlocks, you can build a flexible and resource-efficient MySQL environment. Whether you need a powerful primary instance or specialized report-generation replicas, KubeBlocks Operator enables you to fine-tune each Pod’s CPU, memory, and storage according to workload demands.

© 2025 ApeCloud PTE. Ltd.