sql >> Databáze >  >> RDS >> MariaDB

Spuštění ProxySQL jako Kubernetes Service

Při provozování distribuovaných databázových clusterů je zcela běžné, že je nahradíte nástroji pro vyrovnávání zatížení. Výhody jsou jasné – load balancing, failover připojení a oddělení aplikační vrstvy od podkladových databázových topologií. Pro inteligentnější vyvažování zátěže by byl správným řešením proxy server s databází, jako je ProxySQL nebo MaxScale. V našem předchozím blogu jsme vám ukázali, jak spustit ProxySQL jako pomocný kontejner v Kubernetes. V tomto příspěvku na blogu vám ukážeme, jak nasadit ProxySQL jako službu Kubernetes. Jako příklad aplikace použijeme Wordpress a backend databáze běží na dvouuzlovém MySQL Replication nasazeném pomocí ClusterControl. Následující diagram znázorňuje naši infrastrukturu:

Protože se chystáme nasadit podobné nastavení jako v tomto předchozím blogovém příspěvku, počítejte s duplicitou v některých částech blogového příspěvku, aby byl příspěvek čitelnější.

ProxySQL na Kubernetes

Začněme malou rekapitulací. Návrh architektury ProxySQL je subjektivní téma a velmi závisí na umístění aplikace, databázových kontejnerech a také na roli samotného ProxySQL. V ideálním případě můžeme nakonfigurovat ProxySQL tak, aby byl spravován Kubernetes, se dvěma konfiguracemi:

  1. ProxySQL jako služba Kubernetes (centralizované nasazení)
  2. ProxySQL jako pomocný kontejner v podu (distribuované nasazení)

Obě nasazení lze snadno rozlišit podle následujícího diagramu:

Tento blogový příspěvek se bude týkat první konfigurace – spuštění ProxySQL jako služby Kubernetes. Druhá konfigurace je zde již popsána. Na rozdíl od přístupu pomocných kontejnerů umožňuje běh jako služba ProxySQL pody žít nezávisle na aplikacích a lze je snadno škálovat a klastrovat společně pomocí Kubernetes ConfigMap. Toto je rozhodně odlišný přístup ke shlukování než podpora nativního shlukování ProxySQL, která se spoléhá na kontrolní součet konfigurace napříč instancemi ProxySQL (také znám jako proxysql_servers). Podívejte se na tento blogový příspěvek, pokud se chcete dozvědět o clusteringu ProxySQL, který je s ClusterControl snadný.

V Kubernetes vícevrstvý konfigurační systém ProxySQL umožňuje shlukování podů pomocí ConfigMap. Existuje však řada nedostatků a řešení, aby to fungovalo hladce, jako to dělá nativní funkce clusteringu ProxySQL. V současné době je signalizace modulu při aktualizaci ConfigMap funkcí, na které se pracuje. Tomuto tématu se budeme věnovat mnohem podrobněji v nadcházejícím příspěvku na blogu.

V zásadě musíme vytvořit ProxySQL pody a připojit službu Kubernetes, aby k ní měly přístup ostatní pody v rámci sítě Kubernetes nebo externě. Aplikace se poté připojí ke službě ProxySQL prostřednictvím sítě TCP/IP na nakonfigurovaných portech. Výchozí hodnota je 6033 pro připojení s vyváženým zatížením MySQL a 6032 pro konzolu pro správu ProxySQL. S více než jednou replikou budou připojení k podu automaticky vyrovnávána zátěž pomocí komponenty Kubernetes kube-proxy běžící na každém uzlu Kubernetes.

ProxySQL jako služba Kubernetes

V tomto nastavení spouštíme ProxySQL i Wordpress jako moduly a služby. Následující diagram ilustruje naši architekturu na vysoké úrovni:

