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