Istioのインストール、サイドカープロキシ(Envoy)の挿入、マイクロサービスの可視化Cloud Nativeチートシート(10)

Kubernetesやクラウドネイティブをより便利に利用する技術やツールの概要、使い方を凝縮して紹介する連載。今回は、Istioの環境構築と実践ポイントを説明します。

» 2021年11月05日 05時00分 公開
[毛利健太郎, 岡本隆史株式会社NTTデータ]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

 Kubernetesやクラウドネイティブをより便利に利用する技術やツールの概要、使い方を凝縮して紹介する本連載「Cloud Nativeチートシート」。今回は、前回の「サービスメッシュ」や「Istio」の概要の紹介に続き、Istioの環境構築と実践ポイントを説明します。

 Istioのインストールについては、Istio公式サイト(Getting Startedページ)でも書かれているので、興味がある方はご覧ください。

Istioのインストール

 今回は、下記の環境でインストールしました。

対象 説明 動作確認で利用した環境
Kubernetes 「Azure Kubernetes Service」(AKS)や「Google Kubernetes Engine」(GKE)などのクラウドのマネージドサービス環境や「minikube」などのローカル環境おけるKubernetesクラスタ AKS(v1.21)
GKE(v1.21)
minikube(v1.21)
Istio サービスメッシュソフトウェア v1.11.3

 Istioを利用するには、「istioctl」を用いる方法、連載第8回で紹介した「Operator」を利用する方法、CLIによりマニフェストファイルを生成する方法、連載第3回で紹介した「Helm」を利用する方法がありますが、ここではIstio公式サイト(Install with Istioctlページ)に沿ってistioctlを用いる方法を説明します。

istioctlのダウンロード

 最初にIstioの設定を管理するistioctlを下記コマンドでダウンロードします。

# 最新版を使用する場合
$ curl -L https://istio.io/downloadIstio | sh -
 
# バージョン、プロセッサアーキテクチャを指定する場合
$ curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.11.3 TARGET_ARCH=x86_64 sh -

Istioディレクトリの階層構造

 ダウンロードしたIstioリリースパッケージは次のディレクトリで構成されています。

  • bin
    Istioと対話するCLI。istioctlが含まれる。Kubernetes APIを操作する「kubectl」に似ており、Istioをコマンドラインで操作できる
  • manifests
    istioctlを使用してインストールする場合に使用するConfiguration Profile(後述)やHelmでインストールする場合のチャートが含まれる
  • samples
    Istioを使いこなすチュートリアルやアプリケーションが多数含まれる
  • tools
    istioctlのbash-completion(自動補完設定)が含まれる

 階層構造は下記のようになっています。

$ tree -L 2 istio-1.11.3
istio-1.11.3
├── LICENSE
├── README.md
├── bin
│   └── istioctl    # istioctl
├── manifest.yaml
├── manifests       # helmチャートやistioctlを使用したインストールの構成ファイルが含まれる
│   ├── charts
│   ├── examples
│   └── profiles
├── samples         # サンプルアプリケーションが含まれる
│   ├── README.md
│   ├── addons
│   ├── bookinfo
│   ├── certs
│   ├── custom-bootstrap
│   ├── extauthz
│   ├── external
│   ├── health-check
│   ├── helloworld
│   ├── httpbin
│   ├── jwt-server
│   ├── kubernetes-blog
│   ├── multicluster
│   ├── operator
│   ├── ratelimit
│   ├── security
│   ├── sleep
│   ├── tcp-echo
│   └── websockets
└── tools           # istioctlのbash-completionが含まれる
    ├── _istioctl
    ├── certs
    └── istioctl.bash

istioctlバージョンの確認

 istioctlを実行してコマンドが機能することを確認します。

# 事前にコマンドのパスを通しておく
$ cd ./istio-1.11.3
$ export PATH=$PWD/bin:$PATH
 
$ istioctl version
no running Istio pods in "istio-system"
1.11.3

 Kubernetesクラスタで前提条件(バージョンなど)が満たされていることを確認します。下記コマンドで確認できます。

