著者は、 Write forDOnationsプログラムの一環として寄付を受け取るためにTechEducationFundを選択しました。

序章

サービスメッシュは、管理者がサービス間の通信を処理するのに役立つ専用のインフラストラクチャレイヤーです。 多くの強力なツールを提供するこれらのサービスメッシュは、システムをより安全で信頼性が高く、より見やすくすることができます。

たとえば、 Linkerd のようなサービスメッシュは、接続を自動的に暗号化し、リクエストの再試行とタイムアウトを処理し、成功率や遅延などのテレメトリ情報を提供できます。

このチュートリアルでは、Linkerdサービスメッシュを Kubernetes クラスターにインストールし、サンプルアプリケーションをデプロイしてから、Linkerdのダッシュボードを探索します。 このダッシュボード情報の一部に慣れたら、特定のKubernetesポッドにtimeoutおよびretryポリシーを適用するようにLinkerdを構成します。

または、DigitalOceanのワンクリックLinkerd/Kubernetesインストールオプションを検討することを検討してください。

前提条件

  • Kubernetes1.12+クラスター。 このチュートリアルでは、セットアップで3つのノードを持つ DigitalOcean Kubernetes クラスターを使用しますが、別の方法を使用してクラスターを自由に作成できます。

  • kubectlコマンドラインツールが開発サーバーにインストールされ、クラスターに接続するように構成されています。 kubectlのインストールの詳細については、公式ドキュメントを参照してください。

ステップ1—アプリケーションのデプロイ

Linkerdの動作を確認するには、クラスターでアプリケーションを実行する必要があります。 このステップでは、Linkerdチームがこの目的のために作成したemojivotoというアプリケーションをデプロイします

このリポジトリには、アプリケーションを構成する4つのサービスのコードと、これらのサービスをKubernetesクラスターにデプロイするために使用するマニフェストファイルが表示されます。

まず、このマニフェストファイルをローカルに保存します。

  1. curl https://run.linkerd.io/emojivoto.yml --output manifest.yaml

curlを使用してファイルをフェッチし、--outputオプションを渡して、ファイルを保存する場所を指定します。 この場合、manifest.yamlというファイルを作成しています。

このファイルが何を達成するかをよりよく理解するには、catでその内容を調べるか、お気に入りのエディターで開きます。

  1. cat manifest.yaml | less

SPACEを押して、ディレクティブをページングします。 manifest.yamlが、このアプリケーションに関連するすべてが実行されるemojivotoというKubernetes名前空間と、いくつかのKubernetesDeploymentsServicesを作成していることがわかります。

次に、このマニフェストをKubernetesクラスターに適用します。

  1. kubectl apply -f manifest.yaml

ここでも、kubectl apply-fフラグを使用して、適用するファイルを割り当てています。

このコマンドは、作成されたすべてのリソースのリストを出力します。

Output
namespace/emojivoto created serviceaccount/emoji created serviceaccount/voting created serviceaccount/web created service/emoji-svc created service/voting-svc created service/web-svc created deployment.apps/emoji created deployment.apps/vote-bot created deployment.apps/voting created deployment.apps/web created

次に、サービスが実行されていることを確認します。

  1. kubectl -n emojivoto get pods

kubectlを使用して、クラスターで実行しているすべてのpodsを一覧表示し、-nフラグを渡して使用する名前空間を示します。 emojivoto名前空間を渡すのは、これらすべてのサービスを実行している場所だからです。

Running状態のすべてのpodsが表示されたら、次の手順を実行します。

Output
NAME READY STATUS RESTARTS AGE emoji-566954596f-cw75b 1/1 Running 0 24s vote-bot-85c5f5699f-7dw5c 1/1 Running 0 24s voting-756995b6fc-czf8z 1/1 Running 0 24s web-7f7b69d467-2546n 1/1 Running 0 23s

最後に、ブラウザで実行されているアプリケーションを確認するには、ローカルリクエストをリモートクラスタに転送するkubectl組み込み機能を使用します。

  1. kubectl -n emojivoto port-forward svc/web-svc 8080:80

注:ローカルマシンからこれを実行していない場合は、localhostだけでなく、すべてのアドレスをリッスンするために--address 0.0.0.0フラグを追加する必要があります。

ここでも、emojivoto名前空間でkubectlを使用していますが、port-forwardサブコマンドを呼び出して、ポート8080ですべてのローカルリクエストを転送するように指示しています。ポート80でKubernetesサービスweb-svcに接続します。 これは、適切なロードバランサーを配置しなくても、アプリケーションにアクセスするための便利な方法です。

http://localhost:8080にアクセスすると、emojivotoアプリケーションが表示されます。

Emojivoto sample application

端末のCTRL + Cを押します。 クラスターでアプリケーションを実行すると、Linkerdをインストールして、その動作を確認する準備が整います。

ステップ2—Linkerdをインストールする

アプリケーションを実行しているので、Linkerdをインストールしましょう。 Kubernetesクラスタにインストールするには、最初にLinkerdCLIが必要です。 このコマンドラインインターフェイスを使用して、ローカルマシンからLinkerdと対話します。 その後、Linkerdをクラスターにインストールできます。

まず、Linkerdチームから提供されたスクリプトを使用してCLIをインストールしましょう。

  1. curl https://run.linkerd.io/install | sh

