LinkerdをKubernetesでインストールして使用する方法

提供:Dev Guides
移動先:案内検索

著者は、 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クラスターにデプロイするために使用するマニフェストファイルが表示されます。

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

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

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

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

cat manifest.yaml | less

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

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

kubectl apply -f manifest.yaml

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

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

Outputnamespace/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

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

kubectl -n emojivoto get pods

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

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

OutputNAME                        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組み込み機能を使用します。

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アプリケーションが表示されます。

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

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

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

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

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

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

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

~/.linkerd2/bin/linkerd version

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

OutputClient version: stable-2.7.1
Server version: unavailable

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

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

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

linkerd version

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

linkerd install

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

linkerd install | kubectl apply -f -

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

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

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

linkerd check

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

Outputkubernetes-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フラグを指定する必要があることに注意してください)。

linkerd dashboard

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

linkerd stat deployments -n linkerd

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

OutputNAME                     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名前空間で次のコマンドを試してください。

linkerd stat deployments -n emojivoto

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

OutputNAME       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のプロキシを手動で挿入できます。

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

このコマンドでは、最初にkubectl getを使用して、emojivoto名前空間で実行しているすべてのKubernetesdeploymentを取得し、次に[ X181X]形式。 次に、その出力をlinkerd injectコマンドに送信します。 このコマンドは、実行中の現在のマニフェストを含むyamlファイルを読み取り、すべてのdeploymentと一緒にlinkerdプロキシを含めるように変更します。

最後に、この変更されたマニフェストを受け取り、kubectl applyを使用してクラスターに適用します。

このコマンドを実行すると、4つのemojivotoサービス(emojivote-botvoting、およびweb)すべてを示すメッセージが表示されます。正常に注入されました。

emojivotostatsを取得すると、すべてのdeploymentがメッシュ化され、数秒後に同じ統計が表示されるようになります。 linkerd名前空間で見た:

linkerd stat deployments -n emojivoto

ここでは、emojivotoアプリケーションを構成する4つのサービスすべての統計を、それぞれの成功率、1秒あたりのリクエスト数、レイテンシーとともに確認できます。アプリケーションコードを記述したり、変更したりする必要はありません。

OutputNAME       MESHED   SUCCESS      RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99   TCP_CONN
emoji         1/1   100.00%   1.9rps           1ms           2ms           2ms          2
vote-bot      1/1         -        -             -             -             -          -
voting        1/1    85.96%   0.9rps           1ms           1ms           1ms          2
web           1/1    93.04%   1.9rps           8ms          27ms          29ms          2

vote-botサービスは、他のサービスにリクエストを送信するボットであり、トラフィックを受信していないため、統計情報を表示しません。これは、それ自体が貴重な情報です。

次に、サービスに関する追加情報をLinkerdに提供して、サービスの動作をカスタマイズする方法を見てみましょう。

ステップ4—サービスプロファイルを定義する

Linkerdをアプリケーションに挿入したので、各サービスの動作に関する貴重な情報の取得を開始できます。 さらに、カスタム構成を記述したり、アプリケーションのコードを変更したりすることなく、これを実現できました。 ただし、Linkerdに追加情報を提供すると、タイムアウトや再試行などの多数のポリシーを適用できます。 その後、ルートごとのメトリックを提供することもできます。

この情報は、サービスプロファイルを通じて提供されます。サービスプロファイルは、アプリケーション内のルートと各ルートの動作を説明できるカスタムLinkerdリソースです。

サービスプロファイルマニフェストがどのように見えるかの例を次に示します。

example-service-profile.yaml

apiVersion: linkerd.io/v1alpha2
kind: ServiceProfile
metadata:
  name: my-service.my-namespace.svc.cluster.local
spec:
  routes:
  - name: My Route Name
    isRetryable: true # Define it's safe to retry this route
    timeout: 100ms # Define a timeout for this route
    condition:
      method: GET
      pathRegex: /my/route/path

