Published on

Istio on GKEでハマったこと

Authors

備忘録として書き留めます。コメントありましたらよろしくお願いいたします。

TL;DR

  • Terraformで、default nodeを削除してクラスタを立てると0 nodeになる
  • promsd (defaultのprometheus) はいくつかexporterがなく、かつReconcile設定が入っているのでConfigmapを書き換えられない
  • kialiやjaegerを入れる場合は、IstioのHelm Chartからの差分を手動でManifestに設定してapplyする必要がある

Istio on GKEとは?

https://cloud.google.com/istio/docs/istio-on-gke/overview?hl=ja

Istio on GKEは、Google Kubernetes EngineでIstio有効にするためのアドオンです。これを利用することによって、わざわざクラスタにIstioをinstallしなくても、Istioが有効なクラスタが立ち上がります

通常Istioを入れる場合はHelm Chartを利用してInstallする必要があります

https://istio.io/docs/setup/kubernetes/install/helm/

ただ、Helmで入れない場合、いくつかハマりどころがあったのでそれを紹介したいと思います

default nodeを利用しないとPodが立ち上がらない

基本、GKEの構成管理はTerraformを利用することが多いのだが、ここで一つトラップがあった。

現在、柔軟なリソース管理のために、いくつかリソースの異なるNodeを利用してPodのスケジューリングを行うことができる。

https://cloud.google.com/kubernetes-engine/docs/tutorials/migrating-node-pool?hl=ja

その際、デフォルトのnodepoolを使わずにクラスタを立てる方法があり、terraformだと以下のように記述ができる

しかし、この方法でClusterを作成すると、後から作ったNodeが0Nodeとなって、Podがスケジューリングできない現象に遭遇した。エラーメッセージは、 Increase maximum size limit for autoscaling in one or more node pools that have autoscaling enabled. と表示される

この問題は、Default node poolを使ってクラスタを立てることで解決した。後からNode poolを足していくことは問題なさそう

promsdの設定が書き換えられない

Istio on GKEでIstioを入れた場合、デフォルトでpromsd(混乱を割けるためにpromsdという名前になったらしい https://cloud.google.com/istio/docs/istio-on-gke/release-notes

ただし、このpromsdはトラップがあって、Helmで入るPrometheusと設定が異なっているうえに、

labels:
    addonmanager.kubernetes.io/mode: Reconcile

が設定されたconfigmapで、後からPrometheusの設定を変更したり、exporterを追加したりすることができなかった

https://qiita.com/inajob/items/300805e895eec6535dd2

解決法としては、Istio on GKEの公式にも書かれている方法での独自PrometheusのInstallで落ち着いた

https://cloud.google.com/istio/docs/istio-on-gke/installing#adding_prometheus

監視系の追加Install

KialiやJaegerといった監視や可視化のComponentsはIstio on GKEでは入っていない。 これらを入れるには、IstioのHelm Chartから上記Adaptersの差分を取り出してきて、手動でmanifestの作成を行う必要がある

https://cloud.google.com/istio/docs/istio-on-gke/installing#adding_adapters

どんな感じで設定するかというと、例えば、Kialiを入れたい場合、

curl -L https://git.io/getLatestIstio | ISTIO_VERSION=${CHART_ISTIO_VERSION} sh -

helm template --set kiali.enabled=false --namespace istio-system istio-${CHART_ISTIO_VERSION}/install/kubernetes/helm/istio > off.yaml
helm template --set kiali.enabled=true --namespace istio-system istio-${CHART_ISTIO_VERSION}/install/kubernetes/helm/istio > on.yaml
diff -u off.yaml on.yaml > kiali.yaml

といった感じで、Installする場合としない場合のyamlのdiffを取って、それらを手動で整形していくという形になる。これは運用事故りそうだなと感じてはいるが、現状はこの方法が一番ベストなはず