MariaDB
 sql >> Baza danych >  >> RDS >> MariaDB

Uruchamianie ProxySQL jako usługi Kubernetes

Podczas uruchamiania rozproszonych klastrów baz danych dość często stosuje się do nich mechanizmy równoważenia obciążenia. Korzyści są oczywiste — równoważenie obciążenia, przełączanie awaryjne połączeń i oddzielenie warstwy aplikacji od bazowych topologii baz danych. Aby uzyskać bardziej inteligentne równoważenie obciążenia, najlepszym rozwiązaniem byłby serwer proxy obsługujący bazę danych, taki jak ProxySQL lub MaxScale. W naszym poprzednim blogu pokazaliśmy, jak uruchomić ProxySQL jako kontener pomocniczy w Kubernetes. W tym poście na blogu pokażemy, jak wdrożyć ProxySQL jako usługę Kubernetes. Użyjemy Wordpressa jako przykładowej aplikacji, a zaplecze bazy danych działa na dwuwęzłowej replikacji MySQL wdrożonej przy użyciu ClusterControl. Poniższy diagram ilustruje naszą infrastrukturę:

Ponieważ zamierzamy wdrożyć podobną konfigurację, jak w poprzednim poście na blogu, należy się spodziewać powielania niektórych części wpisu na blogu, aby post był bardziej czytelny.

ProxySQL na Kubernetes

Zacznijmy od krótkiego podsumowania. Projektowanie architektury ProxySQL jest tematem subiektywnym i silnie uzależnionym od umiejscowienia aplikacji, kontenerów bazy danych oraz roli samego ProxySQL. W idealnej sytuacji możemy skonfigurować ProxySQL do zarządzania przez Kubernetes w dwóch konfiguracjach:

  1. ProxySQL jako usługa Kubernetes (scentralizowane wdrażanie)
  2. ProxySQL jako kontener pomocniczy w pod (rozproszone wdrożenie)

Oba wdrożenia można łatwo odróżnić, patrząc na następujący diagram:

W tym poście na blogu omówimy pierwszą konfigurację — uruchamianie ProxySQL jako usługi Kubernetes. Druga konfiguracja została już omówiona tutaj. W przeciwieństwie do podejścia kontenera pomocnika, uruchamianie jako usługa sprawia, że ​​pody ProxySQL działają niezależnie od aplikacji i mogą być łatwo skalowane i klastrowane razem za pomocą Kubernetes ConfigMap. Jest to zdecydowanie inne podejście do klastrowania niż natywna obsługa klastrów ProxySQL, która opiera się na sumie kontrolnej konfiguracji w instancjach ProxySQL (tzw. proxysql_servers). Sprawdź ten wpis na blogu, jeśli chcesz dowiedzieć się więcej o klastrowaniu ProxySQL, które jest łatwe dzięki ClusterControl.

W Kubernetes wielowarstwowy system konfiguracji ProxySQL umożliwia klastrowanie pod za pomocą programu ConfigMap. Istnieje jednak wiele niedociągnięć i obejść, które sprawiają, że działa płynnie, tak jak robi to natywna funkcja klastrowania ProxySQL. W tej chwili sygnalizowanie poda po aktualizacji ConfigMap jest funkcją, nad którą pracujemy. Ten temat omówimy bardziej szczegółowo w nadchodzącym poście na blogu.

Zasadniczo musimy utworzyć pody ProxySQL i dołączyć usługę Kubernetes, aby uzyskać dostęp do innych podów w sieci Kubernetes lub zewnętrznie. Aplikacje będą wówczas łączyć się z usługą ProxySQL za pośrednictwem sieci TCP/IP na skonfigurowanych portach. Domyślnie 6033 dla połączeń z równoważeniem obciążenia MySQL i 6032 dla konsoli administracyjnej ProxySQL. W przypadku więcej niż jednej repliki połączenia z podem będą równoważone automatycznie przez komponent Kubernetes kube-proxy działający na każdym węźle Kubernetes.

ProxySQL jako usługa Kubernetes

W tej konfiguracji uruchamiamy zarówno ProxySQL, jak i Wordpress jako pody i usługi. Poniższy diagram ilustruje naszą architekturę wysokiego poziomu:

W tej konfiguracji wdrożymy dwa pody i usługi — „wordpress” i „proxysql”. Połączymy deklaracje wdrażania i usług w jednym pliku YAML na aplikację i będziemy zarządzać nimi jako jedną jednostką. Aby zawartość kontenerów aplikacji była trwała w wielu węzłach, musimy użyć klastrowego lub zdalnego systemu plików, którym w tym przypadku jest NFS.

