前書き

サービスメッシュは、アプリケーションのマイクロサービス間の通信を管理できるインフラストラクチャレイヤーです。 より多くの開発者がマイクロサービスを使用するにつれて、サービスメッシュが進化し、分散セットアップで一般的な管理タスクと管理タスクを統合することにより、その作業がより簡単かつ効果的になりました。

Istioなどのサービスメッシュを使用すると、サービスの検出、ルーティングとトラフィックの構成、暗号化と認証/承認、監視とテレメトリなどのタスクを簡素化できます。 特に、Istioは、既存のサービスコードを大幅に変更することなく動作するように設計されています。 たとえば、https://kubernetes.io/ [Kubernetes]を使用する場合、既存のアプリケーションリソースと連携するIstio固有のオブジェクトを構築することにより、クラスターで実行されているアプリケーションにサービスメッシュ機能を追加できます。

このチュートリアルでは、Kubernetesのhttps://helm.sh/[Helm]パッケージマネージャーを使用してIstioをインストールします。 次に、Istioを使用して、https://istio.io/docs/reference/config/networking/v1alpha3/gateway/ [Gatewayを作成することにより、デモhttps://nodejs.org/[Node.js]アプリケーションを外部トラフィックに公開します。 ]およびhttps://istio.io/docs/reference/config/networking/v1alpha3/virtual-service/[Virtual Service]リソース。 最後に、https://grafana.com/ [Grafana]テレメトリーアドオンにアクセスして、アプリケーションのトラフィックデータを視覚化します。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • 役割ベースのアクセス制御(RBAC)が有効になっているKubernetes 1.10+クラスター。 このセットアップでは、3つのノードを持つhttps://www.digitalocean.com/products/kubernetes/[DigitalOcean Kubernetesクラスター]を使用しますが、https://www.digitalocean.com/community/tutorials/how-toは自由です。 -create-a-kubernetes-1-11-cluster-using-kubeadm-on-ubuntu-18-04 [別の方法を使用してクラスターを作成]。

  • 開発サーバーにインストールされ、クラスターに接続するように設定されたコマンドラインツール「+ kubectl 」。 ` kubectl +`のインストールの詳細については、https://kubernetes.io/docs/tasks/tools/install-kubectl/ [公式ドキュメント]をご覧ください。

  • https://www.digitalocean.com/community/tutorials/how-to-install-software-on-kubernetes-clustersのステップ1および2に概説されている指示に従って、開発サーバーにインストールされたHelmとクラスターにインストールされたTiller -with-the-helm-package-manager [Helm Package Managerを使用してKubernetesクラスターにソフトウェアをインストールする方法]。

  • 開発サーバーにインストールされたhttps://www.docker.com/[Docker]。 Ubuntu 18.04を使用している場合は、https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04 [How To]のステップ1および2に従ってください。 Ubuntu 18.04にDockerをインストールして使用する];それ以外の場合は、https://docs.docker.com/install/ [公式ドキュメント]に従って他のオペレーティングシステムへのインストールに関する情報を確認してください。 リンクされたチュートリアルのステップ2で説明されているように、必ず非ルートユーザーを `+ docker +`グループに追加してください。

  • Docker Hubアカウント。 この設定方法の概要については、Docker Hubのhttps://docs.docker.com/docker-hub/ [この概要]を参照してください。

ステップ1-アプリケーションのパッケージ化

Kubernetesでデモアプリケーションを使用するには、https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/ [+ kubelet + agent]のようにコードを複製してパッケージ化する必要があります。画像を引っ張ることができます。

最初のステップは、https://github.com/do-community [DigitalOcean Community GitHubからhttps://github.com/do-community/nodejs-image-demo[nodejs-image-demo respository]を複製することです。アカウント]。 このリポジトリには、https://www.digitalocean.com/community/tutorials/how-to-build-a-node-js-application-with-docker [Node.jsアプリケーションの構築方法]で説明されているセットアップのコードが含まれています。 Node.jsアプリケーションのイメージを構築する方法と、このイメージを使用してコンテナを作成する方法について説明しています。 アプリケーション自体の詳細については、https://www.digitalocean.com/community/tutorial_series/from-containers-to-kubernetes-with-node-js [Node.jsを使用したコンテナからKubernetesへのシリーズ]を参照してください。

