Istio 1.10における今後のネットワーク変更
Istioネットワークの今後の変更点、クラスタへの影響、および対応方法について理解します。
背景
Kubernetesのネットワークはカスタマイズ可能ですが、典型的なPodのネットワークは次のようになります。
アプリケーションは、ループバックインターフェース`lo`(通常は`127.0.0.1`にバインド)、またはPodのネットワークインターフェース`eth0`(通常はPodのIPにバインド)、または両方(通常は`0.0.0.0`にバインド)にバインドすることを選択できます。
`lo`にバインドすると、Pod内から`curl localhost`などの呼び出しを実行できます。 `eth0`にバインドすると、他のPodからPodへの呼び出しが可能になります。
通常、アプリケーションは両方にバインドします。ただし、管理インターフェースなどの内部ロジックを持つアプリケーションは、他のPodからのアクセスを回避するために`lo`のみにバインドすることを選択する場合があります。さらに、一部のアプリケーション(通常はステートフルアプリケーション)は、`eth0`のみにバインドすることを選択します。
現在の動作
リリース1.10より前のIstioでは、アプリケーションと同じPodで実行されているEnvoyプロキシは、`eth0`インターフェースにバインドし、すべての受信トラフィックを`lo`インターフェースにリダイレクトします。
これには、標準のKubernetesとは異なる動作を引き起こす2つの重要な副作用があります。
- `lo`のみにバインドするアプリケーションは、通常は許可されていない場合でも、他のPodからのトラフィックを受信します。
- `eth0`のみにバインドするアプリケーションは、トラフィックを受信しません。
両方のインターフェースにバインドするアプリケーション(これは一般的です)は影響を受けません。
今後の動作
Istio 1.10以降、ネットワークの動作はKubernetesに存在する標準の動作に合わせて変更されます。
ここでは、プロキシがトラフィックを`lo`インターフェースにリダイレクトするのではなく、`eth0`上のアプリケーションに転送していることがわかります。その結果、Kubernetesの標準の動作は維持されますが、Istioのすべての利点は引き続き得られます。この変更により、Istioは、ゼロ構成で既存のワークロードと連携するドロップイン透過プロキシという目標に近づくことができます。さらに、`lo`のみにバインドするアプリケーションの意図しない露出を回避します。
影響はありますか?
新規ユーザーの場合、この変更は改善のみとなります。ただし、既存のユーザーである場合、意図的または偶発的に古い動作に依存している可能性があります。
これらの状況を検出するために、影響を受けるPodを見つけるためのチェックを追加しました。 `istioctl experimental precheck`コマンドを実行すると、`Service`で公開されているポートで`lo`にバインドしているPodのレポートを取得できます。このコマンドはIstio 1.10以降で使用できます。 **対策を講じないと、アップグレード時にこれらのポートにアクセスできなくなります。**
$ istioctl experimental precheck
Error [IST0143] (Pod echo-local-849647c5bd-g9wxf.default) Port 443 is exposed in a Service but listens on localhost. It will not be exposed to other pods.
Error [IST0143] (Pod echo-local-849647c5bd-g9wxf.default) Port 7070 is exposed in a Service but listens on localhost. It will not be exposed to other pods.
Error: Issues found when checking the cluster. Istio may not be safe to install or upgrade.
See https://istio.dokyumento.jp/latest/docs/reference/config/analysis for more information about causes and resolutions.
移行
現在`lo`にバインドしている場合は、いくつかのオプションがあります。
アプリケーションをすべてのインターフェース(`0.0.0.0`または`::`)にバインドするように切り替えます。
`Sidecar`イングレス設定を使用してポートを明示的に設定し、`lo`に送信して古い動作を維持します。
たとえば、`ratings`アプリケーションの`localhost`にリクエストを送信するように設定するには、次のようにします。
apiVersion: networking.istio.io/v1beta1 kind: Sidecar metadata: name: ratings spec: workloadSelector: labels: app: ratings ingress: - port: number: 8080 protocol: HTTP name: http defaultEndpoint: 127.0.0.1:8080
Istiodの`PILOT_ENABLE_INBOUND_PASSTHROUGH=false`環境変数を使用して変更を完全に無効にし、Istio 1.10より前の動作と同じ動作を有効にします。このオプションは将来削除されます。