Cuando se ejecutan clústeres de bases de datos distribuidas, es bastante común enfrentarlos con balanceadores de carga. Las ventajas son claras:equilibrio de carga, conmutación por error de la conexión y desacoplamiento del nivel de la aplicación de las topologías de la base de datos subyacente. Para un equilibrio de carga más inteligente, un proxy compatible con bases de datos como ProxySQL o MaxScale sería el camino a seguir. En nuestro blog anterior, le mostramos cómo ejecutar ProxySQL como un contenedor auxiliar en Kubernetes. En esta publicación de blog, le mostraremos cómo implementar ProxySQL como un servicio de Kubernetes. Usaremos Wordpress como una aplicación de ejemplo y el backend de la base de datos se ejecuta en una replicación de MySQL de dos nodos implementada mediante ClusterControl. El siguiente diagrama ilustra nuestra infraestructura:

Dado que vamos a implementar una configuración similar a la de esta publicación de blog anterior, espere duplicación en algunas partes de la publicación de blog para que la publicación sea más legible.
ProxySQL en Kubernetes
Comencemos con un poco de resumen. El diseño de una arquitectura ProxySQL es un tema subjetivo y depende en gran medida de la ubicación de la aplicación, los contenedores de la base de datos y la función del propio ProxySQL. Idealmente, podemos configurar ProxySQL para que sea administrado por Kubernetes con dos configuraciones:
- ProxySQL como servicio de Kubernetes (implementación centralizada)
- ProxySQL como contenedor auxiliar en un pod (implementación distribuida)
Ambas implementaciones se pueden distinguir fácilmente observando el siguiente diagrama:

Esta publicación de blog cubrirá la primera configuración:ejecutar ProxySQL como un servicio de Kubernetes. La segunda configuración ya está cubierta aquí. En contraste con el enfoque del contenedor de ayuda, la ejecución como servicio hace que los pods de ProxySQL vivan independientemente de las aplicaciones y se pueden escalar y agrupar fácilmente con la ayuda de Kubernetes ConfigMap. Definitivamente, este es un enfoque de agrupación en clústeres diferente al soporte de agrupación en clústeres nativo de ProxySQL, que se basa en la suma de verificación de la configuración en las instancias de ProxySQL (también conocidas como servidores proxysql_servers). Consulte esta publicación de blog si desea obtener información sobre la agrupación en clústeres de ProxySQL de forma fácil con ClusterControl.
En Kubernetes, el sistema de configuración multicapa de ProxySQL hace posible la agrupación en clústeres de pods con ConfigMap. Sin embargo, hay una serie de deficiencias y soluciones para que funcione sin problemas como lo hace la función de agrupación en clústeres nativa de ProxySQL. Por el momento, la señalización de un pod en la actualización de ConfigMap es una característica en desarrollo. Cubriremos este tema con mucho más detalle en una próxima publicación de blog.
Básicamente, necesitamos crear pods de ProxySQL y adjuntar un servicio de Kubernetes para que puedan acceder los otros pods dentro de la red de Kubernetes o externamente. Luego, las aplicaciones se conectarán al servicio ProxySQL a través de la red TCP/IP en los puertos configurados. El valor predeterminado es 6033 para conexiones con equilibrio de carga de MySQL y 6032 para la consola de administración de ProxySQL. Con más de una réplica, las conexiones al pod se equilibrarán automáticamente mediante el componente kube-proxy de Kubernetes que se ejecuta en cada nodo de Kubernetes.
ProxySQL como servicio de Kubernetes
En esta configuración, ejecutamos tanto ProxySQL como Wordpress como pods y servicios. El siguiente diagrama ilustra nuestra arquitectura de alto nivel:

