Sidecar リソースを設定し、クラスター内の他の Pod が Service を使用して localhost でリッスンするアプリケーションにアクセスできるようにします。
他の Pod が localhost アプリケーションにアクセスできない理由
localhost はループバックアドレスであり、同一の Pod 内からのみアクセス可能です。クラスターにデプロイされたアプリケーションが localhost でリッスンしている場合、Service を通じてアプリケーションのサービスポートを公開しても、クラスター内の他の Pod からアクセスすることはできません。
以下の例は、異なる言語で記述されたアプリケーションが localhost でリッスンする方法を示しています。
Golang:
net.Listen("tcp", "localhost:8080")Node.js:
http.createServer().listen(8080, "localhost")Python:
socket.socket().bind(("localhost", 8083))
オプションの選択
アプリケーションを公開するには 2 つのオプションがあります。アプリケーションコードを変更できるかどうかに基づいて、いずれかを選択してください。
オプション 1 — アプリケーションがリッスンするネットワークアドレスを変更します。アプリケーションコードを変更できる場合は、このオプションを選択してください。
オプション 2 — アプリケーションコードを変更したくない場合は、Service Mesh (ASM) を使用して localhost でリッスンするアプリケーションを公開します。
オプション 1: アプリケーションがリッスンするネットワークアドレスの変更
アプリケーションを公開するには、localhost の代わりに 0.0.0.0 でリッスンするようにアプリケーションコードを変更します。
オプション 2: ASM を使用した localhost でリッスンするアプリケーションの公開
ASM コンソールで Sidecar リソースを作成します。Sidecar リソースは、選択した Pod へのインバウンドリクエストをインターセプトし、localhost 上のアプリケーションにリクエストを転送します。
次の手順を実行します。
ASM コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。表示されるページで、[YAML から作成] をクリックします。
作成 ページで、名前空間 と任意の シナリオテンプレート を選択し、次の YAML を設定してから 作成 をクリックします。
apiVersion: networking.istio.io/v1beta1 kind: Sidecar metadata: name: localhost-access namespace: {namespace} spec: ingress: - defaultEndpoint: '127.0.0.1:{container_port}' port: name: tcp number: {port} protocol: TCP workloadSelector: labels: {key}: {value}次のパラメーターを実際の値に置き換えてください。
パラメーター
説明
{namespace}アプリケーションがデプロイされている名前空間。
{container_port}アプリケーションが localhost でリッスンしているコンテナポート。
{port}アプリケーションのサービスポート。
{key}: {value}アプリケーションの Pod を選択する label。
前述の設定は、workloadSelector で定義されているラベルを持つポッドにのみ適用され、ingress で定義されている単一の TCP ポートを公開します。