Wdrożenie ProxySQL jako usługi przynosi kilka dobrych rzeczy w stosunku do podejścia kontenera pomocniczego:

  • Korzystając z podejścia Kubernetes ConfigMap, ProxySQL można łączyć w klastry z niezmienną konfiguracją.
  • Kubernetes obsługuje odzyskiwanie ProxySQL i automatycznie równoważy połączenia z instancjami.
  • Pojedynczy punkt końcowy z implementacją wirtualnego adresu IP Kubernetes o nazwie ClusterIP.
  • Scentralizowana warstwa zwrotnego proxy z architekturą niczego nie współdzielonego.
  • Może być używany z aplikacjami zewnętrznymi poza Kubernetes.

Rozpoczniemy wdrażanie jako dwie repliki dla ProxySQL i trzy dla Wordpress, aby zademonstrować działanie na dużą skalę i możliwości równoważenia obciążenia, które oferuje Kubernetes.

Przygotowywanie bazy danych

Utwórz bazę danych wordpress i użytkownika na urządzeniu głównym i przypisz z odpowiednimi uprawnieniami:

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

Utwórz także użytkownika monitorującego ProxySQL:

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

Następnie ponownie załaduj tabelę grantów:

mysql-master> FLUSH PRIVILEGES;

Pod ProxySQL i definicja usługi

Następnym krokiem jest przygotowanie naszego wdrożenia ProxySQL. Utwórz plik o nazwie proxysql-rs-svc.yml i dodaj następujące wiersze:

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

Zobaczmy, o co chodzi w tych definicjach. YAML składa się z dwóch zasobów połączonych w plik, oddzielonych separatorem „---”. Pierwszym zasobem jest wdrożenie, które definiujemy w następującej specyfikacji:

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

Powyższe oznacza, że ​​chcielibyśmy wdrożyć dwa pody ProxySQL jako zestaw replik, który pasuje do kontenerów oznaczonych etykietą „app=proxysql,tier=frontend”. Strategia wdrażania określa strategię używaną do zastępowania starych zasobników nowymi. W tym wdrożeniu wybraliśmy RollingUpdate, co oznacza, że ​​pody będą aktualizowane w sposób ciągły, po jednym pod na raz.

Kolejna część to szablon kontenera:

      - 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

W spec.templates.spec.container.* w sekcji, mówimy Kubernetesowi, aby wdrożył ProxySQL przy użyciu severalnines/proxysql wersja obrazu 1.4.12. Chcemy również, aby Kubernetes zamontował nasz niestandardowy, wstępnie skonfigurowany plik konfiguracyjny i zmapował go do /etc/proxysql.cnf wewnątrz kontenera. Działające zasobniki opublikują dwa porty — 6033 i 6032. Zdefiniujemy również sekcję „wolumy”, w której poinstruujemy Kubernetes, aby zamontował ConfigMap jako wolumin wewnątrz zasobników ProxySQL, które mają być montowane przez volumeMounts.

Drugim zasobem jest usługa. Usługa Kubernetes to warstwa abstrakcji, która definiuje logiczny zestaw podów i zasady dostępu do nich. W tej sekcji definiujemy:

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

W tym przypadku chcemy, aby dostęp do naszego ProxySQL był możliwy z sieci zewnętrznej, dlatego wybranym typem jest typ NodePort. Spowoduje to opublikowanie nodePort na wszystkich węzłach Kubernetes w klastrze. Zakres prawidłowych portów dla zasobu NodePort to 30000-32767. Wybraliśmy port 30033 dla połączeń z równoważeniem obciążenia MySQL, który jest zmapowany na port 6033 w kapsułach ProxySQL i port 30032 dla portu administracyjnego ProxySQL zmapowanego na 6032.

Dlatego, w oparciu o naszą definicję YAML powyżej, musimy przygotować następujący zasób Kubernetes, zanim będziemy mogli rozpocząć wdrażanie pod „proxysql”:

  • ConfigMap — do przechowywania pliku konfiguracyjnego ProxySQL jako woluminu, aby można go było zamontować w wielu zasobnikach i ponownie zamontować, jeśli zasobnik zostanie przeniesiony do innego węzła Kubernetes.

Przygotowywanie ConfigMap dla ProxySQL

