MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

Chạy ProxySQL dưới dạng Dịch vụ Kubernetes

Khi chạy các cụm cơ sở dữ liệu phân tán, việc đặt chúng trước các bộ cân bằng tải là điều khá phổ biến. Những ưu điểm rất rõ ràng - cân bằng tải, chuyển đổi dự phòng kết nối và tách lớp ứng dụng khỏi các cấu trúc liên kết cơ sở dữ liệu bên dưới. Để cân bằng tải thông minh hơn, một proxy nhận biết cơ sở dữ liệu như ProxySQL hoặc MaxScale sẽ là cách để đi. Trong blog trước của chúng tôi, chúng tôi đã hướng dẫn bạn cách chạy ProxySQL như một vùng chứa trợ giúp trong Kubernetes. Trong bài đăng trên blog này, chúng tôi sẽ hướng dẫn bạn cách triển khai ProxySQL dưới dạng dịch vụ Kubernetes. Chúng tôi sẽ sử dụng Wordpress làm ứng dụng mẫu và phần phụ trợ cơ sở dữ liệu đang chạy trên Bản sao MySQL hai nút được triển khai bằng ClusterControl. Sơ đồ sau minh họa cơ sở hạ tầng của chúng tôi:

Vì chúng tôi sẽ triển khai một thiết lập tương tự như trong bài đăng trên blog trước này, chúng tôi mong đợi sự trùng lặp trong một số phần của bài đăng trên blog để giữ cho bài đăng dễ đọc hơn.

ProxySQL trên Kubernetes

Hãy bắt đầu với một chút tóm tắt. Thiết kế một kiến ​​trúc ProxySQL là một chủ đề chủ quan và phụ thuộc nhiều vào vị trí của ứng dụng, vùng chứa cơ sở dữ liệu cũng như vai trò của chính ProxySQL. Lý tưởng nhất là chúng ta có thể định cấu hình ProxySQL được Kubernetes quản lý bằng hai cấu hình:

  1. ProxySQL dưới dạng dịch vụ Kubernetes (triển khai tập trung)
  2. ProxySQL như một vùng chứa trợ giúp trong một nhóm (triển khai phân tán)

Có thể dễ dàng phân biệt cả hai cách triển khai bằng cách nhìn vào sơ đồ sau:

Bài đăng trên blog này sẽ đề cập đến cấu hình đầu tiên - chạy ProxySQL như một dịch vụ Kubernetes. Cấu hình thứ hai đã được đề cập ở đây. Ngược lại với cách tiếp cận vùng chứa trợ giúp, việc chạy như một dịch vụ làm cho các nhóm ProxySQL sống độc lập với các ứng dụng và có thể dễ dàng mở rộng quy mô và nhóm lại với nhau với sự trợ giúp của Kubernetes ConfigMap. Đây chắc chắn là một cách tiếp cận phân cụm khác với hỗ trợ phân cụm gốc ProxySQL dựa trên tổng kiểm tra cấu hình trên các phiên bản ProxySQL (còn gọi là proxysql_servers). Hãy xem bài đăng trên blog này nếu bạn muốn tìm hiểu về phân cụm ProxySQL được thực hiện dễ dàng với ClusterControl.

Trong Kubernetes, hệ thống cấu hình nhiều lớp của ProxySQL làm cho việc phân cụm nhóm có thể thực hiện được với ConfigMap. Tuy nhiên, có một số thiếu sót và cách giải quyết để làm cho nó hoạt động trơn tru như những gì tính năng phân cụm gốc của ProxySQL thực hiện. Hiện tại, báo hiệu một nhóm khi cập nhật ConfigMap là một tính năng đang hoạt động. Chúng tôi sẽ đề cập đến chủ đề này một cách chi tiết hơn trong một bài đăng blog sắp tới.

