Istioをインストールして味見してみた

Istioを味見したのでメモ。
本記事はインストールまで。

Grafanaを有効化のため、installコマンドを更新

Istioについて

ざっくりした理解だけ。
触っていくうちに理解が深まれば、追加予定。

概要

Pod間の通信保護、サービス間のルーティングや監視する手段を提供する。
最初にIstioを聞いたときには、CNIと競合するようなコンポーネントと勘違いした。
Istio自体がPodで動作することと、IPのアサインや実際のIPルーティングについてはCNIを使用する必要がある。
そのため、今回の環境ではcanal(Calico+flannel)をCNIとした環境下で味見。

Citadel

Istio内のセキュリティコンポーネントで鍵と証明書の管理を行う。具体的には証明書の発行と更新などを行う。

Egress Gateway

サービスメッシュ内のPodから外部への通信はEgressGatewayを通して行われる。
デフォルトでは外部へ通信ができないようになっている。

Galley

Istioの設定の責任を持ち、他のIstioのコンポーネントに配布するコンポーネント。

Ingress Gateway

サービスメッシュ内のPodへのGateway機能を提供。

Pilot

トラフィックのルーティングルールをEnvoyの設定に翻訳し、サイドカーとして動いているEnvoyに設定を反映する。
サービスディスカバリー機能を有しており、Podが追加された場合にロードバランサーのプールを更新するなどの役割を果たす。

Envoy(Proxy)

サイドカーとして動作し、トラフィックのプロキシーを行う。
Istioを有効化したサービスにおいては、全てのトラフィックがこのEnvoyを経由する。

Mixer

アクセス制御やEnvoyからのテレメトリーデータの取得を行う。

環境

クラスタの環境は以下の通り。

$ kubectl get node -o wide
NAME          STATUS    ROLES     AGE       VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
k8s-master1   Ready     master    5d        v1.11.3   192.168.110.246   <none>        Ubuntu 16.04.5 LTS   4.4.0-72-generic   docker://17.3.2
k8s-master2   Ready     master    5d        v1.11.3   192.168.110.248   <none>        Ubuntu 16.04.5 LTS   4.4.0-72-generic   docker://17.3.2
k8s-master3   Ready     master    5d        v1.11.3   192.168.110.244   <none>        Ubuntu 16.04.5 LTS   4.4.0-72-generic   docker://17.3.2
k8s-node1     Ready     <none>    5d        v1.11.3   192.168.110.243   <none>        Ubuntu 16.04.5 LTS   4.4.0-72-generic   docker://17.3.2
k8s-node2     Ready     <none>    5d        v1.11.3   192.168.110.241   <none>        Ubuntu 16.04.5 LTS   4.4.0-72-generic   docker://17.3.2
k8s-node3     Ready     <none>    5d        v1.11.3   192.168.110.247   <none>        Ubuntu 16.04.5 LTS   4.4.0-72-generic   docker://17.3.2
$ kubectl get pod -o wide --all-namespaces
NAMESPACE      NAME                                             READY     STATUS    RESTARTS   AGE       IP                NODE          NOMINATED NODE
kube-system    canal-6bx99                                      3/3       Running   6          8d        192.168.110.248   k8s-master2   <none>
kube-system    canal-6fkcl                                      3/3       Running   3          8d        192.168.110.243   k8s-node1     <none>
kube-system    canal-b7vq7                                      3/3       Running   3          8d        192.168.110.247   k8s-node3     <none>
kube-system    canal-nvdrq                                      3/3       Running   3          8d        192.168.110.241   k8s-node2     <none>
kube-system    canal-ppflm                                      3/3       Running   3          8d        192.168.110.246   k8s-master1   <none>
kube-system    canal-xmw8t                                      3/3       Running   3          8d        192.168.110.244   k8s-master3   <none>
kube-system    coredns-78fcdf6894-7v82x                         1/1       Running   1          8d        10.244.2.4        k8s-master3   <none>
kube-system    coredns-78fcdf6894-qnd7t                         1/1       Running   1          8d        10.244.2.5        k8s-master3   <none>
kube-system    kube-apiserver-k8s-master1                       1/1       Running   1          8d        192.168.110.246   k8s-master1   <none>
kube-system    kube-apiserver-k8s-master2                       1/1       Running   2          8d        192.168.110.248   k8s-master2   <none>
kube-system    kube-apiserver-k8s-master3                       1/1       Running   2          8d        192.168.110.244   k8s-master3   <none>
kube-system    kube-controller-manager-k8s-master1              1/1       Running   3          8d        192.168.110.246   k8s-master1   <none>
kube-system    kube-controller-manager-k8s-master2              1/1       Running   4          8d        192.168.110.248   k8s-master2   <none>
kube-system    kube-controller-manager-k8s-master3              1/1       Running   2          8d        192.168.110.244   k8s-master3   <none>
kube-system    kube-proxy-6krfw                                 1/1       Running   2          8d        192.168.110.243   k8s-node1     <none>
kube-system    kube-proxy-cg2j4                                 1/1       Running   2          8d        192.168.110.241   k8s-node2     <none>
kube-system    kube-proxy-g9kq5                                 1/1       Running   1          8d        192.168.110.246   k8s-master1   <none>
kube-system    kube-proxy-hjztx                                 1/1       Running   2          8d        192.168.110.248   k8s-master2   <none>
kube-system    kube-proxy-jcznc                                 1/1       Running   1          8d        192.168.110.244   k8s-master3   <none>
kube-system    kube-proxy-xptlh                                 1/1       Running   2          8d        192.168.110.247   k8s-node3     <none>
kube-system    kube-scheduler-k8s-master1                       1/1       Running   3          8d        192.168.110.246   k8s-master1   <none>
kube-system    kube-scheduler-k8s-master2                       1/1       Running   3          8d        192.168.110.248   k8s-master2   <none>
kube-system    kube-scheduler-k8s-master3                       1/1       Running   2          8d        192.168.110.244   k8s-master3   <none>
kube-system    nginx-ingress-controller-5cf76b966b-q9t4t        1/1       Running   0          21h       10.244.3.8        k8s-node1     <none>
kube-system    nginx-ingress-default-backend-544cfb69fc-vwpx8   1/1       Running   0          21h       10.244.5.45       k8s-node3     <none>
kube-system    tiller-deploy-56c4cf647b-nmc8w                   1/1       Running   0          21h       10.244.4.8        k8s-node2     <none>