Podobnie jak w poprzednim poście w blogu, zamierzamy użyć podejścia ConfigMap do oddzielenia pliku konfiguracyjnego od kontenera, a także do celów skalowalności. Zwróć uwagę, że w tej konfiguracji uważamy, że nasza konfiguracja ProxySQL jest niezmienna.

Najpierw utwórz plik konfiguracyjny ProxySQL, proxysql.cnf i dodaj następujące wiersze:

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

Zwróć uwagę na admin_variables.admin_credentials zmienna, w której użyliśmy użytkownika innego niż domyślny, którym jest „proxysql-admin”. ProxySQL rezerwuje domyślnego użytkownika „admin” tylko do połączenia lokalnego przez localhost. Dlatego musimy użyć innych użytkowników, aby uzyskać zdalny dostęp do instancji ProxySQL. W przeciwnym razie otrzymasz następujący błąd:

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

Nasza konfiguracja ProxySQL opiera się na naszych dwóch serwerach baz danych działających w replikacji MySQL, jak podsumowano na poniższym zrzucie ekranu topologii zaczerpniętym z ClusterControl:

Wszystkie zapisy powinny iść do węzła głównego, podczas gdy odczyty są przekazywane do grupy hostów 20, zgodnie z definicją w sekcji „mysql_query_rules”. To podstawa dzielenia odczytu/zapisu i chcemy je całkowicie wykorzystać.

Następnie zaimportuj plik konfiguracyjny do ConfigMap:

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

Sprawdź, czy ConfigMap jest załadowany do Kubernetes:

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

Definicja poda i usługi Wordpress

Teraz wklej następujące wiersze do pliku o nazwie wordpress-rs-svc.yml na hoście, na którym skonfigurowano 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

Podobnie do naszej definicji ProxySQL, YAML składa się z dwóch zasobów oddzielonych ogranicznikiem „---” połączonych w pliku. Pierwszym z nich jest zasób Deployment, który zostanie wdrożony jako ReplicaSet, jak pokazano w sekcji „spec.*”:

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

Ta sekcja zawiera specyfikację wdrożenia — 3 pody na początek, które odpowiadają etykiecie „app=wordpress,tier=backend”. Strategia wdrażania to RollingUpdate, co oznacza, że ​​sposób, w jaki Kubernetes zastąpi pod, polega na użyciu sposobu aktualizacji kroczących, tak samo jak w przypadku wdrożenia ProxySQL.

Następna część to sekcja „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


W tej sekcji mówimy Kubernetes, aby wdrożył Wordpress 4.9 przy użyciu serwera WWW Apache, a kontenerowi nadaliśmy nazwę "wordpress". Kontener będzie uruchamiany ponownie za każdym razem, gdy zostanie wyłączony, niezależnie od stanu. Chcemy również, aby Kubernetes przekazywał szereg zmiennych środowiskowych:

  • WORDPRESS_DB_HOST - Host bazy danych MySQL. Ponieważ używamy ProxySQL jako usługi, nazwa usługi będzie wartością metadata.name czyli "proxysql". ProxySQL nasłuchuje na porcie 6033 dla połączeń MySQL ze zrównoważonym obciążeniem, podczas gdy konsola administracyjna ProxySQL jest na 6032.
  • WORDPRESS_DB_USER - Określ użytkownika bazy danych Wordpress, który został utworzony w sekcji „Przygotowywanie bazy danych”.
  • WORDPRESS_DB_PASSWORD - Hasło dla WORDPRESS_DB_USER . Ponieważ nie chcemy ujawniać hasła w tym pliku, możemy je ukryć za pomocą Kubernetes Secrets. Tutaj instruujemy Kubernetes, aby zamiast tego przeczytał zasób tajny "mysql-pass". Sekrety muszą zostać utworzone na zaawansowanym etapie przed wdrożeniem pod, jak wyjaśniono poniżej.

Chcemy również opublikować port 80 poda dla użytkownika końcowego. Zawartość Wordpress przechowywana w /var/www/html w kontenerze zostanie zamontowana w naszym trwałym magazynie działającym na NFS. W tym celu użyjemy zasobów PersistentVolume i PersistentVolumeClaim, jak pokazano w sekcji „Przygotowywanie trwałego magazynu dla Wordpress”.

Po linii przerwania „---” definiujemy kolejny zasób o nazwie Usługa:

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

