概要
istiio proxy-status
コマンドについて解説します。
使いどころ
istioを使っていると、たまに設定が反映されない or 時間がかかる時があります(少なくともv1.0.2までは結構ある)。Istioが悪いのか、それとも自分の設定が間違っているのかわからなくなって頭を抱える方も多いのではないでしょうか?
そこで、本当にPilotから各envoy(istio-proxy)に同期されているんだろうか... という時には、 istioctl proxy-status
コマンドを使うとxDSが同期されているか確認することができます。
$ istioctl proxy-status
PROXY CDS LDS EDS RDS PILOT VERSION
foo-api-7fffcdggg-7w2ata.foo SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-hogehoge 1.0.2
foo-api-7fffcdggg-dc9b4w.foo SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-hogehoge 1.0.2
istio-egressgateway-7b46123587-abcde.istio-system SYNCED SYNCED SYNCED (100%) NOT SENT istio-pilot-hogehoge 1.0.2
istio-ingressgateway-57f123c456-abcde.istio-system SYNCED SYNCED SYNCED (100%) SYNCED istio-pilot-hogehoge 1.0.2
※ proxy-status は ps
がエイリアスとして設定されていますので、 istioctl ps
でも同じ結果が返ってきます。
※ xDSはenvoyをコントロールするために必要なDiscovery Serviceのことです。Istioの場合、cluster / listener / endpoint / route のDiscovery Serviceがあります。
内部の挙動について
istioctl コマンドのソースコードを読むとわかるのですが、 istio-pilotのdiscoveryコンテナに対して、下記のようなコマンドを実行しています。
/usr/local/bin/pilot-discovery request GET /debug/syncz
/debug/syncz
というのがistiio-pilotのenvoyのエンドポイントに存在していて、各istio-proxyとxDSがいつ同期したのか、表示してくれます。 $istioctl proxy-status
はこのエンドポイントのレスポンスを整形・加工して出力しているということです。元の、レスポンスが見たい場合は、下記のようなコマンドを実行するとイメージがしやすいかと思います。
$ for pilot-pod in `kubectl get po -n istio-system -l istio=pilot -o jsonpath={.items[*].metadata.name}`
> do
> kubectl exec -it ${pilot-pod} -n istio-system -c discovery /usr/local/bin/pilot-discovery request GET /debug/syncz
> done
まとめ
デバッグや監視に利用できそうですね。正直、この辺りのツールまで準備してくれているのはさすがだなと思いました(自分でcontrol plainを作ってこの辺りまで面倒みると思うと果てしないので...)。もし設定が同期されてない場合は、Pilotを再起動してみる等のオペレーションの判断に役立ちそうです。設定がうまくいかない時は使うと幸せになれるかもしれません。