【Linkerd】実際に動かしてざっくり理解するLinkerd

2022.09.12
2024.03.24
Kubernetes
Linkerdマイクロサービス

はじめに

Linkerdとはどんなものなのか実際に触ってみて、ざっくり理解したいと思います。

Linkerdとは

Linkerdとは、Kubernetes向けのサービスメッシュを実装するためのオープンソースです。

Linkerdは、アプリケーションに変更を加えることなく、セキュリティや監視、信頼性などに関する機能を追加することができます。

似たサービスメッシュとして、Istioもありますが、Linkerdはより軽量でシンプルだそうです。

Istioについては、下記で紹介しています。

【Istio】実際に動かしてざっくり理解するIstio

【Istio】実際に動かしてざっくり理解するIstio

:::affiliate-message 本ページはAmazonアフィリエイトのリンクを含みます。

アーキテクチャ

Linkerdのアーキテクチャは下記のようになります。

linkerd-proxyがサービス間の通信を仲介します。

Linkerdのドキュメントより

CLIインストール

Linkerdを使うには、CLIが必要なのでインストールします。

Homebrewを使う場合は下記になります。

1brew install linkerd

ローカルで試してみる

Linkerdをローカルで試してみます。

Linkerdをクラスタにインストール

クラスタにLinkerdをインストールします。

最初に、CRD(Custom Resource Definitions)をクラスタに反映させます。

1linkerd install --crds | kubectl apply -f -

下記のCRDが作成されます。

1customresourcedefinition.apiextensions.k8s.io/authorizationpolicies.policy.linkerd.io created
2customresourcedefinition.apiextensions.k8s.io/httproutes.policy.linkerd.io created
3customresourcedefinition.apiextensions.k8s.io/meshtlsauthentications.policy.linkerd.io created
4customresourcedefinition.apiextensions.k8s.io/networkauthentications.policy.linkerd.io created
5customresourcedefinition.apiextensions.k8s.io/serverauthorizations.policy.linkerd.io created
6customresourcedefinition.apiextensions.k8s.io/servers.policy.linkerd.io created
7customresourcedefinition.apiextensions.k8s.io/serviceprofiles.linkerd.io created

次にLinkerdのコントロールプレーンをデプロイします。

1linkerd install --set proxyInit.runAsRoot=true | kubectl apply -f -

下記のリソースが作成されます。

1namespace/linkerd created
2clusterrole.rbac.authorization.k8s.io/linkerd-linkerd-identity created
3clusterrolebinding.rbac.authorization.k8s.io/linkerd-linkerd-identity created
4serviceaccount/linkerd-identity created
5clusterrole.rbac.authorization.k8s.io/linkerd-linkerd-destination created
6clusterrolebinding.rbac.authorization.k8s.io/linkerd-linkerd-destination created
7serviceaccount/linkerd-destination created
8secret/linkerd-sp-validator-k8s-tls created
9validatingwebhookconfiguration.admissionregistration.k8s.io/linkerd-sp-validator-webhook-config created
10secret/linkerd-policy-validator-k8s-tls created
11validatingwebhookconfiguration.admissionregistration.k8s.io/linkerd-policy-validator-webhook-config created
12clusterrole.rbac.authorization.k8s.io/linkerd-policy created
13clusterrolebinding.rbac.authorization.k8s.io/linkerd-destination-policy created
14role.rbac.authorization.k8s.io/linkerd-heartbeat created
15rolebinding.rbac.authorization.k8s.io/linkerd-heartbeat created
16clusterrole.rbac.authorization.k8s.io/linkerd-heartbeat created
17clusterrolebinding.rbac.authorization.k8s.io/linkerd-heartbeat created
18serviceaccount/linkerd-heartbeat created
19clusterrole.rbac.authorization.k8s.io/linkerd-linkerd-proxy-injector created
20clusterrolebinding.rbac.authorization.k8s.io/linkerd-linkerd-proxy-injector created
21serviceaccount/linkerd-proxy-injector created
22secret/linkerd-proxy-injector-k8s-tls created
23mutatingwebhookconfiguration.admissionregistration.k8s.io/linkerd-proxy-injector-webhook-config created
24configmap/linkerd-config created
25secret/linkerd-identity-issuer created
26configmap/linkerd-identity-trust-roots created
27service/linkerd-identity created
28service/linkerd-identity-headless created
29deployment.apps/linkerd-identity created
30service/linkerd-dst created
31service/linkerd-dst-headless created
32service/linkerd-sp-validator created
33service/linkerd-policy created
34service/linkerd-policy-validator created
35deployment.apps/linkerd-destination created
36cronjob.batch/linkerd-heartbeat created
37deployment.apps/linkerd-proxy-injector created
38service/linkerd-proxy-injector created
39secret/linkerd-config-overrides created