Istioのインストール

Helmを使ってIstioをインストールする。
まずはネームスペースの作成

$ kubectl create ns istio-system

IstioのGitレポジトリをクローン

$ git clone https://github.com/istio/istio.git
$ cd istio

続いて、CustomResourcesの作成

$ kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml -n istio-system

helmを使ってistioのインストール。

$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system --set grafana.enabled=true > $HOME/istio.yaml
$ kubectl apply -f $HOME/istio.yaml

PodがReadyになったことを確認。

$ kubectl get pod  -o wide
NAME                                      READY     STATUS      RESTARTS   AGE       IP            NODE        NOMINATED NODE
istio-citadel-8545986b5c-qnpt6            1/1       Running     0          1m        10.244.5.57   k8s-node3   <none>
istio-cleanup-secrets-2srbf               0/1       Completed   0          2m        10.244.4.15   k8s-node2   <none>
istio-egressgateway-f449f844-d7mf6        1/1       Running     0          1m        10.244.4.16   k8s-node2   <none>
istio-galley-5c77f544cc-tl428             1/1       Running     0          1m        10.244.5.58   k8s-node3   <none>
istio-ingressgateway-7fc4cdbfc7-8bnps     1/1       Running     0          1m        10.244.3.21   k8s-node1   <none>
istio-pilot-7974d67fcc-clhlt              2/2       Running     0          1m        10.244.3.22   k8s-node1   <none>
istio-policy-6bc68c8bcb-56zw2             2/2       Running     0          1m        10.244.5.56   k8s-node3   <none>
istio-security-post-install-8dppl         0/1       Completed   0          2m        10.244.3.20   k8s-node1   <none>
istio-sidecar-injector-74cd5c9565-cxc29   1/1       Running     0          1m        10.244.4.19   k8s-node2   <none>
istio-telemetry-7658f85655-5kpwb          2/2       Running     0          1m        10.244.4.17   k8s-node2   <none>
prometheus-554b5cc795-tbkjl               1/1       Running     0          1m        10.244.4.18   k8s-node2   <none>