W tej konfiguracji chcielibyśmy, aby Kubernetes utworzył usługę o nazwie „wordpress”, nasłuchiwał na porcie 30088 na wszystkich węzłach (aka NodePort) do sieci zewnętrznej i przekazywał go do portu 80 we wszystkich podach oznaczonych „app=wordpress,tier=nakładka”.

Dlatego, w oparciu o naszą definicję YAML powyżej, musimy przygotować szereg zasobów Kubernetes, zanim będziemy mogli rozpocząć wdrażanie poda i usługi „wordpress”:

  • Stała głośność i PersistentVolumeClaim - Aby przechowywać zawartość sieciową naszej aplikacji Wordpress, więc gdy pod zostanie przeniesiony do innego węzła roboczego, nie stracimy ostatnich zmian.
  • Sekrety - Aby ukryć hasło użytkownika bazy danych Wordpress w pliku YAML.

Przygotowywanie pamięci trwałej dla Wordpress

Dobry magazyn trwały dla Kubernetes powinien być dostępny dla wszystkich węzłów Kubernetes w klastrze. Na potrzeby tego wpisu na blogu użyliśmy NFS jako dostawcy PersistentVolume (PV), ponieważ jest łatwy i obsługiwany od razu po zainstalowaniu. Serwer NFS znajduje się gdzieś poza naszą siecią Kubernetes (jak pokazano na pierwszym schemacie architektury) i skonfigurowaliśmy go tak, aby zezwalał na wszystkie węzły Kubernetes z następującym wierszem w /etc/exports:

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

Zwróć uwagę, że pakiet klienta NFS musi być zainstalowany na wszystkich węzłach Kubernetes. W przeciwnym razie Kubernetes nie byłby w stanie poprawnie zamontować NFS. Na wszystkich węzłach:

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

Upewnij się również, że na serwerze NFS istnieje katalog docelowy:

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

Następnie utwórz plik o nazwie wordpress-pv-pvc.yml i dodaj następujące wiersze:

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

W powyższej definicji mówimy Kubernetesowi, aby przydzielił 3 GB przestrzeni woluminu na serwerze NFS dla naszego kontenera Wordpress. Zwróć uwagę na użycie produkcyjne, NFS powinien być skonfigurowany z automatycznym udostępnianiem i klasą pamięci.

Utwórz zasoby PV i PVC:

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

Sprawdź, czy te zasoby zostały utworzone i czy musi mieć status „Związany”:

$ 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

Przygotowywanie sekretów dla Wordpressa

Utwórz klucz tajny, który będzie używany przez kontener Wordpress dla WORDPRESS_DB_PASSWORD Zmienna środowiskowa. Powodem jest to, że nie chcemy ujawniać hasła w postaci zwykłego tekstu w pliku YAML.

Utwórz tajny zasób o nazwie mysql-pass i odpowiednio przekaż hasło:

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

Sprawdź, czy nasz sekret został utworzony:

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

Wdrażanie ProxySQL i Wordpress

Wreszcie możemy rozpocząć wdrażanie. Najpierw wdróż ProxySQL, a następnie Wordpress:

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

Następnie możemy wyświetlić listę wszystkich podów i usług, które zostały utworzone w warstwie „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>

Powyższe dane wyjściowe weryfikują naszą architekturę wdrożeniową, w której obecnie mamy trzy pody Wordpress, udostępnione publicznie na porcie 30088, a także naszą instancję ProxySQL, która jest uwidoczniona na portach 30033 i 30032 zewnętrznie oraz 6033 i 6032 wewnętrznie.

W tym momencie nasza architektura wygląda mniej więcej tak:

Port 80 opublikowany przez pody Wordpress jest teraz mapowany na świat zewnętrzny przez port 30088. Możemy uzyskać dostęp do naszego wpisu na blogu pod adresem http://{any_kubernetes_host}:30088/ i powinien zostać przekierowany na stronę instalacji Wordpress. Jeśli będziemy kontynuować instalację, pominiemy część dotyczącą połączenia z bazą danych i wyświetlimy bezpośrednio tę stronę:

Oznacza to, że nasza konfiguracja MySQL i ProxySQL jest poprawnie skonfigurowana w pliku wp-config.php. W przeciwnym razie zostaniesz przekierowany na stronę konfiguracji bazy danych.

Nasze wdrożenie zostało zakończone.

Pody ProxySQL i zarządzanie usługami

