MySQL operators for Kubernetes compared (2026)
To run MySQL on Kubernetes you usually pick an operator: a controller that provisions the database, keeps replication healthy, fails over when the primary dies and takes backups. Several are actively maintained, and they differ in which MySQL they run, how they stay available and how far back you can restore.
We maintain CNMSQL, so we are not neutral. Every fact below comes from each project's own documentation, listed under Sources, and there is a full section on what CNMSQL cannot do. If something is wrong or out of date, open an issue.
The short versionโ
- A vendor-maintained operator with a GA release: one of Percona's two operators. One runs Percona XtraDB Cluster (Galera), the other runs Percona Server with Group Replication.
- Oracle MySQL, InnoDB Cluster or the Enterprise edition: Oracle's MySQL Operator.
- More writes than one primary can take: Vitess.
- MariaDB with Galera or MaxScale: mariadb-operator.
- Plain semi-sync replication, no proxy: MOCO or CNMSQL.
- One platform for many database engines: KubeDB (commercial) or KubeBlocks (AGPL-3.0).
- CloudNativePG-style operations for MySQL: CNMSQL. It offers continuous binlog archiving with point-in-time recovery to a time or a GTID, and one API for Percona Server and MariaDB. It is four months old, so read what it does not do first.
Feature comparisonโ
Checked on 16 October 2026. Numbers in the table refer to the notes under it.
- Supported
- Partial, with caveats, or tech preview
- Not supported
- Not found in the docs we checked
Scroll sideways to see every project.
| Feature | CNMSQL | Percona XtraDB Cluster operator | Percona Server operator | Oracle MySQL Operator | MOCO | Vitess Operator | mariadb-operator | KubeDB | KubeBlocks |
|---|---|---|---|---|---|---|---|---|---|
| Project | |||||||||
| License | Apache-2.0 | Apache-2.0 | Apache-2.0 | UPL 1.0 | Apache-2.0 | Apache-2.0 | MIT | Commercial1 | AGPL-3.0 |
| Latest release | 0.8.0 (Sep 2026)2 | 1.20.0 (Jun 2026) | 1.2.0 (Jul 2026) | 26.7.0-2.3.0 (Jul 2026) | 0.37.0 (Sep 2026) | 2.17.1 (Sep 2026) | 26.10.1 (Sep 2026) | v2026.10.12 | 1.0.2 (Feb 2026) |
| Database engines | |||||||||
| MySQL | Percona Server 8.0, 8.4 | Percona XtraDB Cluster 5.7, 8.0, 8.4 | Percona Server 8.0, 8.4 | MySQL 8.4, 9.7, 26.7 | MySQL 8.0, 8.4 | MySQL, through Vitess 24 | MariaDB only | Yes | MySQL 5.7, 8.0, 8.4 |
| MariaDB | 10.11, 11.4, 12.3 | No | No | No | No | No | 10.6 and later | Separate resource | Separate addon |
| High availability | |||||||||
| Async or semi-sync, with failover | Async or semi-sync | Galera instead | Async, tech preview3 | Group Replication only | Semi-sync, up to 5 instances | Failover by VTOrc | Async | Semi-sync | Yes |
| Group Replication | Single-primary4 | No | GA | InnoDB Cluster | No | No | Not in MariaDB | Also InnoDB Cluster | Yes |
| Galera | No | Yes5 | No | No | No | No | Yes | Separate resources | Not documented |
| Sharding | No | No | No | No | No | Yes | No | No | No |
| Standby cluster in another region | Planned6 | Multi-site replication | Group Replication only (1.2.0) | Not documented | Replicates from an external MySQL | Zones in one Kubernetes cluster7 | Multi-cluster replication | Remote replica | Not documented |
| Client routing | |||||||||
| Native routing | Read-write, read-only and any-instance Services8 | Proxy by default9 | Not documented | Through MySQL Router | Primary and replica Services8 | Through vtgate | Primary and secondary Services | Not documented | Not documented |
| Proxy | No | HAProxy or ProxySQL | HAProxy or MySQL Router | MySQL Router | No | vtgate | MaxScale, optional | Not documented | Not documented |
| Connection pooling | No | With ProxySQL | Not documented10 | Not documented10 | No | vttablet pools | Not documented | Not documented | Not documented |
| Backup and recovery | |||||||||
| Physical backups | XtraBackup or mariadb-backup | XtraBackup | XtraBackup, incremental, encrypted | Logical dumps only | Logical dumps only | Builtin or XtraBackup engine | mariadb-backup, volume snapshots | Not documented | XtraBackup |
| Logical backups | mysqldump or mariadb-dump | XtraBackup only | XtraBackup only | MySQL Shell dump | MySQL Shell dump | MySQL Shell engine, experimental | mariadb-dump | Through KubeStash | mydumper |
| Backup storage | S3-compatible only11 | S3-compatible, Azure, volume | S3-compatible, GCS, Azure | S3, Azure, OCI, volume | S3-compatible, GCS, Azure | S3, GCS, Ceph, file | S3-compatible, Azure, volume | S3, GCS, Azure, volume | S3, GCS, Azure and others |
| Point-in-time recovery | To a time or a GTID12 | Yes13 | Tech preview | Not documented | Up to the last backup run14 | To a time or a GTID | Since 26.3.0 | Continuous archiving | Not documented |
| Day-2 operations | |||||||||
| Declarative users and databases | Database and DatabaseUser resources | Users in the cluster resource (1.16+)15 | System users only | Not documented | Operator accounts only | Keyspaces and vtgate users | User, Grant and Database resources | Not documented | Not documented |
| In-place major version upgrade | 8.0 to 8.416 | Only minor upgrades documented | Only minor upgrades documented | Not documented | Rolling, one instance at a time | Not documented | Not documented | UpdateVersion request | Not documented |
- Free only for databases created and destroyed within 30 days, such as dev or CI clusters. Production use needs a paid license.
- First release (0.1.0) on 18 June 2026. The API is still v1alpha1, and the repository lists three contributors.
- Percona labels asynchronous replication a tech preview and does not recommend it for production.
- MySQL 8.0.22 and later. Multi-primary mode is rejected, and a running cluster cannot switch between async replication and Group Replication.
- Galera needs primary keys and InnoDB tables, and large or conflicting transactions can fail certification. Commits wait for the cluster.
- The spec.replica field exists in the API, but the operator rejects it today. Cross-region recovery means restoring from the object store.
- The operator documentation describes replicating across availability zones within one Kubernetes cluster.
- Clients connect straight to the database Pod, with no extra hop. The application picks the read-write or read-only Service itself and reconnects after a failover.
- HAProxy is the default. The operator can also expose the XtraDB Cluster Pods directly.
- MySQL Router 8.4 can share and reuse server connections. We did not find an operator setting that turns it on.
- Any S3-compatible store, including AWS S3, MinIO, Ceph RGW, Cloudflare R2 and Backblaze B2. GCS works through its S3 interoperability API with HMAC keys. Azure Blob Storage and volumes are not supported.
- Binary logs are archived continuously to S3-compatible storage. Recovery cannot bring back transactions that were never archived and are missing from the new primary.
- A dedicated Pod uploads binary logs to S3-compatible or Azure storage at a configurable interval.
- Binary logs are collected at each backup run, not streamed. If the whole cluster is lost, up to one backup interval of writes can be lost.
- Users and grants are declared in the users section of the cluster resource. Removing a user from the resource does not drop it from the database.
- One series at a time, with a rolling restart and a switchover. MariaDB follows 10.11, 11.4, 12.3. Downgrades are not supported.
What CNMSQL does not doโ
Some of these are on the roadmap. Others are design choices.
| Area | Limitation |
|---|---|
| Maturity | First release in June 2026. The API is v1alpha1 and can change between minor releases; read the upgrade notes before every upgrade. |
| Scale | No sharding and no multi-primary writes. One primary takes every write. |
| Disaster recovery | No standby cluster in another region yet. Cross-region recovery means restoring from the object store. |
| Backup storage | S3-compatible object storage only. GCS works through its S3 interoperability API; Azure Blob Storage and volumes are not supported. |
| Routing | No proxy. Applications choose between Kubernetes Services. There is no read/write splitting or connection pooling. |
| Engines | Percona Server 8.0 and 8.4 only for MySQL. No Oracle MySQL images, no 5.7. On MariaDB: no Galera or Group Replication. |
| Changes in place | A cluster cannot switch between async replication and Group Replication, or between MySQL and MariaDB. Downgrades are not supported. |
| Recovery | Group Replication quorum loss needs a human to run kubectl cnmsql group recover. A diverged replica is re-initialized by hand, which discards its data. |
| Dependencies | cert-manager is required. No NetworkPolicy examples ship yet. |
Details: Group Replication, Replication and failover, Point-in-time recovery, MariaDB flavor.
The other options, in briefโ
Percona XtraDB Cluster operatorโ
The longest-running operator in this list (since 2018). It runs Galera-based synchronous replication behind HAProxy or ProxySQL.
- Pick it if: you want a mature vendor operator, still run 5.7, or need synchronous replication.
- Watch out for: Galera's rules on primary keys and large transactions, and the extra commit latency.
Percona Server operatorโ
Percona's operator for standard Percona Server. Group Replication has been GA since 1.0.0 (November 2025), and 1.2.0 added cross-site replication and encrypted backups.
- Pick it if: you want Group Replication with a vendor behind it.
- Watch out for: async replication and point-in-time recovery are still tech previews.
Oracle MySQL Operatorโ
Runs InnoDB Cluster (Group Replication plus MySQL Router) on Oracle's Community or Enterprise images.
- Pick it if: you are standardized on Oracle MySQL or need the Enterprise edition.
- Watch out for: backups are logical dumps only, point-in-time recovery is not documented, and only one cluster-wide operator can be installed.
MOCOโ
Cybozu's operator for GTID semi-sync replication on MySQL 8.0 and 8.4, up to five instances. It does not do Group Replication by design.
- Pick it if: you want plain MySQL replication from a small, focused operator.
- Watch out for: binlogs are collected at backup time, not streamed, and old backups are not deleted for you.
Vitess Operatorโ
Runs Vitess, a CNCF graduated project that shards MySQL behind the vtgate proxy.
- Pick it if: one primary cannot keep up with your writes or data size.
- Watch out for: more components to run, and
SQL limits on sharded keyspaces
such as no
CREATE PROCEDUREthrough Vitess and no uniqueauto_incrementacross shards.
mariadb-operatorโ
MariaDB only, with async replication or Galera, optional MaxScale, and point-in-time recovery since 26.3.0.
- Pick it if: you run MariaDB and want Galera or MaxScale.
- Compared with CNMSQL on MariaDB: CNMSQL has neither Galera nor MaxScale. It makes sense for MariaDB only if you want one operator for MariaDB and Percona Server.
KubeDBโ
AppsCode's commercial platform for many engines. For MySQL it supports Group Replication, InnoDB Cluster, semi-sync and remote replicas.
- Pick it if: you want one supported product across many databases.
- Watch out for: a paid license is needed for anything that lives longer than 30 days.
KubeBlocksโ
ApeCloud's multi-engine platform. Its MySQL addon supports replication, Group Replication and Orchestrator topologies on 5.7, 8.0 and 8.4.
- Pick it if: you want one platform for several engines.
- Watch out for: the AGPL-3.0 license, which some organizations do not allow.
Inactive projectsโ
Bitpoke mysql-operator (last release May 2023) and RadonDB MySQL Kubernetes (last release November 2024) are not archived, but we would not start a new deployment on either.
Managed servicesโ
If the database does not have to run inside your cluster, Amazon RDS, Google Cloud SQL or Azure Database for MySQL remove the need for an operator, at the cost of price, provider lock-in and control over versions.
How to chooseโ
- Engine. Oracle MySQL, Percona Server, Percona XtraDB Cluster or MariaDB? This alone rules out several options.
- Write scale. If one primary cannot keep up, look at Vitess.
- Disaster recovery. Need a standby in another region today? Look at the Percona operators, mariadb-operator or KubeDB.
- Data loss. Compare the point-in-time recovery row, and check whether it is GA or a tech preview.
- Proxy or not. A proxy adds read/write splitting and one more component to run.
- License. AGPL-3.0 (KubeBlocks) and commercial (KubeDB) need sign-off in many companies.
- Maturity. GA vendor operators, community projects with years of releases, and pre-1.0 projects like CNMSQL carry different levels of risk.
Where CNMSQL fitsโ
CNMSQL applies the design of CloudNativePG to MySQL: an instance manager in each Pod, failover decided by the operator with leases and fencing, and Kubernetes Services instead of a proxy. On top of the features in the table, it has a namespaced install mode, HPA and VPA support, and slim rootless images.
If the limitations above don't rule it out, the quickstart gets a three-instance cluster running in a few minutes. Issues and pull requests are welcome on GitHub.
Sourcesโ
Every source, checked on 16 October 2026
Release dates come from each project's GitHub releases page unless a source below gives one.
- CNMSQL: documentation, GitHub repository
- Percona XtraDB Cluster operator: documentation, 1.20.0 release notes, point-in-time recovery, backup storage, users, database upgrades
- Percona Server operator: documentation, 1.2.0 release notes, GA announcement, backup storage, users, database upgrades
- Oracle MySQL Operator: introduction, backups, custom resource properties, 26.7.0-2.3.0 release notes, README
- MOCO: README, backup design, Azure Blob Storage, usage, upgrading mysqld
- Vitess: operator overview, MySQL compatibility, backup and restore
- mariadb-operator: README, SQL resources, logical backups, updates
- KubeDB: MySQL overview, MySQL guides, remote replica, version updates, MariaDB guides, Percona XtraDB, KubeStash storage backends, pricing
- KubeBlocks: repository, MySQL addon, MySQL backup actions, backup repositories, addon list
