Pgpool-II 4.2.1 文書 | |||
---|---|---|---|
前のページ | 上に戻る | 第 8章設定の例 | 次のページ |
この章では、Kubernetes上でPgpool-IIを利用し、読み取りクエリの負荷分散とコネクションプーリングを実現する方法について説明します。
PostgreSQLはステートフルなアプリケーションであり、またPostgreSQLの運用ではバックアップ、リカバリ、障害対策などの管理が必要になります。 Kubernetesの標準的な機能ではこれらの機能を実現できません。 そのために、Kubernetesを使ってPostgreSQLを運用するには、 Kubernetesの本来の機能を拡張するためのOperatorが必要になります。
代表的なPostgreSQL Operatorとしては、 Crunchy PostgreSQL Operatorや Zalando PostgreSQL Operator、 KubeDBがあります。 しかし、これらのPostgreSQL Operatorには読み取りクエリの負荷分散機能はありません。
この章では、PostgreSQL OperatorをPgpool-IIと組み合わせて、Kubernetes上で読み取りクエリの負荷分散とコネクションプーリング機能を備えたPostgreSQLクラスタの構築方法について説明します。Pgpool-IIは、上記PostgreSQL Operatorのいずれかと組み合わせることができます。
Pgpool-IIの設定の前に、以下の設定を行ってください。
Kubernetesクラスタを構築し、kubectlをインストールしておきます。
KubernetesクラスタにPostgreSQL Operatorをインストールし、PostgreSQLクラスタを1つ作成しておきます。
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つあります。
環境変数を利用する
ConfigMapを利用する
プロダクション環境では、クライアント認証、または多くのパラメーターを設定する必要があります。 プロダクション環境の場合は、ConfigMapを使用してPgpool-IIの設定ファイル、 例えば、pgpool.conf、pcp.conf、pool_passwd、pool_hba.confなどを設定することをお勧めします。
次のセクションでは、環境変数とConfigMapをそれぞれ使用してPgpool-II を設定およびデプロイする方法について説明します。 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
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は、作成されたConfigMapを Pgpool-IIのPodにマウントするサンプルマニフェストです。 基本的にはそのまま利用できます。
kubectl apply -f pgpool_deploy_with_mount_configmap.yaml
Pgpool-IIをデプロイした後、kubectl get podや kubectl get svcコマンドを使用してPgpool-IIのPodとserviceを確認できます。