[Istio1.10] Destination IP 保存の動作検証

Istio1.10からトラフィックの流れに変更がでるそうです。これにより、デフォルトで宛先(Destination) IPが保存されます。

参考 Upcoming networking changes in Istio 1.10

トラフィックパス変更点

istio1.9までは、envoyが途中でインターセプトして、loインタフェースからアプリケーションにリクエストを投げていましたが、

A pod's network with Istio today
引用: Istio.ioより

istio1.10からは下記のように、envoyがインターセプトした後も、eth0でアプリケーションにリクエストを投げるようになるそうです。

A pod's network with Istio in the future
引用:Istio.ioより

要するに、Istioなしでアプリケーションをデプロイした場合とトラフィックの流れが一緒になるということです。しかし、1.9までの動作を想定して、loインタフェースでのみリクエストを受け付けているアプリケーションは動作しなくなるため、アップグレードには注意が必要です。

1.9.Xまでの動作検証

では、実際にアプリケーションが受け取るリクエストを見てみます。nginxをwebサーバとしてデプロイし、リクエストの内容をレスポンスで返すようにします。

セットアップ

今回使う設定はこちらです。

Istioのサイドカーインジェクションをdefaultネームスペースで有効化します。

kubectl label namespace default istio-injection=enabled

続いて、デモアプリケーションをデプロイします。

kubectl deploy -f https://raw.githubusercontent.com/eng-investor-admin/istio-proxy-demo/main/demo-app.yml

デモアプリケーションにリクエストを投げるクライアントをデプロイします。

kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot -- /bin/bash

動作検証

先程のコマンドでクライアントのシェルが立ち上がるので、curl demo-appを実行します。デモアプリケーションにアクセスすると、アプリケーションが認識しているクライアントIPとサーバIPをレスポンスとして返してくれます。

bash-5.1# curl demo-app
Hostname: demo-app-87ccc8688-mq89x
User:
Protocol: HTTP/1.1
Method: GET
Path: /
Server: 127.0.0.1
Http_host: demo-app
user_agent: curl/7.75.0
Remote IP: 127.0.0.1

今回の例だと、ServerがサーバIPでRemote IPがクライアントIPです。

# kubectl get pod -o wide
NAME                              READY   STATUS             RESTARTS   AGE   IP            NODE                         NOMINATED NODE   READINESS GATES
demo-app-87ccc8688-mq89x          2/2     Running            0          20m   172.16.2.19   k8s1-md-0-5d948c5f7f-8wklh   <none>           <none>
tmp-shell                         2/2     Running            0          16m   172.16.1.8    k8s1-md-0-5d948c5f7f-zjfb5   <none>           <none>

元々クライアントは172.16.1.8、サーバは172.16.2.19のIPを保持しているため、istioがなければ172.16.1.8 -> 172.16.2.19になるはずなのですが、127.0.0.1 -> 127.0.0.1になっています。これは、envoyがインターセプトしてloに投げているためです。

1.10からの動作検証

1.10.0-alpha.1のリリースを使って確認します。

セットアップ

Intel Mac OSのファイルをダウンロードして下記のようにIstioをインストールします。

wget https://github.com/istio/istio/releases/download/1.10.0-alpha.1/istio-1.10.0-alpha.1-osx.tar.gz
tar xvzf istio-1.10.0-alpha.1-osx.tar.gz
cd istio-1.10.0-alpha.1/
export PATH=$PWD/bin:$PATH
istioctl install --set profile=demo -y

同様に、デモアプリケーションをデプロイします。

kubectl deploy -f https://raw.githubusercontent.com/eng-investor-admin/istio-proxy-demo/main/demo-app.yml

クライアントからcurlします。これは前回と同じコマンドです。

kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot -- /bin/bash

動作検証

この状態でcurlをするとサーバとクライアントのIPがたしかに見えるようになります。

bash-5.1# curl demo-app
Hostname: demo-app-87ccc8688-flrb5
User:
Protocol: HTTP/1.1
Method: GET
Path: /
Server: 172.16.1.8
Http_host: demo-app
user_agent: curl/7.75.0
Remote IP: 127.0.0.6

PodのIPを確認するとたしかにあっています。

# kubectl get pod -o wide
NAME                               READY   STATUS        RESTARTS   AGE   IP           NODE                         NOMINATED NODE   READINESS GATES
demo-app-87ccc8688-flrb5           2/2     Running       0          20m   172.16.1.8   k8s1-md-0-5d948c5f7f-t6874   <none>           <none>

これにより、宛先IPが保存されていることが確認できました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA