(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Istio】istioctl kube-injectでYAMLファイルを変換する

スポンサーリンク

はじめに

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

と入れると以下のように画面が表示されます。

f:id:mtiit:20201224231410p:plain
サンプルページが表示される

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.

初学者の方はまずは手動でファイルを変換しながら、どこがどう変わっているのかを確認するのが良いと思います。

そんなハンズオンの参考になれば幸いです。