sql >> データベース >  >> RDS >> MariaDB

ProxySQLをKubernetesサービスとして実行する

    分散データベースクラスターを実行する場合、ロードバランサーを前面に配置するのが一般的です。利点は明らかです。負荷分散、接続フェイルオーバー、および基盤となるデータベーストポロジからのアプリケーション層の分離です。よりインテリジェントな負荷分散には、ProxySQLやMaxScaleなどのデータベース対応プロキシが最適です。以前のブログでは、KubernetesでProxySQLをヘルパーコンテナとして実行する方法を紹介しました。このブログ投稿では、ProxySQLをKubernetesサービスとしてデプロイする方法を紹介します。サンプルアプリケーションとしてWordpressを使用し、データベースバックエンドはClusterControlを使用してデプロイされた2ノードのMySQLレプリケーションで実行されます。次の図は、インフラストラクチャを示しています。

    この前のブログ投稿と同様の設定を展開するので、投稿を読みやすくするために、ブログ投稿の一部で重複することを期待してください。

    Kubernetes上のProxySQL

    少し要約することから始めましょう。 ProxySQLアーキテクチャの設計は主観的なトピックであり、アプリケーションの配置、データベースコンテナ、およびProxySQL自体の役割に大きく依存します。理想的には、次の2つの構成でKubernetesによって管理されるようにProxySQLを構成できます。

    1. KubernetesサービスとしてのProxySQL(集中型デプロイ)
    2. ポッド内のヘルパーコンテナとしてのProxySQL(分散展開)

    次の図を見ると、両方の展開を簡単に区別できます。

    このブログ投稿では、最初の構成、つまりProxySQLをKubernetesサービスとして実行する方法について説明します。 2番目の構成についてはすでにここで説明しています。ヘルパーコンテナアプローチとは対照的に、サービスとして実行すると、ProxySQLポッドがアプリケーションから独立して動作し、KubernetesConfigMapを使用して簡単にスケーリングおよびクラスター化できます。これは、ProxySQLインスタンス(別名proxysql_servers)全体の構成チェックサムに依存するProxySQLネイティブクラスタリングサポートとは明らかに異なるクラスタリングアプローチです。 ClusterControlで簡単に作成されたProxySQLクラスタリングについて知りたい場合は、このブログ投稿を確認してください。

    Kubernetesでは、ProxySQLのマルチレイヤー構成システムにより、ConfigMapを使用したポッドクラスタリングが可能になります。ただし、ProxySQLのネイティブクラスタリング機能と同じようにスムーズに機能させるには、いくつかの欠点と回避策があります。現時点では、ConfigMapの更新時にポッドに信号を送ることが作業中の機能です。このトピックについては、今後のブログ投稿でさらに詳しく説明します。

    基本的に、ProxySQLポッドを作成し、Kubernetesネットワーク内または外部の他のポッドからアクセスできるようにKubernetesサービスをアタッチする必要があります。その後、アプリケーションは、構成されたポートでTCP/IPネットワークを介してProxySQLサービスに接続します。デフォルトは、MySQL負荷分散接続の場合は6033、ProxySQL管理コンソールの場合は6032です。複数のレプリカがある場合、ポッドへの接続は、すべてのKubernetesノードで実行されているKuberneteskube-proxyコンポーネントによって自動的に負荷分散されます。

    KubernetesサービスとしてのProxySQL

    このセットアップでは、ProxySQLとWordpressの両方をポッドとサービスとして実行します。次の図は、高レベルのアーキテクチャを示しています。

    このセットアップでは、「wordpress」と「proxysql」の2つのポッドとサービスをデプロイします。デプロイメントとサービスの宣言をアプリケーションごとに1つのYAMLファイルにマージし、それらを1つのユニットとして管理します。アプリケーションコンテナのコンテンツを複数のノード間で永続的に保つには、クラスター化されたファイルシステムまたはリモートファイルシステム(この場合はNFS)を使用する必要があります。

    ProxySQLをサービスとしてデプロイすると、ヘルパーコンテナアプローチにいくつかの優れた点がもたらされます。

    • Kubernetes ConfigMapアプローチを使用すると、ProxySQLを不変の構成でクラスター化できます。
    • KubernetesはProxySQLリカバリを処理し、インスタンスへの接続のバランスを自動的に調整します。
    • ClusterIPと呼ばれるKubernetes仮想IPアドレスを実装した単一のエンドポイント。
    • シェアードナッシングアーキテクチャを備えた一元化されたリバースプロキシ層。
    • Kubernetes以外の外部アプリケーションで使用できます。

    ProxySQL用に2つのレプリカ、Wordpress用に3つのレプリカとしてデプロイを開始し、Kubernetesが提供する大規模な実行と負荷分散機能を示します。

    データベースの準備

    マスター上にワードプレスデータベースとユーザーを作成し、正しい権限で割り当てます:

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

    また、ProxySQL監視ユーザーを作成します:

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

    次に、付与テーブルをリロードします:

    mysql-master> FLUSH PRIVILEGES;

    ProxySQLポッドとサービス定義

    次は、ProxySQLデプロイメントを準備することです。 proxysql-rs-svc.ymlというファイルを作成します 次の行を追加します:

    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

    それらの定義が何であるかを見てみましょう。 YAMLは、「---」区切り文字で区切られた、ファイルに結合された2つのリソースで構成されます。最初のリソースはDeploymentであり、次の仕様を定義します。

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

    上記は、2つのProxySQLポッドを「app =proxysql、tier=frontend」というラベルの付いたコンテナーに一致するReplicaSetとしてデプロイすることを意味します。展開戦略は、古いポッドを新しいポッドに置き換えるために使用される戦略を指定します。この展開では、RollingUpdateを選択しました。これは、ポッドがローリング更新方式で、一度に1つのポッドで更新されることを意味します。

    次の部分はコンテナのテンプレートです:

          - 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

    spec.templates.spec.containers。*内 セクションでは、 somealnines / proxysqlを使用してProxySQLをデプロイするようにKubernetesに指示しています。 イメージバージョン1.4.12。また、Kubernetesで事前構成されたカスタム構成ファイルをマウントし、コンテナー内の/etc/proxysql.cnfにマップする必要があります。実行中のポッドは、6033と6032の2つのポートを公開します。「ボリューム」セクションも定義します。このセクションでは、ボリュームマウントによってマウントされるProxySQLポッド内のボリュームとしてConfigMapをマウントするようにKubernetesに指示します。

    2番目のリソースはサービスです。 Kubernetesサービスは、ポッドの論理セットとそれらにアクセスするためのポリシーを定義する抽象化レイヤーです。このセクションでは、以下を定義します。

    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

    この場合、ProxySQLに外部ネットワークからアクセスする必要があるため、NodePortタイプが選択されたタイプです。これにより、クラスター内のすべてのKubernetesノードでnodePortが公開されます。 NodePortリソースの有効なポートの範囲は30000〜32767です。 ProxySQLポッドのポート6033にマップされるMySQL負荷分散接続にはポート30033を選択し、6032にマップされるProxySQL管理ポートにはポート30032を選択しました。

    したがって、上記のYAML定義に基づいて、「proxysql」ポッドのデプロイを開始する前に、次のKubernetesリソースを準備する必要があります。

    • ConfigMap-ProxySQL構成ファイルをボリュームとして保存し、複数のポッドにマウントして、ポッドが他のKubernetesノードに再スケジュールされている場合に再度マウントできるようにします。

    ProxySQL用のConfigMapの準備

    以前のブログ投稿と同様に、ConfigMapアプローチを使用して、構成ファイルをコンテナーから分離し、スケーラビリティーの目的でも使用します。この設定では、ProxySQL構成は不変であると見なしていることに注意してください。

    まず、ProxySQL構成ファイル proxysql.cnfを作成します。 次の行を追加します:

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

    admin_variables.admin_credentialsに注意してください 「proxysql-admin」であるデフォルト以外のユーザーを使用した変数。 ProxySQLは、ローカルホストのみを介したローカル接続用にデフォルトの「admin」ユーザーを予約します。したがって、ProxySQLインスタンスにリモートでアクセスするには、他のユーザーを使用する必要があります。そうしないと、次のエラーが発生します:

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

    ProxySQL構成は、ClusterControlから取得した次のトポロジスクリーンショットに要約されているように、MySQLレプリケーションで実行されている2つのデータベースサーバーに基づいています。

    「mysql_query_rules」セクションで定義されているように、読み取りがホストグループ20に転送される間、すべての書き込みはマスターノードに送信される必要があります。これが読み取り/書き込み分割の基本であり、それらをすべて活用したいと考えています。

    次に、構成ファイルをConfigMapにインポートします。

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

    ConfigMapがKubernetesに読み込まれているかどうかを確認します:

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

    Wordpressポッドとサービスの定義

    次に、次の行を wordpress-rs-svc.ymlというファイルに貼り付けます。 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

    ProxySQL定義と同様に、YAMLは2つのリソースで構成され、ファイル内で結合された「---」区切り文字で区切られます。 1つ目は、「spec。*」セクションに示されているように、ReplicaSetとしてデプロイされるDeploymentリソースです。

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

    このセクションでは、デプロイメントの仕様を示します。ラベル「app =wordpress、tier=backend」に一致する3つのポッドを開始します。デプロイ戦略はRollingUpdateです。つまり、Kubernetesがポッドを置き換える方法は、ProxySQLデプロイメントと同じローリングアップデート方式を使用することです。

    次の部分は「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


    このセクションでは、ApacheWebサーバーを使用してWordpress4.9をデプロイするようにKubernetesに指示し、コンテナーに「wordpress」という名前を付けました。コンテナは、ステータスに関係なく、ダウンするたびに再起動されます。また、Kubernetesにいくつかの環境変数を渡してもらいたい:

    • WORDPRESS_DB_HOST -MySQLデータベースホスト。 ProxySQLをサービスとして使用しているため、サービス名は metadata.nameの値になります。 これは「proxysql」です。 ProxySQL管理コンソールが6032にある間、ProxySQLはポート6033でMySQL負荷分散接続をリッスンします。
    • WORDPRESS_DB_USER -「データベースの準備」セクションで作成されたWordPressデータベースユーザーを指定します。
    • WORDPRESS_DB_PASSWORD - WORDPRESS_DB_USERのパスワード 。このファイルでパスワードを公開したくないので、Kubernetesシークレットを使用してパスワードを非表示にすることができます。ここでは、代わりに「mysql-pass」シークレットリソースを読み取るようにKubernetesに指示します。さらに下で説明するように、ポッドを展開する前に、シークレットを事前に作成する必要があります。

    また、エンドユーザー向けにポッドのポート80を公開したいと思います。コンテナの/var/ www / html内に保存されているWordpressコンテンツは、NFSで実行されている永続ストレージにマウントされます。 「Wordpress用の永続ストレージの準備」セクションに示すように、この目的のためにPersistentVolumeおよびPersistentVolumeClaimリソースを使用します。

    「---」ブレークラインの後に、サービスと呼ばれる別のリソースを定義します:

    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

    この構成では、Kubernetesで「wordpress」というサービスを作成し、すべてのノード(別名NodePort)のポート30088で外部ネットワークをリッスンし、「app =wordpress、tier=」というラベルの付いたすべてのポッドのポート80に転送します。フロントエンド」。

    したがって、上記のYAML定義に基づいて、「wordpress」ポッドとサービスのデプロイを開始する前に、いくつかのKubernetesリソースを準備する必要があります。

    • PersistentVolume およびPersistentVolumeClaim -WordpressアプリケーションのWebコンテンツを保存し、ポッドが他のワーカーノードに再スケジュールされているときに、最後の変更が失われることはありません。
    • 秘密 -WordpressデータベースのユーザーパスワードをYAMLファイル内に非表示にします。

    Wordpress用の永続ストレージの準備

    Kubernetesの適切な永続ストレージには、クラスター内のすべてのKubernetesノードからアクセスできる必要があります。このブログ投稿のために、NFSをPersistentVolume(PV)プロバイダーとして使用しました。これは、NFSが簡単で、すぐにサポートされるためです。 NFSサーバーはKubernetesネットワークの外部にあり(最初のアーキテクチャ図に示されているように)、/ etc/exports内に次の行を持つすべてのKubernetesノードを許可するように構成されています。

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

    NFSクライアントパッケージはすべてのKubernetesノードにインストールする必要があることに注意してください。そうしないと、KubernetesはNFSを正しくマウントできません。すべてのノード:

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

    また、NFSサーバーにターゲットディレクトリが存在することを確認してください:

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

    次に、 wordpress-pv-pvc.ymlというファイルを作成します 次の行を追加します:

    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

    上記の定義では、Wordpressコンテナ用にNFSサーバーに3GBのボリュームスペースを割り当てるようにKubernetesに指示しています。本番環境での使用に注意してください。NFSは自動プロビジョナーとストレージクラスで構成する必要があります。

    PVおよびPVCリソースを作成します:

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

    それらのリソースが作成され、ステータスが「バインド済み」である必要があるかどうかを確認します。

    $ 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

    Wordpressの秘密を準備する

    WORDPRESS_DB_PASSWORDのWordpressコンテナで使用されるシークレットを作成します 環境変数。その理由は、YAMLファイル内でパスワードをクリアテキストで公開したくないからです。

    mysql-passという秘密のリソースを作成し、それに応じてパスワードを渡します:

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

    シークレットが作成されていることを確認します:

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

    ProxySQLとWordpressの導入

    最後に、展開を開始できます。最初にProxySQLをデプロイし、次にWordpressをデプロイします:

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

    次に、「フロントエンド」層で作成されたすべてのポッドとサービスを一覧表示できます。

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

    上記の出力は、現在ポート30088で公開されている3つのWordpressポッドと、外部でポート30033と30032、さらに内部で6033と6032で公開されているProxySQLインスタンスを使用しているデプロイメントアーキテクチャを確認します。

    この時点で、私たちのアーキテクチャは次のようになっています。

    Wordpressポッドによって公開されたポート80は、ポート30088を介して外部にマッピングされます。http:// {any_kubernetes_host}:30088 /でブログ投稿にアクセスでき、Wordpressのインストールページにリダイレクトする必要があります。インストールを続行すると、データベース接続部分がスキップされ、次のページが直接表示されます:

    これは、MySQLとProxySQLの構成がwp-config.phpファイル内で正しく構成されていることを示しています。そうしないと、データベース構成ページにリダイレクトされます。

    これで展開が完了しました。

    ProxySQLポッドとサービス管理

    フェイルオーバーとリカバリは、Kubernetesによって自動的に処理されることが期待されています。たとえば、Kubernetesワーカーがダウンした場合、ポッドは--pod-eviction-timeout(デフォルトは5分)の後に次に使用可能なノードに再作成されます。コンテナがクラッシュまたは強制終了された場合、Kubernetesはほぼ瞬時にコンテナを置き換えます。

    次のセクションで示すように、Kubernetes内で実行すると、いくつかの一般的な管理タスクが異なることが予想されます。

    ProxySQLへの接続

    ProxySQLはポート30033(MySQL)および30032(Admin)で外部に公開されていますが、公開されているポート6033および6032を介して内部的にもアクセスできます。したがって、Kubernetesネットワーク内のProxySQLインスタンスにアクセスするには、CLUSTER-IPまたはサービス名「proxysql」をホスト値として使用します。たとえば、Wordpressポッド内で、次のコマンドを使用してProxySQL管理コンソールにアクセスできます。

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

    外部に接続する場合は、YAMLにサービスを提供するnodePort値で定義されたポートを使用し、ホスト値としてKubernetesノードのいずれかを選択します。

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

    同じことが、ポート30033(外部)および6033(内部)のMySQL負荷分散接続にも当てはまります。

    スケールアップとスケールダウン

    Kubernetesを使用すると、スケールアップが簡単になります:

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

    ロールアウトステータスを確認します:

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

    スケールダウンも同様です。ここでは、5から2のレプリカに戻したいと思います:

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

    また、ProxySQLのデプロイメントイベントを調べて、「説明」オプションを使用することで、このデプロイメントで何が起こったかをより正確に把握することもできます。

    $ 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によって自動的に負荷分散されます。

    構成の変更

    ProxySQLポッドの構成を変更する1つの方法は、別のConfigMap名を使用して構成をバージョン管理することです。まず、お気に入りのテキストエディタを使用して構成ファイルを直接変更します:

    $ vim /root/proxysql.cnf

    次に、それを別の名前でKubernetesConfigMapにロードします。この例では、リソース名に「-v2」を追加します:

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

    ConfigMapが正しくロードされているかどうかを確認します:

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

    ProxySQLデプロイメントファイルproxysql-rs-svc.ymlを開きます configMapセクションの下の次の行を新しいバージョンに変更します。

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

    次に、変更をProxySQLデプロイメントに適用します。

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

    「describe」フラグを使用してReplicaSetイベントを確認し、ロールアウトを確認します。

    $ 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

    新しいConfigMap名の「ボリューム」セクションに注意してください。出力の下部に展開イベントも表示されます。この時点で、新しい構成がすべてのProxySQLポッドに読み込まれ、KubernetesはProxySQL ReplicaSetを0にスケールダウンし(RollingUpdate戦略に従って)、2つのレプリカの目的の状態に戻します。

    最終的な考え

    これまで、KubernetesでのProxySQLの可能なデプロイアプローチについて説明してきました。 Kubernetes ConfigMapを使用してProxySQLを実行すると、ProxySQLクラスタリングの新しい可能性が開かれます。この可能性は、ProxySQLに組み込まれているネイティブクラスタリングサポートとは多少異なります。

    今後のブログ投稿では、KubernetesConfigMapを使用したProxySQLクラスタリングとその正しい方法について説明します。しばらくお待ちください!


    1. 1つの列を複数の行に分割する

    2. PSQLコマンドを使用してホスト名とポートを検索します

    3. カンマ区切りの値に基づいてテーブルを結合する

    4. MySQLのORDERBYRAND()関数を最適化するにはどうすればよいですか?