web-dev-qa-db-ja.com

Kubernetes-1つのポッドに複数のイメージをデプロイする

アプリケーションが元々docker-composeで実行するように構成されていたため、問題が発生しています。 .yamlデプロイメントファイルをKubernetesに移植して書き換えることができましたが、問題はポッドの通信にあります。

フロントエンドはバックエンドと通信してサービスにアクセスします。同じネットワーク内にある必要があるため、フロントエンドはローカルホストからサービスを呼び出します。コードは会社によって開発されたプロプライエタリアプリケーションであり、Kubernetesをサポートしていないため、コードにアクセスできません。コードの変更は問題外です。

主な理由は、フロントエンドとバックエンドが異なるIPで異なるポッドで実行されているためだと思います。

フロントエンドがAPIを呼び出そうとすると、サービスが見つからず、エラーが返されます。したがって、フロントエンドイメージとバックエンドイメージの両方を同じポッドにデプロイして、同じクラスターIPを共有しようとしています。

残念ながら、yamlファイルを作成して単一のポッド内に両方のコンテナーを作成する方法がわかりません。

フロントエンドコンテナとバックエンドコンテナの両方を同じポッドで実行することは可能ですか、それともコンテナを通信させる別の方法(おそらくプロキシ)がありますか?

4
user3653379

はい、yamlファイルのcontainersセクションにエントリを追加するだけです。例:

apiVersion: v1
kind: Pod
metadata:
name: two-containers
spec:
    restartPolicy: Never
containers:
    - name: nginx-container
      image: nginx
    - name: debian-container
      image: debian
4
Chris Johnson

したがって、フロントエンドイメージとバックエンドイメージの両方を同じポッドにデプロイして、同じクラスターIPを共有しようとしています。

同じポッドでより多くのコンテナーを実行する例に取り組んでいる、受け入れられた回答はすでにありますが、いくつかの詳細を指摘したいと思います。

  • コンテナーは、それらが一緒にスケーリングする場合にのみ同じポッド内にある必要があります(コンテナー間でclusterIPを介して通信する場合はそうではありません)。フロントエンド/バックエンド分割のシナリオは、それらを一緒に詰め込むのに適した候補とは思えません。

  • コンテナを同じポッドに配置することを選択した場合、コンテナはlocalhostを介して通信でき(2つのプロセスが同じホストで実行されているように見えます(ファイルシステムが異なる部分を除く)、直接通信にlocalhostを使用できます。そのうちの両方に同じポートを割り当てることはできません。クラスターIPを使用すると、同じホスト上で2つのプロセスが外部IPを介して通信しているようになります。

  • ここでのより多くのkubernetes哲学アプローチは次のとおりです。

    • バックエンドのデプロイメントを作成する
    • バックエンドのサービスを作成します(必要なポートを公開します)
    • フロントエンドのデプロイメントを作成する
    • バックエンドサービス名(kube-dnsはこれをバックエンドサービスのクラスターIPに解決します)と指定されたバックエンドポートを使用して、フロントエンドからバックエンドに通信します。
    • オプションで(この例では)、外部アクセスまたは外部に出て行くもののためにフロントエンドのサービスを作成します。ここでは、バックエンドサービスが同じポッド(ホスト)に存在しないため、バックエンドサービスと同じポートを割り当てることができることに注意してください。

このアプローチの利点には、バックエンドをより適切に分離できる(バックエンドとフロントエンドの通信はクラスター内でのみ行われ、外部に公開されない)、ノードで個別にスケジュールできる、個別にスケーリングできる(たとえば、より多くのバックエンドが必要な場合)などがあります。電源はありますが、フロントはトラフィックを処理しています(その逆)、それらのいずれかを個別に置き換えることができます...

3
Const