始めるには、nodejs-image-demoリポジトリを `++`というディレクトリにクローンします:

git clone https://github.com/do-community/nodejs-image-demo.git

`++`ディレクトリに移動します:

cd

このディレクトリには、サメに関する基本情報をユーザーに提供するサメ情報アプリケーション用のファイルとフォルダが含まれています。 ディレクトリには、アプリケーションファイルに加えて、アプリケーションコードを使用してDockerイメージを構築するための手順を含むDockerfileが含まれています。 Dockerfileの指示の詳細については、https://www.digitalocean.com/community/tutorials/how-to-build-a-node-js-application-with-docker#step-3-%E2%を参照してください80%94-writing-the-dockerfile [DockerでNode.jsアプリケーションを構築する方法のステップ3]。

アプリケーションコードとDockerfileが期待どおりに動作することをテストするには、https://docs.docker.com/engine/reference/commandline/build/ [+ docker build +]コマンドを使用してイメージをビルドし、タグ付けしてから、画像を使用してデモコンテナを実行します。 + docker build`で + -t + `フラグを使用すると、イメージにDocker Hubユーザー名をタグ付けできるため、テスト後にDocker Hubにプッシュできます。

次のコマンドでイメージをビルドします。

docker build -t / .

コマンドの「。」は、ビルドコンテキストが現在のディレクトリであることを指定します。 画像に「++」という名前を付けましたが、別の名前を自由に付けることができます。

ビルドプロセスが完了すると、https://docs.docker.com/engine/reference/commandline/images/ [+ docker images +]で画像を一覧表示できます。

docker images

イメージのビルドを確認する次の出力が表示されます。

OutputREPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
/   latest              37f1c2939dbf        5 seconds ago       77.6MB
node                                10-alpine           9dfa73010b19        2 days ago          75.3MB

次に、 `+ docker run +`を使用して、この画像に基づいてコンテナーを作成します。 このコマンドには3つのフラグが含まれます。

  • + -p +:これはコンテナ上のポートを公開し、ホスト上のポートにマッピングします。 ホストではポート「80」を使用しますが、そのポートで別のプロセスを実行している場合は、必要に応じて自由に変更してください。 これがどのように機能するかについての詳細は、https://docs.docker.com/v17.09/engine/userguide/networking/default_network/binding/ [ポートバインディング]のDockerドキュメントのこの説明を参照してください。

  • + -d +:これはバックグラウンドでコンテナを実行します。

  • +-name +:これにより、コンテナにカスタマイズした名前を付けることができます。

次のコマンドを実行して、コンテナを構築します。

docker run --name  -p 80:8080 -d /

`+docker ps + `で実行中のコンテナを検査します。

docker ps

アプリケーションコンテナが実行されていることを確認する出力が表示されます。

OutputCONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS              PORTS                  NAMES
49a67bafc325        /   "docker-entrypoint.s…"   8 seconds ago       Up 6 seconds        0.0.0.0:80->8080/tcp

サーバーIPにアクセスして、セットアップをテストできます: + http:// +。 アプリケーションには、次のランディングページが表示されます。

image:https://assets.digitalocean.com/articles/docker_node_image/landing_page.png [アプリケーションのランディングページ]

アプリケーションをテストしたので、実行中のコンテナを停止できます。 もう一度 `+ docker ps `を使用して、 ` CONTAINER ID +`を取得します。

docker ps
OutputCONTAINER ID        IMAGE                               COMMAND                  CREATED              STATUS              PORTS                  NAMES
49a67bafc325        /   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:80->8080/tcp

https://docs.docker.com/engine/reference/commandline/stop/[`docker stop + `]でコンテナを停止します。 ここにリストされている ` CONTAINER ID `を独自のアプリケーション ` CONTAINER ID +`に置き換えてください:

docker stop

