DockerからKubernetesへのPostgresの提供


このポストでは、我々はどのように作成するかを見るPostgres container using Docker そして、データを失うことなくPostgresコンテナを再起動します.記事の最後に、ConfigMapとStateFootsetsを使用したカスタム展開を使用して、Kubernetesポッド内のPostgresを展開します.以前は、Kubernetesパッケージ管理システムを使用して、Kubernetes内でPostgresを展開する方法を取り上げました.


なぜコンテナ化されたデータベースを使うのか?


データベース用のコンテナーを作成すると、単にサーバーにインストールするのと比較して、不要なオーバーヘッドを追加するように見えるかもしれません.しかし、ユーザーがコンテナのすべての利点を持ってデータベースに負担することができます.
データとデータベースを分離する
コンテナ化は、ユーザーがデータベースアプリケーションとデータを分離することができます.結果として、アプリケーションが失敗した場合に新しいコンテナーをユーザーがスピンしないようにすることで、フォールトトレランスを向上させます.さらに、コンテナ化は、ユーザーがスケールを容易にして、相対的な容易さでデータベースの可用性を増やすこともできます.
移植性
コンテナの移植性は、ユーザーが任意のインフラストラクチャまたは構成変更なしにサポートされているコンテナ化された環境にデータベースを展開し、移行するのに役立ちます.また、ユーザーは生産環境の基礎データに影響を与えないようにデータベースアプリケーションに設定変更を行うことができます.さらに、これらのコンテナは、より良い資源利用をもたらして、全体的な経費を減らしましたthey are inherently lightweight compared to other solutions like VMs .

コンテナ化データベースの作成


まず、我々のコンテナのベースとして機能するイメージが必要です.Postgresのような一般的なソフトウェアがコンテナをカスタマイズするためのオプションで公式コンテナイメージを提供します.したがって、私たちはofficial Postgres image in the Docker hub このデータベースコンテナーを作成するには.

次は?コンテナの設定を作成する時間.これはdone easily via the docker-compose file .
version: '3.1'
services:
    postgres-db:
        container_name: postgres-db
        image: postgres:latest
        restart: always
        environment:
            POSTGRES_USER: testadmin
            POSTGRES_PASSWORD: test123
            POSTGRES_DB: testdb
            PGDATA: /var/lib/postgresql/data/pgdata
        volumes:
            - postgres-db-data:/var/lib/postgresql/data
        ports:
            - 5432:5432
volumes:
    postgres-db-data:
        name: postgres-db-data
上記の設定でPostgresデータを格納するためにDockerボリュームを作成します.このボリュームは再利用可能ですので、コンテナが削除されても、基になるデータを回復することができます.Postgresコンテナでは、最新のPostgresイメージを使用して、コンテナ内のユーザー、パスワード、データベース、およびデータの場所を設定します.ボリュームセクションでは、内部コンテナデータの位置をボリュームにマップし、ポート5432を公開します.
ファイルが作成されると、docker-compose up コンテナを起動するコマンド.

次に、私たちはdocker ps コンテナが正常に動作しているかどうかを確認します.

それです.Containerized Postgresデータベースを作成しました.仕事ですか.SQLクライアントを介してデータベースに接続しようとすることで確認できます.では、使用しましょうArctype SQL client テスト接続を初期化するにはまず、データベース接続の詳細を提供します.この例では、コンテナを作成するときに、Dockerホスト、ポート、および我々が提供した資格情報のIPを使用します.次に、次のイメージで見ることができるように、データベースへの接続を正常に初期化できます.

繰り返し設定の作成


前述のように、コンテナはユーザにアプリケーションからデータベースデータを切り離して、繰り返し可能な構成を可能にします.たとえば、データベースソフトウェアのエラーに遭遇したとします.伝統的なインストールでは、データとアプリケーションの両方がバインドされているので、これは悲惨な結果につながることができます.彼らはデータ損失の結果としても、ロールバックは可能ではありません.しかし、コンテナ化を使用すると、エラーのコンテナーを削除し、新しいインスタンスをスピンし、すぐにデータにアクセスできます.
このシナリオを実際に見てみましょう.まず、ましょうcreate a table 名前test_data_table そして、いくつかのレコードをarctypeクライアントを使って挿入します.


これでデータベースにデータがあります.Docker Comment Downコマンドを使用してコンテナを削除しましょう.

注意-コンテナが削除されると、SQLクライアントは接続が拒否されたというエラーが表示されます.

次に、コンテナーファイルの名前を変更するために、構成ファイルを少し変更しましょう.
version: '3.1'
services:
    postgres-db:
        # New Container
        container_name: postgres-db-new
        image: postgres:latest
        restart: always
        environment:
            POSTGRES_USER: testadmin
            POSTGRES_PASSWORD: test123
            POSTGRES_DB: testdb
            PGDATA: /var/lib/postgresql/data/pgdata
        volumes:
        - postgres-db-data:/var/lib/postgresql/data
        ports:
        - 5432:5432
volumes:
    postgres-db-data:
        name: postgres-db-data
次に、コンテナを再びスピンし、docker ps コマンド.

接続を再確立するために、arcTypeクライアントのテーブルをリフレッシュします.次に、単純なSELECTコマンドを実行して、test_data_table 下記の通り.

ご覧のように、コンテナを取り外してもデータをアクセスできます.

Kubernetesを使用したコンテナ管理


