sql >> Database >  >> RDS >> MariaDB

ProxySQL uitvoeren als Kubernetes-service

Bij het uitvoeren van gedistribueerde databaseclusters is het vrij gebruikelijk om ze te voorzien van load balancers. De voordelen zijn duidelijk:taakverdeling, verbindingsfailover en ontkoppeling van de applicatielaag van de onderliggende databasetopologieën. Voor een intelligentere taakverdeling zou een databasebewuste proxy zoals ProxySQL of MaxScale de juiste keuze zijn. In onze vorige blog hebben we je laten zien hoe je ProxySQL kunt draaien als een helpercontainer in Kubernetes. In deze blogpost laten we u zien hoe u ProxySQL kunt inzetten als Kubernetes-service. We gebruiken Wordpress als een voorbeeldtoepassing en de database-backend wordt uitgevoerd op een MySQL-replicatie met twee knooppunten die wordt geïmplementeerd met ClusterControl. Het volgende diagram illustreert onze infrastructuur:

Aangezien we een vergelijkbare opzet gaan gebruiken als in deze vorige blogpost, moet u rekening houden met duplicatie in sommige delen van de blogpost om de post leesbaarder te houden.

ProxySQL op Kubernetes

Laten we beginnen met een korte samenvatting. Het ontwerpen van een ProxySQL-architectuur is een subjectief onderwerp en sterk afhankelijk van de plaatsing van de applicatie, databasecontainers en de rol van ProxySQL zelf. Idealiter kunnen we ProxySQL configureren om door Kubernetes te worden beheerd met twee configuraties:

  1. ProxySQL als Kubernetes-service (gecentraliseerde implementatie)
  2. ProxySQL als hulpcontainer in een pod (gedistribueerde implementatie)

Beide implementaties kunnen eenvoudig worden onderscheiden door naar het volgende diagram te kijken:

Deze blogpost behandelt de eerste configuratie:ProxySQL draaien als een Kubernetes-service. De tweede configuratie is hier al behandeld. In tegenstelling tot de helper-containerbenadering, zorgt het draaien als een service ervoor dat ProxySQL-pods onafhankelijk van de applicaties leven en gemakkelijk kunnen worden geschaald en geclusterd met behulp van Kubernetes ConfigMap. Dit is absoluut een andere clusteringbenadering dan ProxySQL-native clusteringondersteuning, die afhankelijk is van configuratiecontrolesommen over ProxySQL-instanties (ook wel proxysql_servers genoemd). Bekijk deze blogpost als je meer wilt weten over ProxySQL-clustering, eenvoudig gemaakt met ClusterControl.

In Kubernetes maakt het meerlaagse configuratiesysteem van ProxySQL podclustering mogelijk met ConfigMap. Er zijn echter een aantal tekortkomingen en oplossingen om het soepel te laten werken zoals de native clustering-functie van ProxySQL doet. Op dit moment is het signaleren van een pod bij de ConfigMap-update een functie in de maak. We zullen dit onderwerp veel gedetailleerder behandelen in een volgende blogpost.

Kortom, we moeten ProxySQL-pods maken en een Kubernetes-service koppelen die toegankelijk is voor de andere pods binnen het Kubernetes-netwerk of extern. Toepassingen maken vervolgens verbinding met de ProxySQL-service via TCP/IP-netwerken op de geconfigureerde poorten. Standaard ingesteld op 6033 voor MySQL-taakverdelingsverbindingen en 6032 voor ProxySQL-beheerconsole. Als er meer dan één replica is, worden de verbindingen met de pod automatisch gebalanceerd door de Kubernetes kube-proxy-component die op elk Kubernetes-knooppunt wordt uitgevoerd.

ProxySQL als Kubernetes-service

In deze opstelling gebruiken we zowel ProxySQL als Wordpress als pods en services. Het volgende diagram illustreert onze architectuur op hoog niveau:

In deze opstelling zullen we twee pods en services implementeren:"wordpress" en "proxysql". We zullen de implementatie- en serviceverklaring samenvoegen in één YAML-bestand per applicatie en deze als één eenheid beheren. Om de inhoud van de applicatiecontainers persistent te houden over meerdere knooppunten, moeten we een geclusterd of extern bestandssysteem gebruiken, in dit geval NFS.

Het implementeren van ProxySQL als een service brengt een aantal goede dingen met zich mee ten opzichte van de helper-containerbenadering:

  • Met de Kubernetes ConfigMap-aanpak kan ProxySQL worden geclusterd met een onveranderlijke configuratie.
  • Kubernetes handelt ProxySQL-herstel af en balanceert de verbindingen met de instanties automatisch.
  • Enkel eindpunt met implementatie van Kubernetes Virtual IP-adres genaamd ClusterIP.
  • Gecentraliseerde reverse proxy-laag met gedeelde niets-architectuur.
  • Kan worden gebruikt met externe applicaties buiten Kubernetes.

