web-dev-qa-db-ja.com

Kubernetesポッド間でストレージを共有する方法は?

Kubernetesを新しいアプリケーションのプラットフォームとして評価しています。今のところ、すべて非常にエキサイティングに見えます!ただし、問題が発生しています。GCEでクラスターをホストしており、2つのポッド(継続的な統合サーバーとアプリケーションサーバー)間でストレージを共有するためのメカニズムが必要です。 kubernetesでこれを行う最良の方法は何ですか? 1つのポッドがディスクに書き込む必要がある場合、GCEディスクは共有できないため、ボリュームタイプはどれも私のニーズに合わないようです。 NFSは完璧ですが、kubernetesクラスターには特別なビルドオプションが必要なようです。

編集:ストレージの共有は、Kubernetesを使用して複数回遭遇した問題のようです。 1つのボリュームを持ち、それを複数のポッド(書き込みアクセス)に接続したいというユースケースが複数あります。私はこれが一般的なユースケースであると仮定することができますか?

EDIT2:たとえば、 このページ はElasticsearchクラスターのセットアップ方法を説明していますが、永続ストレージとの接続は不可能です( ここで説明 )、どの種類のレンダリングを行うか無意味:(

37
Marco Lamina

この質問に答えるのは少し遅れましたが、これまでのKubernetes/MSAの経験から、ここでの問題は設計パターンにあります。 MSAで頻繁に登場し続ける基本的な設計パターンの1つは、データを含むサービスの適切なカプセル化です。

サービスは、関心領域に関連するデータを管理し、OOPと同様に、インターフェイス(API、PUBSUBメッセージなど)を介して他のサービスへのこのデータへのアクセスを許可する必要があります。データへのマルチサービスアクセスは、OOPのグローバル変数に似たアンチパターンです。

Googleも同じ意見を持っていると思います。これがKubernetesがこのように設定されている理由です。

例として、ログを書きたい場合は、各サービスがログに必要な関連データで呼び出すことができるログサービスが必要です。共有ディスクに直接書き込むことは、ログディレクトリ構造などを変更したり、エラー時の電子メールなどの追加機能を追加することにした場合、すべてのコンテナを更新する必要があることを意味します。

27
Ian Belcher

NFSは組み込みのボリュームプラグインであり、複数のポッドライターをサポートしています。 KubeでNFSを動作させるための特別なビルドオプションはありません。

私はRed HatのKubernetesで主にストレージに取り組んでいます。

22
Mark Turansky

複数のポッド間でボリュームを共有するには、アクセスモードがReadWriteManyのPVCを作成する必要があります

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
    name: my-pvc
spec:
    accessModes:
      - ReadWriteMany
    storageClassName: myvolume
    resources:
        requests:
            storage: 1Gi

その後、複数のポッドにマウントできます:

apiVersion: v1
kind: Pod
metadata:
  name: myapp1
spec:
  containers:
...
      volumeMounts:
        - mountPath: /data
          name: data
          subPath: app1
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: 'my-pvc'
---
apiVersion: v1
kind: Pod
metadata:
  name: myapp2
spec:
  containers:
...
      volumeMounts:
        - mountPath: /data
          name: data
          subPath: app2
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: 'my-pvc'

もちろん、永続ボリュームはネットワーク経由でアクセス可能でなければなりません。それ以外の場合は、すべてのポッドがそのボリュームを持つノードにスケジュールされていることを確認する必要があります。

クラウドプロバイダーに関連付けられていない、それに適したボリュームタイプがいくつかあります。

  • NFS
  • RBD(セフブロックデバイス)
  • CephFS
  • Glusterfs
  • Portworxボリューム

もちろん、ボリュームを使用するには、まずボリュームを用意する必要があります。つまり、NFSを使用する場合は、K8sクラスターのすべてのノードでNFSをセットアップする必要があります。 Cephを使用する場合は、Cephクラスターなどをセットアップする必要があります。

デフォルトでKubernetesをサポートする唯一のボリュームタイプはPortworksです。 GKEでの設定方法 に指示があります。

K8sでCephクラスターをセットアップするには、 Rook と呼ばれる開発中のプロジェクトがあります。

ただし、あるノードのフォルダーを別のノードで使用できるようにしたい場合、これはすべてやり過ぎです。この場合、NFSサーバーをセットアップするだけです。他の種類のボリュームをプロビジョニングするよりも難しくはなく、消費するCPU /メモリ/ディスクリソースははるかに少なくなります。

12
Vanuan

更新:最良の選択は、おそらく管理されたNFSシステムであるCloud Filestoreです。これにより、アップロード/ダウンロードのみをサポートするGCSとは異なり、ファイルへの完全なランダム読み取り/書き込みアクセスが可能になります。 docs here を参照してください。

オリジナル: Google Cloud Storage を試しましたか? Fuse adapter を使用して、ネットワークディスクのようにマッピングすることもできます。

4
Sandeep Dinesh

ディスクに書き込みたいログがログの場合、logspout https://github.com/gliderlabs/logspout を参照することをお勧めします。これにより、各ポッドのログが収集され、その後、fluiddを使用するGoogleクラウドプラットフォームのかなり新しいログサービスを使用できます。これにより、各ポッドからのすべてのログが単一の場所に収集されます。

通常、データベースまたはその種の何かに書き込むデータである場合、データベースを実行するkubernetesクラスターの外部に別のサーバーを用意することをお勧めします。

[〜#〜] edit [〜#〜]

ポッド間でファイルを共有するには、kubernetesクラスターの各ノードにgoogleクラウドストレージドライブをマウントし、そのマウントされたディレクトリにマウントする各ポッドにボリュームとしてセットアップすることをお勧めしますドライブに直接ではありません。ポッドは指定されたノード上で実行されないため、各ノードにマウントするとよいので、その場合は一元化することをお勧めします。

4

Googleは最近、クラウドファイルストアをリリースしました。チュートリアルはこちら https://cloud.google.com/filestore/docs/accessing-fileshares

一部のシナリオでは、クラウドストレージ/バケットの優れた代替手段になる可能性があります。

3
Geige V

Kubernetes Volumes を見ましたか?おそらくgcePersistentDiskの作成を検討しています。

GcePersistentDiskボリュームは、Google Compute Engine(GCE)永続ディスクをポッドにマウントします。 Podが削除されると消去されるemptyDirとは異なり、PDの内容は保持され、ボリュームは単にアンマウントされます。つまり、PDデータを事前に入力し、そのデータをポッド間で「ハンドオフ」することができます。重要:使用する前に、gcloudまたはGCE APIまたはUIを使用してPDを作成する必要があります。 gcePersistentDiskを使用する場合の制限:ポッドが実行されているノードはGCE VMである必要があります。これらのVMは、PDの機能PDは、複数のコンシューマーが同時に読み取り専用としてマウントできることです。つまり、PDをデータセットに事前設定し、asから並行して提供できることを意味します。残念ながら、PDは単一のコンシューマーが読み書きモードでのみマウントできます-同時ライターは許可されません。ReplicationControllerによって制御されるポッドでPDを使用すると失敗しますPDは読み取り専用またはレプリカ数は0または1です。

さまざまなポッドからの複数の書き込みをサポートするには、おそらく、readFromDiskメソッドとWriteToDiskメソッドを公開するthriftまたはソケットタイプのサービスを公開する1つの強力なポッドを作成する必要があります。

3
varun

@Marco-Maven関連の質問に関しては、これを一元化されたストレージの問題と見なすのをやめ、おそらくサービスの問題と考えることをお勧めします。

過去にHTTPでMavenリポジトリを実行しました(読み取り専用)。 Mavenリポジトリを作成し、独自のポッド(ドッカーコンテナ)でApache/Nginxを介して公開し、そのポッドに必要な専用ストレージを公開し、サービスディスカバリーを使用してアプリケーションとビルドシステムにリンクします。

1
Dave Thomson