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

Kubernetesを使用したPostgreSQLのデプロイ

    はじめに

    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

    1. PostgreSQLのセッションIDに適したランダムな文字列をどのように作成しますか?

    2. PHP/MySQLビルドツリーメニュー

    3. T-SQLを使用してSQLServerのすべてのデータベースを一覧表示する最も簡単な方法

    4. IDENT_CURRENT()を使用して、SQLServerのID列の現在のID値を返します