Oczekuje się, że przełączanie awaryjne i odzyskiwanie będą obsługiwane automatycznie przez Kubernetes. Na przykład, jeśli pracownik Kubernetes przestanie działać, pod zostanie odtworzony w następnym dostępnym węźle po --pod-eviction-timeout (domyślnie 5 minut). Jeśli kontener ulegnie awarii lub zostanie zabity, Kubernetes zastąpi go niemal natychmiast.

Oczekuje się, że niektóre typowe zadania zarządzania będą inne podczas uruchamiania w Kubernetes, jak pokazano w następnych sekcjach.

Łączenie z ProxySQL

Chociaż ProxySQL jest udostępniany zewnętrznie na portach 30033 (MySQL) i 30032 (Admin), jest również dostępny wewnętrznie za pośrednictwem opublikowanych portów, odpowiednio 6033 i 6032. Tak więc, aby uzyskać dostęp do instancji ProxySQL w sieci Kubernetes, użyj CLUSTER-IP lub nazwy usługi „proxysql” jako wartości hosta. Na przykład, w ramach programu Wordpress, możesz uzyskać dostęp do konsoli administracyjnej ProxySQL za pomocą następującego polecenia:

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

Jeśli chcesz połączyć się zewnętrznie, użyj portu zdefiniowanego w wartości nodePort dla usługi YAML i wybierz dowolny węzeł Kubernetes jako wartość hosta:

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

To samo dotyczy połączenia MySQL ze zrównoważonym obciążeniem na porcie 30033 (zewnętrznym) i 6033 (wewnętrznym).

Skalowanie w górę i w dół

Skalowanie w górę jest łatwe dzięki Kubernetes:

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

Sprawdź stan wdrożenia:

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

Skalowanie również jest podobne. Tutaj chcemy przywrócić z 5 do 2 replik:

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

Możemy również przyjrzeć się zdarzeniom wdrożenia dla ProxySQL, aby uzyskać lepszy obraz tego, co wydarzyło się w przypadku tego wdrożenia, korzystając z opcji „opisz”:

$ 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

Połączenia z podami będą automatycznie równoważone przez Kubernetes.

Zmiany konfiguracji

Jednym ze sposobów wprowadzania zmian w konfiguracji w naszych zasobnikach ProxySQL jest przechowywanie wersji naszej konfiguracji przy użyciu innej nazwy ConfigMap. Po pierwsze, zmodyfikuj nasz plik konfiguracyjny bezpośrednio za pomocą ulubionego edytora tekstu:

$ vim /root/proxysql.cnf

Następnie załaduj go do Kubernetes ConfigMap pod inną nazwą. W tym przykładzie do nazwy zasobu dołączamy „-v2”:

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

Sprawdź, czy ConfigMap jest poprawnie załadowany:

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

Otwórz plik wdrożenia ProxySQL, proxysql-rs-svc.yml i zmień następującą linię w sekcji configMap na nową wersję:

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

Następnie zastosuj zmiany do naszego wdrożenia ProxySQL:

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

Zweryfikuj wdrożenie, sprawdzając zdarzenie ReplicaSet przy użyciu flagi „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

Zwróć uwagę na sekcję „Woluminy” z nową nazwą ConfigMap. Możesz również zobaczyć zdarzenia wdrożenia na dole danych wyjściowych. W tym momencie nasza nowa konfiguracja została załadowana do wszystkich podów ProxySQL, w których Kubernetes obniżył ProxySQL ReplicaSet do 0 (zgodnie ze strategią RollingUpdate) i przywrócił je do pożądanego stanu 2 replik.

Ostateczne myśli

Do tego momentu omówiliśmy możliwe podejście do wdrażania ProxySQL w Kubernetes. Uruchamianie ProxySQL z pomocą Kubernetes ConfigMap otwiera nową możliwość klastrowania ProxySQL, gdzie jest nieco inny niż natywna obsługa klastrów wbudowana w ProxySQL.

W nadchodzącym poście w blogu omówimy klastrowanie ProxySQL przy użyciu Kubernetes ConfigMap i jak to zrobić we właściwy sposób. Bądź na bieżąco!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Porównanie czasów przełączania awaryjnego dla Amazon Aurora, Amazon RDS i ClusterControl

  2. Jak HOUR() działa w MariaDB

  3. Jak dodać AM/PM do wartości czasu lub daty i godziny w MariaDB?

  4. Jak naprawić błąd przekroczenia limitu czasu oczekiwania na blokadę w MySQL?

  5. Co nowego w MariaDB 10.6