En esta configuración, implementaremos dos pods y servicios:"wordpress" y "proxysql". Fusionaremos la declaración de implementación y servicio en un archivo YAML por aplicación y los administraremos como una sola unidad. Para mantener el contenido de los contenedores de la aplicación persistente en varios nodos, tenemos que usar un sistema de archivos remoto o en clúster, que en este caso es NFS.
La implementación de ProxySQL como un servicio trae un par de cosas buenas sobre el enfoque del contenedor auxiliar:
- Usando el enfoque de Kubernetes ConfigMap, ProxySQL se puede agrupar con una configuración inmutable.
- Kubernetes maneja la recuperación de ProxySQL y equilibra las conexiones a las instancias automáticamente.
- Punto final único con implementación de dirección IP virtual de Kubernetes llamada ClusterIP.
- Nivel de proxy inverso centralizado con arquitectura compartida.
- Se puede usar con aplicaciones externas fuera de Kubernetes.
Comenzaremos la implementación como dos réplicas para ProxySQL y tres para Wordpress para demostrar la ejecución a escala y las capacidades de equilibrio de carga que ofrece Kubernetes.
Preparación de la base de datos
Cree la base de datos de wordpress y el usuario en el maestro y asigne el privilegio correcto:
mysql-master> CREATE DATABASE wordpress;
mysql-master> CREATE USER [email protected]'%' IDENTIFIED BY 'passw0rd';
mysql-master> GRANT ALL PRIVILEGES ON wordpress.* TO [email protected]'%';
Además, cree el usuario de supervisión de ProxySQL:
mysql-master> CREATE USER [email protected]'%' IDENTIFIED BY 'proxysqlpassw0rd';
Luego, vuelve a cargar la tabla de subvenciones:
mysql-master> FLUSH PRIVILEGES;
Definición de servicio y pod de ProxySQL
El siguiente es preparar nuestra implementación de ProxySQL. Cree un archivo llamado proxysql-rs-svc.yml y agregue las siguientes líneas:
apiVersion: v1
kind: Deployment
metadata:
name: proxysql
labels:
app: proxysql
spec:
replicas: 2
selector:
matchLabels:
app: proxysql
tier: frontend
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: proxysql
tier: frontend
spec:
restartPolicy: Always
containers:
- image: severalnines/proxysql:1.4.12
name: proxysql
volumeMounts:
- name: proxysql-config
mountPath: /etc/proxysql.cnf
subPath: proxysql.cnf
ports:
- containerPort: 6033
name: proxysql-mysql
- containerPort: 6032
name: proxysql-admin
volumes:
- name: proxysql-config
configMap:
name: proxysql-configmap
---
apiVersion: v1
kind: Service
metadata:
name: proxysql
labels:
app: proxysql
tier: frontend
spec:
type: NodePort
ports:
- nodePort: 30033
port: 6033
name: proxysql-mysql
- nodePort: 30032
port: 6032
name: proxysql-admin
selector:
app: proxysql
tier: frontend
Veamos de qué se tratan esas definiciones. El YAML consta de dos recursos combinados en un archivo, separados por el delimitador "---". El primer recurso es el Deployment, que definimos con la siguiente especificación:
spec:
replicas: 2
selector:
matchLabels:
app: proxysql
tier: frontend
strategy:
type: RollingUpdate
Lo anterior significa que nos gustaría implementar dos pods ProxySQL como un ReplicaSet que coincida con los contenedores etiquetados con "app=proxysql,tier=frontend". La estrategia de implementación especifica la estrategia utilizada para reemplazar los pods antiguos por otros nuevos. En esta implementación, elegimos RollingUpdate, lo que significa que los pods se actualizarán de forma continua, un pod a la vez.
La siguiente parte es la plantilla del contenedor:
- image: severalnines/proxysql:1.4.12
name: proxysql
volumeMounts:
- name: proxysql-config
mountPath: /etc/proxysql.cnf
subPath: proxysql.cnf
ports:
- containerPort: 6033
name: proxysql-mysql
- containerPort: 6032
name: proxysql-admin
volumes:
- name: proxysql-config
configMap:
name: proxysql-configmap
En spec.templates.spec.containers.* sección, le estamos diciendo a Kubernetes que implemente ProxySQL usando severalnines/proxysql imagen versión 1.4.12. También queremos que Kubernetes monte nuestro archivo de configuración personalizado y preconfigurado y lo asigne a /etc/proxysql.cnf dentro del contenedor. Los pods en ejecución publicarán dos puertos:6033 y 6032. También definimos la sección de "volúmenes", donde indicamos a Kubernetes que monte el ConfigMap como un volumen dentro de los pods de ProxySQL para ser montado por volumeMounts.
El segundo recurso es el servicio. Un servicio de Kubernetes es una capa de abstracción que define el conjunto lógico de pods y una política para acceder a ellos. En esta sección, definimos lo siguiente:
apiVersion: v1
kind: Service
metadata:
name: proxysql
labels:
app: proxysql
tier: frontend
spec:
type: NodePort
ports:
- nodePort: 30033
port: 6033
name: proxysql-mysql
- nodePort: 30032
port: 6032
name: proxysql-admin
selector:
app: proxysql
tier: frontend
En este caso, queremos que se acceda a nuestro ProxySQL desde la red externa, por lo que el tipo NodePort es el tipo elegido. Esto publicará el puerto de nodo en todos los nodos de Kubernetes en el clúster. El rango de puertos válidos para el recurso NodePort es 30000-32767. Elegimos el puerto 30033 para las conexiones de carga balanceada de MySQL, que está asignado al puerto 6033 de los pods de ProxySQL, y el puerto 30032 para el puerto de administración de ProxySQL asignado al 6032.
Por lo tanto, según nuestra definición YAML anterior, debemos preparar el siguiente recurso de Kubernetes antes de que podamos comenzar a implementar el pod "proxysql":
- ConfigMap:para almacenar el archivo de configuración de ProxySQL como un volumen para que pueda montarse en varios pods y volver a montarse si el pod se reprograma al otro nodo de Kubernetes.
Preparación de ConfigMap para ProxySQL
Al igual que en la publicación de blog anterior, vamos a utilizar el enfoque de ConfigMap para desacoplar el archivo de configuración del contenedor y también con fines de escalabilidad. Tenga en cuenta que en esta configuración, consideramos que nuestra configuración de ProxySQL es inmutable.
En primer lugar, cree el archivo de configuración de ProxySQL, proxysql.cnf y agregue las siguientes líneas:
datadir="/var/lib/proxysql"
admin_variables=
{
admin_credentials="proxysql-admin:adminpassw0rd"
mysql_ifaces="0.0.0.0:6032"
refresh_interval=2000
}
mysql_variables=
{
threads=4
max_connections=2048
default_query_delay=0
default_query_timeout=36000000
have_compress=true
poll_timeout=2000
interfaces="0.0.0.0:6033;/tmp/proxysql.sock"
default_schema="information_schema"
stacksize=1048576
server_version="5.1.30"
connect_timeout_server=10000
monitor_history=60000
monitor_connect_interval=200000
monitor_ping_interval=200000
ping_interval_server_msec=10000
ping_timeout_server=200
commands_stats=true
sessions_sort=true
monitor_username="proxysql"
monitor_password="proxysqlpassw0rd"
}
mysql_replication_hostgroups =
(
{ writer_hostgroup=10, reader_hostgroup=20, comment="MySQL Replication 5.7" }
)
mysql_servers =
(
{ address="192.168.55.171" , port=3306 , hostgroup=10, max_connections=100 },
{ address="192.168.55.172" , port=3306 , hostgroup=10, max_connections=100 },
{ address="192.168.55.171" , port=3306 , hostgroup=20, max_connections=100 },
{ address="192.168.55.172" , port=3306 , hostgroup=20, max_connections=100 }
)
mysql_users =
(
{ username = "wordpress" , password = "passw0rd" , default_hostgroup = 10 , active = 1 }
)
mysql_query_rules =
(
{
rule_id=100
active=1
match_pattern="^SELECT .* FOR UPDATE"
destination_hostgroup=10
apply=1
},
{
rule_id=200
active=1
match_pattern="^SELECT .*"
destination_hostgroup=20
apply=1
},
{
rule_id=300
active=1
match_pattern=".*"
destination_hostgroup=10
apply=1
}
)
Preste atención a las admin_variables.admin_credentials variable donde usamos un usuario no predeterminado que es "proxysql-admin". ProxySQL reserva el usuario "admin" predeterminado para la conexión local solo a través de localhost. Por lo tanto, tenemos que usar otros usuarios para acceder a la instancia de ProxySQL de forma remota. De lo contrario, obtendrías el siguiente error:
ERROR 1040 (42000): User 'admin' can only connect locally
Nuestra configuración de ProxySQL se basa en nuestros dos servidores de base de datos que se ejecutan en MySQL Replication, como se resume en la siguiente captura de pantalla de topología tomada de ClusterControl:

