Istio v0.7でEnvoy Proxyを付けるまで

istiokubernetes

追記(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:
    ...