サービスプロファイルはルートのリストを記述し、次に指定されたconditionに一致するリクエストがどのように動作するかを定義します。 この例では、/my/route/pathに送信されたすべてのGET要求は、100ミリ秒後にタイムアウトになり、失敗した場合は再試行できると言っています。

次に、サービスの1つにサービスプロファイルを作成しましょう。 voting-svcを例にとると、最初にLinkerd CLIを使用して、このサービス用に定義したルートを確認します。

linkerd routes svc/voting-svc -n emojivoto

ここでは、linkerd routesコマンドを使用して、emojiovoto名前空間にあるサービスvoting-svcのすべてのルートを一覧表示しています。

OutputROUTE          SERVICE   SUCCESS      RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99
[DEFAULT]   voting-svc    83.05%   1.0rps           1ms           1ms           2ms

[DEFAULT]という1つのルートしか見つかりません。 これは、サービスプロファイルを定義するまで、すべてのリクエストがグループ化される場所です。

次に、nanoまたはお気に入りのエディターを開いてservice-profile.yamlファイルを作成します。

nano service-profile.yaml

次のサービスプロファイル定義をこのファイルに追加します。

service-profile.yaml

apiVersion: linkerd.io/v1alpha2
kind: ServiceProfile
metadata:
  name: voting-svc.emojivoto.svc.cluster.local
  namespace: emojivoto
spec:
  routes:
  - name: VoteDoughnut
    isRetryable: true
    timeout: 100ms
    condition:
      method: POST
      pathRegex: /emojivoto.v1.VotingService/VoteDoughnut

次に、ファイルを保存してエディターを閉じます。

ここでは、emojivoto名前空間で、voting-svcサービスのサービスプロファイルを宣言しています。 VoteDoughnutと呼ばれる1つのルートを定義しました。これは、POST要求を/emojivoto.v1.VotingService/VoteDoughnutパスに一致させます。 これらの基準に一致するリクエストに100ミリ秒以上かかる場合、Linkerdはそれをキャンセルし、クライアントは504応答を受け取ります。 また、このリクエストが失敗した場合は再試行できることをLinkerdに伝えています。

次に、このファイルをクラスターに適用します。

kubectl apply -f service-profile.yaml

数秒後、このサービスのルートを再確認します。

linkerd routes svc/voting-svc -n emojivoto

これで、新しく定義されたVoteDoughnutルートが表示されます。

OutputROUTE             SERVICE   SUCCESS      RPS   LATENCY_P50   LATENCY_P95   LATENCY_P99
VoteDoughnut   voting-svc     0.00%   0.2rps           1ms           1ms           1ms
[DEFAULT]      voting-svc   100.00%   0.8rps           1ms           4ms           4ms

この特定のルートの成功率、1秒あたりのリクエスト数、レイテンシーなど、いくつかのカスタム指標を確認できます。 VoteDoughnutエンドポイントは意図的に構成され常にエラーを返すように設定されており、[DEFAULT]ルートが100%を出力しているのに対し、成功率は0%を出力していることに注意してください。 。

これで、Linkerdにサービスに関する情報を少し提供した後、ルートごとにカスタムメトリックが設定され、タイムアウトと再試行の2つのポリシーが適用されます。

結論

この記事では、LinkerdをKubernetesクラスターにインストールし、それを使用してサンプルアプリケーションを監視しました。 成功率、スループット、遅延などの有用なテレメトリ情報を抽出しました。 また、ルートごとのメトリックを収集し、emojivotoアプリケーションで2つのポリシーを適用するようにLinkerdサービスプロファイルを構成しました。

Linkerdについて詳しく知りたい場合は、すばらしいドキュメントページを参照してください。ここでは、サービスを保護する分散トレースを構成する、[ X204X]カナリアリリースの自動化など。

ここから、 Istio をチェックアウトすることも検討できます。これは、異なる機能とトレードオフのセットを備えた別のサービスメッシュです。