Kubernetes上のサービスグリッドIstio-分散追跡編

13294 ワード

要旨:2017年5月、Google、IBM、LyftはオープンソースサービスグリッドフレームワークIstioを発表し、マイクロサービスの接続、管理、監視、安全保護を提供した.Istioはサービス間通信のインフラストラクチャ層を提供し、応用ロジックとサービスアクセスにおけるバージョン管理、セキュリティ保護、フェイルオーバ、遠隔測定の監視などの断面の問題をデカップリングした.
マイクロサービスアーキテクチャは複雑なシステムをいくつかの小さなサービスに分割し、各サービスは独立して開発、導入、伸縮することができる.マイクロサービスアーキテクチャとコンテナ(Docker/Kubernetes)は天作の合であり、マイクロサービスの提供をさらに簡素化し、システム全体の弾力性と丈夫性を強化することができる.しかしながら、大量のマイクロサービスからなる分散アプリケーションアーキテクチャは、メンテナンス、デバッグ、およびセキュリティ管理の複雑さを増大させる.上記の課題を解決するために、Spring CloudやDubbo/EDASなどのマイクロサービスフレームワークは、サービスガバナンス能力をプログラミングフレームワークに内蔵している.
2017年5月、Google、IBM、LyftはオープンソースサービスグリッドフレームワークIstioを発表し、マイクロサービスの接続、管理、監視、セキュリティ保護を提供した.Istioはサービス間通信のインフラストラクチャ層を提供し、応用ロジックとサービスアクセスにおけるバージョン管理、セキュリティ保護、フェイルオーバ、遠隔測定の監視などの断面の問題をデカップリングした.
Istioはギリシャ語で「出航」を意味し、非常に若いプロジェクトであるにもかかわらず大きな注目を集め、その生態発展は非常に急速である.今日はまず、分散型サービス追跡(Distributed Tracing)に関する進展に注目します.
本文はIstio公式文書の内容を参考にした.https://istio.io/docs/tasks/telemetry/distributed-tracing.html
Istioのインストール
Kubernetesクラスタの構成
MinikubeまたはアリクラウドコンテナサービスKubernetesクラスタを使用して検証できます.
Minikubeのインストール方法については、Minikube-Kubernetesローカル実験環境を参照してください.
Initializers方式で導入するため、次のコマンドを実行して、対応するInitializersアクセス制御プラグインを開く必要があります.
minikube start \
    --memory 4096 \
    --registry-mirror=https://registry.docker-cn.com \
    --extra-config=apiserver.Admission.PluginNames="Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota"

アリクラウドコンテナサービスの1.8+バージョン以上のKubernetesクラスタには、Initializersプラグインが内蔵されており、追加の構成作業を必要としません.
注意:Istioを導入すると、各Podにsidecarが注入され、サービス通信を引き継ぐため、独立したテスト環境で検証することをお勧めします.
クラスタ管理ページ情報に基づいて、対応する接続情報を構成する必要があります.
Istioリリースをダウンロード
Istio releasesページで最新のインストールパッケージを取得し、ローカルに解凍するか、次のコマンドを実行します.
curl -L https://git.io/getLatestIstio | sh -

次のコマンドを実行します.
#         Istio
cd istio-0.3.0
#    istioctl client   PATH     
export PATH=$PWD/bin:$PATH

配備
#    Istio     
kubectl apply -f install/kubernetes/istio.yaml
#    Istio initializer   
kubectl apply -f install/kubernetes/istio-initializer.yaml

デプロイが完了したら、Istioコンポーネントが正常にデプロイされたかどうかを確認するには、次のコマンドを使用します.
$ kubectl get svc,pod  -n istio-system
NAME                TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)                                                            AGE
svc/istio-ingress   LoadBalancer   10.0.0.241        80:31411/TCP,443:31972/TCP                                         22m
svc/istio-mixer     ClusterIP      10.0.0.146           9091/TCP,15004/TCP,9093/TCP,9094/TCP,9102/TCP,9125/UDP,42422/TCP   22m
svc/istio-pilot     ClusterIP      10.0.0.253           15003/TCP,443/TCP                                                  22m

NAME                                    READY     STATUS    RESTARTS   AGE
po/istio-ca-76dddbd695-jzgq4            1/1       Running   0          22m
po/istio-ingress-85fb769c4d-8jr4r       1/1       Running   0          22m
po/istio-initializer-7fcb8b7454-f68h8   1/1       Running   0          10s
po/istio-mixer-587fd4bbdb-wpbfr         3/3       Running   0          22m
po/istio-pilot-7db8db896c-wdmhp         2/2       Running   0          22m

すべてのPodが実行状態に入るのを待って、Istioはすでに配備が完了しました.
分散型サービス追跡
導入テストアプリケーションBookInfo
BookInfoガイドを参照して、アプリケーションを展開します.このアプリケーションはいくつかのマイクロサービスから構成され、各マイクロサービスはコンテナ方式で導入される.
次のコマンドを実行します.
kubectl apply -f samples/bookinfo/kube/bookinfo.yaml