Về cơ bản, chúng ta cần tạo các nhóm ProxySQL và đính kèm một dịch vụ Kubernetes để các nhóm khác truy cập trong mạng Kubernetes hoặc bên ngoài. Các ứng dụng sau đó sẽ kết nối với dịch vụ ProxySQL thông qua mạng TCP / IP trên các cổng được cấu hình. Mặc định là 6033 cho các kết nối cân bằng tải MySQL và 6032 cho bảng điều khiển quản trị ProxySQL. Với nhiều hơn một bản sao, các kết nối đến nhóm sẽ được cân bằng tải tự động bởi thành phần kube-proxy Kubernetes chạy trên mọi nút Kubernetes.

ProxySQL dưới dạng Dịch vụ Kubernetes

Trong thiết lập này, chúng tôi chạy cả ProxySQL và Wordpress dưới dạng nhóm và dịch vụ. Sơ đồ sau minh họa kiến ​​trúc cấp cao của chúng tôi:

Trong thiết lập này, chúng tôi sẽ triển khai hai nhóm và dịch vụ - "wordpress" và "proxysql". Chúng tôi sẽ hợp nhất khai báo Triển khai và Dịch vụ trong một tệp YAML cho mỗi ứng dụng và quản lý chúng như một đơn vị. Để giữ cho nội dung của vùng chứa ứng dụng liên tục trên nhiều nút, chúng tôi phải sử dụng hệ thống tệp được phân cụm hoặc từ xa, trong trường hợp này là NFS.

Triển khai ProxySQL như một dịch vụ mang lại một số điều tốt so với phương pháp tiếp cận vùng chứa trợ giúp:

  • Sử dụng phương pháp Kubernetes ConfigMap, ProxySQL có thể được phân nhóm với cấu hình bất biến.
  • Kubernetes xử lý khôi phục ProxySQL và tự động cân bằng kết nối với các phiên bản.
  • Một điểm cuối có triển khai địa chỉ IP ảo Kubernetes được gọi là ClusterIP.
  • Cấp proxy ngược tập trung không có kiến ​​trúc được chia sẻ.
  • Có thể được sử dụng với các ứng dụng bên ngoài bên ngoài Kubernetes.

Chúng tôi sẽ bắt đầu triển khai dưới dạng hai bản sao cho ProxySQL và ba bản cho Wordpress để chứng minh khả năng chạy ở quy mô và khả năng cân bằng tải mà Kubernetes cung cấp.

Chuẩn bị cơ sở dữ liệu

Tạo cơ sở dữ liệu và người dùng wordpress trên bản chính và gán đặc quyền chính xác:

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

Ngoài ra, hãy tạo người dùng giám sát ProxySQL:

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

Sau đó, tải lại bảng tài trợ:

mysql-master> FLUSH PRIVILEGES;

ProxySQL Pod và Định nghĩa dịch vụ

Việc tiếp theo là chuẩn bị triển khai ProxySQL của chúng tôi. Tạo tệp có tên proxysql-rs-svc.yml và thêm các dòng sau:

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

Hãy xem những định nghĩa đó là gì. YAML bao gồm hai tài nguyên được kết hợp trong một tệp, được phân tách bằng dấu phân cách "---". Tài nguyên đầu tiên là Triển khai, mà chúng tôi xác định thông số kỹ thuật sau:

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

Điều trên có nghĩa là chúng tôi muốn triển khai hai nhóm ProxySQL dưới dạng ReplicaSet khớp với các vùng chứa có nhãn "app =proxysql, tier =frontend". Chiến lược triển khai chỉ định chiến lược được sử dụng để thay thế các nhóm cũ bằng các nhóm mới. Trong lần triển khai này, chúng tôi đã chọn RollingUpdate có nghĩa là các nhóm sẽ được cập nhật theo kiểu cập nhật liên tục, từng nhóm một.

Phần tiếp theo là mẫu của vùng chứa:

      - 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

Trong spec.templates.spec.containers. * , chúng tôi đang yêu cầu Kubernetes triển khai ProxySQL bằng cách sử dụng vàinines / proxysql phiên bản hình ảnh 1.4.12. Chúng tôi cũng muốn Kubernetes gắn tệp cấu hình tùy chỉnh, được định cấu hình trước của chúng tôi và ánh xạ nó tới /etc/proxysql.cnf bên trong vùng chứa. Các nhóm đang chạy sẽ xuất bản hai cổng - 6033 và 6032. Chúng tôi cũng xác định phần "khối lượng", nơi chúng tôi hướng dẫn Kubernetes gắn kết Bản đồ cấu hình như một ổ đĩa bên trong các nhóm ProxySQL để được gắn kết bằng khối lượng.

