はじめに
istioctlコマンドが通るようになった環境にて
istioctl kube-injectを通すと、各Podに自動的にサイドカーが付与される様子を実機で確認しました。
環境情報
- IKS v1.18.13
- Debian GNU/Linux 9
- istio-1.8.1
サンプルファイル
istioをインストール時のディレクトリ内にサンプルファイルがあります。
# kubectl apply -f istio-1.8.1/samples/bookinfo/platform/kube/bookinfo.yaml service/details created serviceaccount/bookinfo-details created deployment.apps/details-v1 created service/ratings created serviceaccount/bookinfo-ratings created deployment.apps/ratings-v1 created service/reviews created serviceaccount/bookinfo-reviews created deployment.apps/reviews-v1 created deployment.apps/reviews-v2 created deployment.apps/reviews-v3 created service/productpage created serviceaccount/bookinfo-productpage created deployment.apps/productpage-v1 created
これにてPod/Service/Serviceaccoutが起動しますがPodは以下のようになっています。
# kubectl get pod NAME READY STATUS RESTARTS AGE details-v1-558b8b4b76-h4p8v 1/1 Running 0 49s productpage-v1-6987489c74-6dpc9 1/1 Running 0 48s ratings-v1-7dc98c7588-zcg47 1/1 Running 0 49s reviews-v1-7f99cc4496-n72sw 1/1 Running 0 49s reviews-v2-7d79d5bd5d-pkhm6 1/1 Running 0 48s reviews-v3-7dbcdcbc56-29b8g 1/1 Running 0 48s
この状態で同じくディレクトリ配下の以下のYAMLファイルを展開すると
# kubectl apply -f istio-1.8.1/samples/bookinfo/networking/bookinfo-gateway.yaml ...
GatewayとVirtualServiceが起動されるので
# kubectl get virtualservices -o=yaml ... spec: gateways: - bookinfo-gateway hosts: - '*' http: - match: - uri: exact: /productpage ...
パブリックIPとNodePort(istio-ingressgatewayの80番ポートに紐づくPort)を指定してブラウザに
http://169.X.X.X.X:30914/productpage
と入れると以下のように画面が表示されます。
kube-injectでYAMLを変換する
以下のコマンドで新たなYAMLファイル(istioを仕込んだYAML)が生成されます。
# istioctl kube-inject -f istio-1.8.1/samples/bookinfo/platform/kube/bookinfo.yaml > istio-1.8.1/samples/bookinfo/platform/kube/bookinfo2.yaml
元ファイルと比較すると
# cat istio-1.8.1/samples/bookinfo/platform/kube/bookinfo.yaml | wc 331 686 7669
大きく文字列が挿入されていることが分かります。
# cat istio-1.8.1/samples/bookinfo/platform/kube/bookinfo2.yaml 1509 2956 41709
元のYAMLで起動したオブジェクト群を削除した後に新規作成したYAMLでオブジェクトを起動すると
# kubectl apply -f istio-1.8.1/samples/bookinfo/platform/kube/bookinfo2.yaml service/details created serviceaccount/bookinfo-details created deployment.apps/details-v1 created service/ratings created serviceaccount/bookinfo-ratings created deployment.apps/ratings-v1 created service/reviews created serviceaccount/bookinfo-reviews created deployment.apps/reviews-v1 created deployment.apps/reviews-v2 created deployment.apps/reviews-v3 created service/productpage created serviceaccount/bookinfo-productpage created deployment.apps/productpage-v1 created
確かにPodにはサイドカーとしてコンテナが増えている(1/1→2/2)ことが確認できます。
# kubectl get pod NAME READY STATUS RESTARTS AGE details-v1-75db48d85b-flmmt 2/2 Running 0 19s productpage-v1-867fcbf649-gngc6 2/2 Running 0 18s ratings-v1-677f8dc6b4-9rrjl 2/2 Running 0 19s reviews-v1-5796745c4d-sczw8 2/2 Running 0 19s reviews-v2-84b989f9cf-nmmhj 2/2 Running 0 19s reviews-v3-7f598dbdbb-485rs 2/2 Running 0 18s
同じくGatewayとVirtualServiceを起動すればブラウザから確認もできます。
終わりに
IstioはKubernetes Pod内にEnvoyと呼ばれるコンテナをSidecarとしてデプロイすることでアプリケーションのコードを変更することなくサービスメッシュ機能の追加が可能です。
実際は以下のように変換を自動的に行うように名前空間にラベルを張ることで逐次YAMLの書き換え対応は不要ですが
# istioctl analyze Info [IST0102] (Namespace default) The namespace is not enabled for Istio injection. Run 'kubectl label namespace default istio-injection=enabled' to enable it, or 'kubectl label namespace default istio-injection=disabled' to explicitly mark it as not needing injection.
初学者の方はまずは手動でファイルを変換しながら、どこがどう変わっているのかを確認するのが良いと思います。
そんなハンズオンの参考になれば幸いです。