Skip to content

For help, click the link below to get free database assistance or contact our experts for personalized support.

Delete Percona Operator for MySQL based on Percona Server for MySQL

You may have different reasons to clean up your Kubernetes environment: moving from trial deployment to a production one, testing experimental configurations and the like. In either case, you need to remove some (or all) of these objects:

  • Percona Server for MySQL managed by the Operator
  • Percona Operator for MySQL itself
  • Custom Resource Definition deployed with the Operator
  • Resources like PVCs and Secrets

Delete the database cluster

To delete the database cluster means to delete the Custom Resource associated with it.

Note

There are 2 finalizers defined in the Custom Resource, which define whether to delete or preserve TLS-related objects and data volumes when the cluster is deleted.

  • finalizers.percona.com/delete-mysql-pvc: if present, Persistent Volume Claims for the database cluster Pods are deleted along with the cluster deletion.
  • finalizers.percona.com/delete-ssl: if present, objects, created for SSL (Secret, certificate, and issuer) are deleted along with the cluster deletion.

These finalizers are off by default in the deploy/cr.yaml configuration file, and it allows you to recreate the cluster without losing data, credentials for the system users, etc. You can always delete TLS-related objects and PVCs manually, if needed.

The steps are the following:

  1. List the Custom Resources. Replace the <namespace> placeholder with your value

    $ kubectl get ps -n <namespace>
    
  2. Delete the Custom Resource with the name of your cluster

    $ kubectl delete ps <cluster_name> -n <namespace>
    
    Sample output
    perconaservermysql.ps.percona.com "cluster1" deleted
    

    It may take a while to stop and delete the cluster.

  3. Check that the cluster is deleted by listing the Custom Resources again:

    $ kubectl get ps -n <namespace>
    
    Sample output
    No resources found in <namespace> namespace.
    

Delete the Operator

Choose the instructions relevant to the way you installed the Operator.

To uninstall the Operator, delete the Deployments related to it.

  1. List the deployments. Replace the <namespace> placeholder with your namespace.

    $ kubectl get deploy -n <namespace>
    
    Sample output
    NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
    percona-server-mysql-operator   1/1     1            1           42m
    
  2. Delete the percona-* deployment

    $ kubectl delete deploy percona-server-mysql-operator -n <namespace>
    
    Sample output
    deployment.apps "percona-server-mysql-operator" deleted
    
  3. Check that the Operator is deleted by listing the Pods. As a result you should have no Pods related to it.

    $ kubectl get pods -n <namespace>
    
    Sample output
    No resources found in <namespace> namespace.
    
  4. If you are not just deleting the Operator and Percona Server for MySQL from a specific namespace, but want to clean up your entire Kubernetes environment, you can also delete the CustomRecourceDefinitions (CRDs) .

    Warning: CRDs in Kubernetes are non-namespaced but are available to the whole environment. This means that you shouldn’t delete CRDs if you still have the Operator and database cluster in some namespace.

    Get the list of CRDs.

    $ kubectl get crd
    
    Sample output
    NAME                                        CREATED AT
    perconaservermysqlbackups.ps.percona.com    2025-02-07T20:10:42Z
    perconaservermysqlrestores.ps.percona.com   2025-02-07T20:10:42Z
    perconaservermysqls.ps.percona.com          2025-02-07T20:10:42Z
    
  5. Delete the percona*.ps.percona.com CRDs

    $ kubectl delete crd perconaservermysqlbackups.ps.percona.com perconaservermysqlrestores.ps.percona.com perconaservermysqls.ps.percona.com
    
    Sample output
    customresourcedefinition.apiextensions.k8s.io "perconaservermysqlbackups.ps.percona.com" deleted
    customresourcedefinition.apiextensions.k8s.io "perconaservermysqlrestores.ps.percona.com" deleted
    customresourcedefinition.apiextensions.k8s.io "perconaservermysqls.ps.percona.com" deleted
    

To delete the Operator, do the following:

  1. List the Helm charts:

    $ helm list -n <namespace>
    
    Sample output
    cluster1    <namespace>         1           2023-10-31 10:18:10.763049 +0100 CET    deployed    ps-db-0.9.0        0.9.0
    my-op       <namespace>         1           2023-10-31 10:15:18.41444 +0100 CET     deployed    ps-operator-0.9.0   0.9.0
    
  2. Delete the release object for Percona XtraDB Cluster

    $ helm uninstall cluster1 --namespace <namespace>
    
  3. Delete the release object for the Operator

    $ helm uninstall my-op --namespace <namespace>
    

Clean up resources

By default, TLS-related objects and data volumes remain in Kubernetes environment after you delete the cluster to allow you to recreate it without losing the data (unless you overwrite this behaviour by turning on percona.com/delete-mysql-pvc and/or percona.com/delete-ssl finalizers). You can always delete TLS-related objects and PVCs manually. If you wish to delete them, do the following:

  1. Delete Persistent Volume Claims.

    1. List PVCs. Replace the <namespace> placeholder with your namespace:

      $ kubectl get pvc -n <namespace>
      
      Sample output
      NAME                     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
      datadir-cluster1-mysql-0   Bound    pvc-8683d0ab-7ed4-48cb-93a9-bc6ceb6ec285   2G         RWO            standard       <unset>                 47m
      datadir-cluster1-mysql-1   Bound    pvc-fbc5a8a4-94ff-4259-9d15-f798c97e0788   2G         RWO            standard       <unset>                 45m
      datadir-cluster1-mysql-2   Bound    pvc-4c164ff3-a4f5-431c-9aa8-e5c7eb71a31b   2G         RWO            standard       <unset>                 44m
      
    2. Delete PVCs related to your cluster. The following command deletes PVCs for the cluster1 cluster:

      $ kubectl delete pvc datadir-cluster1-mysql-0 datadir-cluster1-mysql-1 datadir-cluster1-mysql-2 -n <namespace>
      
      Sample output
      persistentvolumeclaim "datadir-cluster1-mysql-0" deleted
      persistentvolumeclaim "datadir-cluster1-mysql-1" deleted
      persistentvolumeclaim "datadir-cluster1-mysql-2" deleted
      
  2. Delete the Secrets

    1. List Secrets:

      $ kubectl get secrets -n <namespace>
      
    2. Delete the Secret:

      $ kubectl delete secret <secret_name> -n <namespace>
      

Last update: 2025-02-20