Tài nguyên thứ hai là dịch vụ. Dịch vụ Kubernetes là một lớp trừu tượng xác định tập hợp lôgic của các nhóm và một chính sách để truy cập chúng. Trong phần này, chúng tôi xác định những điều sau:

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

Trong trường hợp này, chúng tôi muốn ProxySQL của chúng tôi được truy cập từ mạng bên ngoài, do đó kiểu NodePort là kiểu được chọn. Điều này sẽ xuất bản nodePort trên mọi nút Kubernetes trong cụm. Phạm vi các cổng hợp lệ cho tài nguyên NodePort là 30000-32767. Chúng tôi đã chọn cổng 30033 cho các kết nối cân bằng tải MySQL được ánh xạ tới cổng 6033 của nhóm ProxySQL và cổng 30032 cho cổng Quản trị ProxySQL được ánh xạ tới 6032.

Do đó, dựa trên định nghĩa YAML của chúng tôi ở trên, chúng tôi phải chuẩn bị tài nguyên Kubernetes sau trước khi có thể bắt đầu triển khai nhóm "proxysql":

  • ConfigMap - Để lưu trữ tệp cấu hình ProxySQL dưới dạng một ổ đĩa để nó có thể được gắn vào nhiều nhóm và có thể được đếm lại nếu nhóm đó đang được lên lịch lại cho nút Kubernetes khác.

Chuẩn bị Bản đồ cấu hình cho ProxySQL

Tương tự như bài đăng trên blog trước, chúng tôi sẽ sử dụng phương pháp ConfigMap để tách tệp cấu hình khỏi vùng chứa và cũng cho mục đích khả năng mở rộng. Lưu ý rằng trong thiết lập này, chúng tôi coi cấu hình ProxySQL của chúng tôi là bất biến.

Trước tiên, hãy tạo tệp cấu hình ProxySQL, proxysql.cnf và thêm các dòng sau:

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

Hãy chú ý đến admin_variables.admin_credentials biến mà chúng tôi đã sử dụng người dùng không phải mặc định là "proxysql-admin". ProxySQL chỉ dành riêng người dùng "quản trị viên" mặc định cho kết nối cục bộ qua máy chủ cục bộ. Do đó, chúng tôi phải sử dụng những người dùng khác để truy cập phiên bản ProxySQL từ xa. Nếu không, bạn sẽ gặp lỗi sau:

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

Cấu hình ProxySQL của chúng tôi dựa trên hai máy chủ cơ sở dữ liệu của chúng tôi đang chạy trong MySQL Replication như được tóm tắt trong ảnh chụp màn hình Topology sau được lấy từ ClusterControl:

Tất cả các lần ghi phải chuyển đến nút chính trong khi các lần đọc được chuyển tiếp đến nhóm máy chủ 20, như được định nghĩa trong phần "mysql_query_rules". Đó là điều cơ bản của phân tách đọc / ghi và chúng tôi muốn sử dụng chúng hoàn toàn.

Sau đó, nhập tệp cấu hình vào Bản đồ cấu hình:

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

Xác minh xem Bản đồ cấu hình có được tải vào Kubernetes hay không:

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

Wordpress Pod và Định nghĩa dịch vụ

Bây giờ, hãy dán các dòng sau vào một tệp có tên là wordpress-rs-svc.yml trên máy chủ nơi kubectl được định cấu hình:

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

Tương tự như định nghĩa ProxySQL của chúng tôi, YAML bao gồm hai tài nguyên, được phân tách bằng dấu phân cách "---" được kết hợp trong một tệp. Đầu tiên là tài nguyên Triển khai, tài nguyên này sẽ được triển khai dưới dạng ReplicaSet, như được hiển thị trong phần "spec. *":

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