V tomto nastavení nasadíme dva pody a služby – „wordpress“ a „proxysql“. Sloučíme prohlášení o nasazení a službě do jednoho souboru YAML na aplikaci a budeme je spravovat jako jeden celek. Aby byl obsah aplikačních kontejnerů trvalý na více uzlech, musíme použít klastrovaný nebo vzdálený souborový systém, kterým je v tomto případě NFS.

Nasazení ProxySQL jako služby přináší oproti přístupu pomocného kontejneru několik dobrých věcí:

  • Pomocí přístupu Kubernetes ConfigMap lze ProxySQL klastrovat s neměnnou konfigurací.
  • Kubernetes automaticky zajišťuje obnovu ProxySQL a vyrovnává připojení k instancím.
  • Jeden koncový bod s implementací virtuální IP adresy Kubernetes s názvem ClusterIP.
  • Centralizovaná vrstva reverzního proxy s architekturou sdíleného nic.
  • Lze použít s externími aplikacemi mimo Kubernetes.

Zahájíme nasazení jako dvě repliky pro ProxySQL a tři pro Wordpress, abychom předvedli běh ve velkém měřítku a možnosti vyvažování zátěže, které Kubernetes nabízí.

Příprava databáze

Vytvořte databázi wordpress a uživatele na hlavním serveru a přiřaďte jim správná oprávnění:

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

Vytvořte také uživatele monitorování ProxySQL:

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

Poté znovu načtěte tabulku grantů:

mysql-master> FLUSH PRIVILEGES;

ProxySQL Pod a definice služby

Dalším krokem je příprava nasazení ProxySQL. Vytvořte soubor s názvem proxysql-rs-svc.yml a přidejte následující řádky:

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

Podívejme se, o čem tyto definice jsou. YAML se skládá ze dvou zdrojů spojených v souboru, oddělených oddělovačem "---". Prvním zdrojem je Deployment, který definujeme následující specifikací:

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

Výše uvedené znamená, že bychom chtěli nasadit dva moduly ProxySQL jako sadu ReplicaSet, která odpovídá kontejnerům označeným "app=proxysql,tier=frontend". Strategie nasazení určuje strategii použitou k nahrazení starých modulů novými. V tomto nasazení jsme zvolili RollingUpdate, což znamená, že moduly budou aktualizovány způsobem průběžných aktualizací, jeden modul po druhém.

Další částí je šablona kontejneru:

      - 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

V spec.templates.spec.containers.* v sekci říkáme Kubernetes, aby nasadil ProxySQL pomocí několika nin/proxysql verze obrázku 1.4.12. Chceme také, aby Kubernetes připojil náš vlastní, předem nakonfigurovaný konfigurační soubor a namapoval jej na /etc/proxysql.cnf uvnitř kontejneru. Spuštěné moduly budou publikovat dva porty – 6033 a 6032. Definujeme také sekci „volumes“, kde dáváme Kubernetes pokyn, aby připojil ConfigMap jako svazek uvnitř ProxySQL podů, který má být připojen pomocí volumeMounts.

Druhým zdrojem je služba. Služba Kubernetes je abstraktní vrstva, která definuje logickou sadu podů a zásady, pomocí kterých k nim lze přistupovat. V této části definujeme následující:

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

V tomto případě chceme, aby naše ProxySQL bylo přístupné z externí sítě, takže typ NodePort je zvoleným typem. Tím se publikuje nodePort na všech uzlech Kubernetes v clusteru. Rozsah platných portů pro prostředek NodePort je 30000-32767. Zvolili jsme port 30033 pro připojení s vyváženým zatížením MySQL, který je mapován na port 6033 podů ProxySQL a port 30032 pro administrační port ProxySQL mapovaný na 6032.

Proto na základě naší výše uvedené definice YAML musíme připravit následující zdroj Kubernetes, než začneme nasazovat pod „proxysql“:

  • ConfigMap – Pro uložení konfiguračního souboru ProxySQL jako svazku, aby jej bylo možné připojit k více modulům a znovu jej připojit, pokud je modul přeplánován na jiný uzel Kubernetes.