We zullen de implementatie starten als twee replica's voor ProxySQL en drie voor Wordpress om te demonstreren hoe u op schaal draait en de mogelijkheden voor taakverdeling die Kubernetes biedt.

De database voorbereiden

Maak de wordpress-database en gebruiker op de master en wijs deze toe met de juiste rechten:

mysql-master> CREATE DATABASE wordpress;
mysql-master> CREATE USER [email protected]'%' IDENTIFIED BY 'passw0rd';
mysql-master> GRANT ALL PRIVILEGES ON wordpress.* TO [email protected]'%';

Maak ook de ProxySQL-monitoringgebruiker aan:

mysql-master> CREATE USER [email protected]'%' IDENTIFIED BY 'proxysqlpassw0rd';

Laad vervolgens de subsidietabel opnieuw:

mysql-master> FLUSH PRIVILEGES;

ProxySQL-pod en servicedefinitie

De volgende is om onze ProxySQL-implementatie voor te bereiden. Maak een bestand met de naam proxysql-rs-svc.yml en voeg de volgende regels toe:

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

Laten we eens kijken waar die definities over gaan. De YAML bestaat uit twee bronnen gecombineerd in een bestand, gescheiden door een "---" scheidingsteken. De eerste bron is de implementatie, waarvoor we de volgende specificatie definiëren:

spec:
  replicas: 2
  selector:
    matchLabels:
      app: proxysql
      tier: frontend
  strategy:
    type: RollingUpdate

Het bovenstaande betekent dat we twee ProxySQL-pods willen implementeren als een ReplicaSet die overeenkomt met containers met het label "app=proxysql,tier=frontend". De implementatiestrategie specificeert de strategie die wordt gebruikt om oude pods te vervangen door nieuwe. In deze implementatie hebben we RollingUpdate gekozen, wat betekent dat de pods worden bijgewerkt op een doorlopende update-manier, één pod per keer.

Het volgende deel is de sjabloon van de container:

      - 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

In de spec.templates.spec.containers.* sectie, vertellen we Kubernetes om ProxySQL te implementeren met behulp van severalnines/proxysql afbeeldingsversie 1.4.12. We willen ook dat Kubernetes ons aangepaste, vooraf geconfigureerde configuratiebestand koppelt en toewijst aan /etc/proxysql.cnf in de container. De actieve pods zullen twee poorten publiceren - 6033 en 6032. We definiëren ook de sectie "volumes", waar we Kubernetes instrueren om de ConfigMap te koppelen als een volume in de ProxySQL-pods die door volumeMounts moeten worden gemount.

De tweede bron is de service. Een Kubernetes-service is een abstractielaag die de logische set pods definieert en een beleid voor toegang tot deze. In deze sectie definiëren we het volgende:

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

In dit geval willen we dat onze ProxySQL toegankelijk is vanaf het externe netwerk, dus het type NodePort is het gekozen type. Hiermee wordt de nodePort op alle Kubernetes-knooppunten in het cluster gepubliceerd. Het bereik van geldige poorten voor NodePort-bronnen is 30000-32767. We kozen poort 30033 voor MySQL-load-balanced verbindingen die is toegewezen aan poort 6033 van de ProxySQL-pods en poort 30032 voor ProxySQL-beheerpoort toegewezen aan 6032.

Daarom moeten we, op basis van onze YAML-definitie hierboven, de volgende Kubernetes-bron voorbereiden voordat we kunnen beginnen met het implementeren van de "proxysql"-pod:

  • ConfigMap - Om het ProxySQL-configuratiebestand als een volume op te slaan, zodat het aan meerdere pods kan worden gekoppeld en opnieuw kan worden aangekoppeld als de pod opnieuw wordt gepland naar het andere Kubernetes-knooppunt.

ConfigMap voorbereiden voor ProxySQL

Net als bij de vorige blogpost, gaan we de ConfigMap-aanpak gebruiken om het configuratiebestand los te koppelen van de container en ook voor schaalbaarheid. Houd er rekening mee dat we in deze opstelling van mening zijn dat onze ProxySQL-configuratie onveranderlijk is.

Maak eerst het ProxySQL-configuratiebestand, proxysql.cnf en voeg de volgende regels toe:

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
        }
)

