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を確認する。