Příprava ConfigMap pro ProxySQL

Podobně jako v předchozím příspěvku na blogu použijeme přístup ConfigMap k oddělení konfiguračního souboru od kontejneru a také pro účely škálovatelnosti. Vezměte na vědomí, že v tomto nastavení považujeme konfiguraci ProxySQL za neměnnou.

Nejprve vytvořte konfigurační soubor ProxySQL, proxysql.cnf a přidejte následující řádky:

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

Věnujte pozornost admin_variables.admin_credentials proměnná, kde jsme použili jiného než výchozího uživatele, což je "proxysql-admin". ProxySQL si vyhrazuje výchozího uživatele „admin“ pro lokální připojení pouze přes localhost. Pro vzdálený přístup k instanci ProxySQL tedy musíme použít jiné uživatele. Jinak by se zobrazila následující chyba:

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

Naše konfigurace ProxySQL je založena na našich dvou databázových serverech běžících v MySQL Replication, jak je shrnuto na následujícím snímku obrazovky topologie převzatém z ClusterControl:

Všechny zápisy by měly směřovat do hlavního uzlu, zatímco čtení jsou předávána hostitelské skupině 20, jak je definováno v části "mysql_query_rules". To je základ rozdělení čtení/zápisu a my je chceme využít úplně.

Poté importujte konfigurační soubor do ConfigMap:

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

Ověřte, zda je ConfigMap načtena do Kubernetes:

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

Pod a definice služby Wordpress

Nyní vložte následující řádky do souboru s názvem wordpress-rs-svc.yml na hostiteli, kde je nakonfigurován 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

Podobně jako naše definice ProxySQL se YAML skládá ze dvou zdrojů oddělených oddělovačem "---" spojeným v souboru. Prvním z nich je prostředek Deployment, který bude nasazen jako ReplicaSet, jak je uvedeno v části "spec.*":

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

Tato část obsahuje specifikaci nasazení – 3 moduly pro začátek, které odpovídají štítku „app=wordpress,tier=backend“. Strategií nasazení je RollingUpdate, což znamená, že způsob, jakým Kubernetes nahradí modul, je pomocí postupné aktualizace, stejně jako u našeho nasazení ProxySQL.

Další částí je sekce "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


V této části říkáme Kubernetes, aby nasadil Wordpress 4.9 pomocí webového serveru Apache, a dali jsme kontejneru název „wordpress“. Kontejner bude restartován pokaždé, když bude mimo provoz, bez ohledu na stav. Chceme také, aby Kubernetes předával řadu proměnných prostředí:

  • WORDPRESS_DB_HOST - Hostitel databáze MySQL. Protože používáme ProxySQL jako službu, název služby bude mít hodnotu metadata.name což je "proxysql". ProxySQL naslouchá na portu 6033 pro připojení s vyváženým zatížením MySQL, zatímco konzola pro správu ProxySQL je na 6032.
  • WORDPRESS_DB_USER - Zadejte uživatele databáze wordpress, který byl vytvořen v části "Příprava databáze".
  • WORDPRESS_DB_PASSWORD – Heslo pro WORDPRESS_DB_USER . Protože v tomto souboru nechceme odhalit heslo, můžeme ho skrýt pomocí Kubernetes Secrets. Zde dáváme pokyn Kubernetes, aby si místo toho přečetl tajný zdroj „mysql-pass“. Tajemství musí být vytvořeno předem před nasazením modulu, jak je vysvětleno níže.

Chceme také zveřejnit port 80 podu pro koncového uživatele. Obsah Wordpressu uložený uvnitř /var/www/html v kontejneru bude připojen do našeho trvalého úložiště běžícího na NFS. Pro tento účel použijeme zdroje PersistentVolume a PersistentVolumeClaim, jak je uvedeno v části „Příprava trvalého úložiště pro Wordpress“.

Za zalomením "---" definujeme další zdroj s názvem 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

V této konfiguraci bychom chtěli, aby Kubernetes vytvořil službu s názvem „wordpress“, naslouchal na portu 30088 na všech uzlech (aka NodePort) do externí sítě a přeposlal ji na port 80 na všech podech označených „app=wordpress,tier=“. frontend".

Proto na základě naší výše uvedené definice YAML musíme připravit řadu zdrojů Kubernetes, než začneme nasazovat modul a službu „wordpress“:

  • PersistentVolume a PersistentVolumeClaim - Chcete-li ukládat webový obsah naší aplikace Wordpress, takže když je modul přeplánován na jiný pracovní uzel, nepřijdeme o poslední změny.
  • Tajemství - Chcete-li skrýt heslo uživatele databáze Wordpress v souboru YAML.

Příprava trvalého úložiště pro Wordpress

Dobré trvalé úložiště pro Kubernetes by mělo být dostupné pro všechny uzly Kubernetes v clusteru. V zájmu tohoto blogového příspěvku jsme jako poskytovatele PersistentVolume (PV) použili NFS, protože je to snadné a podporované ihned po vybalení. Server NFS se nachází někde mimo naši síť Kubernetes (jak je znázorněno na prvním schématu architektury) a nakonfigurovali jsme jej tak, aby umožňoval všechny uzly Kubernetes s následujícím řádkem v /etc/exports:

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

Vezměte na vědomí, že balíček klienta NFS musí být nainstalován na všech uzlech Kubernetes. Jinak by Kubernetes nemohl správně připojit NFS. Na všech uzlech:

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

Také se ujistěte, že na serveru NFS existuje cílový adresář:

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

Poté vytvořte soubor s názvem wordpress-pv-pvc.yml a přidejte následující řádky:

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

Ve výše uvedené definici říkáme Kubernetes, aby přidělil 3 GB prostoru na svazku na serveru NFS pro náš kontejner Wordpress. Při produkčním použití by měl být NFS nakonfigurován s automatickým zřizováním a třídou úložiště.

Vytvořte zdroje PV a PVC:

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

Ověřte, zda jsou tyto zdroje vytvořeny a stav musí být "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

Příprava tajemství pro Wordpress

Vytvořte tajný klíč, který bude kontejner Wordpress používat pro WORDPRESS_DB_PASSWORD proměnná prostředí. Důvodem je jednoduše to, že nechceme v souboru YAML zveřejňovat heslo jako prostý text.

Vytvořte tajný zdroj nazvaný mysql-pass a předejte mu heslo:

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

Ověřte, že je naše tajemství vytvořeno:

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

Nasazení ProxySQL a Wordpress

Konečně můžeme začít s nasazením. Nejprve nasaďte ProxySQL a poté Wordpress:

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

Poté můžeme vypsat všechny moduly a služby, které byly vytvořeny na úrovni „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>

Výše uvedený výstup ověřuje naši architekturu nasazení, kde aktuálně máme tři moduly Wordpress, veřejně přístupné na portu 30088 a také naši instanci ProxySQL, která je vystavena na portech 30033 a 30032 externě plus 6033 a 6032 interně.

V tuto chvíli naše architektura vypadá asi takto:

Port 80 publikovaný moduly Wordpress je nyní namapován na vnější svět prostřednictvím portu 30088. Náš příspěvek na blogu máme na adrese http://{any_kubernetes_host}:30088/ a měli bychom být přesměrováni na stránku instalace Wordpressu. Pokud bychom pokračovali v instalaci, přeskočilo by to část s připojením k databázi a přímo zobrazilo tuto stránku:

Znamená to, že naše konfigurace MySQL a ProxySQL je správně nakonfigurována v souboru wp-config.php. V opačném případě byste byli přesměrováni na konfigurační stránku databáze.

Naše nasazení je nyní dokončeno.

ProxySQL Pods a správa služeb

