8.5. Kubernetesの設定例

この章では、Kubernetes上でPgpool-IIを利用し、読み取りクエリの負荷分散とコネクションプーリングを実現する方法について説明します。

8.5.1. はじめに

PostgreSQLはステートフルなアプリケーションであり、またPostgreSQLの運用ではバックアップ、リカバリ、障害対策などの管理が必要になります。 Kubernetesの標準的な機能ではこれらの機能を実現できません。 そのために、Kubernetesを使ってPostgreSQLを運用するには、 Kubernetesの本来の機能を拡張するためのOperatorが必要になります。

代表的なPostgreSQL Operatorとしては、 Crunchy PostgreSQL OperatorZalando PostgreSQL OperatorKubeDBがあります。 しかし、これらのPostgreSQL Operatorには読み取りクエリの負荷分散機能はありません。

この章では、PostgreSQL OperatorをPgpool-IIと組み合わせて、Kubernetes上で読み取りクエリの負荷分散とコネクションプーリング機能を備えたPostgreSQLクラスタの構築方法について説明します。Pgpool-IIは、上記PostgreSQL Operatorのいずれかと組み合わせることができます。

8.5.2. 全体構成図

図 8-2. 全体構成図

8.5.3. 前提条件

Pgpool-IIの設定の前に、以下の設定を行ってください。

8.5.4. Pgpool-IIのデプロイ

Pgpool-IIのPodにPgpool-IIコンテナと Pgpool-II Exporterコンテナを作成します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pgpool
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pgpool
  template:
    metadata:
      labels:
        app: pgpool
    spec:
      containers:
      - name: pgpool
        image: pgpool/pgpool:4.2
    ...
      - name: pgpool-stats
        image: pgpool/pgpool2_exporter:1.0
    ...
  

pgpool-IIのヘルスチェック、自動フェイルオーバー、Watchdogおよびオンラインリカバリ機能はKubernetes環境では必要ありません。 読み取りクエリの負荷分散とコネクションプーリング機能のみを有効ににすれば良いです。

Kubernetes上でpgpool を動かすために、以下の設定が必要最低限の設定です。

backend_hostname0='primary service name'
backend_hostname1='replica service name'
backend_port0='5432'
backend_port1='5432'
backend_flag0='ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
backend_flag1='DISALLOW_TO_FAILOVER'

sr_check_period = 10
sr_check_user='PostgreSQL user name'

load_balance_mode = on
connection_cache = on
listen_addresses = '*'
  

Pgpool-IIを構成する方法は2つあります。

  1. 環境変数を利用する

  2. ConfigMapを利用する

プロダクション環境では、クライアント認証、または多くのパラメーターを設定する必要があります。 プロダクション環境の場合は、ConfigMapを使用してPgpool-IIの設定ファイル、 例えば、pgpool.conf、pcp.conf、pool_passwd、pool_hba.confなどを設定することをお勧めします。

次のセクションでは、環境変数とConfigMapをそれぞれ使用してPgpool-II を設定およびデプロイする方法について説明します。 Pgpool-IIのデプロイに使用される各種マニフェストファイルは、 ここからダウンロードできます。

8.5.4.1. 環境変数を使用したPgpool-IIの設定

Kubernetes環境変数は、Pod内のコンテナに渡すことができます。 マニフェストで環境変数を定義することで、Pgpool-IIのパラメーターを設定することができます。 pgpool_deploy.yamlは、Deploymentマニフェストの例です。 pgpool_deploy.yamlをダウンロードして、このマニフェストにて必要な環境変数を指定します。

$ curl -LO https://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool_deploy.yaml
   