MiniKube環境では、次のコマンドを実行して対応するアクセスアドレスを取得します.
export GATEWAY_URL=$(kubectl get po -l istio=ingress -n istio-system -o 'jsonpath={.items[0].status.hostIP}'):$(kubectl get svc istio-ingress -n istio-system -o 'jsonpath={.spec.ports[0].nodePort}')

アリクラウドKubernetesクラスタはすでに各クラスタにSLBとIngressを構成している.
$ kubectl get ingress -o wide
NAME      HOSTS     ADDRESS          PORTS     AGE
gateway   *         112.74.xxx.xxx   80        2m

対応するアドレスは以下の方法で得ることができる.
export GATEWAY_URL=$(kubectl get ingress -o wide -o jsonpath={.items[0].status.loadBalancer.ingress[0].ip})

次のコマンドに従います.
curl -o /dev/null -s -w "%{http_code}
"
http://${GATEWAY_URL}/productpage
200に戻ると、アプリケーションが正常に導入されたことを示し、ブラウザでhttp://${GATEWAY_URL}/productpageを開くことでアプリケーションにアクセスできます.
分散型サービス追跡の導入
分散追跡システムは、パフォーマンスの問題を診断し、システムの障害を分析するための利器として、サービス間呼び出しチェーンを観察するのに役立ちます.
Istio生態はZipkinとJaegerを含む異なる分布追跡システムのサポートを実現した.
Istio v0.3 Jaegerに対する良好なサポートを提供し、テスト方法は以下の通りである.
kubectl apply -n istio-system -f https://raw.githubusercontent.com/jaegertracing/jaeger-kubernetes/master/all-in-one/jaeger-all-in-one-template.yml

導入が完了すると、ポートマッピングを使用してJaegerコントロールパネルにアクセスできます.
kubectl port-forward -n istio-system $(kubectl get pod -n istio-system -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 16686:16686 &

ブラウザで開くhttp://localhost:16686
複数のテストアプリケーションにアクセスすると、サービスの呼び出しチェーンが明確に表示されます.
Istio分散トレース実装
IstioサービスグリッドのコアはEnvoyであり、高性能のオープンソースL 7エージェントと通信バスである.Istioでは、各マイクロサービスがEnvoy Sidecarに注入され、このインスタンスは、すべての送信および送信のネットワークトラフィックの処理を担当する.したがって、各Envoy Sidecarは、すべてのサービス間API呼び出しを監視し、各サービス呼び出しに要する時間と、正常に完了したかどうかを記録することができる.
マイクロサービスが外部呼び出しを開始するたびに、クライアントEnvoyは新しいspanを作成します.1つのspanは、要求者(クライアント)が要求を発行してからサービス側の応答を受信するまで、マイクロサービス間の完全なインタラクションプロセスのセットを表す.
サービスインタラクション中、クライアントは要求の開始時間と応答の受信時間を記録し、サーバ側Envoyは要求の受信時間と応答の戻り時間を記録する.
各Envoyは、独自のspanビュー情報を分散トラッキングシステムにパブリッシュします.1つのマイクロサービスが要求を処理する場合、他のマイクロサービスを呼び出す必要があり、因果関連spanの作成を招き、完全なtraceを形成することができる.これは、要求メッセージから次のヘッダを収集および転送するためにアプリケーションによって必要とされる.
  • x-request-id
  • x-b3-traceid
  • x-b3-spanid
  • x-b3-parentspanid
  • x-b3-sampled
  • x-b3-flags
  • x-ot-span-context

  • 通信リンク内のEnvoyでは、対応するヘッダを切り取り、処理、転送することができる.
        Client Tracer                                              Server Tracer
    ┌──────────────────┐                                       ┌──────────────────┐
    │                  │                                       │                  │
    │   TraceContext   │           Http Request Headers        │   TraceContext   │
    │ ┌──────────────┐ │          ┌───────────────────┐        │ ┌──────────────┐ │
    │ │ TraceId      │ │          │ X─B3─TraceId      │        │ │ TraceId      │ │
    │ │              │ │          │                   │        │ │              │ │
    │ │ ParentSpanId │ │ Extract  │ X─B3─ParentSpanId │ Inject │ │ ParentSpanId │ │
    │ │              ├─┼─────────>│                   ├────────┼>│              │ │
    │ │ SpanId       │ │          │ X─B3─SpanId       │        │ │ SpanId       │ │
    │ │              │ │          │                   │        │ │              │ │
    │ │ Sampled      │ │          │ X─B3─Sampled      │        │ │ Sampled      │ │
    │ └──────────────┘ │          └───────────────────┘        │ └──────────────┘ │
    │                  │                                       │                  │
    └──────────────────┘                                       └──────────────────┘

    まとめ
    Istioは良好な拡張メカニズムと強力な生態を借りてService Meshの応用と普及を加速させている.Weave Scope、Istio Dashboard、およびIstio-Analyticsプロジェクトは、上述した以外にも、豊富な呼び出しリンクの可視化および分析能力を提供します.
    著者:易立
    テキストリンク:http://click.aliyun.com/m/41483/