Phần này cung cấp thông số kỹ thuật Triển khai - 3 nhóm để bắt đầu khớp với nhãn "app =wordpress, tier =backend". Chiến lược triển khai là RollingUpdate có nghĩa là cách Kubernetes sẽ thay thế nhóm này bằng cách sử dụng thời trang cập nhật liên tục, giống với việc triển khai ProxySQL của chúng tôi.

Phần tiếp theo là phầ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


Trong phần này, chúng tôi đang yêu cầu Kubernetes triển khai Wordpress 4.9 bằng máy chủ web Apache và chúng tôi đã đặt tên cho vùng chứa là "wordpress". Vùng chứa sẽ được khởi động lại mỗi khi nó gặp sự cố, bất kể trạng thái như thế nào. Chúng tôi cũng muốn Kubernetes chuyển một số biến môi trường:

  • WORDPRESS_DB_HOST - Máy chủ cơ sở dữ liệu MySQL. Vì chúng tôi đang sử dụng ProxySQL làm dịch vụ nên tên dịch vụ sẽ là giá trị của metadata.name là "proxysql". ProxySQL lắng nghe trên cổng 6033 cho các kết nối cân bằng tải MySQL trong khi bảng điều khiển quản trị ProxySQL trên 6032.
  • WORDPRESS_DB_USER - Chỉ định người dùng cơ sở dữ liệu wordpress đã được tạo trong phần "Chuẩn bị cơ sở dữ liệu".
  • WORDPRESS_DB_PASSWORD - Mật khẩu cho WORDPRESS_DB_USER . Vì chúng tôi không muốn để lộ mật khẩu trong tệp này, chúng tôi có thể ẩn nó bằng cách sử dụng Kubernetes Secrets. Ở đây, chúng tôi hướng dẫn Kubernetes đọc tài nguyên Bí mật "mysql-pass" để thay thế. Các bí mật phải được tạo nâng cao trước khi triển khai nhóm, như đã giải thích thêm.

Chúng tôi cũng muốn xuất bản cổng 80 của pod cho người dùng cuối. Nội dung Wordpress được lưu trữ bên trong / var / www / html trong vùng chứa sẽ được gắn vào bộ nhớ liên tục chạy trên NFS của chúng tôi. Chúng tôi sẽ sử dụng các tài nguyên PersentlyVolume và PersentlyVolumeClaim cho mục đích này như được hiển thị trong phần "Chuẩn bị lưu trữ liên tục cho Wordpress".

Sau dòng ngắt "---", chúng tôi xác định một tài nguyên khác được gọi là Dịch vụ:

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

Trong cấu hình này, chúng tôi muốn Kubernetes tạo một dịch vụ có tên "wordpress", lắng nghe trên cổng 30088 trên tất cả các nút (còn gọi là NodePort) với mạng bên ngoài và chuyển tiếp nó tới cổng 80 trên tất cả các nhóm có nhãn "app =wordpress, tier =giao diện người dùng ".

Do đó, dựa trên định nghĩa YAML của chúng tôi ở trên, chúng tôi phải chuẩn bị một số tài nguyên Kubernetes trước khi có thể bắt đầu triển khai nhóm và dịch vụ "wordpress":

  • PersentlyVolume PersentlyVolumeClaim - Để lưu trữ nội dung web của ứng dụng Wordpress của chúng tôi, vì vậy khi nhóm đang được lên lịch lại đến nút công nhân khác, chúng tôi sẽ không mất các thay đổi cuối cùng.
  • Bí mật - Để ẩn mật khẩu người dùng cơ sở dữ liệu Wordpress bên trong tệp YAML.

Chuẩn bị lưu trữ liên tục cho Wordpress

Tất cả các nút Kubernetes trong cụm đều có thể truy cập được một bộ lưu trữ liên tục tốt cho Kubernetes. Vì lợi ích của bài đăng trên blog này, chúng tôi đã sử dụng NFS làm nhà cung cấp PersentlyVolume (PV) vì nó dễ dàng và được hỗ trợ ngay từ đầu. Máy chủ NFS được đặt ở đâu đó bên ngoài mạng Kubernetes của chúng tôi (như được hiển thị trong sơ đồ kiến ​​trúc đầu tiên) và chúng tôi đã định cấu hình nó để cho phép tất cả các nút Kubernetes có dòng sau bên trong / etc / export:

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