PGPOOL_PARAMS_で始まる環境変数は、Pgpool-IIの設定パラメーターに変換され、 デフォルトの設定値を上書きすることができます。

  • Pgpool-IIコンテナのDockerイメージは、ストリーミングレプリケーションモードでビルドされています。 デフォルトでは、クエリの負荷分散、コネクションプーリング、およびストリーミングレプリケーションチェックが有効になっています。

  • 2つのバックエンドノードのみを指定すれば良いです。 backend_hostname0にプライマリservice名を指定します。 backend_hostname1にレプリカservice名を指定します。 自動フェイルオーバがKubernetesによって管理されているので、両方のノードのbackend_flagに DISALLOW_TO_FAILOVERフラグを指定します。 backend_flag0にALWAYS_PRIMARYフラグを指定します。 backend_weightは通常どおり設定します。 backend_data_directoryを設定する必要はありません。

    例えば、マニフェストで定義されている環境変数は、

    env:
    - name: PGPOOL_PARAMS_BACKEND_HOSTNAME0
      value: "hippo"
    - name: PGPOOL_PARAMS_BACKEND_HOSTNAME1
      value: "hippo-replica"
    - name: PGPOOL_PARAMS_BACKEND_FLAG0
      value: "ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER"
    - name: PGPOOL_PARAMS_BACKEND_FLAG1
      value: "DISALLOW_TO_FAILOVER"
         

    以下のようにpgpool.confの設定パラメータに変換されます。

    backend_hostname0='hippo'
    backend_hostname1='hippo-replica'
    backend_flag0='ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
    backend_flag1='DISALLOW_TO_FAILOVER'
         
  • ストリーミングレプリケーションチェックを実行するためのPostgreSQLのユーザー名とパスワードを指定します。 セキュリティ上の理由から、暗号化されたパスワードを指定することをお勧めします。

    - name: PGPOOL_PARAMS_SR_CHECK_USER
      value: "PostgreSQL user name"
    - name: PGPOOL_PARAMS_SR_CHECK_PASSWORD
      value: "encrypted PostgreSQL user's password"
         

    または、作成済のSecretを利用し環境変数を設定することもできます。

  • ヘルスチェックはKubernetesによって実施されているため、 Pgpool-IIのヘルスチェックを無効にする必要があります。 デフォルト値がオフになっているため、このパラメーターを設定する必要はありません。

  • デフォルトでは、Pgpool-IIコンテナの起動時に以下の環境変数が設定済です。

    export PGPOOL_PARAMS_LISTEN_ADDRESSES=*
    export PGPOOL_PARAMS_SR_CHECK_USER=${POSTGRES_USER:-"postgres"}
    export PGPOOL_PARAMS_SOCKET_DIR=/var/run/postgresql
    export PGPOOL_PARAMS_PCP_SOCKET_DIR=/var/run/postgresql
         

8.5.4.2. ConfigMapを使用したPgpool-IIの設定

KubernetesのConfigMapを使用し、pgpool.conf、pcp.conf、pool_passwd、pool_hba.conf、 これらの設定ファイル全体を保存することができます。 また、ConfigMapは、ボリュームとしてはpgpool-IIのコンテナにマウントすることができます。

ConfigMapとDeploymentを定義するサンプルマニフェストファイルは リポジトリからダウンロードできます。

curl -LO https://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool_configmap.yaml
curl -LO https://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool_deploy_with_mount_configmap.yaml
   

サンプルのConfigMapは以下のような形式で定義されています。必要に応じて更新してください。

apiVersion: v1
kind: ConfigMap
metadata:
  name: pgpool-config
  labels:
    app: pgpool-config
data:
  pgpool.conf: |-
    listen_addresses = '*'
    port = 9999
    socket_dir = '/var/run/postgresql'
    pcp_listen_addresses = '*'
    pcp_port = 9898
    pcp_socket_dir = '/var/run/postgresql'
    backend_hostname0 = 'hippo'
    backend_port0 = 5432
    backend_weight0 = 1
    backend_flag0 = 'ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
    backend_hostname1 = 'hippo-replica'
    backend_port1 = 5432
    backend_weight1 = 1
    backend_flag1 = 'DISALLOW_TO_FAILOVER'
    sr_check_user = 'postgres'
    sr_check_period = 10
    enable_pool_hba = on
    master_slave_mode = on
    num_init_children = 32
    max_pool = 4
    child_life_time = 300
    child_max_connections = 0
    connection_life_time = 0
    client_idle_limit = 0
    connection_cache = on
    load_balance_mode = on
  pcp.conf: |-
    postgres:e8a48653851e28c69d0506508fb27fc5
  pool_passwd: |-
    postgres:md53175bce1d3201d16594cebf9d7eb3f9d
  pool_hba.conf: |-
    local   all         all                               trust
    host    all         all         127.0.0.1/32          trust
    host    all         all         ::1/128               trust
    host    all         all         0.0.0.0/0             md5
   

まず、Pgpool-IIのPodをデプロイする前にConfigMapを作成する必要があります。

kubectl apply -f pgpool_configmap.yaml
   

ConfigMapを作成したら、Pgpool-IIをデプロイするマニフェストで ConfigMapをボリュームとしてPgpool-IIのPodにマウントするように設定します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pgpool
  ...
        volumeMounts:
        - name: pgpool-config
          mountPath: /usr/local/pgpool-II/etc
      ...
      volumes:
      - name: pgpool-config
        configMap:
          name: pgpool-config
   

pgpool_deploy_with_mount_configmap.yamlは、作成されたConfigMapPgpool-IIのPodにマウントするサンプルマニフェストです。 基本的にはそのまま利用できます。

kubectl apply -f pgpool_deploy_with_mount_configmap.yaml
   

Pgpool-IIをデプロイした後、kubectl get podkubectl get svcコマンドを使用してPgpool-IIのPodとserviceを確認できます。