イメージをテストしたので、Docker Hubにプッシュできます。 まず、前提条件で作成したDocker Hubアカウントにログインします。

docker login -u

プロンプトが表示されたら、Docker Hubアカウントのパスワードを入力します。 この方法でログインすると、Docker Hubの資格情報を使用して、非ルートユーザーのホームディレクトリに `+〜/ .docker / config.json +`ファイルが作成されます。

https://docs.docker.com/engine/reference/commandline/push/[`docker push + `command]を使用して、アプリケーションイメージをDocker Hubにプッシュします。 `+`を自分のDocker Hubユーザー名に置き換えることを忘れないでください:

docker push /

これで、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/

次に、httpsを使用して + istio-init +`チャートでIstioのhttps://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#customresourcedefinitions [カスタムリソース定義](CRD)をインストールします://helm.sh/docs/helm/#helm-install [+ 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をhttps://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/ [+ kube-apiserver +]にコミットし、Istioメッシュで使用できるようにします。 また、 `+ istio-system `と呼ばれるIstioオブジェクトに対してhttps://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/[namespace]を作成し、 `-name `オプションを使用しますHelmに_release_ ` istio-init +`という名前を付けます。 Helmのリリースは、特定の構成オプションが有効になっている特定のチャート展開​​を指します。

必要なすべてのCRDがコミットされたことを確認するには、次のコマンドを実行します。

kubectl get crds | grep 'istio.io\|certmanager.k8s.io' | wc -l

これにより、数値「53」が出力されます。

これで、 `+ istio `チャートをインストールできます。 Grafanaテレメトリアドオンがチャートとともにインストールされるようにするために、 ` helm install `コマンドで `-set grafana.enabled = true +`設定オプションを使用します。 また、目的のhttps://istio.io/docs/setup/kubernetes/additional-setup/config-profiles/ [構成プロファイル]:デフォルトプロファイルのインストールプロトコルも使用します。 Istioには、Helmでインストールするときに選択できるいくつかの構成プロファイルがあり、Istio https://istio.io/docs/setup/kubernetes/additional-setup/config-profiles/ [コントロールプレーンおよびデータプレーンサイドカーをカスタマイズできます。 ]。 デフォルトのプロファイルは、実稼働環境への展開に推奨されます。これを使用して、実稼働環境に移行するときに使用する構成オプションについて理解します。

次の `+ 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 +)に名前を付けています。

次のコマンドを使用して、デフォルトプロファイルに必要なhttps://kubernetes.io/docs/concepts/services-networking/service/ [サービスオブジェクト]が作成されたことを確認できます。

kubectl get svc -n istio-system

ここで表示されるサービスには、「+ istio-citadel 」、「 istio-galley 」、「 istio-ingressgateway 」、「 istio-pilot 」、「 istio-policy 」、「 istio-sidecar-インジェクター+ + 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

`+ READY +`フィールドは、Podで実行されているコンテナの数を示します。 詳細については、https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/ [Podライフサイクルに関するドキュメント]を参照してください。

Istioインストールの最後のステップでは、https://www.envoyproxy.io/ [Envoy]プロキシの作成を有効にします。これは、メッシュで実行されているサービスに_sidecars_としてデプロイされます。

サイドカーは通常、既存のコンテナ環境に機能のレイヤーを追加するために使用されます。 Istioのhttps://istio.io/docs/concepts/what-is-istio/#architecture [メッシュアーキテクチャ]は、メッシュのデータプレーンを構成するEnvoyサイドカーとコントロールプレーンのコンポーネント間の通信に依存しています。 メッシュが機能するためには、メッシュ内の各PodがEnvoyサイドカーも実行するようにする必要があります。

この目標を達成するには2つの方法があります:https://istio.io/docs/setup/kubernetes/additional-setup/sidecar-injection/#manual-sidecar-injection [手動サイドカー注入]およびhttps://istio.io / docs / setup / kubernetes / additional-setup / sidecar-injection /#automatic-sidecar-injection [サイドカーの自動注入]。 labelingラベル「+ istio- injection = enabled + `。 これにより、https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#mutatingadmissionwebhook [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をインストールして構成したら、アプリケーションサービスとhttps://kubernetes.io/docs/concepts/workloads/controllers/deployment/[Deployment]オブジェクトの作成に進むことができます。