デモ

ここにあるデモアプリケーションを動作して、基本的なデモを行う。
試すのは公式にあること。

デモ用アプリケーションのデプロイ

デモ用のNamespaceを作成

$ kubectl create ns istio-demo
namespace/istio-demo created

Proxyは、istio-injection=enabledとなっているネームスペースに自動でデプロイされるので、やることはアプリケーションをデプロイするだけ。

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

$ kubectl get ns --show-labels
NAME           STATUS    AGE       LABELS
default        Active    33d       <none>
istio-demo     Active    42s       istio-injection=enabled
istio-system   Active    25d       name=istio-system
kube-public    Active    33d       <none>
kube-system    Active    33d       project=kube-system

続いて、デモアプリケーションをネームスペースに作成

$ kubectl -n istio-demo apply -f samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
deployment.extensions/details-v1 created
service/ratings created
deployment.extensions/ratings-v1 created
service/reviews created
deployment.extensions/reviews-v1 created
deployment.extensions/reviews-v2 created
deployment.extensions/reviews-v3 created
service/productpage created
deployment.extensions/productpage-v1 created

yaml内のDeploymentを確認すると、それぞれ1つのコンテナしかないが、デプロイするとPod内に2つコンテナが作られていることがわかる。

$ kubectl -n istio-demo get pod
NAME                             READY     STATUS    RESTARTS   AGE
details-v1-6764bbc7f7-ns8rx      2/2       Running   0          4m
productpage-v1-54b8b9f55-dmhff   2/2       Running   0          4m
ratings-v1-7bc85949-lknzr        2/2       Running   0          4m
reviews-v1-fdbf674bb-kqhcm       2/2       Running   0          4m
reviews-v2-5bdc5877d6-w4ns6      2/2       Running   0          4m
reviews-v3-dd846cc78-sx8tb       2/2       Running   0          4m

$ kubectl -n istio-demo get pod -o 'custom-columns=NAME:.metadata.name,CONTAINER0:.spec.containers[0].name,CONTAINER1:.spec.containers[1].name'
NAME                             CONTAINER0    CONTAINER1
details-v1-6764bbc7f7-ns8rx      details       istio-proxy
productpage-v1-54b8b9f55-dmhff   productpage   istio-proxy
ratings-v1-7bc85949-lknzr        ratings       istio-proxy
reviews-v1-fdbf674bb-kqhcm       reviews       istio-proxy
reviews-v2-5bdc5877d6-w4ns6      reviews       istio-proxy
reviews-v3-dd846cc78-sx8tb       reviews       istio-proxy

続いて、アプリケーションにアクセスするためGatewayを作成する。

$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created

その後、デプロイされたアプリケーションにアクセスする。外部からアクセスするには、IngressGatewayを通してアクセスする必要があるので、IngressGatewayへのアクセスを確認する。

$ kubectl -n istio-system get svc istio-ingressgateway
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                                                                   AGE
istio-ingressgateway   LoadBalancer   10.111.226.58   <pending>     80:31380/TCP,443:31390/TCP,31400:31400/TCP,15011:31622/TCP,8060:31512/TCP,853:30869/TCP,15030:32498/TCP,15031:31770/TCP   25d

この環境では、External-IPが付与されないので、NodePortを使ってアクセスする。
Workerノード1のIPが192.168.110.243なので、HTTPはhttp://192.168.110.243:31380 ch、HTTPSはhttps://192.168.110.243:31390からアクセス可能。

下記コマンドでStatus 200が返ってくればIstioが動いていることが確認できる

$ curl -o /dev/null -s -w "%{http_code}\n" http://192.168.110.243:31380/productpage
200

ブラウザから同じURLにアクセスすると以下のページが見える。

次回はIntelligent Routingを確認する。

Simple Bookstore App

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください