Hands on Linkerd

1、安装

首先搭建 kubernetes 环境,我用的是 Docker Desktop for Mac:

2、安装 linkerd

curl 安装,并将 linkerd 加到 PATH 路径:

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

检查下版本(这里是 statble-2.3.2):

$ linkerd version
Client version: stable-2.3.2
Server version: stable-2.3.2

3、下载镜像

众所周知的原因 gci.io 无法访问,需要另辟蹊径替换镜像地址:

linkerd install | \
    sed -e 's/gcr.io\/linkerd-io\//dylankyc\/gcr.io_linkerd-io_/g' \
    kubectl apply -f -

这里是输出:

namespace/linkerd created
configmap/linkerd-config created
serviceaccount/linkerd-identity created
clusterrole.rbac.authorization.k8s.io/linkerd-linkerd-identity unchanged
clusterrolebinding.rbac.authorization.k8s.io/linkerd-linkerd-identity unchanged
service/linkerd-identity created
secret/linkerd-identity-issuer created
deployment.extensions/linkerd-identity created
serviceaccount/linkerd-controller created
clusterrole.rbac.authorization.k8s.io/linkerd-linkerd-controller unchanged
clusterrolebinding.rbac.authorization.k8s.io/linkerd-linkerd-controller unchanged
service/linkerd-controller-api created
service/linkerd-destination created
deployment.extensions/linkerd-controller created
customresourcedefinition.apiextensions.k8s.io/serviceprofiles.linkerd.io unchanged
serviceaccount/linkerd-web created
service/linkerd-web created
deployment.extensions/linkerd-web created
serviceaccount/linkerd-prometheus created
clusterrole.rbac.authorization.k8s.io/linkerd-linkerd-prometheus unchanged
clusterrolebinding.rbac.authorization.k8s.io/linkerd-linkerd-prometheus unchanged
service/linkerd-prometheus created
deployment.extensions/linkerd-prometheus created
configmap/linkerd-prometheus-config created
serviceaccount/linkerd-grafana created
service/linkerd-grafana created
deployment.extensions/linkerd-grafana created
configmap/linkerd-grafana-config created
serviceaccount/linkerd-sp-validator created
clusterrole.rbac.authorization.k8s.io/linkerd-linkerd-sp-validator unchanged
clusterrolebinding.rbac.authorization.k8s.io/linkerd-linkerd-sp-validator configured
service/linkerd-sp-validator created
deployment.extensions/linkerd-sp-validator created

或者你也先将 linkerd install 输出的 yaml 保存起来:

linkerd install > linkerd.yaml
# replace gcr.io image with docker hub; for linux, replace `sed -i ""` with  `sed -i`
sed -i "" -e 's/gcr.io\/linkerd-io\//dylankyc\/gcr.io_linkerd-io_/g' linkerd.yaml

再通过 kubectl 安装:

kubectl apply -f linkerd.yaml

喝杯咖啡之后 linkerd 就安装完成了,如果不行就两杯。

4、开启 dashboard

linkerd dashboard &

默认会随机分配一个端口如 50750,打开 http://127.0.0.1:50750/overview,通过 dashboard 可以探索 linkerd mesh 内部组件。

5、安装示例工程 emojivoto

curl -sL https://run.linkerd.io/emojivoto.yml | kubectl apply -f -

将容器 80 端口转发到本地 8080,这样通过 localhost:8080 就能访问 emojivoto 服务了。

kubectl -n emojivoto port-forward svc/web-svc 8080:80 &

由于通过 kubectl 安装,此时没有注入 linkerd sidecar,所以 Meshed 显示 0/1。

6、注入 linkerd 到 emojivoto

kubectl get -n emojivoto deploy -o yaml \
| linkerd inject - \
| kubectl apply -f -

注入 linkerd 的 deployment 在 dashboard 上可以查看到显示为 Meshed

注入 linkderd 需要操纵的是 deployment,如:

linkerd inject deployment.yml \
| kubectl apply -f -

它会把 linkerd 作为 sidecar inject 到 pod 里,并配置 iptables。

$ kubectl get -n emojivoto deploy -o yaml | linkerd inject - | kubectl apply -f -

deployment "emoji" injected
deployment "vote-bot" injected
deployment "voting" injected
deployment "web" injected

deployment.extensions/emoji configured
deployment.extensions/vote-bot configured
deployment.extensions/voting configured
deployment.extensions/web configured

7、通过 grafana 查看监控

访问 emojivoto 几次,可以在 grafana 面板 http://127.0.0.1:50750/grafana 查看到服务的历史数据,如 Success rate, Request rate, Latency distribution percentiles 等。

8、调试

为了演示,demo 故意在代码里埋了一些错误。

点开 deployment/web,可以看到 deploy/web 接收 deploy/vote-bot 请求,同时也会给 deploy/emojideploy/voting 发送请求。

TODO:

但是值得注意的是,deploy/vote-botdeploy/voting 的成功率都不是 100%,由于 deploy/vote-bot 调用 deploy/web 进而调用 deploy/voting, 还可以看出,对 web 而言,deploy/vote-bot (对应 PATH /api/vote)是入口,而 deploy/voting (对应 PATH /emojivoto.v1.VotingService/VoteDoughnut)是出口,我们可以猜想错误因 deploy/voting 而起。

我们还可以点击 tap,通过查看只针对这一接口 /emojivoto.v1.VotingService/VoteDoughnut 的请求来进一步定位错误。

通过图中 Unknown 的消息及 grpc 针对 Unknown code 的说明文档(https://godoc.org/google.golang.org/grpc/codes#Code),可知这个接口有异常。

我们还可以通过查看代码来验证:https://github.com/BuoyantIO/emojivoto/blob/master/emojivoto-voting-svc/api/api.go#L22,我们可以看到 doughnut(甜甜圈)那里报错了,从而定位坑。

Refs

https://linkerd.io/2/tasks/debugging-your-service/