手順3-アプリケーションオブジェクトの作成

Istioメッシュを配置し、サイドカーポッドを注入するように構成すると、アプリケーションを作成できますhttps://kubernetes.io/docs/concepts/cluster-administration/manage-deployment/#organizing-resource-configurations[manifest] with forサービスおよびデプロイメントオブジェクト。 Kubernetesマニフェストの仕様は、各オブジェクトの望ましい状態を記述します。

アプリケーションサービスは、個々のPodが作成および破棄されるときに、コンテナを実行するPodが動的環境でアクセス可能な状態を維持するようにし、DeploymentはPodの望ましい状態を記述します。

`+ nano `またはお気に入りのエディターで ` node-app.yaml +`というファイルを開きます:

nano node-app.yaml

まず、次のコードを追加して、 `+ nodejs +`アプリケーションサービスを定義します。

〜/ istio_project / node-app.yaml

apiVersion: v1
kind: Service
metadata:
 name: nodejs
 labels:
   app: nodejs
spec:
 selector:
   app: nodejs
 ports:
 - name: http
   port: 8080

このサービス定義には、ポッドを対応する「+ app:nodejs 」ラベルと一致させる「 selector 」が含まれています。 また、サービスは、ラベルが一致するポッドのポート「+8080」をターゲットにすることも指定しました。

Istioのhttps://istio.io/docs/setup/kubernetes/prepare/requirements/ [ポッドとサービスの要件]に準拠して、サービスポートにも名前を付けています。 `+ http `値は、Istioが ` name +`フィールドに受け入れる値の1つです。

次に、サービスの下に、アプリケーションの展開に関する次の仕様を追加します。 `+ containers `仕様の下にリストされている ` image +`を、作成してhttps://www.digitalocean.com/community/tutorials/how-to-install-and-でDocker Hubにプッシュしたイメージに置き換えてください。 use-istio#step-1-%E2%80%94-cloning-and-packaging-the-application [ステップ1]:

〜/ istio_project / node-app.yaml

...
---
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: /
       ports:
       - containerPort: 8080

このデプロイの仕様には、 `+ replicas `の数(この場合は1)と、デプロイが管理するポッドを定義する ` selector `が含まれます。 この場合、 ` app:nodejs +`ラベルでポッドを管理します。

`+ template +`フィールドには、次のことを行う値が含まれます。

  • Deploymentによって管理されるPodに `+ app:nodejs `ラベルを適用します。 Istio https://istio.io/docs/setup/kubernetes/prepare/requirements/ [推奨]「 app +」ラベルを展開仕様に追加して、Istioのメトリックとテレメトリのコンテキスト情報を提供します。

  • `+ version `ラベルを適用して、このデプロイメントに対応するアプリケーションのバージョンを指定します。 ` app `ラベルと同様に、Istioはコンテキスト情報を提供するために ` version +`ラベルを含めることを推奨します。

  • コンテナ `+ name `や ` image `など、Podが実行するコンテナの仕様を定義します。 ここの「 image 」は、https://www.digitalocean.com/community/tutorials/how-to-install-and-use-istio#step-1-%E2%80%94-cloningで作成した画像です-and-packaging-the-application [ステップ1]そしてDocker Hubにプッシュされます。 コンテナの仕様には、各コンテナがリッスンするポートを指す「 containerPort 」設定も含まれています。 ポートがここにリストされていない場合、Istioプロキシをバイパスします。 このポート「+8080」は、サービス定義で指定されたターゲットポートに対応することに注意してください。

編集が終了したら、ファイルを保存して閉じます。

このファイルを配置したら、GatewayオブジェクトとVirtual Serviceオブジェクトの定義を含むファイルの編集に移ります。これらのオブジェクトは、トラフィックがメッシュに入る方法と、そこで一度ルーティングされる方法を制御します。

ステップ4-Istioオブジェクトの作成