$ istioctl x precheck
レ No issues found when checking the cluster. Istio is safe to install or upgrade!
  To get started, check out https://istio.io/latest/docs/setup/getting-started/

インストールオプションの確認

 問題がなければ、istioctlで使用するインストールオプションを確認します。今回は、Istioで事前に準備されているチュートリアル実行用のConfiguration Profileを利用します。

 Configuration Profileは、istioctlから呼び出して使用できるインストールオプションです。「manifests/profiles」配下に設定ファイルが格納されており、自身でカスタマイズすることもできます。事前に用意されているファイルは下記コマンドで確認できます。

$ istioctl profile list
Istio configuration profiles:
    default
    demo
    empty
    external
    minimal
    openshift
    preview
    remote

 事前に準備されたConfiguration Profileを用いて導入できる主要なコンポーネントは下表の通りです。

Profile default demo empty minimal
istio-egressgateway - - -
istio-ingressgateway - -
istiod -
grafana - - - -
istio-tracing - - - -
kiali - - - -
prometheus - - - -

 なお、事前に準備されたConfiguration ProfileはIstioのバージョンによって内容が異なる場合があるので、Istio公式サイト(Installation Configuration Profilesページ)で確認することをお勧めします。v1.6までのIstioのConfiguration Profileには、「Prometheus」などのObservabilityに関連したアドオンが含まれていましたが、現在のバージョンでは個別にインストールする必要があります。

 これらのObservabilityに関するアドオンについては、後述します。

Configuration Profileに基づいたインストール

 最初にConfiguration Profileに基づいてインストールする方法を解説します。設定をカスタマイズする方法については、次節で解説します。

 ここでは、チュートリアル実行用のConfiguration Profileである「demo」を使用して、「egressgateway」「ingressgateway」「istiod」をインストールします。

# istioctlを利用したインストールコマンド
$ istioctl install --set profile=demo -y
 
レ Istio core installed
レ Istiod installed
レ Egress gateways installed
レ Ingress gateways installed
レ Installation complete                                                                                             
Thank you for installing Istio 1.11.Please take a few minutes to tell us about your install/upgrade experience!  https://forms.gle/kWULBRjUv7hHci7T6

 「Installation complete」が表示されれば完了です。Istioのリソースがデプロイされているかどうかを確認します。

$ kubectl get namespace
NAME              STATUS   AGE
default           Active   84m
istio-system      Active   9m2s
kube-node-lease   Active   84m
kube-public       Active   84m
kube-system       Active   84m
 
$ kubectl get all -n istio-system
NAME                                        READY   STATUS    RESTARTS   AGE
pod/istio-egressgateway-7d4f75956-fbcdd     1/1     Running   0          9m44s
pod/istio-ingressgateway-5d57955454-bsghf   1/1     Running   0          9m44s
pod/istiod-6f6c6bbbbd-rjw7b                 1/1     Running   0          10m
 
NAME                           TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)                                                                      AGE
service/istio-egressgateway    ClusterIP      10.0.28.8      <none>           80/TCP,443/TCP                                                               9m44s
service/istio-ingressgateway   LoadBalancer   10.0.176.115   20.191.174.190   15021:31626/TCP,80:31349/TCP,443:31180/TCP,31400:31562/TCP,15443:31901/TCP   9m44s
service/istiod                 ClusterIP      10.0.52.158    <none>           15010/TCP,15012/TCP,443/TCP,15014/TCP                                        10m
 
NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/istio-egressgateway    1/1     1            1           9m44s
deployment.apps/istio-ingressgateway   1/1     1            1           9m44s
deployment.apps/istiod                 1/1     1            1           10m
NAME                                              DESIRED   CURRENT   READY   AGE
replicaset.apps/istio-egressgateway-7d4f75956     1         1         1       9m44s
replicaset.apps/istio-ingressgateway-5d57955454   1         1         1       9m44s
replicaset.apps/istiod-6f6c6bbbbd                 1         1         1       10m

 上記からegressGateway、ingressgateway、istiodがデプロイされていることが確認できます。

 続いて、インストールしたIstioの正常性を確認します。「istioctl verify-install」コマンドを使うことで、インストール時に指定した設定ファイルと比較できます。