Očekává se, že převzetí služeb při selhání a obnovení bude automaticky zpracováno Kubernetes. Pokud například dojde k výpadku pracovníka Kubernetes, pod se znovu vytvoří v dalším dostupném uzlu po --pod-eviction-timeout (výchozí hodnota je 5 minut). Pokud se kontejner zhroutí nebo je zabit, Kubernetes jej téměř okamžitě nahradí.

Očekává se, že některé běžné úlohy správy se při spuštění v rámci Kubernetes budou lišit, jak je ukázáno v dalších částech.

Připojování k ProxySQL

Zatímco ProxySQL je vystaven externě na portu 30033 (MySQL) a 30032 (Admin), je také přístupný interně prostřednictvím publikovaných portů, 6033 a 6032. Pro přístup k instancím ProxySQL v síti Kubernetes tedy použijte CLUSTER-IP nebo název služby „proxysql“ jako hodnotu hostitele. Například v rámci Wordpress pod můžete přistupovat k administrátorské konzoli ProxySQL pomocí následujícího příkazu:

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

Pokud se chcete připojit externě, použijte port definovaný pod hodnotou nodePort pro službu YAML a jako hodnotu hostitele vyberte libovolný uzel Kubernetes:

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

Totéž platí pro připojení s vyváženým zatížením MySQL na portu 30033 (externí) a 6033 (interní).

Zvětšení a zmenšení

S Kubernetes je škálování snadné:

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

Ověřte stav zavádění:

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

Snížení je také podobné. Zde se chceme vrátit zpět z 5 na 2 repliky:

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

Můžeme se také podívat na události nasazení pro ProxySQL, abychom získali lepší obrázek o tom, co se stalo při tomto nasazení, pomocí možnosti „popsat“:

$ 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 automaticky vyrovnává zatížení připojení k modulům.

Změny konfigurace

Jedním ze způsobů, jak provést změny konfigurace na našich modulech ProxySQL, je verzování naší konfigurace pomocí jiného názvu ConfigMap. Nejprve upravte náš konfigurační soubor přímo prostřednictvím vašeho oblíbeného textového editoru:

$ vim /root/proxysql.cnf

Poté jej nahrajte do Kubernetes ConfigMap s jiným názvem. V tomto příkladu připojíme "-v2" k názvu zdroje:

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

Ověřte, zda je ConfigMap správně načtena:

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

Otevřete soubor nasazení ProxySQL, proxysql-rs-svc.yml a změňte následující řádek v části configMap na novou verzi:

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

Poté aplikujte změny na naše nasazení ProxySQL:

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

Ověřte zavedení pomocí pohledu na událost ReplicaSet pomocí příznaku "describe":

$ 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

Věnujte pozornost sekci "Volumes" s novým názvem ConfigMap. Události nasazení můžete také vidět ve spodní části výstupu. V tuto chvíli byla naše nová konfigurace nahrána do všech modulů ProxySQL, kde Kubernetes zmenšil ProxySQL ReplicaSet na 0 (v souladu se strategií RollingUpdate) a vrátil je zpět do požadovaného stavu 2 replik.

Poslední myšlenky

Až do tohoto okamžiku jsme se zabývali možným přístupem k nasazení ProxySQL v Kubernetes. Spuštění ProxySQL s pomocí Kubernetes ConfigMap otevírá novou možnost clusterování ProxySQL, kde je poněkud odlišné ve srovnání s nativní podporou clusterů zabudovanou v ProxySQL.

V nadcházejícím blogovém příspěvku prozkoumáme ProxySQL Clustering pomocí Kubernetes ConfigMap a jak to udělat správným způsobem. Zůstaňte naladěni!


  1. Základní příkazy SQL:Jak psát jednoduché dotazy s příklady

  2. Oracle sql:aktualizujte, pokud existuje else insert

  3. Jak mohu vytvořit uživatele v databázi SQL Server Express, kterou jsem přidal do svého projektu?

  4. Jak získat datum ze sloupce Datetime v MySQL