Istio 導入への道 - インストール編

Istio 導入に向けて一歩一歩やっていき。リリースされたばかりの 1.5 を使ってみようと思います。

Minikube の起動

まずは Kubernetes クラスタの作成。いつものように minikube です。こちらのページによると Istio 1.5 は Kubernetes 1.14, 1.15, 1.16 でテストされているそうです。1.17 はまだ早いみたいです。特に理由はないですがここではひとまず 1.15 を使うことにしました。

minikube start --kubernetes-version=v1.15.10 --cpus=4 --memory=8gb

後で type: LoadBalancerService が作られるので別ターミナルで minikube tunnel を実行しておきます。

minikube tunnel

Istio のインストール

istioctl のダウンロード

まずはダウンロードです。最新版をダウンロードする場合は ISTIO_VERSION の指定は不要かと思いますが一応。

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.5.0 sh -

これでカレントディレクトリに istio-1.5.0 というディレクトリができているはずです。(github の releases から環境に合わせた tar.gz をダウンロードして展開してくれるだけ)

istio-1.5.0/bin にある istioctl コマンドを使います。PATH に入れるか PATH の通ってるところに置いてしまいましょう。

profile の確認

istioctl は複数の preset profile を持っています。

$ istioctl profile list               
Istio configuration profiles:
    default
    demo
    empty
    minimal
    remote
    separate

それぞれがどんな構成を作るのかは istioctl profile dump PROFILE-NAME で確認できます。istioctl profile diff PROFILE-NAME1 PROFILE-NAME2 で profile 間の差分も表示してくれます。kubectl で適用する manifest は istioctl manifest generate で生成できるため、この出力を比較することもできます。

した manifest を diff で確認した方がわかりやすいです。

diff -u <(istioctl manifest generate --set profile=default) \
        <(istioctl manifest generate --set profile=minimal)

profile dump で確認できる変数を --set で上書きすることで細かいカスタマイズも可能でその影響も manifest generage で確認することができます。(オプション設定一覧)

Envoy proxy でアクセスログを出力するには values.global.proxy.accessLogFile=/dev/stdout とします。また、そのフォーマット(エンコーディング?)を JSON にするには values.global.proxy.accessLogEncoding=JSON とします。この manifest の差分が次のようにして確認できます。

diff -u <(istioctl manifest generate \
                      --set profile=default \
                      --set values.global.proxy.accessLogEncoding=JSON \
                      --set values.global.proxy.accessLogFile=/dev/stdout) \
        <(istioctl manifest generate --set profile=default)
--- /dev/fd/11	2020-03-07 16:29:46.000000000 +0900
+++ /dev/fd/12	2020-03-07 16:29:46.000000000 +0900
@@ -7199,11 +7199,11 @@
     enableTracing: true
 
     # Set accessLogFile to empty string to disable access log.
-    accessLogFile: "/dev/stdout"
+    accessLogFile: ""
 
     accessLogFormat: ""
 
-    accessLogEncoding: 'JSON'
+    accessLogEncoding: 'TEXT'
 
     enableEnvoyAccessLogService: false
     # reportBatchMaxEntries is the number of requests that are batched before telemetry data is sent to the mixer server
@@ -7569,8 +7569,8 @@
         "priorityClassName": "",
         "prometheusNamespace": "istio-system",
         "proxy": {
-          "accessLogEncoding": "JSON",
-          "accessLogFile": "/dev/stdout",
+          "accessLogEncoding": "TEXT",
+          "accessLogFile": "",
           "accessLogFormat": "",
           "autoInject": "enabled",
           "clusterDomain": "cluster.local",

Egress Gateway を有効にしたい場合は gateways.components.egressGateway.enabled=true を指定します。

インストール

istioctl manifest apply \
    --set profile=default \
    --set values.global.proxy.accessLogEncoding=JSON \
    --set values.global.proxy.accessLogFile=/dev/stdout
Detected that your cluster does not support third party JWT authentication. Falling back to less secure first party JWT. See https://istio.io/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for details.
- Applying manifest for component Base...
✔ Finished applying manifest for component Base.
- Applying manifest for component Pilot...
✔ Finished applying manifest for component Pilot.
  Waiting for resources to become ready...
  Waiting for resources to become ready...
  Waiting for resources to become ready...
  Waiting for resources to become ready...
  Waiting for resources to become ready...
  Waiting for resources to become ready...
  Waiting for resources to become ready...
  Waiting for resources to become ready...
  Waiting for resources to become ready...
  Waiting for resources to become ready...
  Waiting for resources to become ready...
- Applying manifest for component IngressGateways...
- Applying manifest for component AddonComponents...
✔ Finished applying manifest for component IngressGateways.
✔ Finished applying manifest for component AddonComponents.


✔ Installation complete

後で変更したり削除する時のために generate で manifest を作成して kubectl apply した方が良いのかな。

追記:

Configure third party service account tokens について。
istio-proxy が認証に使える token には First Party Token と Third Party Token の2つがあり、First Party は無期限で使えて、全ての Pod にマウントされているため、有効期限の管理される Third Party Token が使えればその方が好ましい。クラウドプロバイダーの提供する Kubernetes の多くでは Third Party Token をサポートしているが、ローカルの開発用クラスタではそうではないことが多いらしい。istioctl manifest apply はこれを自動で調べて使える方を使ってくれるが、istioctl manifest generate で別途 apply する場合は --set values.global.jwtPolicy=third-party-jwt--set values.global.jwtPolicy=first-party-jwt を明示する必要があります。

続く


Istio 導入への道シリーズ

Built with Hugo
テーマ StackJimmy によって設計されています。