概述

虽然对 Linkerd 已经闻其名很久的,也大概了解了一些它的架构,但还真是没有尝试一下,主要是它之前的版本着实不易用,但是据说第二版改了很多,所以最近就跟着别人的视频玩了一下,顺便水一篇。

环境准备

安装 Kind

使用的环境是 Ubuntu:

  1. [root@liqiang.io]# curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64
  2. [root@liqiang.io]# chmod +x ./kind
  3. [root@liqiang.io]# mv ./kind /usr/local/bin/kind

创建集群

  1. [root@liqiang.io]# kind create cluster
  2. [root@liqiang.io]# kind create cluster --name linkerd --image kindest/node:v1.19.1
  3. [root@liqiang.io]# kind get clusters
  4. kind
  5. linkerd

添加本地 DNS 记录

  1. [root@liqiang.io]# sudo echo "127.0.0.1 servicemesh.demo" >> /etc/hosts

部署测试应用

  1. [root@liqiang.io]# git clone https://github.com/marcel-dempers/docker-development-youtube-series.git
  2. [root@liqiang.io]# echo "create nginx ingress"
  3. [root@liqiang.io]# kubectl create ns ingress-nginx
  4. [root@liqiang.io]# kubectl apply -f kubernetes/servicemesh/applications/ingress-nginx/
  5. [root@liqiang.io]# echo "create applications"
  6. [root@liqiang.io]# kubectl apply -f kubernetes/servicemesh/applications/playlists-api/
  7. [root@liqiang.io]# kubectl apply -f kubernetes/servicemesh/applications/playlists-db/
  8. [root@liqiang.io]# kubectl apply -f kubernetes/servicemesh/applications/videos-web/
  9. [root@liqiang.io]# kubectl apply -f kubernetes/servicemesh/applications/videos-api/
  10. [root@liqiang.io]# kubectl apply -f kubernetes/servicemesh/applications/videos-db/

访问测试应用,打开本地的浏览器,输入:http://servicemesh.demo/home/,应该看到这个页面:

图 0:测试应用页面

部署 Linkerd

这里我按照别人的视频操作选择了一个 Docker 容器,在容器内操作:

  1. [root@liqiang.io]# docker run -it --rm -v ${HOME}:/root/ -v ${PWD}:/work -w /work --net host alpine:3.12 sh
  2. /work # echo "现在进入到容器内部了"
  3. /work # apk add --no-cache curl nano
  4. /work # curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
  5. /work # chmod +x ./kubectl
  6. /work # mv ./kubectl /usr/local/bin/kubectl
  7. /work # export KUBE_EDITOR="nano"
  8. /work # kubectl get nodes
  9. NAME STATUS ROLES AGE VERSION
  10. linkerd-control-plane Ready master 127m v1.19.1

安装 Linkerd Cli:

  1. /work # curl -L -o linkerd https://github.com/linkerd/linkerd2/releases/download/edge-20.10.1/linkerd2-cli-edge-20.10.1-linux-amd64
  2. /work # chmod +x linkerd && mv ./linkerd /usr/local/bin/
  3. /work # linkerd check --pre

应该看到的是一片 ✅ 就对了,最后有一点小 Warning,还有这里的结果是 ❎,因为我是在安装之后才执行的,所以请忽略它:

图 1:Precheck

安装 Linkerd

  1. [root@liqiang.io]# linkerd install > ./kubernetes/servicemesh/linkerd/manifest/linkerd-edge-20.10.1.yaml
  2. [root@liqiang.io]# kubectl apply -f ./kubernetes/servicemesh/linkerd/manifest/linkerd-edge-20.10.1.yaml
  3. [root@liqiang.io]# linkerd check

再检查一遍,应该此时就是正常的了:

图 2:PostCheck

查看 Dashboard

  1. [root@liqiang.io]# kubectl -n linkerd port-forward svc/linkerd-web 8084

如果你是远程机器的话,因为 Linkerd 设置了 Host 过滤,所以你可能需要代理一下(不能麻烦的话):

  1. [root@liqiang.io]# ssh -L 8084:127.0.0.1:8084 <host-ip>

然后访问 http://127.0.0.1:8084/namespaces 就可以看到这个界面了:

图 3:Linkerd Dashboard

到此,只是将 Linkerd 的架子打起来,其实还没有使用到 Linkerd 的功能,下面开始正式注入 Linkerd,Linkerd 和 Istio 一样,都是通过注入 Sidecar 的方式实现,所以这个没啥差异。

Linkerd 使用

注入 Sidecar

这一步,就开始给所有的 Service 注入 Linkerd 的 sidecar,然后我们再来看看 Dashboard 中会显示什么内容,如果不注入 Sidecar 的话,什么内容都不会显示:

  1. [root@liqiang.io]# kubectl get deploy playlists-api -o yaml | linkerd inject - | kubectl apply -f -
  2. [root@liqiang.io]# kubectl get deploy playlists-db -o yaml | linkerd inject - | kubectl apply -f -
  3. [root@liqiang.io]# kubectl get deploy videos-api -o yaml | linkerd inject - | kubectl apply -f -
  4. [root@liqiang.io]# kubectl get deploy videos-db -o yaml | linkerd inject - | kubectl apply -f -
  5. [root@liqiang.io]# kubectl get deploy videos-web -o yaml | linkerd inject - | kubectl apply -f -
  6. [root@liqiang.io]# kubectl -n ingress-nginx get deploy nginx-ingress-controller -o yaml | linkerd inject - | kubectl apply -f -

然后打开 Dashboard:

图 4:Dashboard 数据

可以看到这些 Meshed 的 Pod 会有一些成功率以及延迟的一些数据,这就表示 Sidecar 开始工作了。这个 Dashboard 其实也没多少内容,点击一个 Metric 之后你可以看到一个调用链的图,除此之外没有太多其他的东西:

图 5:调用链

监测流量

这个 Dashboard 用来监测流量,例如你发现一个 API 异常之后,你可以通过这个监测面板查看 API 的状态,从而定位异常,解决异常:

图 6:流量监测

小结

本文大概就这么多内容,主要都还是参照这个视频(Introduction to Linkerd for beginners | a Service Mesh)来的,其实还是主要学习了一下如何使用 Linkerd,但是对于一些特性还没有来得及体会,接下来会继续水。