この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Kubernetesやクラウドネイティブをより便利に利用する技術やツールの概要、使い方を凝縮して紹介する本連載「Cloud Nativeチートシート」。今回は、前回の「サービスメッシュ」や「Istio」の概要の紹介に続き、Istioの環境構築と実践ポイントを説明します。
Istioのインストールについては、Istio公式サイト(Getting Startedページ)でも書かれているので、興味がある方はご覧ください。
今回は、下記の環境でインストールしました。
対象 | 説明 | 動作確認で利用した環境 |
---|---|---|
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を用いる方法を説明します。
最初に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リリースパッケージは次のディレクトリで構成されています。
階層構造は下記のようになっています。
$ 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を実行してコマンドが機能することを確認します。
# 事前にコマンドのパスを通しておく $ 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である「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
先ほどのインストール手順でも使用したdemo用のConfiguration Profileをベースに作成したマニフェストファイルで上書きする形で構成を反映できます。
・設定の差分確認
下記のようなケースで、Istioの設定の差分を確認したいことがあります。
「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アプリケーションを使用します。
Istioに導入する前の構成を確認します。
Bookinfoアプリケーションは、4つのマイクロサービスから構成されています。「productpage」サービスが一番外側でリクエストを受け付け、2つのサービス「reviews」「details」と連携し、reviewsは「ratings」サービスとも連携するという構成です。reviewsサービスは異なる3つのバージョンが存在します。
Bookinfoアプリケーションは、trace-idをheaderに伝搬する処理も実装されているので、Istioを使用した監視、トレーシングを検証したい方にお薦めのアプリケーションです。
Copyright © ITmedia, Inc. All Rights Reserved.