Let op de admin_variables.admin_credentials variabele waarbij we een niet-standaard gebruiker hebben gebruikt, namelijk "proxysql-admin". ProxySQL reserveert de standaard "admin"-gebruiker alleen voor lokale verbinding via localhost. Daarom moeten we andere gebruikers gebruiken om op afstand toegang te krijgen tot de ProxySQL-instantie. Anders krijgt u de volgende foutmelding:

ERROR 1040 (42000): User 'admin' can only connect locally

Onze ProxySQL-configuratie is gebaseerd op onze twee databaseservers die worden uitgevoerd in MySQL-replicatie, zoals samengevat in het volgende screenshot van de topologie, genomen uit ClusterControl:

Alle schrijfbewerkingen moeten naar het hoofdknooppunt gaan, terwijl de leesbewerkingen worden doorgestuurd naar hostgroep 20, zoals gedefinieerd in de sectie "mysql_query_rules". Dat is de basis van het splitsen van lezen/schrijven en we willen ze helemaal gebruiken.

Importeer vervolgens het configuratiebestand in ConfigMap:

$ kubectl create configmap proxysql-configmap --from-file=proxysql.cnf
configmap/proxysql-configmap created

Controleer of de ConfigMap in Kubernetes is geladen:

$ kubectl get configmap
NAME                 DATA   AGE
proxysql-configmap   1      45s

Wordpress-pod en servicedefinitie

Plak nu de volgende regels in een bestand met de naam wordpress-rs-svc.yml op de host waar kubectl is geconfigureerd:

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

Net als onze ProxySQL-definitie, bestaat de YAML uit twee bronnen, gescheiden door een "---" scheidingsteken gecombineerd in een bestand. De eerste is de implementatiebron, die zal worden geïmplementeerd als een ReplicaSet, zoals weergegeven in de sectie "spec.*":

spec:
  replicas: 3
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: RollingUpdate

Deze sectie bevat de implementatiespecificatie - 3 pods om te starten die overeenkomen met het label "app=wordpress,tier=backend". De implementatiestrategie is RollingUpdate, wat betekent dat Kubernetes de pod vervangt door gebruik te maken van rolling update-mode, hetzelfde met onze ProxySQL-implementatie.

Het volgende deel is de sectie "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


In deze sectie vertellen we Kubernetes om Wordpress 4.9 te implementeren met behulp van de Apache-webserver en we gaven de container de naam "wordpress". De container wordt elke keer dat deze offline is opnieuw gestart, ongeacht de status. We willen ook dat Kubernetes een aantal omgevingsvariabelen doorgeeft:

  • WORDPRESS_DB_HOST - De MySQL-databasehost. Aangezien we ProxySQL als service gebruiken, is de servicenaam de waarde van metadata.name wat "proxysql" is. ProxySQL luistert op poort 6033 voor MySQL load-balanced verbindingen terwijl de ProxySQL-beheerconsole op 6032 staat.
  • WORDPRESS_DB_USER - Geef de gebruiker van de wordpress-database op die is aangemaakt in het gedeelte "De database voorbereiden".
  • WORDPRESS_DB_PASSWORD - Het wachtwoord voor WORDPRESS_DB_USER . Omdat we het wachtwoord in dit bestand niet willen onthullen, kunnen we het verbergen met Kubernetes Secrets. Hier instrueren we Kubernetes om in plaats daarvan de geheime bron "mysql-pass" te lezen. Geheimen moeten vooraf worden aangemaakt voordat de pod wordt geïmplementeerd, zoals verderop wordt uitgelegd.

We willen ook poort 80 van de pod publiceren voor de eindgebruiker. De Wordpress-inhoud die in /var/www/html in de container is opgeslagen, wordt gemount in onze permanente opslag die op NFS draait. We zullen hiervoor de bronnen PersistentVolume en PersistentVolumeClaim gebruiken, zoals weergegeven in het gedeelte 'Persistente opslag voor Wordpress voorbereiden'.

Na de onderbrekingsregel "---" definiëren we een andere bron met de naam Service:

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

In deze configuratie willen we dat Kubernetes een service maakt met de naam "wordpress", luistert op poort 30088 op alle knooppunten (ook bekend als NodePort) naar het externe netwerk en deze doorstuurt naar poort 80 op alle pods met het label "app=wordpress,tier=frontend".

Daarom moeten we, op basis van onze YAML-definitie hierboven, een aantal Kubernetes-bronnen voorbereiden voordat we kunnen beginnen met het implementeren van de "wordpress"-pod en -service:

  • PersistentVolume en PersistentVolumeClaim - Om de webinhoud van onze Wordpress-toepassing op te slaan, zodat we de laatste wijzigingen niet verliezen wanneer de pod wordt verplaatst naar een ander werkknooppunt.
  • Geheimen - Om het gebruikerswachtwoord van de Wordpress-database in het YAML-bestand te verbergen.

