LinkerdをKubernetesでインストールして使用する方法
著者は、 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名前空間と、いくつかのKubernetesDeployments
とServices
を作成していることがわかります。
次に、このマニフェストを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
列も表示されます。これは、pods
Linkerdが注入した数を示しています。
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
サービス(emoji
、vote-bot
、voting
、およびweb
)すべてを示すメッセージが表示されます。正常に注入されました。
emojivoto
のstats
を取得すると、すべての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 をチェックアウトすることも検討できます。これは、異なる機能とトレードオフのセットを備えた別のサービスメッシュです。