Lưu ý rằng gói máy khách NFS phải được cài đặt trên tất cả các nút Kubernetes. Nếu không, Kubernetes sẽ không thể gắn NFS một cách chính xác. Trên tất cả các nút:

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

Ngoài ra, hãy đảm bảo rằng trên máy chủ NFS, thư mục đích tồn tại:

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

Sau đó, tạo một tệp có tên wordpress-pv-pvc.yml và thêm các dòng sau:

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

Trong định nghĩa trên, chúng tôi đang yêu cầu Kubernetes phân bổ 3GB dung lượng ổ đĩa trên máy chủ NFS cho vùng chứa Wordpress của chúng tôi. Lưu ý đối với việc sử dụng sản xuất, NFS nên được định cấu hình với trình cấp phép tự động và lớp lưu trữ.

Tạo nguồn PV và PVC:

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

Xác minh xem các tài nguyên đó có được tạo hay không và trạng thái phải là "Đã ràng buộc":

$ 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

Chuẩn bị bí mật cho Wordpress

Tạo bí mật để vùng chứa Wordpress sử dụng cho WORDPRESS_DB_PASSWORD biến môi trường. Lý do đơn giản là vì chúng tôi không muốn để lộ mật khẩu dưới dạng văn bản rõ ràng bên trong tệp YAML.

Tạo một tài nguyên bí mật được gọi là mysql-pass và chuyển mật khẩu tương ứng:

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

Xác minh rằng bí mật của chúng tôi được tạo ra:

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

Triển khai ProxySQL và Wordpress

Cuối cùng, chúng ta có thể bắt đầu triển khai. Triển khai ProxySQL trước, sau đó là Wordpress:

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

Sau đó, chúng tôi có thể liệt kê tất cả các nhóm và dịch vụ đã được tạo trong cấp "giao diện người dùng":

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

Kết quả ở trên xác minh kiến ​​trúc triển khai của chúng tôi, nơi chúng tôi hiện đang có ba nhóm Wordpress, được hiển thị trên cổng 30088 công khai cũng như phiên bản ProxySQL của chúng tôi được hiển thị trên cổng 30033 và 30032 bên ngoài cộng với 6033 và 6032 trong nội bộ.

Tại thời điểm này, kiến ​​trúc của chúng tôi trông giống như sau:

Cổng 80 do nhóm Wordpress xuất bản hiện được ánh xạ với thế giới bên ngoài qua cổng 30088. Chúng tôi có thể truy cập bài đăng trên blog của mình tại http:// {any_kubernetes_host}:30088 / và sẽ được chuyển hướng đến trang cài đặt Wordpress. Nếu chúng tôi tiến hành cài đặt, nó sẽ bỏ qua phần kết nối cơ sở dữ liệu và hiển thị trực tiếp trang này:

Nó chỉ ra rằng cấu hình MySQL và ProxySQL của chúng tôi được định cấu hình chính xác bên trong tệp wp-config.php. Nếu không, bạn sẽ được chuyển hướng đến trang cấu hình cơ sở dữ liệu.

Việc triển khai của chúng tôi hiện đã hoàn tất.

ProxySQL Pods và Quản lý dịch vụ

Chuyển đổi dự phòng và khôi phục dự kiến ​​sẽ được Kubernetes xử lý tự động. Ví dụ:nếu nhân viên Kubernetes gặp sự cố, nhóm sẽ được tạo lại trong nút khả dụng tiếp theo sau --pod-eviction-timeout (mặc định là 5 phút). Nếu vùng chứa gặp sự cố hoặc bị chết, Kubernetes sẽ thay thế nó gần như ngay lập tức.

Một số tác vụ quản lý chung dự kiến ​​sẽ khác khi chạy trong Kubernetes, như được hiển thị trong các phần tiếp theo.

Kết nối với ProxySQL