クラスターへのアクセスとサービスへのルーティングを制御するために、KubernetesはIngress Resourcesおよびhttps://kubernetes.io/docs/concepts/services-を使用しますnetworking / ingress-controllers / [_ Controllers_]。 イングレスリソースは、クラスターサービスへのHTTPおよびHTTPSルーティングのルールを定義しますが、コントローラーは着信トラフィックの負荷を分散し、正しいサービスにルーティングします。

Ingressリソースとコントローラーの使用の詳細については、https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nginx-ingress-with-cert-manager-on-digitalocean-kubernetesを参照してください[DigitalOcean KubernetesでCert-Managerを使用してNginx Ingressを設定する方法]。

Istioは、いくつかの重要な違いはありますが、異なるオブジェクトのセットを使用して同様の目的を達成します。 コントローラを使用してトラフィックの負荷を分散する代わりに、Istioメッシュはhttps://istio.io/docs/reference/config/networking/v1alpha3/gateway/[Gateway]を使用します。これは、着信および発信を処理するロードバランサとして機能しますHTTP / TCP接続。 ゲートウェイは、メッシュに入るトラフィックに監視およびルーティングルールを適用することを許可します。 具体的には、トラフィックルーティングを決定する構成は、仮想サービスとして定義されます。 各仮想サービスには、特定のプロトコルと宛先の基準に一致するルーティングルールが含まれます。

Kubernetes Ingressリソース/コントローラーとIstioゲートウェイ/仮想サービスにはいくつかの機能的な類似点がありますが、メッシュの構造には重要な違いがあります。 たとえば、Kubernetes Ingressリソースおよびコントローラーはオペレーターにいくつかのルーティングオプションを提供しますが、ゲートウェイおよび仮想サービスはトラフィックがメッシュに入ることを可能にするため、より堅牢な機能セットを使用可能にします。 言い換えると、Kubernetes Ingress Controllers and Resourcesがクラスターオペレーターに提供する制限されたhttps://en.wikipedia.org/wiki/OSI_model#Layer_7:_Application_Layer[application layer]機能には、高度なルーティング、トレースなどの機能が含まれていません、およびテレメトリ-Istioサービスメッシュのサイドカーによって提供されます。

メッシュへの外部トラフィックを許可し、Nodeアプリへのルーティングを構成するには、Istio GatewayとVirtual Serviceを作成する必要があります。 マニフェストの `+ node-istio.yaml +`というファイルを開きます:

nano node-istio.yaml

まず、Gatewayオブジェクトの定義を追加します。

〜/ istio_project / node-isto.yaml

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
 name: nodejs-gateway
spec:
 selector:
   istio: ingressgateway
 servers:
 - port:
     number: 80
     name: http
     protocol: HTTP
   hosts:
   - "*"

「+ metadata」フィールドでゲートウェイに「+ name」を指定することに加えて、次の仕様を含めました。

  • このリソースを、https://istio.io/docs/setup/kubernetes/additional-setup/config-profiles/ [構成プロファイル]で選択したデフォルトのIstio IngressGatewayコントローラーと一致する「+ selector +」 Istioのインストール。

  • イングレス用に公開する「+ port 」とゲートウェイによって公開される「 hosts 」を指定する「 servers 」仕様。 この場合、特定の保護されたドメインで作業していないため、すべての ` hosts `にアスタリスク( ` * +`)を指定しています。

ゲートウェイ定義の下に、仮想サービスの仕様を追加します。

〜/ istio_project / node-istio.yaml

...
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
 name: nodejs
spec:
 hosts:
 - "*"
 gateways:
 - nodejs-gateway
 http:
 - route:
   - destination:
       host: nodejs

