Kubernetes のサービスメッシュツール Istio を試してみる。

こんにちは k-jun です。今回は Kubernetes 環境などで名前解決、サービスメッシュに使用される istio を試してみます。

https://github.com/istio/istio

最近良く名前を聞くなぁぐらいでやってみることにしましたが、結構難しそうですね。README.md を参照すると、Istio は以下の2つで構成されているようです。

  • Envoy - Sidecar proxies per microservice to handle ingress/egress traffic between services in the cluster and from a service to external services.

こちらはサービスメッシュを担当する Proxy の Envoy さんですね。サイドカーとしてくっついてくれるようです。

  • Istiod - The Istio control plane. It provides service discovery, configuration and certificate management

Istio のコントロールプレーンであり、サービスディスカバリを担当します。

Setup

ドキュメントを参照すると、良さげなチュートリアルを見つけたのでこちらを参考に試してみることにします。

https://istio.io/latest/docs/setup/getting-started/

$ curl -L https://istio.io/downloadIstio | sh -
$ cd istio-1.11.4
$ export PATH=$PWD/bin:$PATH

$ istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Egress gateways installed
✔ Installation complete
Thank you for installing Istio 1.11.  Please take a few minutes to tell us about your install/upgrade experience!  https://forms.gle/kWULBRjUv7hHci7T6

kubectl コマンド経由で namespace を追加し、デプロイまで行ってしまいます。

$ kubectl label namespace default istio-injection=enabled
namespace/default labeled

$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

諸々見てみますが、良さそうです。

$ kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
details-v1-79f774bdb9-8jkwg       2/2     Running   0          20m
productpage-v1-6b746f74dc-j8bp4   2/2     Running   0          20m
ratings-v1-b6994bb9-kjnk2         2/2     Running   0          20m
reviews-v1-545db77b95-lms4f       2/2     Running   0          20m
reviews-v2-7bf8c9648f-642rr       2/2     Running   0          20m
reviews-v3-84779c7bbc-24p5k       2/2     Running   0          20m

$ kubectl get services
NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.24.7.179    <none>        9080/TCP   20m
kubernetes    ClusterIP   10.24.0.1      <none>        443/TCP    28m
productpage   ClusterIP   10.24.12.121   <none>        9080/TCP   20m
ratings       ClusterIP   10.24.10.233   <none>        9080/TCP   20m
reviews       ClusterIP   10.24.12.68    <none>        9080/TCP   20m

$ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

ここからが istio の出番です。現在外部公開されていないサービスを外部に公開していきます。このためにサービスメッシュの入り口を Istio Ingress Gateway を用いて公開していきます。

$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created

$ kubectl get svc istio-ingressgateway -n istio-system
NAME                   TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)                                                                      AGE
istio-ingressgateway   LoadBalancer   10.24.1.213   34.121.233.158   15021:30454/TCP,80:32232/TCP,443:30434/TCP,31400:32235/TCP,15443:31426/TCP   39m

サービスにアクセスするために External IP を利用して環境変数を設定していきます。

$ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
$ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}'
$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
$ echo "$GATEWAY_URL"
34.121.233.158:80

大丈夫そうですね。ではいよいよダッシュボードをデプロイしてサービスメッシュ経由で接続してみます。

$ kubectl apply -f samples/addons
$ kubectl rollout status deployment/kiali -n istio-system

$ istioctl dashboard kiali

f:id:K-jun1221:20211106212318p:plain

良い感じにダッシュボードが見れました。チュートリアルに従っただけですので、正直何もわかっていませんが Istio で何ができそうかということだけでもわかって面白かったです。 それでは今回はこのへんで。