istio 1.0.5 と minikube で Automatic sidecar injection を試してみた。

# 概要

macOS 上で動作する minikube へ istio 1.0.5 をインストールした後、`Automatic sidecar injection` を試してみました。istio のインストール作業において色々とハマりポイントがあったので、健忘録を兼ねて書きます。

# 検証環境

- macOS - High Sierra 10.13.6

- minikube - v0.32.0

- kubectl - 1.13.1

- helm - 2.11.0

# minikube の起動

[minimal istio install](https://istio.io/docs/setup/kubernetes/minimal-install/) を行うだけであれば、メモリーを 8 MB、CPU を4つを割り当てて minikube を起動するだけで問題ありません。しかしながら、`Automatic sidecar injection` を試したい場合、これだけでは不十分です。

まず、[公式ドキュメント](https://istio.io/docs/setup/kubernetes/platform-setup/minikube/)の起動コマンドは次の通りです。

```bash
$ minikube start --memory=8192 --cpus=4 --kubernetes-version=v1.10.0 \
  --extra-config=controller-manager.cluster-signing-cert-file="/var/lib/localkube/certs/ca.crt" \
  --extra-config=controller-manager.cluster-signing-key-file="/var/lib/localkube/certs/ca.key" \
  --vm-driver=`your_vm_driver_choice`
```

このコマンドでは仮想マシンに存在する証明書と鍵のパスが誤っているため、istio の Pod が起動しません。[issue](https://github.com/istio/istio.io/issues/2765) でもこのことは報告されているようです。

自身の仮想マシンへ `minikube ssh` でログインして証明書と鍵のパスを確認する必要があります。私の場合は `/var/lib/minikube/certs` 配下にありました。したがって、起動コマンド配下のようになります。

```bash
$ minikube start --memory=8192 --cpus=4 --kubernetes-version=v1.10.0 \
  --extra-config=controller-manager.cluster-signing-cert-file="/var/lib/minikube/certs/ca.crt" \
  --extra-config=controller-manager.cluster-signing-key-file="/var/lib/minikube/certs/ca.key" \
  --vm-driver=`your_vm_driver_choice`
```

# istio のインストール

[Downloading the Release](https://istio.io/docs/setup/kubernetes/download-release/)に従い、次のコマンドにて istio をダウンロードします。

```bash
$ curl -L https://git.io/getLatestIstio | sh -
```

次に [minimal istio install](https://istio.io/docs/setup/kubernetes/minimal-install/) を参考にコマンドを実行していきます。

```bash
$ kubectl apply -f istio-1.0.5/install/kubernetes/helm/istio/templates/crds.yaml
```

今回は `Automatic sidecar injection` を試したいので helm によるマニフェストのレンダリングは以下のように設定しました。

```bash
$ helm template istio-1.0.5/install/kubernetes/helm/istio --name istio --namespace istio-system \
  --set security.enabled=false \
  --set ingress.enabled=false \
  --set gateways.istio-ingressgateway.enabled=false \
  --set gateways.istio-egressgateway.enabled=false \
  --set galley.enabled=false \
  --set mixer.enabled=false \
  --set prometheus.enabled=false \
  --set global.proxy.envoyStatsd.enabled=false \
  --set pilot.sidecar=false | kubectl apply -f -
```

しかし、このコマンドではいつまでたっても `istio-sidecar-injector` の Pod が動きません・・・

[issue のコメント](https://github.com/istio/istio/issues/7174#issuecomment-429233168)に原因らしき事が記載されていました。コメントの通り、 `--set security.enabled=false` のオプションを外してみます。

```bash
$ helm template istio-1.0.5/install/kubernetes/helm/istio --name istio --namespace istio-system \
  --set ingress.enabled=false \
  --set gateways.istio-ingressgateway.enabled=false \
  --set gateways.istio-egressgateway.enabled=false \
  --set galley.enabled=false \
  --set mixer.enabled=false \
  --set prometheus.enabled=false \
  --set global.proxy.envoyStatsd.enabled=false \
  --set pilot.sidecar=false | kubectl apply -f -
```

自分の環境では Pod の作成に時間がかかりました。おおよそ 5分後に確認すると・・・

```bash
$ kubectl get pods -n istio-system
NAME                                      READY   STATUS      RESTARTS   AGE
istio-citadel-cb5b884db-2pvhl             1/1     Running     0          6m
istio-cleanup-secrets-dgrlx               0/1     Completed   0          6m
istio-pilot-8668c69c84-lx2p7              1/1     Running     0          32m
istio-security-post-install-mkg4c         0/1     Completed   0          6m
istio-sidecar-injector-7f4c7db98c-bqfgp   1/1     Running     0          32m
```

istio の動作に必要な Pod が作成されました。

# Automatic sidecar injection を試してみる。

[ドキュメント](https://istio.io/docs/setup/kubernetes/sidecar-injection/)に従い、サンプルのマニフェストを用いて istio-proxy をインジェクションしてみます。

```bash
$ kubectl label namespace sandbox istio-injection=enabled
namespace/sandbox labeled
```

```bash
$ kubectl get namespace -L istio-injection
NAME           STATUS   AGE   ISTIO-INJECTION
default        Active   39m
istio-system   Active   37m
kube-public    Active   39m
kube-system    Active   39m
sandbox        Active   37m   enabled
```

```bash
$ kubectl apply -f ./istio-1.0.5/samples/sleep/sleep.yaml
service/sleep created
deployment.extensions/sleep created
```

```bash
$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
sleep-79cc87b6b9-t7rlp   2/2     Running   0          2m
```

コンテナの数が2つになっています。無事、istio-proxy がインジェクションされました。