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

スポンサーリンク

はじめに

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

Linkerdとは

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

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

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

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

【Istio】実際に動かしてざっくり理解するIstio
はじめにIstioとはどんなものなのか実際に使ってみて、ざっくり理解したいと思います。IstioとはIstionとは、サービスメッシュを実装するためのオープンソースです。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 &

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

参考

タイトルとURLをコピーしました