$ istioctl verify-install
1 Istio control planes detected, checking --revision "default" only
<中略>
レ Istio is installed and verified successfully

 「Istio is installed and verified successfully」が確認できれば、インストールは完了です。

構成をカスタマイズしてインストールする

 先ほどの手順では、事前に用意されたdemo用のConfiguration Profileをそのままインストールしました。しかし環境によっては、用意された値ではなく、構成のカスタマイズが必要なケースも出てきます。例えば、Ingressgatewayコンポーネントでは、「Service」の「LoadBalancer」を利用しますが、パブリッククラウドで提供されるマネージドKubernetes環境ではなく、自前でKubernetesを構築した場合、Service:LoadBalancerは環境によっては利用できないので、NodePortを利用する必要があります。

 今回は、構成をカスタマイズする一例として、IngressgatewayをNodePortで起動する方法を紹介します。

 なお、この手順は必須ではないので、まずはdemo用のConfiguration Profileのまま試したい方は、サンプルアプリケーションのデプロイから手順を進めてください。

インストールコマンドで構成をカスタマイズしてインストール

 簡単なカスタマイズ方法として、istioctlコマンドに「--set」オプションを与えることで設定を追加できます。

# --set引数を使用して、ワンライナーでNodePortに変更
$ istioctl install --set profile=demo --set values.gateways.istio-ingressgateway.type=NodePort -y 

 この方法は、少しの変更には適していますが、設定の変更履歴を管理したり、設定を変更した部分の差分を確認したりすることには適していません。

 公式ドキュメントではマニフェストファイルを事前に作成する方法を推奨しているので、それらの方法を確認します。

マニフェストで構成をカスタマイズしてインストール

 商用環境で構成を管理する場合には、「IstioOperatorAPI」を使用したマニフェストファイルの適用をお勧めします。

 Istio Operatorは、Istioの構成管理を行うKubernetesのカスタムリソースです。「base」「pilot」「ingressGateways」「egressGateways」「cni」「istiodRemote」というIstioのコンポーネントの構成を管理します。istioctlコマンドでは、コマンドラインオプションやマニフェストファイルを渡すことでIstioOperatorの全APIを使用できるので、マニフェスト形式でIstioコンポーネントに対して有効化の設定やKubernetes設定(レプリカ数など)をカスタマイズすることが可能です。

 変更可能なKubernetesリソースに関しては、Istio公式サイト(Customize Kubernetes settingsページ)をご覧ください。

・設定ファイルの編集

 「manifests/profiles」配下のファイルとIstio公式サイト(IstioOperator Optionsページ)を参考にYAMLを編集します。「ingressgateway」は、デフォルトでは、「type: LoadBalancer」として起動するので、明示的に設定を変更する必要があります。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  components:
    ingressGateways:
      - name: istio-ingressgateway
        enabled: true                   # istio-ingressgatewayを有効にする
        k8s:                            # k8s配下でKubernetesリソースに関する設定を変更する
          service:
            type: NodePort              # ServiceリソースをNodePortに変更する
            ports:
            - name: status-port
              port: 15021
              targetPort: 15021
            - name: http2
              port: 80
              targetPort: 8080
            - name: https
              port: 443
              targetPort: 8443
            - name: tcp
              port: 31400
              targetPort: 31400
            - name: tls
              port: 15443
              targetPort: 15443
ingressgateway_NodePort.yaml

 先ほどのインストール手順でも使用したdemo用のConfiguration Profileをベースに作成したマニフェストファイルで上書きする形で構成を反映できます。