Dockerは、ローカル開発環境のための優れた選択、あるいは生産環境でいくつかのコンテナを実行しています.しかし,ほとんどの生産環境は多くのコンテナから構成されるので,それらを迅速に管理することは不可能となる.これは、Kubernetesのようなオーケストレーションプラットフォームが再生され、スケールでコンテナを管理する完全な機能豊富なコンテナオーケストレーションプラットフォームを提供する場所です.
KubernetesでPostgresコンテナを展開する最良の方法は、ステータスセットを使用しています.It enables users to provision stateful applications と永続的なストレージ、ユニークなネットワーク識別子、自動化された圧延の更新、注文の展開とスケーリングを構成します.すべてのこれらの機能は、データベースのようなステイトなアプリケーションを容易にするために必要です.この節では、PostgresコンテナをK 8 Sクラスタに展開する方法について説明します.

Postgresポッドの作成と配備


この展開のためにconfigmap 環境変数を格納するには、クラスタの外側にあるデータベースを公開するサービスとPostgres podに対してステータスセットを設定します.
# PostgreSQL StatefulSet ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
    name: postgres-db-config
    labels:
        app: postgresql-db
data:
    POSTGRES_PASSWORD: test123
    PGDATA: /data/pgdata
---
# PostgreSQL StatefulSet Service
apiVersion: v1
kind: Service
metadata:
    name: postgres-db-lb
spec:
    selector:
        app: postgresql-db
    type: LoadBalancer
    ports:
    - port: 5432
    targetPort: 5432
---
# PostgreSQL StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
    name: postgresql-db
spec:
    serviceName: postgresql-db-service
    selector:
        matchLabels:
            app: postgresql-db
    replicas: 2
    template:
        metadata:
            labels:
                app: postgresql-db
        spec:
            # Official Postgres Container
            containers:
            - name: postgresql-db
            image: postgres:10.4
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 5432
            # Resource Limits
            resources:
                requests:
                    memory: "265Mi"
                    cpu: "250m"
                limits:
                    memory: "512Mi"
                    cpu: "500m"
            # Data Volume
            volumeMounts:
            - name: postgresql-db-disk
            mountPath: /data
            # Point to ConfigMap
            env:
            - configMapRef:
            name: postgres-db-config
# Volume Claim
volumeClaimTemplates:
    - metadata:
        name: postgresql-db-disk
    spec:
        accessModes: ["ReadWriteOnce"]
        resources:
            requests:
                storage: 25Gi
以上の構成は次の点で要約することができる.

  • Configmap - Postgres DB config :この設定マップはPostgresコンテナが必要とするすべての環境変数を定義します.

  • サービス- Postgres DB Lb :ロードバランサタイプサービスはポート5432を使用してコンテナの外にポッドを露出させるように定義されます

  • statefulset - PostgreSQL DB :ステータスセットは、Postgresコンテナイメージを使用して永続的なボリュームにマウントされたデータを使用して2つのレプリカで構成されます.追加のリソース制限はコンテナとボリュームの両方に設定されます.
  • この構成を作成した後、それを適用し、次のコマンドを使用して状態セットを確認できます.
    kubectl apply -f .\postgres-statefulset.yaml
    kubectl get all
    kubectl get pvc
    

    それだ!PostgreresデータベースをKubernetes上で正常に設定しました.

    データベースへのアクセス


    今、私たちはポッドを実行しているので、データベースにアクセスしましょう.サービスを設定しているので、そのサービスの外部IPを使用してデータベースにアクセスできます.デフォルトのユーザやデータベース(Postgres)などのサーバーの詳細をArctype client と接続をテストします.

    Dockerの例と同様に、テーブル名を作成しましょうtest_data_table そしていくつかのレコードを追加します.ここでは、全体の状態セットを削除します.すべてを正しく設定した場合、データが残りますが、PODは削除されます.

    では、状態セットをリセットしてデータベースにアクセスしてみましょう.これが新しい展開であるので、サービスに関連した新しい外部IPが表示されます.

    クライアントの接続文字列を変更して接続を試みます.

    次に、以前に作成したテーブルが表示されます.PODの状態にかかわらずデータが利用可能であることを示すSELECTコマンドを実行して、テーブル内のすべてのデータを公開することができます.

    データベースのポッドでの作業のベストプラクティス


    最高の信頼性とパフォーマンスを得るためにKubernetesでデータベースを展開するときに続くいくつかのベストプラクティスがあります.
  • 用途Kubernetes Secrets to store sensitive information パスワードなど.簡単にするためにユーザーのパスワードを平文で保存しても、任意の機密情報を生産環境の秘密に格納し、必要に応じて参照する必要があります.
  • 実装resource limits for CPU, RAM, and storage . これはクラスタ内のリソースを管理し、PODがリソースを消費しないようにします.
  • 常にあなたのボリュームのバックアップを設定します.ポッドを再作成することができても、基になるデータボリュームが破損した場合、データベース全体が使用できなくなります.
  • ネットワークポリシーとRBACを実装し、最適なパフォーマンスとセキュリティのためにこれらのリソースを変更することができます.
  • 別の名前空間を使用して、通常のアプリケーションからデータベースを分離し、サービスを通して接続性を管理します.
  • 結論


    コンテナ化されたデータベースの作成は、ユーザーがコンテナ化のすべての利点を活用し、データベースに適用することができます.このコンテナ化はどんな市場にも適用可能ですMySQL and Postgres クラウドネイティブアプリケーションのために地上から設計された新しい競合子に.例えば、.コンテナ化されたデータベースを管理することによって、ユーザーは従来のデータベース展開によって必要とされるリソースの一部を有する耐故障性、非常に利用可能で、スケーラブルなデータベースアーキテクチャを容易にすることができる.