Persistente opslag voorbereiden voor Wordpress

Een goede permanente opslag voor Kubernetes moet toegankelijk zijn voor alle Kubernetes-knooppunten in het cluster. Omwille van deze blogpost hebben we NFS gebruikt als de PersistentVolume (PV)-provider omdat het eenvoudig is en out-of-the-box wordt ondersteund. De NFS-server bevindt zich ergens buiten ons Kubernetes-netwerk (zoals weergegeven in het eerste architectuurdiagram) en we hebben deze geconfigureerd om alle Kubernetes-knooppunten toe te staan ​​met de volgende regel in /etc/exports:

/nfs    192.168.55.*(rw,sync,no_root_squash,no_all_squash)

Houd er rekening mee dat het NFS-clientpakket op alle Kubernetes-knooppunten moet zijn geïnstalleerd. Anders zou Kubernetes de NFS niet correct kunnen mounten. Op alle knooppunten:

$ sudo apt-install nfs-common #Ubuntu/Debian
$ yum install nfs-utils #RHEL/CentOS

Zorg er ook voor dat op de NFS-server de doelmap bestaat:

(nfs-server)$ mkdir /nfs/kubernetes/wordpress

Maak vervolgens een bestand met de naam wordpress-pv-pvc.yml en voeg de volgende regels toe:

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

In de bovenstaande definitie vertellen we Kubernetes om 3 GB volumeruimte op de NFS-server toe te wijzen voor onze Wordpress-container. Let op voor productiegebruik, NFS moet worden geconfigureerd met automatische voorziening en opslagklasse.

Maak de PV- en PVC-bronnen:

$ kubectl create -f wordpress-pv-pvc.yml

Controleer of deze bronnen zijn gemaakt en of de status "Gebonden" moet zijn:

$ 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

Geheimen voorbereiden voor Wordpress

Maak een geheim dat door de Wordpress-container moet worden gebruikt voor WORDPRESS_DB_PASSWORD omgevingsvariabele. De reden is simpelweg omdat we het wachtwoord niet in leesbare tekst in het YAML-bestand willen weergeven.

Maak een geheime bron met de naam mysql-pass en geef het wachtwoord dienovereenkomstig door:

$ kubectl create secret generic mysql-pass --from-literal=password=passw0rd

Controleer of ons geheim is aangemaakt:

$ kubectl get secrets mysql-pass
NAME         TYPE     DATA   AGE
mysql-pass   Opaque   1      7h12m

ProxySQL en Wordpress implementeren

Eindelijk kunnen we beginnen met de implementatie. Implementeer eerst ProxySQL, gevolgd door Wordpress:

$ kubectl create -f proxysql-rs-svc.yml
$ kubectl create -f wordpress-rs-svc.yml

We kunnen dan alle pods en services weergeven die zijn gemaakt onder de "frontend"-laag:

$ 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>

De bovenstaande uitvoer verifieert onze implementatie-architectuur waar we momenteel drie Wordpress-pods hebben, openbaar beschikbaar op poort 30088, evenals onze ProxySQL-instantie die extern wordt weergegeven op poort 30033 en 30032 plus intern 6033 en 6032.

Op dit moment ziet onze architectuur er ongeveer zo uit:

Poort 80, gepubliceerd door de Wordpress-pods, is nu toegewezen aan de buitenwereld via poort 30088. We hebben toegang tot onze blogpost op http://{any_kubernetes_host}:30088/ en moeten worden doorgestuurd naar de installatiepagina van Wordpress. Als we doorgaan met de installatie, wordt het gedeelte over de databaseverbinding overgeslagen en wordt deze pagina direct weergegeven:

Het geeft aan dat onze MySQL- en ProxySQL-configuratie correct is geconfigureerd in het wp-config.php-bestand. Anders wordt u doorgestuurd naar de databaseconfiguratiepagina.

Onze implementatie is nu voltooid.

ProxySQL-pods en servicebeheer

Failover en herstel worden naar verwachting automatisch afgehandeld door Kubernetes. Als een Kubernetes-worker bijvoorbeeld uitvalt, wordt de pod opnieuw gemaakt in het volgende beschikbare knooppunt na --pod-eviction-timeout (standaard 5 minuten). Als de container crasht of doodgaat, zal Kubernetes hem vrijwel onmiddellijk vervangen.

Sommige algemene beheertaken zullen naar verwachting anders zijn wanneer ze binnen Kubernetes worden uitgevoerd, zoals weergegeven in de volgende secties.

