[ci skip] MySQL: deploy InnoDB Cluster via Oracle MySQL Operator

- MySQL Operator v2.2.7 in mysql-operator namespace (on control-plane)
- InnoDB Cluster: 3 MySQL 9.2.0 servers + 1 Router, local-path storage
- Group Replication with automatic failover via MySQL Router
- Compatibility service: mysql.dbaas:3306 → Router port 6446
- Images from container-registry.oracle.com (not Docker Hub)
- Init containers are slow (~20 min) due to mysqlsh plugin loading
- Data restore from mysqldump pending after cluster is ONLINE
This commit is contained in:
Viktor Barzin 2026-03-01 03:00:21 +00:00
parent 6139052104
commit 1101242036

View file

@ -30,30 +30,99 @@ module "tls_secret" {
} }
resource "kubernetes_config_map" "mycnf" { #### MYSQL InnoDB Cluster via MySQL Operator
metadata { #
name = "mycnf" # 3 MySQL servers with Group Replication + 1 MySQL Router for auto-failover.
namespace = kubernetes_namespace.dbaas.metadata[0].name # Operator installed in mysql-operator namespace (toleration for control-plane).
annotations = { # Init containers are slow (~20 min each) due to mysqlsh plugin loading.
"reloader.stakater.com/match" = "true"
} resource "helm_release" "mysql_operator" {
} namespace = "mysql-operator"
data = { create_namespace = true
"my.cnf" = <<-EOT name = "mysql-operator"
[mysqld] timeout = 300
skip-name-resolve
datadir=/var/lib/mysql repository = "https://mysql.github.io/mysql-operator/"
socket=/var/run/mysqld/mysqld.sock chart = "mysql-operator"
secure-file-priv=/var/lib/mysql-files version = "2.2.7"
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
EOT
}
} }
resource "helm_release" "mysql_cluster" {
namespace = kubernetes_namespace.dbaas.metadata[0].name
create_namespace = false
name = "mysql-cluster"
timeout = 900
repository = "https://mysql.github.io/mysql-operator/"
chart = "mysql-innodbcluster"
version = "2.2.7"
values = [yamlencode({
serverInstances = 3
routerInstances = 1
serverVersion = "9.2.0"
credentials = {
root = {
user = "root"
password = var.dbaas_root_password
host = "%"
}
}
tls = {
useSelfSigned = true
}
datadirVolumeClaimTemplate = {
storageClassName = "local-path"
resources = {
requests = {
storage = "30Gi"
}
}
}
serverConfig = {
"my.cnf" = <<-EOT
[mysqld]
skip-name-resolve
EOT
}
resources = {
requests = {
cpu = "250m"
memory = "1Gi"
}
limits = {
cpu = "2"
memory = "2Gi"
}
}
podSpec = {
containers = [{
name = "mysql"
resources = {
requests = {
memory = "1Gi"
cpu = "250m"
}
limits = {
memory = "2Gi"
cpu = "2"
}
}
}]
}
})]
depends_on = [helm_release.mysql_operator]
}
# Compatibility service: mysql.dbaas points at InnoDB Cluster Router
# Router handles automatic failover clients connect here transparently
resource "kubernetes_service" "mysql" { resource "kubernetes_service" "mysql" {
metadata { metadata {
name = var.cluster_master_service name = var.cluster_master_service
@ -61,98 +130,16 @@ resource "kubernetes_service" "mysql" {
} }
spec { spec {
selector = { selector = {
app = "mysql" "component" = "mysqlrouter"
"mysql.oracle.com/cluster" = "mysql-cluster"
} }
port { port {
port = 3306 port = 3306
target_port = 6446
} }
} }
}
# MySQL single instance on NFS (temporary, pending replication migration) depends_on = [helm_release.mysql_cluster]
resource "kubernetes_deployment" "mysql" {
metadata {
name = "mysql"
namespace = kubernetes_namespace.dbaas.metadata[0].name
annotations = {
"reloader.stakater.com/search" = "true"
}
labels = {
tier = var.tier
}
}
spec {
replicas = 1
selector {
match_labels = {
app = "mysql"
}
}
strategy {
type = "Recreate"
}
template {
metadata {
labels = {
app = "mysql"
}
}
spec {
container {
image = "mysql:9.2.0"
name = "mysql"
resources {
requests = {
cpu = "250m"
memory = "512Mi"
}
limits = {
cpu = "1"
memory = "2Gi"
}
}
env {
name = "MYSQL_ROOT_PASSWORD"
value = var.dbaas_root_password
}
port {
container_port = 3306
name = "mysql"
}
volume_mount {
name = "mysql-persistent-storage"
mount_path = "/var/lib/mysql"
}
volume_mount {
name = "mycnf"
mount_path = "/etc/my.cnf"
sub_path = "my.cnf"
}
}
volume {
name = "mysql-persistent-storage"
nfs {
path = "/mnt/main/mysql"
server = var.nfs_server
}
}
volume {
name = "mycnf"
config_map {
name = "mycnf"
}
}
dns_config {
option {
name = "ndots"
value = "2"
}
}
}
}
}
} }
resource "kubernetes_cron_job_v1" "mysql-backup" { resource "kubernetes_cron_job_v1" "mysql-backup" {