| 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を確認できます。