Verbinding maken met ProxySQL

Hoewel ProxySQL extern wordt weergegeven op poort 30033 (MySQL) en 30032 (Admin), is het ook intern toegankelijk via de gepubliceerde poorten, respectievelijk 6033 en 6032. Om toegang te krijgen tot de ProxySQL-instanties binnen het Kubernetes-netwerk, gebruikt u dus de CLUSTER-IP of de servicenaam "proxysql" als hostwaarde. In de Wordpress-pod kunt u bijvoorbeeld toegang krijgen tot de ProxySQL-beheerconsole door de volgende opdracht te gebruiken:

$ mysql -uproxysql-admin -p -hproxysql -P6032

Als u extern verbinding wilt maken, gebruikt u de poort die is gedefinieerd onder nodePort value he service YAML en kiest u een van de Kubernetes-knooppunten als hostwaarde:

$ mysql -uproxysql-admin -p -hkube3.local -P30032

Hetzelfde geldt voor de MySQL load-balanced verbinding op poort 30033 (extern) en 6033 (intern).

Op en neer schalen

Opschalen is eenvoudig met Kubernetes:

$ kubectl scale deployment proxysql --replicas=5
deployment.extensions/proxysql scaled

Controleer de uitrolstatus:

$ kubectl rollout status deployment proxysql
deployment "proxysql" successfully rolled out

Verkleinen is ook vergelijkbaar. Hier willen we teruggaan van 5 naar 2 replica's:

$ kubectl scale deployment proxysql --replicas=2
deployment.extensions/proxysql scaled

We kunnen ook kijken naar de implementatiegebeurtenissen voor ProxySQL om een ​​beter beeld te krijgen van wat er voor deze implementatie is gebeurd door de optie "beschrijven" te gebruiken:

$ 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

De verbindingen met de pods worden automatisch door Kubernetes in balans gebracht.

Configuratiewijzigingen

Een manier om configuratiewijzigingen aan te brengen op onze ProxySQL-pods is door onze configuratie te versiebeheer met een andere ConfigMap-naam. Wijzig eerst ons configuratiebestand rechtstreeks via uw favoriete teksteditor:

$ vim /root/proxysql.cnf

Laad het vervolgens met een andere naam in Kubernetes ConfigMap. In dit voorbeeld voegen we "-v2" toe aan de resourcenaam:

$ kubectl create configmap proxysql-configmap-v2 --from-file=proxysql.cnf

Controleer of de ConfigMap correct is geladen:

$ kubectl get configmap
NAME                    DATA   AGE
proxysql-configmap      1      3d15h
proxysql-configmap-v2   1      19m

Open het ProxySQL-implementatiebestand, proxysql-rs-svc.yml en verander de volgende regel onder de sectie configMap naar de nieuwe versie:

      volumes:
      - name: proxysql-config
        configMap:
          name: proxysql-configmap-v2 #change this line

Pas vervolgens de wijzigingen toe op onze ProxySQL-implementatie:

$ kubectl apply -f proxysql-rs-svc.yml
deployment.apps/proxysql configured
service/proxysql configured

Controleer de uitrol door naar de ReplicaSet-gebeurtenis te kijken met behulp van de "describe"-vlag:

$ 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

Let op de sectie "Volumes" met de nieuwe ConfigMap-naam. U kunt de implementatiegebeurtenissen ook onder aan de uitvoer zien. Op dit moment is onze nieuwe configuratie in alle ProxySQL-pods geladen, waar Kubernetes de ProxySQL ReplicaSet naar 0 heeft geschaald (volgens de RollingUpdate-strategie) en ze terugbrengt naar de gewenste status van 2 replica's.

Laatste gedachten

Tot nu toe hebben we de mogelijke implementatiebenadering voor ProxySQL in Kubernetes behandeld. Het uitvoeren van ProxySQL met behulp van Kubernetes ConfigMap opent een nieuwe mogelijkheid voor ProxySQL-clustering, waar het enigszins verschilt van de native clusteringondersteuning die in ProxySQL is ingebouwd.

In de komende blogpost zullen we ProxySQL-clustering onderzoeken met Kubernetes ConfigMap en hoe we dit op de juiste manier kunnen doen. Blijf op de hoogte!


  1. Verbinding maken met een externe MySQL-server met behulp van PHP

  2. DBA - Hoe alle databaseprocessen op SQL Server te beëindigen?

  3. Een CHECK-beperking inschakelen in SQL Server (T-SQL-voorbeeld)

  4. PostgreSQL -moet voorkomen in de GROUP BY-component of worden gebruikt in een aggregatiefunctie