Todas las escrituras deben ir al nodo maestro mientras que las lecturas se reenvían al grupo de host 20, como se define en la sección "mysql_query_rules". Eso es lo básico de la división de lectura/escritura y queremos utilizarlos por completo.
Luego, importe el archivo de configuración a ConfigMap:
$ kubectl create configmap proxysql-configmap --from-file=proxysql.cnf
configmap/proxysql-configmap created
Verifique si el ConfigMap está cargado en Kubernetes:
$ kubectl get configmap
NAME DATA AGE
proxysql-configmap 1 45s
Definición de servicio y pod de WordPress
Ahora, pegue las siguientes líneas en un archivo llamado wordpress-rs-svc.yml en el host donde está configurado kubectl:
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
replicas: 3
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
restartPolicy: Always
containers:
- image: wordpress:4.9-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: proxysql:6033 # proxysql.default.svc.cluster.local:6033
- name: WORDPRESS_DB_USER
value: wordpress
- name: WORDPRESS_DB_DATABASE
value: wordpress
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 80
name: wordpress
---
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
tier: frontend
spec:
type: NodePort
ports:
- name: wordpress
nodePort: 30088
port: 80
selector:
app: wordpress
tier: frontend
Similar a nuestra definición de ProxySQL, el YAML consta de dos recursos, separados por el delimitador "---" combinados en un archivo. El primero es el recurso de implementación, que se implementará como un conjunto de réplicas, como se muestra en la sección "spec.*":
spec:
replicas: 3
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: RollingUpdate
Esta sección proporciona la especificación de implementación:3 pods para comenzar que coincidan con la etiqueta "app=wordpress,tier=backend". La estrategia de implementación es RollingUpdate, lo que significa que la forma en que Kubernetes reemplazará el pod es mediante el uso de actualizaciones continuas, al igual que nuestra implementación de ProxySQL.
La siguiente parte es la sección "spec.template.spec.*":
restartPolicy: Always
containers:
- image: wordpress:4.9-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: proxysql:6033
- name: WORDPRESS_DB_USER
value: wordpress
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
En esta sección, le decimos a Kubernetes que implemente Wordpress 4.9 usando el servidor web Apache y le dimos al contenedor el nombre "wordpress". El contenedor se reiniciará cada vez que esté inactivo, independientemente del estado. También queremos que Kubernetes pase una serie de variables de entorno:
- WORDPRESS_DB_HOST - El anfitrión de la base de datos MySQL. Como estamos usando ProxySQL como un servicio, el nombre del servicio será el valor de metadata.name que es "proxysql". ProxySQL escucha en el puerto 6033 para conexiones de carga equilibrada de MySQL, mientras que la consola de administración de ProxySQL está en 6032.
- WORDPRESS_DB_USER - Especifique el usuario de la base de datos de wordpress que se ha creado en la sección "Preparación de la base de datos".
- WORDPRESS_DB_PASSWORD - La contraseña para WORDPRESS_DB_USER . Como no queremos exponer la contraseña en este archivo, podemos ocultarla usando Kubernetes Secrets. Aquí le indicamos a Kubernetes que lea el recurso secreto "mysql-pass" en su lugar. Los secretos deben crearse por adelantado antes de la implementación del pod, como se explica más adelante.
También queremos publicar el puerto 80 del pod para el usuario final. El contenido de Wordpress almacenado dentro de /var/www/html en el contenedor se montará en nuestro almacenamiento persistente que se ejecuta en NFS. Usaremos los recursos PersistentVolume y PersistentVolumeClaim para este fin, como se muestra en la sección "Preparación del almacenamiento persistente para Wordpress".
Después de la línea de corte "---", definimos otro recurso llamado Servicio:
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
tier: frontend
spec:
type: NodePort
ports:
- name: wordpress
nodePort: 30088
port: 80
selector:
app: wordpress
tier: frontend
En esta configuración, nos gustaría que Kubernetes cree un servicio llamado "wordpress", escuche en el puerto 30088 en todos los nodos (también conocido como NodePort) a la red externa y lo reenvíe al puerto 80 en todos los pods etiquetados con "app=wordpress,tier=interfaz".
Por lo tanto, en función de nuestra definición de YAML anterior, tenemos que preparar una serie de recursos de Kubernetes antes de que podamos comenzar a implementar el pod y el servicio "wordpress":
- Volumen persistente y Reclamación de volumen persistente - Para almacenar los contenidos web de nuestra aplicación Wordpress, de modo que cuando el pod se reprograme a otro nodo trabajador, no perderemos los últimos cambios.
- Secretos - Para ocultar la contraseña de usuario de la base de datos de Wordpress dentro del archivo YAML.
Preparación de almacenamiento persistente para Wordpress
Todos los nodos de Kubernetes del clúster deberían poder acceder a un buen almacenamiento persistente para Kubernetes. Por el bien de esta publicación de blog, usamos NFS como el proveedor PersistentVolume (PV) porque es fácil y compatible de forma inmediata. El servidor NFS está ubicado en algún lugar fuera de nuestra red de Kubernetes (como se muestra en el primer diagrama de arquitectura) y lo hemos configurado para permitir todos los nodos de Kubernetes con la siguiente línea dentro de /etc/exports:
/nfs 192.168.55.*(rw,sync,no_root_squash,no_all_squash)
Tenga en cuenta que el paquete de cliente NFS debe estar instalado en todos los nodos de Kubernetes. De lo contrario, Kubernetes no podría montar el NFS correctamente. En todos los nodos:
$ sudo apt-install nfs-common #Ubuntu/Debian
$ yum install nfs-utils #RHEL/CentOS
Además, asegúrese de que en el servidor NFS exista el directorio de destino:
(nfs-server)$ mkdir /nfs/kubernetes/wordpress
Luego, crea un archivo llamado wordpress-pv-pvc.yml y agregue las siguientes líneas:
apiVersion: v1
kind: PersistentVolume
metadata:
name: wp-pv
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 3Gi
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: /nfs/kubernetes/wordpress
server: 192.168.55.200
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: wp-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
selector:
matchLabels:
app: wordpress
tier: frontend
En la definición anterior, le decimos a Kubernetes que asigne 3 GB de espacio de volumen en el servidor NFS para nuestro contenedor de Wordpress. Tome nota del uso de producción, NFS debe configurarse con aprovisionador automático y clase de almacenamiento.
Cree los recursos PV y PVC:
$ kubectl create -f wordpress-pv-pvc.yml
Verifique si esos recursos están creados y el estado debe ser "Bound":
$ kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/wp-pv 3Gi RWO Recycle Bound default/wp-pvc 22h
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/wp-pvc Bound wp-pv 3Gi RWO 22h
Preparando Secretos para Wordpress
Cree un secreto para que lo use el contenedor de Wordpress para WORDPRESS_DB_PASSWORD Variable ambiental. La razón es simplemente porque no queremos exponer la contraseña en texto claro dentro del archivo YAML.
Cree un recurso secreto llamado mysql-pass y pase la contraseña correspondiente:
$ kubectl create secret generic mysql-pass --from-literal=password=passw0rd
Verifica que nuestro secreto esté creado:
$ kubectl get secrets mysql-pass
NAME TYPE DATA AGE
mysql-pass Opaque 1 7h12m
Implementación de ProxySQL y Wordpress
Finalmente, podemos comenzar el despliegue. Implemente ProxySQL primero, seguido de Wordpress:
$ kubectl create -f proxysql-rs-svc.yml
$ kubectl create -f wordpress-rs-svc.yml
A continuación, podemos enumerar todos los pods y servicios que se han creado en el nivel "frontend":
$ kubectl get pods,services -l tier=frontend -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
pod/proxysql-95b8d8446-qfbf2 1/1 Running 0 12m 10.36.0.2 kube2.local <none>
pod/proxysql-95b8d8446-vljlr 1/1 Running 0 12m 10.44.0.6 kube3.local <none>
pod/wordpress-59489d57b9-4dzvk 1/1 Running 0 37m 10.36.0.1 kube2.local <none>
pod/wordpress-59489d57b9-7d2jb 1/1 Running 0 30m 10.44.0.4 kube3.local <none>
pod/wordpress-59489d57b9-gw4p9 1/1 Running 0 30m 10.36.0.3 kube2.local <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/proxysql NodePort 10.108.195.54 <none> 6033:30033/TCP,6032:30032/TCP 10m app=proxysql,tier=frontend
service/wordpress NodePort 10.109.144.234 <none> 80:30088/TCP 37m app=wordpress,tier=frontend
kube2.local <none>
El resultado anterior verifica nuestra arquitectura de implementación donde actualmente tenemos tres pods de Wordpress, expuestos públicamente en el puerto 30088, así como nuestra instancia de ProxySQL que está expuesta en los puertos 30033 y 30032 externamente más 6033 y 6032 internamente.
En este punto, nuestra arquitectura se parece a esto:

