Linkerd 2.0をProxy環境下で試してみた

[Linkerd 2.0](https://linkerd.io/2/overview/)がリリースされたみたいですね。
1.0と比べてより軽量かつ高速になったそうです。
またmTLSもサポートということで[Istio](https://istio.io/)(※後述)と機能的に似てきました。
(さてさて、今後どちらがメジャーになっていくのか・・・)

この記事ではプロキシ環境下でのインストール時のメモと使ってみた所感について書きます。

# Linkerdとは？
Cloud Native Computing Foundation(CNCF)のプロジェクトの一つでサービスメッシュ技術です。
マイクロサービスアーキテクチャを採用する際にはなくてはならない技術ではないのかなと個人的に思っています。

### サービスメッシュとは？
マイクロサービスアーキテクチャにおいて問題となる点を解決するための技術です。
例えば自分がつなげたいサービスはどこにあるのか(サービスディスカバリー)や、複数あった場合のロードバランシング、アクセス過多になった場合シャットアウトする(サーキットブレーカー)ようなことをします。
※この記事ではサービスメッシュの詳細には踏み込まないので、詳しくは参考サイトをご覧ください。

#### 参考サイト
- https://qiita.com/rerorero/items/0eea0e02955950dd85fc
- https://qiita.com/hirofumimatsu/items/5f8193c2c4a10c509466

### 類似ツール(Istio)
似たようなツールとして[Istio](https://istio.io/)というものがあります。
下のほうにIstioとの比較表も書いてみました。
単純に言うとIstioはLinkerdより高機能だが複雑で大変、UIが現状ないって感じです。

# インストール
公式ページ([https://linkerd.io/2/getting-started/](https://linkerd.io/2/getting-started/))を参考にインストールしていきます。

- linkerdのcliをインストール

```
curl -sL https://run.linkerd.io/install | sh
export PATH=$PATH:$HOME/.linkerd2/bin

linkerd version
```

- linkerd cliを使ってcontrol planeを作成  
`linkerd install`コマンドでkubernetesにデプロイするためのyamlを作成するのですが、公式ページのインストール方法はkubernetesのlocal proxyを使う(kubectl proxyみたいな感じ)のでProxy環境下ではそのまま使えません。  
そこでkubernetesにデプロイするためのyamlファイルを少し編集します。  
※ただしこの方法ではgrafana dashboardにアクセスできなくなります。(プログラムの修正が必要っぽい・・・)

```
linkerd install > linkerd.yaml
vim linkerd.yaml
  ※下のlinkerd.yamlを参考に編集してください。
kubectl apply -f linkerd.yaml
```

```linkerd.yaml
# ...(省略)
--- # (297行目付近)
kind: Service
apiVersion: v1
metadata:
  name: web
  namespace: linkerd
  labels:
    linkerd.io/control-plane-component: web
  annotations:
    linkerd.io/created-by: linkerd/cli stable-2.0.0
spec:
  type: NodePort # NodePortでアクセスできるように変更
  selector:
    linkerd.io/control-plane-component: web
  ports:
  - name: http
    port: 8084
    targetPort: 8084
    nodePort: 31000 # とりあえず31000ポートを使用
  - name: admin-http
    port: 9994
    targetPort: 9994
---
# ...(省略)
```

- dashboardにアクセス  
  ブラウザから以下のURLにアクセスしてください。  
  [http://\<your-server-ip\>:31000](http://localhost:31000)
- アプリをデプロイ  
  アプリをデプロイするためのkubernetesのyamlファイルを用意し、linkerd injectコマンドでlinkerd用のannotesions等を挿入後、デプロイします。

```
wget https://github.com/microservices-demo/microservices-demo/raw/master/deploy/kubernetes/complete-demo.yaml
kubectl create ns sock-shop
linkerd inject complete-demo.yaml | kubectl apply -f -
```

# Istioと比較した結果
類似ツールのIstioと比較した結果です。
!!!!!!!!!!!!!!!!!!!あくまでも私個人の感想なので、一意見としてお考え下さい!!!!!!!!!!!!!!!!!!!

|        機能         |            Linerd                 |                Istio                 |
|:--------------------|:----------------------------------|:------------------------------------|
| UI                  |◎(シンプルでいい感じ)             |×(そもそもない)                      |
| インストール        |○(簡単だけどproxy環境だと編集必要)|△(コンポーネントがたくさんあって大変)|
| セキュリティ        |△(ちょっと物足りない)             |◎(mTLS,RBACなど高機能)               |
| pluggable？         |×(他ツールとの連携が微妙)         |○(jaegerなどと連携可)                |
| アクセス制御        |×(できない)                       |○(yamlできめ細かく制御可能)          |
| サービス通信の可視化|○(Tap,Top,Service meshが見やすい) |△(servicegraphがあるけど・・・)      |

# 使ってみた感想
UIはかっこよかったです！そしてシンプルでわかりやすかった:smile:
また、TapやTop機能など可視化機能は非常に充実していて分析等に便利だなぁという印象です。
そして、all-in-oneで簡単にインストールできるのですぐに使えました！

ただ、Istioのようにアクセス制御や流動制御ができなかったので、もうちょっと頑張ってほしいなぁって感じです。
また、セキュリティに関してもmTLS(相互TLS)がexperimentalで導入されているだけでIstioと比べるとどうしても劣ってしまうので少し残念でした。

とはいっても、今後どんどん良くなっていきそうなので今後に期待です。