はじめに
Kubernetesは、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのオープンソースのコンテナオーケストレーションシステムです。 Kubernetesは、永続ボリュームやステートフルセットなどを使用してステートフルコンテナをプロビジョニングする方法を提供するため、KubernetesでPostgreSQLデータベースを実行することは最近の話題です。
このブログは、KubernetesクラスターでPostgreSQLデータベースを実行する手順を提供することを目的としています。 Kubernetesクラスターのインストールや構成については説明していませんが、KubernetesのMySQLGaleraClusterに関するこのブログで以前に説明しました。
前提条件
- Kubernetesクラスターの動作
- Dockerの基本的な理解
AWS、Azure、GoogleクラウドなどのパブリッククラウドプロバイダーでKubernetesクラスターをプロビジョニングできます。CentOSのKubernetesクラスターのインストールと構成の手順についてはこちらをご覧ください。 DockerコンテナへのPostgreSQLのデプロイに関する基本については、以前のブログ投稿を確認することもできます。
KubernetesにPostgreSQLをデプロイするには、以下の手順に従う必要があります。
- PostgresDockerイメージ
- Postgres構成を保存するための構成マップ
- 永続ストレージボリューム
- PostgreSQLの導入
- PostgreSQLサービス
PostgreSQLDockerイメージ
PostgreSQL 10.4を使用しています パブリックレジストリからのDockerイメージ。このイメージは、ユーザー名、パスワード、データベース名、パスなど、PostgreSQLのカスタム構成/環境変数を提供する機能を提供します。
PostgreSQL構成の構成マップ
PostgreSQL関連の情報を保存するために構成マップを使用します。ここでは、デプロイメントテンプレートのPostgreSQLポッドで使用される構成マップでデータベース、ユーザー、およびパスワードを使用しています。
ファイル:postgres-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-config
labels:
app: postgres
data:
POSTGRES_DB: postgresdb
POSTGRES_USER: postgresadmin
POSTGRES_PASSWORD: admin123
Postgres構成マップリソースを作成する
$ kubectl create -f postgres-configmap.yaml
configmap "postgres-config" created
永続ストレージボリューム
ご存知のとおり、Dockerコンテナは一時的なものです。コンテナインスタンスによって、またはコンテナ内で生成されたすべてのデータは、コンテナインスタンスの終了後に失われます。
データを保存するために、Kubernetes内の永続ボリュームと永続ボリュームクレームリソースを使用して、データを永続ストレージに保存します。
ここでは、ローカルディレクトリ/パスを永続ストレージリソース(/ mnt / data)として使用しています
ファイル:postgres-storage.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
name: postgres-pv-volume
labels:
type: local
app: postgres
spec:
storageClassName: manual
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/mnt/data"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: postgres-pv-claim
labels:
app: postgres
spec:
storageClassName: manual
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
ストレージ関連のデプロイメントを作成する
$ kubectl create -f postgres-storage.yaml
persistentvolume "postgres-pv-volume" created
persistentvolumeclaim "postgres-pv-claim" created
PostgreSQLの導入
PostgreSQLコンテナをデプロイするためのPostgreSQLマニフェストは、PostgreSQL10.4イメージを使用します。以前に作成したconfigmapのユーザー名、パスワード、データベース名などのPostgreSQL構成を使用しています。また、永続ボリュームから作成されたボリュームをマウントし、PostgreSQLコンテナのデータを永続化すると主張しています。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: postgres
spec:
replicas: 1
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:10.4
imagePullPolicy: "IfNotPresent"
ports:
- containerPort: 5432
envFrom:
- configMapRef:
name: postgres-config
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgredb
volumes:
- name: postgredb
persistentVolumeClaim:
claimName: postgres-pv-claim
Postgresデプロイメントを作成する
$ kubectl create -f postgres-deployment.yaml
deployment "postgres" created
今日のホワイトペーパーをダウンロードするClusterControlを使用したPostgreSQLの管理と自動化PostgreSQLの導入、監視、管理、スケーリングを行うために知っておくべきことについて学ぶホワイトペーパーをダウンロードする PostgreSQLサービス
デプロイメントまたはコンテナーにアクセスするには、PostgreSQLサービスを公開する必要があります。 Kubernetesは、ClusterIP、NodePort、LoadBalancerなどのさまざまなタイプのサービスを提供します。
ClusterIPを使用すると、Kubernetes内のPostgreSQLサービスにアクセスできます。 NodePortは、Kubernetesノードでサービスエンドポイントを公開する機能を提供します。 PostgreSQLに外部からアクセスするには、サービスを外部に公開するロードバランサーサービスタイプを使用する必要があります。
ファイル:postgres-service.yaml
apiVersion: v1
kind: Service
metadata:
name: postgres
labels:
app: postgres
spec:
type: NodePort
ports:
- port: 5432
selector:
app: postgres
Postgresサービスを作成する
$ kubectl create -f postgres-service.yaml
service "postgres" created
PostgreSQLに接続
PostgreSQLに接続するには、サービス展開からノードポートを取得する必要があります。
$ kubectl get svc postgres
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
postgres NodePort 10.107.71.253 <none> 5432:31070/TCP 5m
以前にconfigmapで指定されたクレデンシャルを使用して、kubernetesクラスターに存在するマシン/ノードからPostgreSQLに接続するには、ポート31070を使用する必要があります。
$ psql -h localhost -U postgresadmin1 --password -p 31070 postgresdb
Password for user postgresadmin1:
psql (10.4)
Type "help" for help.
postgresdb=#
PostgreSQLデプロイメントを削除する
PostgreSQLリソースを削除するには、以下のコマンドを使用する必要があります。
# kubectl delete service postgres
# kubectl delete deployment postgres
# kubectl delete configmap postgres-config
# kubectl delete persistentvolumeclaim postgres-pv-claim
# kubectl delete persistentvolume postgres-pv-volume
上記の手順を使用することで、KubernetesクラスターにスタンドアロンのPostgreSQLインスタンスをプロビジョニングできることを願っています。
結論
KubernetesでPostgreSQLを実行すると、仮想マシンを使用する場合よりも優れた方法でリソースを利用できます。 Kubernetesは、同じ仮想マシンまたはKubernetesクラスター内でPostgreSQLを使用する他のアプリケーションの分離も提供します。
この記事では、開発/POC環境でKubernetesでPostgreSQLを使用する方法の概要を説明します。 Kubernetesのステートフルセットを使用してPostgreSQLクラスターを探索/セットアップできます。
StatefulSetsが必要ですか?
Kubernetesでは、ステートフルアプリケーションをスケーリングするためにStatefulSetsが必要です。 PostgreSQLは、1つのコマンドでStatefulSetsを使用して簡単にスケーリングできます。
参照
- CentOSへのKubernetesのインストール:https://www.techrepublic.com/article/how-to-install-a-kubernetes-cluster-oen-centos-7
- Kubectlのセットアップ:https://kubernetes.io/docs/tasks/tools/install-kubectl
- Dockerを使用したPostgreSQL:https://severalnines.com/blog/deploying-postgresql-docker-container
- Kubernetes:https://kubernetes.io
- statefulsetsを使用したPostgreSQLクラスターhttps://kubernetes.io/blog/2017/02/postgresql-clusters-kubernetes-statefulsets