【Linkerd】実際に動かしてざっくり理解するLinkerd
はじめに
Linkerdとはどんなものなのか実際に触ってみて、ざっくり理解したいと思います。
Linkerdとは
Linkerdとは、Kubernetes向けのサービスメッシュを実装するためのオープンソースです。
Linkerdは、アプリケーションに変更を加えることなく、セキュリティや監視、信頼性などに関する機能を追加することができます。
似たサービスメッシュとして、Istioもありますが、Linkerdはより軽量でシンプルだそうです。
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 &
サービスの依存関係や経路などを可視化できます。
参考
- Getting Started | Linkerd
- Frequently Asked Questions | Linkerd
- linkerd/linkerd2: Ultralight, security-first service mesh for Kubernetes. Main repo for Linkerd 2.x.
- Graduated and Incubating Projects | Cloud Native Computing Foundation
- Architecture | Linkerd