・設定の差分確認

 下記のようなケースで、Istioの設定の差分を確認したいことがあります。

  • Istioのバージョンアップ
    バージョンアップ前後でKubernetesのマ二フェスト形式で設定を出力、比較してリソースの影響範囲を特定する手段として利用(≠機能差分の確認)
  • 構成変更時の差分確認
    構成変更前後でKubernetesのマ二フェスト形式で設定を出力、比較して想定外の設定差分が発生しないことを確認する手段として利用

 「istioctl manifest generate」を利用すると、Istioのデプロイ内容が、kubectlコマンドでデプロイ可能なKubernetesのマニフェスト形式として出力されます。通常のKubernetesのマニフェストになるので、IstioOperatorのYAMLと比べて「何がデプロイされるのか」「何が変更されるのか」を確認するのも容易になります。

 差分を確認します。コマンド自体はistioctl installに似た形式で、参照するProfileを指定すると、そのProfileでデプロイされるリソースがマニフェスト形式で出力されます。

# samdemo-LB.yamlにKubernetesのマニフェスト形式で出力する(設定変更前)
$ istioctl manifest generate --set profile=demo > ./demo-LB.yaml

 こちらのマニフェストを「kubectl apply」コマンドで適用することも可能ですが、Istioのリリースではテストされていないので、注意が必要です。詳細については、Istio公式サイト(Generate a manifest before installationページ)を参照してください。

 先ほど作成した「ingressgateway_NodePort.yaml」をdemo用のConfiguration Profileに上書きする形でKubernetesのマ二フェストを生成し、先ほど出力した設定変更前のマニフェストと比較しましょう。

# demo_nodePort.yamlにKubernetesのマニフェスト形式で出力する(設定変更後)
$ istioctl manifest generate --set profile=demo -f ./ingressgateway_NodePort.yaml > ./demo_nodePort.yaml
 
# 設定内容の比較
$ istioctl manifest diff ./demo-LB.yaml ./demo_nodePort.yaml
 
Differences in manifests are:
Object Service:istio-system:istio-ingressgateway has diffs:
 
spec:
  type: LoadBalancer -> NodePort # NodePortに変更されたことを確認

 このようにKubernetesのマ二フェスト形式で設定ファイルを作成しておくことで、設定変更の際の差分を取得できるので便利です。

・マニフェストファイルを使用したインストール

 変更前後の差分を含めた設定の確認ができたので、インストールします。先ほどのマニフェスト作成時と同様、demo用のConfiguration Profileに上書きする形でインストールすることが可能です。

$ istioctl install --set profile=demo -f ./ingressgateway_NodePort.yaml -y

 Ingress-gatewayがNodePortで起動していることを確認できます。

$ kubectl get service -n istio-system
NNAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                      AGE
istio-egressgateway    ClusterIP   10.103.226.217   <none>        80/TCP,443/TCP                                               14m
istio-ingressgateway   NodePort    10.99.169.3      <none>        15021:30546/TCP,80:30793/TCP,443:32307/TCP,15443:30778/TCP   14m
istiod                 ClusterIP   10.99.185.134    <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP                        14m

 「service/istio-ingressgateway」が「type: NodePort」で起動していることが確認できました。必要な構成に限定してカスタマイズ可能であり、設定をyamlファイルで保持できるので、最も適用しやすい方法といえるでしょう。

 Istioは稼働するコンポーネントも多く運用が難しい点もありますが、このようにさまざまな方法でカスタマイズしてインストールすることも可能なので、ぜひ試してみてください。

サンプルアプリケーションのデプロイ

 サンプルアプリケーションをデプロイします。今回は、samples配下に用意されているBookinfoアプリケーションを使用します。

サンプルアプリケーション(Bookinfo)

 Istioに導入する前の構成を確認します。

Bookinfoアプリケーション

 Bookinfoアプリケーションは、4つのマイクロサービスから構成されています。「productpage」サービスが一番外側でリクエストを受け付け、2つのサービス「reviews」「details」と連携し、reviewsは「ratings」サービスとも連携するという構成です。reviewsサービスは異なる3つのバージョンが存在します。

 Bookinfoアプリケーションは、trace-idをheaderに伝搬する処理も実装されているので、Istioを使用した監視、トレーシングを検証したい方にお薦めのアプリケーションです。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。