はじめに
Linkerdとはどんなものなのか実際に触ってみて、ざっくり理解したいと思います。
Linkerdとは
Linkerdとは、Kubernetes向けのサービスメッシュを実装するためのオープンソースです。
Linkerdは、アプリケーションに変更を加えることなく、セキュリティや監視、信頼性などに関する機能を追加することができます。
似たサービスメッシュとして、Istioもありますが、Linkerdはより軽量でシンプルだそうです。
Istioについては、下記で紹介しています。

アーキテクチャ
Linkerdのアーキテクチャは下記のようになります。
linkerd-proxyがサービス間の通信を仲介します。
Linkerdのドキュメントより
CLIインストール
Linkerdを使うには、CLIが必要なのでインストールします。
Homebrewを使う場合は下記になります。
brew install linkerd
ローカルで試してみる
Linkerdをローカルで試してみます。
Linkerdをクラスタにインストール
クラスタにLinkerdをインストールします。
最初に、CRD(Custom Resource Definitions)をクラスタに反映させます。
linkerd install --crds | kubectl apply -f -
下記のCRDが作成されます。
customresourcedefinition.apiextensions.k8s.io/authorizationpolicies.policy.linkerd.io created
customresourcedefinition.apiextensions.k8s.io/httproutes.policy.linkerd.io created
customresourcedefinition.apiextensions.k8s.io/meshtlsauthentications.policy.linkerd.io created
customresourcedefinition.apiextensions.k8s.io/networkauthentications.policy.linkerd.io created
customresourcedefinition.apiextensions.k8s.io/serverauthorizations.policy.linkerd.io created
customresourcedefinition.apiextensions.k8s.io/servers.policy.linkerd.io created
customresourcedefinition.apiextensions.k8s.io/serviceprofiles.linkerd.io created
次にLinkerdのコントロールプレーンをデプロイします。
linkerd install --set proxyInit.runAsRoot=true | kubectl apply -f -
下記のリソースが作成されます。
namespace/linkerd created
clusterrole.rbac.authorization.k8s.io/linkerd-linkerd-identity created
clusterrolebinding.rbac.authorization.k8s.io/linkerd-linkerd-identity created
serviceaccount/linkerd-identity created
clusterrole.rbac.authorization.k8s.io/linkerd-linkerd-destination created
clusterrolebinding.rbac.authorization.k8s.io/linkerd-linkerd-destination created
serviceaccount/linkerd-destination created
secret/linkerd-sp-validator-k8s-tls created
validatingwebhookconfiguration.admissionregistration.k8s.io/linkerd-sp-validator-webhook-config created
secret/linkerd-policy-validator-k8s-tls created
validatingwebhookconfiguration.admissionregistration.k8s.io/linkerd-policy-validator-webhook-config created
clusterrole.rbac.authorization.k8s.io/linkerd-policy created
clusterrolebinding.rbac.authorization.k8s.io/linkerd-destination-policy created
role.rbac.authorization.k8s.io/linkerd-heartbeat created
rolebinding.rbac.authorization.k8s.io/linkerd-heartbeat created
clusterrole.rbac.authorization.k8s.io/linkerd-heartbeat created
clusterrolebinding.rbac.authorization.k8s.io/linkerd-heartbeat created
serviceaccount/linkerd-heartbeat created
clusterrole.rbac.authorization.k8s.io/linkerd-linkerd-proxy-injector created
clusterrolebinding.rbac.authorization.k8s.io/linkerd-linkerd-proxy-injector created
serviceaccount/linkerd-proxy-injector created
secret/linkerd-proxy-injector-k8s-tls created
mutatingwebhookconfiguration.admissionregistration.k8s.io/linkerd-proxy-injector-webhook-config created
configmap/linkerd-config created
secret/linkerd-identity-issuer created
configmap/linkerd-identity-trust-roots created
service/linkerd-identity created
service/linkerd-identity-headless created
deployment.apps/linkerd-identity created
service/linkerd-dst created
service/linkerd-dst-headless created
service/linkerd-sp-validator created
service/linkerd-policy created
service/linkerd-policy-validator created
deployment.apps/linkerd-destination created
cronjob.batch/linkerd-heartbeat created
deployment.apps/linkerd-proxy-injector created
service/linkerd-proxy-injector created
secret/linkerd-config-overrides created
デモアプリのデプロイ
Linkerdの動きを確認するために、Linkerdが用意しているデモアプリをデプロイしてみます。
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/emojivoto.yml \
| kubectl apply -f -
下記のようなアプリがデプロイされました。
❯ kubectl get -n emojivoto svc,deploy,pod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/emoji-svc ClusterIP 10.105.34.106 <none> 8080/TCP,8801/TCP 5m36s
service/voting-svc ClusterIP 10.98.205.168 <none> 8080/TCP,8801/TCP 5m36s
service/web-svc ClusterIP 10.106.210.181 <none> 80/TCP 5m35s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/emoji 1/1 1 1 5m35s
deployment.apps/vote-bot 1/1 1 1 5m35s
deployment.apps/voting 1/1 1 1 5m35s
deployment.apps/web 1/1 1 1 5m34s
NAME READY STATUS RESTARTS AGE
pod/emoji-78594cb998-57rm4 1/1 Running 0 5m35s
pod/vote-bot-786d75cf45-qm8p7 1/1 Running 0 5m35s
pod/voting-5f5b555dff-m7c4h 1/1 Running 0 5m34s
pod/web-68cc8bc689-ljgzm 1/1 Running 0 5m33s
ポートフォワードして、localhost:8080
にアクセスするとアプリケーションを確認できます。
kubectl -n emojivoto port-forward svc/web-svc 8080:80
linkerd-proxyの挿入
linkerd inject
コマンドを使って、Podにlinkerd-proxy
を挿入していきます。
kubectl get -n emojivoto deploy -o yaml \
| linkerd inject - \
| kubectl apply -f -
リソースを確認してみると、各Podのコンテナ数が2になっていることが確認できます。
❯ kubectl get -n emojivoto svc,deploy,pod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/emoji-svc ClusterIP 10.105.34.106 <none> 8080/TCP,8801/TCP 12m
service/voting-svc ClusterIP 10.98.205.168 <none> 8080/TCP,8801/TCP 12m
service/web-svc ClusterIP 10.106.210.181 <none> 80/TCP 12m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/emoji 1/1 1 1 12m
deployment.apps/vote-bot 1/1 1 1 12m
deployment.apps/voting 1/1 1 1 12m
deployment.apps/web 1/1 1 1 12m
NAME READY STATUS RESTARTS AGE
pod/emoji-699d77c79-bn79h 2/2 Running 0 6m3s
pod/vote-bot-b57689ffb-r9p9r 2/2 Running 0 6m2s
pod/voting-55d76f4bcb-bm4nj 2/2 Running 0 6m2s
pod/web-6c54d9554d-wpw2w 2/2 Running 0 6m2s
試しに1つのPodのコンテナを確認すると、アプリケーションのコンテナとlinkerd-proxy
があることが確認できます。
❯ kubectl get -n emojivoto pod emoji-699d77c79-bn79h -o jsonpath="{.spec.containers[*].name}"
linkerd-proxy emoji-svc
ダッシュボードを確認
viz
という拡張をインストールして、ダッシュボードを確認してみます。
linkerd viz install | kubectl apply -f -
下記でダッシュボードを起動できます。
linkerd viz dashboard &
サービスの依存関係や経路などを可視化できます。