デモアプリのデプロイ

Linkerdの動きを確認するために、Linkerdが用意しているデモアプリをデプロイしてみます。

1curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/emojivoto.yml \
2  | kubectl apply -f -

下記のようなアプリがデプロイされました。

1❯ kubectl get -n emojivoto svc,deploy,pod
2NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
3service/emoji-svc    ClusterIP   10.105.34.106    <none>        8080/TCP,8801/TCP   5m36s
4service/voting-svc   ClusterIP   10.98.205.168    <none>        8080/TCP,8801/TCP   5m36s
5service/web-svc      ClusterIP   10.106.210.181   <none>        80/TCP              5m35s
6
7NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
8deployment.apps/emoji      1/1     1            1           5m35s
9deployment.apps/vote-bot   1/1     1            1           5m35s
10deployment.apps/voting     1/1     1            1           5m35s
11deployment.apps/web        1/1     1            1           5m34s
12
13NAME                            READY   STATUS    RESTARTS   AGE
14pod/emoji-78594cb998-57rm4      1/1     Running   0          5m35s
15pod/vote-bot-786d75cf45-qm8p7   1/1     Running   0          5m35s
16pod/voting-5f5b555dff-m7c4h     1/1     Running   0          5m34s
17pod/web-68cc8bc689-ljgzm        1/1     Running   0          5m33s

ポートフォワードして、localhost:8080にアクセスするとアプリケーションを確認できます。

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

linkerd-proxyの挿入

linkerd injectコマンドを使って、Podにlinkerd-proxyを挿入していきます。

1kubectl get -n emojivoto deploy -o yaml \
2  | linkerd inject - \
3  | kubectl apply -f -

リソースを確認してみると、各Podのコンテナ数が2になっていることが確認できます。

1❯ kubectl get -n emojivoto svc,deploy,pod
2NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
3service/emoji-svc    ClusterIP   10.105.34.106    <none>        8080/TCP,8801/TCP   12m
4service/voting-svc   ClusterIP   10.98.205.168    <none>        8080/TCP,8801/TCP   12m
5service/web-svc      ClusterIP   10.106.210.181   <none>        80/TCP              12m
6
7NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
8deployment.apps/emoji      1/1     1            1           12m
9deployment.apps/vote-bot   1/1     1            1           12m
10deployment.apps/voting     1/1     1            1           12m
11deployment.apps/web        1/1     1            1           12m
12
13NAME                           READY   STATUS    RESTARTS   AGE
14pod/emoji-699d77c79-bn79h      2/2     Running   0          6m3s
15pod/vote-bot-b57689ffb-r9p9r   2/2     Running   0          6m2s
16pod/voting-55d76f4bcb-bm4nj    2/2     Running   0          6m2s
17pod/web-6c54d9554d-wpw2w       2/2     Running   0          6m2s

試しに1つのPodのコンテナを確認すると、アプリケーションのコンテナとlinkerd-proxyがあることが確認できます。

1❯ kubectl get -n emojivoto pod emoji-699d77c79-bn79h -o jsonpath="{.spec.containers[*].name}"
2linkerd-proxy emoji-svc

ダッシュボードを確認

vizという拡張をインストールして、ダッシュボードを確認してみます。

1linkerd viz install | kubectl apply -f -

下記でダッシュボードを起動できます。

1linkerd viz dashboard &

サービスの依存関係や経路などを可視化できます。

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee