LocalhostListener

このメッセージは、ワークロードがlocalhostネットワークインターフェースでリッスンしているが、そのポートがサービスで公開されている場合に発生します。この場合、そのポートは他のポッドからアクセスできなくなります。

このチェックは、主に Istio 1.10 以降へのアップグレード時に破損する可能性のある、古いバージョンの Istio のワークロードを検出するために追加されました。この動作は、Istio のない標準的な Kubernetes クラスタで発生する動作と一致しますが、古いバージョンの Istio ではこれらのポートが公開されていました。

コマンド nc localhost 8080 -l を実行している Pod を選択する Service を検討してください。

apiVersion: v1
kind: Service
metadata:
  name: netcat
spec:
  ports:
  - port: 8080
    protocol: TCP
  selector:
    app: netcat

アプリケーションがlocalhost上でトラフィックを処理しているため、他のポッドからはアクセスできません。

上記の例では、簡単なncツールを使用しています。他の言語での同等の例をいくつか示します。

  • Go: net.Listen("tcp", "localhost:8080")
  • Node.js: http.createServer().listen(8080, "localhost");
  • Python: socket.socket().bind(("localhost", 8083))

解決方法

アプリケーションを他のポッドに公開する意図がない場合は、Serviceからポートを削除できます。

アプリケーションを他のポッドに公開する場合は、2つのオプションがあります。

  • 他のポッドに公開されているネットワークインターフェースにバインドするようにアプリケーションを変更します。通常、これは0.0.0.0または::にバインドすることを意味します。例:nc 0.0.0.0 8080 -l
  • ポッドのインバウンドネットワーク設定をカスタマイズするために、Sidecar設定を作成します。たとえば、上記のアプリケーションでは次のようになります。
apiVersion: networking.istio.io/v1
kind: Sidecar
metadata:
  name: ratings
spec:
  workloadSelector:
    labels:
      app: netcat
  ingress:
  - port:
      number: 8080
      protocol: TCP
      name: tcp
    defaultEndpoint: 127.0.0.1:8080