追記(2018-09-01) v1.0となりHelmでのインストールも問題なくできるようになった。Istio-AuthがCitadelという名前になっていたりDeprecatedになってるAPIもある
IstioをHelmでインストールしてRoutingとTelemetryを行いJaeger/Kialiで確認する - sambaiz-net
Istioとは
マイクロサービス間のネットワークの、ロードバランシングや認証、モニタリングなどを担うサービスメッシュのOSS。 概念は抽象化されていて、Kubernetes以外でもサポートされている。 通信をコントロールするdata-planeのEnvoyと、Envoyを管理するcontrol-planeのPilot, Mixer, Istio-Authからなる。
Envoy
Sidecarとしてデプロイされる、サービスメッシュでの全ての通信を通すプロキシ。 アプリケーションのコードに手を入れる必要がないので言語に縛られない。 CNCFのプロジェクトの一つで、 Istio用にオリジナルから拡張されている。 ロードバランシングやヘルスチェックなどを行い、メトリクスを取る。
Mixer
サービスメッシュ全体のアクセスコントロールや、Envoyからデータを集めてログに出したりモニタリングしたりする。 プラグインよってAWSやGCPといったインフラバックエンドの差異が吸収される。
Pilot
サービスディスカバリしてEnvoyのトラフィックを制御する。A/Bテストやカナリアリリースをする場合や、障害に対応して適切にルーティングを行うことができる。
Istio-Auth
サービスやエンドユーザーの認証を行い、ポリシーに従ってアクセス制御する。
Istioのインストール
ローカルのminikubeに環境を作る。 apiserver.Admission.PluginNames では立ち上がらなかったので 代わりに apiserver.admission-control を指定している。
$ minikube version
minikube version: v0.27.0
$ minikube start \
--extra-config=apiserver.admission-control="NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota" \
--kubernetes-version=v1.9.0
$ kubectl config current-context
minikube
istioを持ってきてapplyする。 Helmも用意されていて将来的にそっちで入れるのが推奨になりそうだ。
$ curl -L https://git.io/getLatestIstio | sh -
$ cd istio-0.7.1/
$ kubectl apply -f install/kubernetes/istio-auth.yaml
作成されたserviceとpodはこんな感じ。
$ kubectl get svc -o name -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingress LoadBalancer 10.96.175.13 <pending> 80:30562/TCP,443:32026/TCP 7m
istio-mixer ClusterIP 10.98.182.172 <none> 9091/TCP,15004/TCP,9093/TCP,9094/TCP,9102/TCP,9125/UDP,42422/TCP 7m
istio-pilot ClusterIP 10.102.123.144 <none> 15003/TCP,15005/TCP,15007/TCP,15010/TCP,8080/TCP,9093/TCP,443/TCP 7m
$ kubectl get pod -o name -n istio-system
pods/istio-ca-86f55cc46f-5d6vk
pods/istio-ingress-868d5f978b-k4z5m
pods/istio-mixer-65dc5549d6-lh22q
pods/istio-pilot-657cb5ddf7-g8vc6
Envoyが自動で付くようする
追記(2018-06-30): 0.8.0になってsidecar-injectorはデフォルトで入るようになった
istio-sidecar-injector を入れる。これがMutatingAdmissionWebhookでEnvoyを自動で付け足してくれるらしい。Webhookに証明書が必要。
$ ./install/kubernetes/webhook-create-signed-cert.sh \
--service istio-sidecar-injector \
--namespace istio-system \
--secret sidecar-injector-certs
$ kubectl apply -f install/kubernetes/istio-sidecar-injector-configmap-release.yaml
$ cat install/kubernetes/istio-sidecar-injector.yaml | \
./install/kubernetes/webhook-patch-ca-bundle.sh > \
install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml
$ kubectl apply -f install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml
$ kubectl -n istio-system get deployment -listio=sidecar-injector
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
istio-sidecar-injector 1 1 1 0 16s
default namespaceでEnvoyが付くようにする。
$ kubectl label namespace default istio-injection=enabled
$ kubectl get namespace -L istio-injection
NAME STATUS AGE ISTIO-INJECTION
default Active 25m enabled
istio-system Active 25m
kube-public Active 25m
kube-system Active 25m
付いていることが確認できる。
$ kubectl apply -f samples/sleep/sleep.yaml
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
sleep-776b7bcdcd-z567q 2/2 Running 0 26s
$ kubectl describe pod sleep-776b7bcdcd-z567q
Containers:
sleep:
...
istio-proxy:
...