この仮想サービスに「+ name +」を提供することに加えて、次のようなこのリソースの仕様も含まれています。

  • 宛先ホストを指定する「+ hosts 」フィールド。 この場合、ドメインを操作していないため、ブラウザーでアプリケーションにすばやくアクセスできるように、再びワイルドカード値( ` * +`)を使用しています。

  • 外部リクエストが許可されるゲートウェイを指定する「+ gateways 」フィールド。 この場合、それは「 nodejs-gateway +」ゲートウェイです。

  • HTTPトラフィックのルーティング方法を指定する「+ http +」フィールド。

  • リクエストのルーティング先を示す「+ destination 」フィールド。 この場合、それはKubernetes環境でのサービスの完全修飾ドメイン名(FQDN)に暗黙的に展開される ` nodejs `サービスにルーティングされます: ` nodejs.default.svc.cluster.local +`。 ただし、FQDNは、サービスではなく、* rule *が定義されているネームスペースに基づいているため、アプリケーションサービスと仮想サービスが異なるネームスペースにある場合は、必ずこのフィールドでFQDNを使用してください。 Kubernetesドメインネームシステム(DNS)の詳細については、https://www.digitalocean.com/community/tutorials/an-introduction-to-the-kubernetes-dns-service [Kubernetes DNSサービスの概要]をご覧ください。 。

編集が終了したら、ファイルを保存して閉じます。

`+ yaml +`ファイルを配置したら、アプリケーションのサービスとデプロイメント、およびアプリケーションへのアクセスを可能にするゲートウェイと仮想サービスオブジェクトを作成できます。

手順5-アプリケーションリソースの作成とテレメトリアクセスの有効化

アプリケーションサービスとデプロイメントオブジェクトをゲートウェイと仮想サービスとともに作成すると、アプリケーションへのリクエストを生成し、Istio Grafanaダッシュボードで関連データを確認できるようになります。 ただし、まず、ブラウザでダッシュボードにアクセスできるように、Istioを設定してGrafanaアドオンを公開する必要があります。

HTTPでGrafanaアクセスを有効にするを使用しますが、本番環境または機密性の高い環境で作業している場合は、 HTTPSによるアクセスを有効にするを強くお勧めします。

これらのリソースが既に配置されているので、次のステップは、Grafanaアドオンを公開できるように、ゲートウェイと仮想サービスのマニフェストを作成することです。

マニフェストのファイルを開きます。

nano node-grafana.yaml

次のコードをファイルに追加して、トラフィックをGrafanaサービスに公開およびルーティングするゲートウェイおよび仮想サービスを作成します。

〜/ istio_project / node-grafana.yaml

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 GatewayおよびVirtual Serviceの仕様は、https://www.digitalocean.com/community/tutorials/how-to-install-and-use-istio#step-4でアプリケーションGatewayおよびVirtual Serviceに対して定義したものと類似しています。 -%E2%80%94-creating-istio-objects [ステップ4]。 ただし、いくつかの違いがあります。

  • Grafanaはportという名前の + http-grafana +(ポート + 15031 +)で公開され、ホストのポート `+ 3000 +`で実行されます。

  • ゲートウェイと仮想サービスは両方とも「+ istio-system +」名前空間で定義されています。

  • この仮想サービスの「+ host 」は、「 istio-system 」名前空間の「 grafana +」サービスです。 Grafanaサービスが実行されているのと同じネームスペースでこのルールを定義しているため、FQDN拡張は競合することなく再び機能します。

編集が終了したら、ファイルを保存して閉じます。

次のコマンドを使用してGrafanaリソースを作成します。

kubectl apply -f node-grafana.yaml

https://kubernetes.io/docs/concepts/cluster-administration/manage-deployment/#kubectl-apply[`kubectl apply + `]コマンドを使用すると、作成または更新のプロセスで特定の構成をオブジェクトに適用できます。それ。 この場合、 ` node-grafana.yaml +`ファイルで指定した設定を、作成中のGatewayおよびVirtual Serviceオブジェクトに適用しています。

次のコマンドで `+ istio-system`名前空間のGatewayを見ることができます:

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ダッシュボードにアクセスできるはずです。 ただし、その前に、アプリケーションゲートウェイと仮想サービスとともにアプリケーションサービスと展開を作成し、ブラウザでアプリケーションにアクセスできることを確認しましょう。

次のコマンドを使用して、アプリケーションのサービスと展開を作成します。

kubectl apply -f node-app.yaml