El puerto 80 publicado por los pods de Wordpress ahora está asignado al mundo exterior a través del puerto 30088. Podemos acceder a nuestra publicación de blog en http://{any_kubernetes_host}:30088/ y debe ser redirigido a la página de instalación de Wordpress. Si procedemos con la instalación, se saltaría la parte de conexión a la base de datos y mostraría directamente esta página:

Indica que nuestra configuración de MySQL y ProxySQL está correctamente configurada dentro del archivo wp-config.php. De lo contrario, sería redirigido a la página de configuración de la base de datos.
Nuestro despliegue ahora está completo.
Gestión de servicios y pods de ProxySQL
Se espera que Kubernetes maneje automáticamente la conmutación por error y la recuperación. Por ejemplo, si un trabajador de Kubernetes deja de funcionar, el pod se volverá a crear en el siguiente nodo disponible después de --pod-eviction-timeout (predeterminado en 5 minutos). Si el contenedor falla o muere, Kubernetes lo reemplazará casi al instante.
Se espera que algunas tareas de administración comunes sean diferentes cuando se ejecutan dentro de Kubernetes, como se muestra en las siguientes secciones.
Conexión a ProxySQL
Si bien ProxySQL está expuesto externamente en el puerto 30033 (MySQL) y 30032 (Admin), también se puede acceder a él internamente a través de los puertos publicados, 6033 y 6032 respectivamente. Por lo tanto, para acceder a las instancias de ProxySQL dentro de la red de Kubernetes, use el CLUSTER-IP o el nombre de servicio "proxysql" como valor de host. Por ejemplo, dentro del pod de Wordpress, puede acceder a la consola de administración de ProxySQL usando el siguiente comando:
$ mysql -uproxysql-admin -p -hproxysql -P6032
Si desea conectarse externamente, use el puerto definido en el valor nodePort del servicio YAML y seleccione cualquiera de los nodos de Kubernetes como valor de host:
$ mysql -uproxysql-admin -p -hkube3.local -P30032
Lo mismo se aplica a la conexión de equilibrio de carga de MySQL en el puerto 30033 (externo) y 6033 (interno).
Ampliar y reducir
Ampliar es fácil con Kubernetes:
$ kubectl scale deployment proxysql --replicas=5
deployment.extensions/proxysql scaled
Verifique el estado de implementación:
$ kubectl rollout status deployment proxysql
deployment "proxysql" successfully rolled out
La reducción también es similar. Aquí queremos volver de 5 a 2 réplicas:
$ kubectl scale deployment proxysql --replicas=2
deployment.extensions/proxysql scaled
También podemos ver los eventos de implementación de ProxySQL para obtener una mejor idea de lo que sucedió en esta implementación usando la opción "describir":
$ kubectl describe deployment proxysql
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 20m deployment-controller Scaled up replica set proxysql-769895fbf7 to 1
Normal ScalingReplicaSet 20m deployment-controller Scaled down replica set proxysql-95b8d8446 to 1
Normal ScalingReplicaSet 20m deployment-controller Scaled up replica set proxysql-769895fbf7 to 2
Normal ScalingReplicaSet 20m deployment-controller Scaled down replica set proxysql-95b8d8446 to 0
Normal ScalingReplicaSet 7m10s deployment-controller Scaled up replica set proxysql-6c55f647cb to 1
Normal ScalingReplicaSet 7m deployment-controller Scaled down replica set proxysql-769895fbf7 to 1
Normal ScalingReplicaSet 7m deployment-controller Scaled up replica set proxysql-6c55f647cb to 2
Normal ScalingReplicaSet 6m53s deployment-controller Scaled down replica set proxysql-769895fbf7 to 0
Normal ScalingReplicaSet 54s deployment-controller Scaled up replica set proxysql-6c55f647cb to 5
Normal ScalingReplicaSet 21s deployment-controller Scaled down replica set proxysql-6c55f647cb to 2
Kubernetes equilibrará automáticamente la carga de las conexiones a los pods.
Cambios de configuración
Una forma de realizar cambios de configuración en nuestros pods de ProxySQL es versionar nuestra configuración con otro nombre de ConfigMap. En primer lugar, modifique nuestro archivo de configuración directamente a través de su editor de texto favorito:
$ vim /root/proxysql.cnf
Luego, cárguelo en Kubernetes ConfigMap con un nombre diferente. En este ejemplo, agregamos "-v2" en el nombre del recurso:
$ kubectl create configmap proxysql-configmap-v2 --from-file=proxysql.cnf
Verifique si el ConfigMap está cargado correctamente:
$ kubectl get configmap
NAME DATA AGE
proxysql-configmap 1 3d15h
proxysql-configmap-v2 1 19m
Abra el archivo de implementación de ProxySQL, proxysql-rs-svc.yml y cambie la siguiente línea en la sección configMap a la nueva versión:
volumes:
- name: proxysql-config
configMap:
name: proxysql-configmap-v2 #change this line
Luego, aplique los cambios a nuestra implementación de ProxySQL:
$ kubectl apply -f proxysql-rs-svc.yml
deployment.apps/proxysql configured
service/proxysql configured
Verifique el despliegue mirando el evento ReplicaSet usando el indicador "describir":
$ kubectl describe proxysql
...
Pod Template:
Labels: app=proxysql
tier=frontend
Containers:
proxysql:
Image: severalnines/proxysql:1.4.12
Ports: 6033/TCP, 6032/TCP
Host Ports: 0/TCP, 0/TCP
Environment: <none>
Mounts:
/etc/proxysql.cnf from proxysql-config (rw)
Volumes:
proxysql-config:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: proxysql-configmap-v2
Optional: false
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: proxysql-769895fbf7 (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 53s deployment-controller Scaled up replica set proxysql-769895fbf7 to 1
Normal ScalingReplicaSet 46s deployment-controller Scaled down replica set proxysql-95b8d8446 to 1
Normal ScalingReplicaSet 46s deployment-controller Scaled up replica set proxysql-769895fbf7 to 2
Normal ScalingReplicaSet 41s deployment-controller Scaled down replica set proxysql-95b8d8446 to 0
Preste atención a la sección "Volúmenes" con el nuevo nombre de ConfigMap. También puede ver los eventos de implementación en la parte inferior de la salida. En este punto, nuestra nueva configuración se cargó en todos los pods de ProxySQL, donde Kubernetes redujo el ProxySQL ReplicaSet a 0 (obedeciendo la estrategia RollingUpdate) y los devolvió al estado deseado de 2 réplicas.
Reflexiones finales
Hasta este punto, hemos cubierto el posible enfoque de implementación de ProxySQL en Kubernetes. Ejecutar ProxySQL con la ayuda de Kubernetes ConfigMap abre una nueva posibilidad de agrupamiento de ProxySQL, donde es algo diferente en comparación con el soporte nativo de agrupamiento integrado dentro de ProxySQL.
En la próxima publicación del blog, exploraremos la agrupación en clústeres de ProxySQL con Kubernetes ConfigMap y cómo hacerlo de la manera correcta. ¡Estén atentos!