Trong khi ProxySQL được hiển thị bên ngoài trên cổng 30033 (MySQL) và 30032 (Quản trị), nó cũng có thể truy cập nội bộ thông qua các cổng đã xuất bản, lần lượt là 6033 và 6032. Do đó, để truy cập các phiên bản ProxySQL trong mạng Kubernetes, hãy sử dụng CLUSTER-IP hoặc tên dịch vụ "proxysql" làm giá trị máy chủ. Ví dụ:trong Wordpress pod, bạn có thể truy cập bảng điều khiển quản trị ProxySQL bằng cách sử dụng lệnh sau:

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

Nếu bạn muốn kết nối bên ngoài, hãy sử dụng cổng được xác định theo giá trị nodePort mà anh ta phục vụ YAML và chọn bất kỳ nút nào trong số các nút Kubernetes làm giá trị máy chủ:

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

Điều tương tự cũng áp dụng cho kết nối cân bằng tải MySQL trên cổng 30033 (bên ngoài) và 6033 (bên trong).

Mở rộng quy mô lên và xuống

Mở rộng quy mô thật dễ dàng với Kubernetes:

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

Xác minh trạng thái phát hành:

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

Việc thu nhỏ quy mô cũng diễn ra tương tự. Ở đây chúng tôi muốn hoàn nguyên từ 5 đến 2 bản sao:

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

Chúng tôi cũng có thể xem xét các sự kiện triển khai cho ProxySQL để có bức tranh tốt hơn về những gì đã xảy ra cho việc triển khai này bằng cách sử dụng tùy chọn "description":

$ 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

Các kết nối với nhóm sẽ được Kubernetes cân bằng tải tự động.

Thay đổi cấu hình

Một cách để thực hiện các thay đổi cấu hình trên các nhóm ProxySQL của chúng tôi là tạo phiên bản cho cấu hình của chúng tôi bằng tên ConfigMap khác. Trước hết, hãy sửa đổi tệp cấu hình của chúng tôi trực tiếp thông qua trình soạn thảo văn bản yêu thích của bạn:

$ vim /root/proxysql.cnf

Sau đó, tải nó vào Kubernetes ConfigMap với một tên khác. Trong ví dụ này, chúng tôi thêm "-v2" vào tên tài nguyên:

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

Xác minh xem Bản đồ cấu hình có được tải đúng không:

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

Mở tệp triển khai ProxySQL, proxysql-rs-svc.yml và thay đổi dòng sau trong phần Bản đồ cấu hình thành phiên bản mới:

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

Sau đó, áp dụng các thay đổi cho việc triển khai ProxySQL của chúng tôi:

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

Xác minh việc phát hành bằng cách sử dụng xem sự kiện ReplicaSet sử dụng cờ "mô tả":

$ 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

Hãy chú ý đến phần "Volumes" với tên ConfigMap mới. Bạn cũng có thể xem các sự kiện triển khai ở cuối đầu ra. Tại thời điểm này, cấu hình mới của chúng tôi đã được tải vào tất cả các nhóm ProxySQL, nơi Kubernetes thu nhỏ ProxySQL ReplicaSet xuống 0 (tuân theo chiến lược RollingUpdate) và đưa chúng trở lại trạng thái mong muốn của 2 bản sao.

Lời kết

Cho đến thời điểm này, chúng tôi đã đề cập đến cách tiếp cận triển khai có thể có cho ProxySQL trong Kubernetes. Chạy ProxySQL với sự trợ giúp của Kubernetes ConfigMap mở ra một khả năng mới về phân cụm ProxySQL, nơi nó hơi khác so với hỗ trợ phân cụm gốc được tích hợp bên trong ProxySQL.

Trong bài đăng trên blog sắp tới, chúng ta sẽ khám phá ProxySQL Clustering sử dụng Kubernetes ConfigMap và cách thực hiện đúng cách. Hãy theo dõi!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Triển khai MySQL, MariaDB, Percona Server, MongoDB hoặc PostgreSQL - Dễ dàng với ClusterControl

  2. Cách OCTET_LENGTH () hoạt động trong MariaDB

  3. MariaDB JSON_DETAILED () Giải thích

  4. MariaDB giới thiệu TO_CHAR ()

  5. Giám sát bảo mật cơ sở dữ liệu cho MySQL và MariaDB