KubernetesでIstioをインストールして使用する方法
序章
サービスメッシュは、アプリケーションのマイクロサービス間の通信を管理できるようにするインフラストラクチャレイヤーです。 より多くの開発者がマイクロサービスを使用するにつれて、サービスメッシュが進化し、一般的な管理タスクと管理タスクを分散セットアップに統合することで、マイクロサービスの作業がより簡単かつ効果的になりました。
Istio のようなサービスメッシュを使用すると、サービスディスカバリ、ルーティングとトラフィックの構成、暗号化と認証/承認、監視とテレメトリなどのタスクを簡素化できます。 特にIstioは、既存のサービスコードに大きな変更を加えることなく機能するように設計されています。 たとえば、 Kubernetes を使用する場合、既存のアプリケーションリソースで動作するIstio固有のオブジェクトを構築することで、クラスターで実行されているアプリケーションにサービスメッシュ機能を追加できます。
このチュートリアルでは、Kubernetes用のHelmパッケージマネージャーを使用してIstioをインストールします。 次に、Istioを使用して、GatewayおよびVirtualService リソースを作成することにより、デモNode.jsアプリケーションを外部トラフィックに公開します。 最後に、 Grafana テレメトリアドオンにアクセスして、アプリケーションのトラフィックデータを視覚化します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- ロールベースのアクセス制御(RBAC)が有効になっているKubernetes1.10+クラスター。 このセットアップでは、3つのノードを持つ DigitalOcean Kubernetesクラスターを使用しますが、別の方法を使用してクラスターを自由に作成できます。
注:このセットアップには、少なくとも8GBの使用可能なメモリと4vCPUを備えたクラスターを強くお勧めします。 このチュートリアルでは、DigitalOceanの標準の4GB/2vCPUドロップレットのうち3つをノードとして使用します。 <$>
- The
kubectl
開発サーバーにインストールされ、クラスターに接続するように構成されたコマンドラインツール。 インストールについてもっと読むことができますkubectl
公式ドキュメントにあります。 - Helm Package Managerを使用してKubernetesクラスターにソフトウェアをインストールする方法の手順1と2に概説されている手順に従って、開発サーバーにHelmをインストールし、クラスターにTillerをインストールします。
- Dockerが開発サーバーにインストールされています。 Ubuntu 18.04を使用している場合は、 Ubuntu18.04にDockerをインストールして使用する方法の手順1と2に従ってください。 それ以外の場合は、他のオペレーティングシステムへのインストールについて、公式ドキュメントに従ってください。 必ず非rootユーザーをに追加してください
docker
リンクされたチュートリアルのステップ2で説明されているように、グループ。 - DockerHubアカウント。 これを設定する方法の概要については、DockerHubのこの紹介を参照してください。
ステップ1—アプリケーションのパッケージ化
Kubernetesでデモアプリケーションを使用するには、コードのクローンを作成してパッケージ化し、kubeletエージェントがイメージをプルできるようにする必要があります。
最初のステップは、 DigitalOceanCommunityGitHubアカウントからnodejs-image-demoリポジトリのクローンを作成することです。 このリポジトリには、 Docker を使用してNode.jsアプリケーションを構築する方法で説明されているセットアップのコードが含まれています。このコードでは、Node.jsアプリケーションのイメージを構築する方法と、このイメージを使用してコンテナーを作成する方法について説明しています。 アプリケーション自体の詳細については、Node.jsを使用したコンテナーからKubernetesへのシリーズを参照してください。
開始するには、nodejs-image-demoリポジトリを次のディレクトリに複製します。 istio_project
:
- git clone https://github.com/do-community/nodejs-image-demo.git istio_project
に移動します istio_project
ディレクトリ:
- cd istio_project
このディレクトリには、ユーザーにサメに関する基本情報を提供するサメ情報アプリケーションのファイルとフォルダが含まれています。 アプリケーションファイルに加えて、ディレクトリには、アプリケーションコードを使用してDockerイメージを構築するための手順が記載されたDockerfileが含まれています。 Dockerfileの手順の詳細については、Dockerを使用してNode.jsアプリケーションを構築する方法のステップ3を参照してください。
アプリケーションコードとDockerfileが期待どおりに機能することをテストするには、 docker build コマンドを使用してイメージをビルドしてタグ付けし、イメージを使用してデモコンテナを実行します。 を使用して -t
フラグ docker build
イメージにDockerHubユーザー名のタグを付けて、テスト後にDockerHubにプッシュできるようにします。
次のコマンドを使用してイメージをビルドします。
- docker build -t your_dockerhub_username/node-demo .
The .
コマンドで、ビルドコンテキストが現在のディレクトリであることを指定します。 画像に名前を付けました node-demo
、しかし、あなたはそれを他の名前にするのは自由です。
ビルドプロセスが完了すると、 dockerimagesを使用してイメージを一覧表示できます。
- docker images
イメージビルドを確認する次の出力が表示されます。
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
your_dockerhub_username/node-demo latest 37f1c2939dbf 5 seconds ago 77.6MB
node 10-alpine 9dfa73010b19 2 days ago 75.3MB
次に、 docker run
このイメージに基づいてコンテナを作成します。 このコマンドには、次の3つのフラグが含まれます。
-p
:これにより、コンテナーのポートが公開され、ホストのポートにマップされます。 ポートを使用します80
ホスト上にありますが、そのポートで別のプロセスを実行している場合は、必要に応じてこれを自由に変更する必要があります。 これがどのように機能するかについての詳細は、ポートバインディングに関するDockerドキュメントのこの説明を参照してください。-d
:これは、コンテナをバックグラウンドで実行します。--name
:これにより、コンテナにカスタマイズされた名前を付けることができます。
次のコマンドを実行して、コンテナーを作成します。
- docker run --name node-demo -p 80:8080 -d your_dockerhub_username/node-demo
dockerpsを使用して実行中のコンテナーを検査します。
- docker ps
アプリケーションコンテナが実行されていることを確認する出力が表示されます。
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
49a67bafc325 your_dockerhub_username/node-demo "docker-entrypoint.s…" 8 seconds ago Up 6 seconds 0.0.0.0:80->8080/tcp node-demo
これで、サーバーIPにアクセスしてセットアップをテストできます。 http://your_server_ip
. アプリケーションは次のランディングページを表示します。
アプリケーションをテストしたので、実行中のコンテナーを停止できます。 使用する docker ps
もう一度 CONTAINER ID
:
- docker ps
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
49a67bafc325 your_dockerhub_username/node-demo "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:80->8080/tcp node-demo
dockerstopでコンテナを停止します。 必ず交換してください CONTAINER ID
独自のアプリケーションとともにここにリストされています CONTAINER ID
:
- docker stop 49a67bafc325
イメージをテストしたので、DockerHubにプッシュできます。 まず、前提条件で作成したDockerHubアカウントにログインします。
- docker login -u your_dockerhub_username
プロンプトが表示されたら、DockerHubアカウントのパスワードを入力します。 この方法でログインすると、 ~/.docker/config.json
ルート以外のユーザーのホームディレクトリに、DockerHubのクレデンシャルを使用してファイルします。
dockerpushコマンドを使用してアプリケーションイメージをDockerHubにプッシュします。 交換することを忘れないでください your_dockerhub_username
独自のDockerHubユーザー名を使用:
- docker push your_dockerhub_username/node-demo
これで、KubernetesとIstioでアプリケーションを実行するためにプルできるアプリケーションイメージができました。 次に、Helmを使用したIstioのインストールに進むことができます。
ステップ2—Helmを使用したIstioのインストール
Istioはさまざまなインストール方法を提供していますが、ドキュメントでは、構成オプションを管理する際の柔軟性を最大化するためにHelmを使用することを推奨しています。 IstioとHelmをインストールし、Grafanaアドオンが有効になっていることを確認して、アプリケーションのトラフィックデータを視覚化できるようにします。
まず、Istioリリースリポジトリを追加します。
- helm repo add istio.io https://storage.googleapis.com/istio-release/releases/1.1.7/charts/
これにより、リポジトリ内のHelmチャートを使用してIstioをインストールできるようになります。
リポジトリがあることを確認してください。
- helm repo list
あなたは見るべきです istio.io
リストされているリポジトリ:
OutputNAME URL
stable https://kubernetes-charts.storage.googleapis.com
local http://127.0.0.1:8879/charts
istio.io https://storage.googleapis.com/istio-release/releases/1.1.7/charts/
次に、Istioのカスタムリソース定義(CRD)をインストールします。 istio-init
helm installコマンドを使用したチャート:
- helm install --name istio-init --namespace istio-system istio.io/istio-init
OutputNAME: istio-init
LAST DEPLOYED: Fri Jun 7 17:13:32 2019
NAMESPACE: istio-system
STATUS: DEPLOYED
...
このコマンドは、53個のCRDを kube-apiserver にコミットし、Istioメッシュで使用できるようにします。 また、呼び出されたIstioオブジェクトの名前空間を作成します istio-system
を使用します --name
ヘルムに名前を付けるオプションリリース istio-init
. Helmのリリースとは、特定の構成オプションが有効になっているチャートの特定の展開を指します。
必要なすべてのCRDがコミットされていることを確認するには、次のコマンドを実行します。
- kubectl get crds | grep 'istio.io\|certmanager.k8s.io' | wc -l
これは数を出力する必要があります 53
.
これで、 istio
チャート。 Grafanaテレメトリアドオンがチャートとともにインストールされていることを確認するために、 --set grafana.enabled=true
構成オプション helm install
指図。 また、目的の構成プロファイルのインストールプロトコル(デフォルトプロファイル)を使用します。 Istioには、Helmを使用してインストールするときに選択できる構成プロファイルがいくつかあり、Istioコントロールプレーンおよびデータプレーンサイドカーをカスタマイズできます。 実稼働環境での展開にはデフォルトのプロファイルをお勧めします。これを使用して、実稼働環境に移行するときに使用する構成オプションを理解します。
次を実行します helm install
チャートをインストールするコマンド:
- helm install --name istio --namespace istio-system --set grafana.enabled=true istio.io/istio
OutputNAME: istio
LAST DEPLOYED: Fri Jun 7 17:18:33 2019
NAMESPACE: istio-system
STATUS: DEPLOYED
...
繰り返しになりますが、Istioオブジェクトをにインストールしています istio-system
名前空間とリリースの命名—この場合、 istio
.
次のコマンドを使用して、デフォルトプロファイルに期待されるサービスオブジェクトが作成されていることを確認できます。
- kubectl get svc -n istio-system
ここで期待されるサービスには、 istio-citadel
, istio-galley
, istio-ingressgateway
, istio-pilot
, istio-policy
, istio-sidecar-injector
, istio-telemetry
、 と prometheus
. また、 grafana
インストール中にこのアドオンを有効にしたため、サービス:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana ClusterIP 10.245.85.162 <none> 3000/TCP 3m26s
istio-citadel ClusterIP 10.245.135.45 <none> 8060/TCP,15014/TCP 3m25s
istio-galley ClusterIP 10.245.46.245 <none> 443/TCP,15014/TCP,9901/TCP 3m26s
istio-ingressgateway LoadBalancer 10.245.171.39 174.138.125.110 15020:30707/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30285/TCP,15030:31668/TCP,15031:32297/TCP,15032:30853/TCP,15443:30406/TCP 3m26s
istio-pilot ClusterIP 10.245.56.97 <none> 15010/TCP,15011/TCP,8080/TCP,15014/TCP 3m26s
istio-policy ClusterIP 10.245.206.189 <none> 9091/TCP,15004/TCP,15014/TCP 3m26s
istio-sidecar-injector ClusterIP 10.245.223.99 <none> 443/TCP 3m25s
istio-telemetry ClusterIP 10.245.5.215 <none> 9091/TCP,15004/TCP,15014/TCP,42422/TCP 3m26s
prometheus ClusterIP 10.245.100.132 <none> 9090/TCP 3m26s
次のコマンドを使用して、対応するIstio Podsを確認することもできます。
- kubectl get pods -n istio-system
これらのサービスに対応するポッドには、 STATUS
の Running
、ポッドがノードにバインドされており、ポッドに関連付けられているコンテナが実行されていることを示します。
OutputNAME READY STATUS RESTARTS AGE
grafana-67c69bb567-t8qrg 1/1 Running 0 4m25s
istio-citadel-fc966574d-v5rg5 1/1 Running 0 4m25s
istio-galley-cf776876f-5wc4x 1/1 Running 0 4m25s
istio-ingressgateway-7f497cc68b-c5w64 1/1 Running 0 4m25s
istio-init-crd-10-bxglc 0/1 Completed 0 9m29s
istio-init-crd-11-dv5lz 0/1 Completed 0 9m29s
istio-pilot-785694f946-m5wp2 2/2 Running 0 4m25s
istio-policy-79cff99c7c-q4z5x 2/2 Running 1 4m25s
istio-sidecar-injector-c8ddbb99c-czvwq 1/1 Running 0 4m24s
istio-telemetry-578b6f967c-zk56d 2/2 Running 1 4m25s
prometheus-d8d46c5b5-k5wmg 1/1 Running 0 4m25s
The READY
フィールドは、ポッド内で実行されているコンテナの数を示します。 詳細については、ポッドライフサイクルに関するドキュメントを参照してください。
<$>[注] ノート: に予期しないフェーズが見られる場合 STATUS
列では、次のコマンドを使用してポッドのトラブルシューティングを行うことができることを忘れないでください。
- kubectl describe pods your_pod -n pod_namespace
- kubectl logs your_pod -n pod_namespace
Istioインストールの最後のステップは、 Envoy プロキシの作成を有効にすることです。これは、メッシュで実行されているサービスにサイドカーとしてデプロイされます。
サイドカーは通常、既存のコンテナ環境に機能のレイヤーを追加するために使用されます。 Istioのメッシュアーキテクチャは、メッシュのデータプレーンを構成するエンボイサイドカーとコントロールプレーンのコンポーネント間の通信に依存しています。 メッシュが機能するためには、メッシュ内の各ポッドがエンボイサイドカーも実行するようにする必要があります。
この目標を達成するには、手動サイドカーインジェクションと自動サイドカーインジェクションの2つの方法があります。 labeling によって、自動サイドカーインジェクションを有効にします。名前空間には、ラベルを使用してアプリケーションオブジェクトを作成します。 istio-injection=enabled
. これにより、MutatingAdmissionWebhookコントローラーが kube-apiserver
特定のアクションを実行します—この場合、すべてのアプリケーションポッドがサイドカーで始まることを確認します。
を使用します default
アプリケーションオブジェクトを作成するための名前空間なので、 istio-injection=enabled
次のコマンドを使用して、その名前空間にラベルを付けます。
- kubectl label namespace default istio-injection=enabled
次のコマンドを実行することで、コマンドが意図したとおりに機能したことを確認できます。
- kubectl get namespace -L istio-injection
次の出力が表示されます。
OutputAME STATUS AGE ISTIO-INJECTION
default Active 47m enabled
istio-system Active 16m
kube-node-lease Active 47m
kube-public Active 47m
kube-system Active 47m
Istioをインストールして構成したら、アプリケーションサービスとDeploymentオブジェクトの作成に進むことができます。
ステップ3—アプリケーションオブジェクトの作成
Istioメッシュを配置し、サイドカーポッドを挿入するように構成すると、サービスオブジェクトとデプロイメントオブジェクトの仕様を使用してアプリケーションマニフェストを作成できます。 Kubernetesマニフェストの仕様は、各オブジェクトの望ましい状態を記述します。
アプリケーションサービスは、個々のポッドが作成および破棄されるときに、コンテナーを実行しているポッドに動的な環境でアクセスできるようにします。一方、デプロイメントでは、ポッドの望ましい状態を記述します。
というファイルを開きます node-app.yaml
と nano
またはお気に入りの編集者:
- nano node-app.yaml
まず、次のコードを追加して、 nodejs
アプリケーションサービス:
apiVersion: v1
kind: Service
metadata:
name: nodejs
labels:
app: nodejs
spec:
selector:
app: nodejs
ports:
- name: http
port: 8080
このサービス定義には、 selector
ポッドを対応するものと一致させます app: nodejs
ラベル。 また、サービスがポートをターゲットにすることも指定しました 8080
ラベルが一致するポッド。
また、Istioのポッドとサービスの要件に準拠して、サービスポートに名前を付けています。 The http
valueは、Istioが受け入れる値の1つです。 name
分野。
次に、サービスの下に、アプリケーションのデプロイメントに関する次の仕様を追加します。 必ず交換してください image
下にリストされています containers
ステップ1で作成してDockerHubにプッシュしたイメージを使用した仕様:
...
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodejs
labels:
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: nodejs
template:
metadata:
labels:
app: nodejs
version: v1
spec:
containers:
- name: nodejs
image: your_dockerhub_username/node-demo
ports:
- containerPort: 8080
この展開の仕様には、次の数が含まれます。 replicas
(この場合、1)、および selector
これは、Deploymentが管理するポッドを定義します。 この場合、ポッドを管理します app: nodejs
ラベル。
The template
フィールドには、次のことを行う値が含まれています。
- 適用します
app: nodejs
デプロイメントによって管理されるポッドにラベルを付けます。 Istio推奨追加app
Istioのメトリクスとテレメトリのコンテキスト情報を提供するために、展開仕様にラベルを付けます。 - 適用する
version
このデプロイメントに対応するアプリケーションのバージョンを指定するためのラベル。 と同じようにapp
ラベル、Istioは含めることをお勧めしますversion
コンテキスト情報を提供するためのラベル。 - コンテナを含む、ポッドが実行されるコンテナの仕様を定義します
name
そしてそのimage
. Theimage
これは、ステップ1 で作成し、DockerHubにプッシュしたイメージです。 コンテナの仕様には、containerPort
各コンテナがリッスンするポートを指すように構成します。 ここでポートがリストにないままの場合、ポートはIstioプロキシをバイパスします。 このポートに注意してください。8080
、サービス定義で指定されたターゲットポートに対応します。
編集が終了したら、ファイルを保存して閉じます。
このファイルを配置したら、ゲートウェイオブジェクトと仮想サービスオブジェクトの定義を含むファイルの編集に進むことができます。これらのオブジェクトは、トラフィックがメッシュに入る方法と、メッシュがメッシュに入る方法を制御します。
ステップ4—Istioオブジェクトを作成する
クラスタへのアクセスとサービスへのルーティングを制御するために、KubernetesはIngress ResourcesとControllersを使用します。 入力リソースはクラスターサービスへのHTTPおよびHTTPSルーティングのルールを定義し、コントローラーは着信トラフィックの負荷を分散して正しいサービスにルーティングします。
Ingressリソースとコントローラーの使用の詳細については、 DigitalOceanKubernetesでCert-Managerを使用してNginxIngressを設定する方法を参照してください。
Istioは、いくつかの重要な違いはありますが、異なるオブジェクトのセットを使用して同様の目的を達成します。 Istioメッシュは、コントローラーを使用してトラフィックの負荷を分散する代わりに、 Gateway を使用します。これは、着信および発信HTTP/TCP接続を処理するロードバランサーとして機能します。 次に、ゲートウェイは、メッシュに入るトラフィックに監視およびルーティングルールを適用できるようにします。 具体的には、トラフィックルーティングを決定する構成は、仮想サービスとして定義されます。 各仮想サービスには、特定のプロトコルおよび宛先との基準に一致するルーティングルールが含まれています。
Kubernetes Ingress Resources/ControllersとIstioGateways/ Virtual Servicesにはいくつかの機能的な類似点がありますが、メッシュの構造によって重要な違いが生じます。 たとえば、Kubernetes Ingress Resources and Controllersは、オペレーターにいくつかのルーティングオプションを提供しますが、ゲートウェイと仮想サービスは、トラフィックがメッシュに入ることができるため、より堅牢な機能セットを利用できるようにします。 つまり、Kubernetes Ingress Controllers and Resourcesがクラスターオペレーターに提供する制限付きのアプリケーションレイヤー機能には、高度なルーティング、トレース、テレメトリなど、Istioサービスメッシュのサイドカーが提供する機能は含まれていません。 。
メッシュへの外部トラフィックを許可し、ノードアプリへのルーティングを構成するには、Istioゲートウェイと仮想サービスを作成する必要があります。 というファイルを開きます node-istio.yaml
マニフェストの場合:
- nano node-istio.yaml
まず、Gatewayオブジェクトの定義を追加します。
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: nodejs-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
指定に加えて name
のゲートウェイ用 metadata
フィールドには、次の仕様が含まれています。
- A
selector
これは、このリソースを、Istioのインストール時に選択した構成プロファイルで有効にされたデフォルトのIstioIngressGatewayコントローラーと一致させます。 - A
servers
を指定する仕様port
イングレスとhosts
ゲートウェイによって公開されます。 この場合、すべてを指定していますhosts
アスタリスク付き(*
)特定の保護されたドメインを使用していないため。
ゲートウェイ定義の下に、仮想サービスの仕様を追加します。
...
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: nodejs
spec:
hosts:
- "*"
gateways:
- nodejs-gateway
http:
- route:
- destination:
host: nodejs
提供することに加えて name
この仮想サービスには、次のようなこのリソースの仕様も含まれています。
- A
hosts
宛先ホストを指定するフィールド。 この場合も、ワイルドカード値を使用しています(*
)ドメインを使用していないため、ブラウザでアプリケーションにすばやくアクセスできるようにします。 - A
gateways
外部要求が許可されるゲートウェイを指定するフィールド。 この場合、それは私たちですnodejs-gateway
ゲートウェイ。 - The
http
HTTPトラフィックのルーティング方法を指定するフィールド。 - A
destination
リクエストがルーティングされる場所を示すフィールド。 この場合、にルーティングされますnodejs
サービス。Kubernetes環境でサービスの完全修飾ドメイン名(FQDN)に暗黙的に拡張されます。nodejs.default.svc.cluster.local
. ただし、FQDNはサービスではなく、ルールが定義されている名前空間に基づいていることに注意してください。したがって、アプリケーションのサービスと仮想サービスが異なる名前空間で。 Kubernetesドメインネームシステム(DNS)の概要については、KubernetesDNSサービスの概要を参照してください。
編集が終了したら、ファイルを保存して閉じます。
あなたと yaml
ファイルを配置すると、アプリケーションのサービスとデプロイメント、およびアプリケーションへのアクセスを可能にするゲートウェイオブジェクトと仮想サービスオブジェクトを作成できます。
ステップ5—アプリケーションリソースの作成とテレメトリアクセスの有効化
アプリケーションのサービスオブジェクトとデプロイメントオブジェクトをゲートウェイと仮想サービスとともに作成すると、アプリケーションへのリクエストを生成し、IstioGrafanaダッシュボードで関連データを確認できるようになります。 ただし、最初に、ブラウザーでダッシュボードにアクセスできるように、Grafanaアドオンを公開するようにIstioを構成する必要があります。
HTTP でGrafanaアクセスを有効にしますが、本番環境または機密性の高い環境で作業している場合は、HTTPSでアクセスを有効にすることを強くお勧めします。
設定したので --set grafana.enabled=true
ステップ2でIstioをインストールする際の構成オプションでは、Grafanaサービスとポッドがあります istio-system
そのステップで確認した名前空間。
これらのリソースがすでに用意されているので、次のステップは、ゲートウェイと仮想サービスのマニフェストを作成して、Grafanaアドオンを公開できるようにすることです。
マニフェストのファイルを開きます。
- nano node-grafana.yaml
次のコードをファイルに追加して、トラフィックを公開してGrafanaサービスにルーティングするゲートウェイと仮想サービスを作成します。
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: grafana-gateway
namespace: istio-system
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 15031
name: http-grafana
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: grafana-vs
namespace: istio-system
spec:
hosts:
- "*"
gateways:
- grafana-gateway
http:
- match:
- port: 15031
route:
- destination:
host: grafana
port:
number: 3000
Grafanaゲートウェイと仮想サービスの仕様は、ステップ4でアプリケーションゲートウェイと仮想サービスに対して定義したものと同様です。 ただし、いくつかの違いがあります。
- Grafanaはに公開されます
http-grafana
名前付きポート(ポート15031
)、ポートで実行されます3000
ホスト上。 - ゲートウェイと仮想サービスは両方ともで定義されています
istio-system
名前空間。 - The
host
この仮想サービスではgrafana
でのサービスistio-system
名前空間。 Grafanaサービスが実行されているのと同じ名前空間でこのルールを定義しているため、FQDN拡張は競合することなく再び機能します。
注:現在の MeshPolicy は許容モードでTLSを実行するように構成されているため、宛先ルールを適用する必要はありません。マニフェスト。 Istioインストールで別のプロファイルを選択した場合は、HTTPを使用したGrafanaへのアクセスを有効にするときに、相互TLSを無効にする宛先ルールを追加する必要があります。 これを行う方法の詳細については、HTTPを使用したテレメトリアドオンへのアクセスの有効化に関する公式Istioドキュメントを参照してください。
編集が終了したら、ファイルを保存して閉じます。
次のコマンドを使用して、Grafanaリソースを作成します。
- kubectl apply -f node-grafana.yaml
kubectl apply コマンドを使用すると、オブジェクトを作成または更新する過程で、特定の構成をオブジェクトに適用できます。 この例では、で指定した構成を適用しています。 node-grafana.yaml
それらを作成する過程で、ゲートウェイおよび仮想サービスオブジェクトにファイルします。
あなたはでゲートウェイを見ることができます istio-system
次のコマンドを使用した名前空間:
- kubectl get gateway -n istio-system
次の出力が表示されます。
OutputNAME AGE
grafana-gateway 47s
仮想サービスについても同じことができます。
- kubectl get virtualservice -n istio-system
OutputNAME GATEWAYS HOSTS AGE
grafana-vs [grafana-gateway] [*] 74s
これらのリソースが作成されると、ブラウザーでGrafanaダッシュボードにアクセスできるようになります。 ただし、その前に、アプリケーションゲートウェイと仮想サービスとともに、アプリケーションサービスとデプロイメントを作成し、ブラウザーでアプリケーションにアクセスできることを確認しましょう。
次のコマンドを使用して、アプリケーションServiceandDeploymentを作成します。
- kubectl apply -f node-app.yaml
数秒待ってから、次のコマンドを使用してアプリケーションポッドを確認します。
- kubectl get pods
OutputNAME READY STATUS RESTARTS AGE
nodejs-7759fb549f-kmb7x 2/2 Running 0 40s
でわかるように、アプリケーションコンテナは実行されています STATUS
列ですが、なぜ READY
列リスト 2/2
ステップ3のアプリケーションマニフェストで指定されたレプリカが1つだけの場合はどうなりますか?
この2番目のコンテナはEnvoyサイドカーであり、次のコマンドで検査できます。 ここにリストされているポッドを必ず NAME
あなた自身の nodejs
ポッド:
- kubectl describe pod nodejs-7759fb549f-kmb7x
OutputName: nodejs-7759fb549f-kmb7x
Namespace: default
...
Containers:
nodejs:
...
istio-proxy:
Container ID: docker://f840d5a576536164d80911c46f6de41d5bc5af5152890c3aed429a1ee29af10b
Image: docker.io/istio/proxyv2:1.1.7
Image ID: docker-pullable://istio/proxyv2@sha256:e6f039115c7d5ef9c8f6b049866fbf9b6f5e2255d3a733bb8756b36927749822
Port: 15090/TCP
Host Port: 0/TCP
Args:
...
次に、アプリケーションゲートウェイと仮想サービスを作成します。
- kubectl apply -f node-istio.yaml
次のコマンドを使用して、ゲートウェイを検査できます。
- kubectl get gateway
OutputNAME AGE
nodejs-gateway 7s
そして仮想サービス:
- kubectl get virtualservice
OutputNAME GATEWAYS HOSTS AGE
nodejs [nodejs-gateway] [*] 28s
これで、アプリケーションへのアクセスをテストする準備が整いました。 これを行うには、に関連付けられた外部IPが必要になります istio-ingressgateway
LoadBalancerサービスタイプであるサービス。
の外部IPを取得します istio-ingressgateway
次のコマンドでサービスします。
- kubectl get svc -n istio-system
次のような出力が表示されます。
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana ClusterIP 10.245.85.162 <none> 3000/TCP 42m
istio-citadel ClusterIP 10.245.135.45 <none> 8060/TCP,15014/TCP 42m
istio-galley ClusterIP 10.245.46.245 <none> 443/TCP,15014/TCP,9901/TCP 42m
istio-ingressgateway LoadBalancer 10.245.171.39 ingressgateway_ip 15020:30707/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30285/TCP,15030:31668/TCP,15031:32297/TCP,15032:30853/TCP,15443:30406/TCP 42m
istio-pilot ClusterIP 10.245.56.97 <none> 15010/TCP,15011/TCP,8080/TCP,15014/TCP 42m
istio-policy ClusterIP 10.245.206.189 <none> 9091/TCP,15004/TCP,15014/TCP 42m
istio-sidecar-injector ClusterIP 10.245.223.99 <none> 443/TCP 42m
istio-telemetry ClusterIP 10.245.5.215 <none> 9091/TCP,15004/TCP,15014/TCP,42422/TCP 42m
prometheus ClusterIP 10.245.100.132 <none> 9090/TCP 42m
The istio-ingressgateway
を備えた唯一のサービスである必要があります TYPE
LoadBalancer
、および外部IPを持つ唯一のサービス。
ブラウザでこの外部IPに移動します。 http://ingressgateway_ip
.
次のランディングページが表示されます。
次に、[更新]を5〜6回クリックして、サイトに負荷をかけます。
これで、Grafanaダッシュボードをチェックしてトラフィックデータを確認できます。
ブラウザで、次のアドレスに移動します。 istio-ingressgateway
GrafanaGatewayマニフェストで定義した外部IPとポート: http://ingressgateway_ip:15031
.
次のランディングページが表示されます。
ページ上部のホームをクリックすると、istioフォルダーのあるページが表示されます。 ドロップダウンオプションのリストを取得するには、istioフォルダーアイコンをクリックします。
このオプションのリストから、Istioサービスダッシュボードをクリックします。
これにより、別のドロップダウンメニューが表示されたランディングページが表示されます。
選択する nodejs.default.svc.cluster.local
利用可能なオプションのリストから。
これで、そのサービスのトラフィックデータを確認できるようになります。
これで、機能しているNode.jsアプリケーションがIstioサービスメッシュで実行され、Grafanaが有効になり、外部アクセス用に構成されました。
結論
このチュートリアルでは、Helmパッケージマネージャーを使用してIstioをインストールし、それを使用して、ゲートウェイオブジェクトと仮想サービスオブジェクトを使用してNode.jsアプリケーションサービスを公開しました。 また、アプリケーションのトラフィックデータを確認するために、Grafanaテレメトリアドオンを公開するようにゲートウェイオブジェクトと仮想サービスオブジェクトを構成しました。
本番環境に移行するときは、アプリケーションゲートウェイをHTTPS で保護し、Grafanaサービスへのアクセスも安全であることを確認するなどの手順を実行する必要があります。
メトリックの収集と処理、ログ、トレーススパンなど、他のテレメトリ関連タスクを調べることもできます。