数秒待ってから、次のコマンドでアプリケーションポッドを確認します。

kubectl get pods
OutputNAME                      READY   STATUS    RESTARTS   AGE
nodejs-7759fb549f-kmb7x   2/2     Running   0          40s

`+ STATUS `カラムに見られるように、アプリケーションコンテナは実行されていますが、アプリケーションがhttps://www.digitalocean.com/からマニフェストされた場合、 ` READY `カラムに ` 2/2 +`が表示されるのはなぜですかcommunity / tutorials / how-to-install-and-use-istio#step-3-%E2%80%94-creating-application-objects [ステップ3]指定されたレプリカは1つだけですか?

この2番目のコンテナーはEnvoyサイドカーであり、次のコマンドで検査できます。 ここにリストされているポッドを、独自の + node js`ポッドの + NAME`に置き換えてください:

kubectl describe pod
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/[email protected]: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

これで、アプリケーションへのアクセスをテストする準備ができました。 これを行うには、https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer [LoadBalancer Service type]である `+ istio-ingressgateway +`サービスに関連付けられた外部IPが必要です。

次のコマンドを使用して、 `+ istio-ingressgateway +`サービスの外部IPを取得します。

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        10.245.171.39     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

+ istio-ingress gateway`は、 + TYPE` `+ LoadBalancer`を持つ唯一のサービスであり、外部IPを持つ唯一のサービスでなければなりません。

ブラウザで次の外部IPに移動します: + http:// +

次のランディングページが表示されます。

image:https://assets.digitalocean.com/articles/docker_node_image/landing_page.png [アプリケーションのランディングページ]

次に、[更新]を5〜6回クリックして、サイトへの負荷を生成します。

Grafanaダッシュボードで交通量データを確認できるようになりました。

ブラウザで、再び「+ istio-ingressgateway 」外部IPとGrafana Gatewayマニフェストで定義したポートを使用して、次のアドレスに移動します:「 http:// +」。

次のランディングページが表示されます。

画像:https://assets.digitalocean.com/articles/istio_install/grafana_home.png [Grafana Home Dash]

ページ上部の[* Home ]をクリックすると、 istio フォルダーのあるページが表示されます。 ドロップダウンオプションのリストを取得するには、 istio *フォルダーアイコンをクリックします。

image:https://assets.digitalocean.com/articles/istio_install/istio_dropdown.png [Istio Dashオプションドロップダウンメニュー]

このオプションのリストから、* Istio Service Dashboard *をクリックします。

これにより、別のドロップダウンメニューのあるランディングページが表示されます。

image:https://assets.digitalocean.com/articles/istio_install/service_dropdown.png [Istio Service Dashのサービスドロップダウン]

利用可能なオプションのリストから「+ nodejs.default.svc.cluster.local +」を選択します。

これで、そのサービスのトラフィックデータを確認できるようになります。

画像:https://assets.digitalocean.com/articles/istio_install/nodejs_dash.png [Nodejs Service Dash]

Grafanaが有効化され、外部アクセス用に構成されたIstioサービスメッシュで動作するNode.jsアプリケーションが機能するようになりました。

結論

このチュートリアルでは、Helmパッケージマネージャーを使用してIstioをインストールし、それを使用してGatewayおよびVirtual Serviceオブジェクトを使用してNode.jsアプリケーションサービスを公開しました。 また、アプリケーションのトラフィックデータを調べるために、Grafanaテレメトリアドオンを公開するようにGatewayおよびVirtual Serviceオブジェクトを構成しました。

本番環境に移行するときは、https://istio.io/docs/tasks/traffic-management/secure-ingress/ [HTTPSを使用してアプリケーションゲートウェイをセキュリティで保護する]などの手順を実行し、Grafanaサービスへのアクセスを確保する必要があります。 secure

また、https://istio.io/docs/tasks/telemetry/metrics/ [メトリックの収集と処理]を含む他のhttps://istio.io/docs/tasks/telemetry/[telemetry関連タスク]を調べることもできます。 logs、およびhttps://istio.io/docs/tasks/telemetry/distributed-tracing/[trace spans]。