ここでは、curlを使用してインストールスクリプトをダウンロードし、出力をshにパイプして、スクリプトを自動的に実行します。 または、LinkerdのリリースページからCLIを直接ダウンロードすることもできます。

スクリプトを使用すると、Linkerdが~/.linkerd2/binにインストールされます。 ここで、CLIが正しく機能していることを確認します。

  1. ~/.linkerd2/bin/linkerd version

コマンドは次のようなものを出力します:

Output
Client version: stable-2.7.1 Server version: unavailable

次に、CLIの実行を容易にするために、このディレクトリを$PATHに追加します。

  1. export PATH=$PATH:$HOME/.linkerd2/bin

これで、前のコマンドと同様に、コマンドをより直接的に実行できます。

  1. linkerd version

最後に、LinkerdをKubernetesクラスターにインストールしましょう。 linkerd installコマンドは、Linkerdの実行に必要なすべてのyamlマニフェストを生成するために使用されますが、これらのマニフェストはクラスターに適用されません。 次のコマンドを実行して、その出力を調べます。

  1. linkerd install

Linkerdが実行する必要のあるリソースのすべてのyamlマニフェストを一覧表示する長い出力が表示されます。 これらのマニフェストをクラスターに適用するには、次のコマンドを実行します。

  1. linkerd install | kubectl apply -f -

linkerd installを実行すると、以前に見たすべてのマニフェストが出力されます。 次に、|は、この出力をkubectl applyにそれらを適用します。

このコマンドを実行すると、kubectl applyは作成されたすべてのリソースのリストを出力します。

すべてがクラスターで実行されていることを確認するには、linkerd checkを実行します。

  1. linkerd check

これにより、クラスターに対していくつかのチェックが実行され、必要なすべてのコンポーネントが実行されていることを確認します。

Output
kubernetes-api -------------- √ can initialize the client √ can query the Kubernetes API [...] control-plane-version --------------------- √ control plane is up-to-date √ control plane and cli versions match Status check results are √

最後に、このコマンドを実行して、ブラウザーで組み込みのLinkerdダッシュボードを開きます(ローカルマシンからこれを実行していない場合は、--address 0.0.0.0フラグを指定する必要があることに注意してください)。

  1. linkerd dashboard

Linkerd Dashboard

ダッシュボードに表示される情報のほとんどは、LinkerdCLIを使用して取得できます。 たとえば、次のコマンドを実行して、高レベルの統計情報の展開を確認します。

  1. linkerd stat deployments -n linkerd

ここでは、linkerd名前空間で実行されているデプロイメントの統計が必要であると言っています。 これらはLinkerd独自のコンポーネントであり、興味深いことに、Linkerd自体を使用してそれらを監視できます。 1秒あたりのリクエスト数(RPS)、成功率、レイテンシーなどの統計情報を確認できます。 Meshed列も表示されます。これは、podsLinkerdが注入した数を示しています。

Output
NAME MESHED SUCCESS RPS LATENCY_P50 LATENCY_P95 LATENCY_P99 TCP_CONN linkerd-controller 1/1 100.00% 0.4rps 1ms 87ms 98ms 5 linkerd-destination 1/1 100.00% 0.3rps 1ms 2ms 2ms 13 linkerd-grafana 1/1 100.00% 0.3rps 2ms 3ms 3ms 2 linkerd-identity 1/1 100.00% 0.3rps 1ms 2ms 2ms 10 linkerd-prometheus 1/1 100.00% 0.7rps 35ms 155ms 191ms 9 linkerd-proxy-injector 1/1 100.00% 0.3rps 2ms 3ms 3ms 2 linkerd-sp-validator 1/1 100.00% 0.3rps 1ms 5ms 5ms 2 linkerd-tap 1/1 100.00% 0.3rps 1ms 4ms 4ms 6 linkerd-web 1/1 100.00% 0.3rps 1ms 2ms 2ms 2

次に、emojivoto名前空間で次のコマンドを試してください。

  1. linkerd stat deployments -n emojivoto

4つのサービスを確認できますが、これらの展開では以前に確認した統計情報はどれも利用できません。[メッシュ]列に0/1と表示されていることがわかります。

Output
NAME MESHED SUCCESS RPS LATENCY_P50 LATENCY_P95 LATENCY_P99 TCP_CONN emoji 0/1 - - - - - - vote-bot 0/1 - - - - - - voting 0/1 - - - - - - web 0/1 - - - - - -

ここでの出力は、Linkerdをアプリケーションにまだ注入していないことを意味します。 これが次のステップになります。

ステップ3—アプリケーションにLinkerdを挿入する

クラスターでLinkerdを実行しているので、emojivotoアプリケーションにLinkerdを挿入する準備が整いました。

Linkerdは、Kubernetespodsでサイドカーコンテナを実行することで機能します。 つまり、実行しているすべてのpodにリンカされたプロキシコンテナを挿入します。 podsが送信または受信するすべてのリクエストは、この非常に軽量なプロキシを通過します。このプロキシは、指標(成功率、1秒あたりのリクエスト数、レイテンシーなど)を収集し、ポリシー(タイムアウトや再試行など)を適用できます。

次のコマンドを使用して、Linkerdのプロキシを手動で挿入できます。

  1. kubectl get deployments -n emojivoto -o yaml | linkerd inject - | kubectl apply -f -

このコマンドでは、最初にkubectl getを使用して、emojivoto名前空間で実行しているすべてのKubernetesdeploymentを取得し、[ X181X]