Istio1.10からトラフィックの流れに変更がでるそうです。これにより、デフォルトで宛先(Destination) IPが保存されます。
参考 Upcoming networking changes in Istio 1.10TOC
トラフィックパス変更点
istio1.9までは、envoyが途中でインターセプトして、loインタフェースからアプリケーションにリクエストを投げていましたが、
istio1.10からは下記のように、envoyがインターセプトした後も、eth0でアプリケーションにリクエストを投げるようになるそうです。
要するに、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が保存されていることが確認できました。