记录linkerd的安装和使用
安装
设置
我们可以通过在本地安装一个 Linkerd 的 CLI 命令行工具,通过该 CLI 可以将 Linkerd 的控制平面安装到 Kubernetes 集群上。
所以首先需要在本地运行 kubectl 命令,确保可以访问一个可用的 Kubernetes 集群,如果没有集群,可以使用 KinD 在本地快速创建一个。
1
2
3
|
$ kubectl version --short
Client Version: v1.23.5
Server Version: v1.22.8
|
安装CLI
如果这是第一次运行 Linkerd,则需要将 linkerdCLI 下载到本地计算机上。CLI 将允许你与 Linkerd 部署进行交互。
要手动安装 CLI,请运行:
1
|
$ curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh
|
请务必按照说明将其添加到你的路径中。
(或者,如果你使用Homebrew,你可以使用 安装 CLI brew install linkerd。你也可以直接通过 Linkerd 发布页面下载 CLI 。)
安装后使用下面的命令可以验证 CLI 工具是否安装成功:
1
2
3
4
|
$ linkerd version
Client version: stable-2.11.4
Server version: unavailable
|
可以看到 CLI 版本,以及Server version: unavailable,这是因为我们还没有在 Kubernetes 集群上安装控制平面造成的
验证集群
Kubernetes 集群可以通过多种不同的方式进行配置。在我们安装 Linkerd 控制平面之前,我们需要检查并验证所有配置是否正确。要检查集群是否已准备好安装 Linkerd,请运行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
$ linkerd check --pre
Linkerd core checks
===================
kubernetes-api
--------------
√ can initialize the client
√ can query the Kubernetes API
kubernetes-version
------------------
√ is running the minimum Kubernetes API version
√ is running the minimum kubectl version
pre-kubernetes-setup
--------------------
√ control plane namespace does not already exist
√ can create non-namespaced resources
√ can create ServiceAccounts
√ can create Services
√ can create Deployments
√ can create CronJobs
√ can create ConfigMaps
√ can create Secrets
√ can read Secrets
√ can read extension-apiserver-authentication configmap
√ no clock skew detected
linkerd-version
---------------
√ can determine the latest version
‼ cli is up-to-date
is running version 2.11.4 but the latest stable version is 2.11.5
see https://linkerd.io/2.11/checks/#l5d-version-cli for hints
Status check results are √
|
将控制平面安装到集群上
如果一切检查都 OK 则可以开始安装 Linkerd 的控制平面了,直接执行下面的命令即可一键安装:
1
|
$ linkerd install | kubectl apply -f -
|
在此命令中,linkerd install 会生成一个 Kubernetes 资源清单文件,其中包含所有必要的控制平面资源,然后使用 kubectl apply 命令即可将其安装到 Kubernetes 集群中。
可以看到会将 Linkerd 控制面安装到一个名为 linkerd 的命名空间之下,安装完成后会有如下几个 Pod 运行:
1
2
3
4
5
|
$ kubectl get pods -n linkerd
NAME READY STATUS RESTARTS AGE
linkerd-destination-57bb7d556c-ms8tj 4/4 Running 0 14m
linkerd-identity-7cddf5b97d-wxltl 2/2 Running 0 14m
linkerd-proxy-injector-5d9875787f-nsxwh 2/2 Running 0 14m
|
安装完成后通过运行以下命令等待控制平面准备就绪,并可以验证安装结果是否正常:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
$ linkerd check
......
linkerd-control-plane-proxy
---------------------------
√ control plane proxies are healthy
‼ control plane proxies are up-to-date
some proxies are not running the current version:
* linkerd-destination-57bb7d556c-ms8tj (stable-2.11.4)
* linkerd-identity-7cddf5b97d-wxltl (stable-2.11.4)
* linkerd-proxy-injector-5d9875787f-nsxwh (stable-2.11.4)
see https://linkerd.io/2.11/checks/#l5d-cp-proxy-version for hints
√ control plane proxies and cli versions match
Status check results are √
|
helm方式
除了使用 CLI 工具的方式安装控制平面之外,我们也可以通过 Helm Chart 的方式来安装,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
|
$ helm repo add linkerd https://helm.linkerd.io/stable
# set expiry date one year from now, in Mac:
$ exp=$(date -v+8760H +"%Y-%m-%dT%H:%M:%SZ")
# in Linux:
$exp=$(date -d '+8760 hour' +"%Y-%m-%dT%H:%M:%SZ")
$ helm install linkerd2 \
--set-file identityTrustAnchorsPEM=ca.crt \
--set-file identity.issuer.tls.crtPEM=issuer.crt \
--set-file identity.issuer.tls.keyPEM=issuer.key \
--set identity.issuer.crtExpiry=$exp \
linkerd/linkerd2
|
此外该 chart 包含一个 values-ha.yaml 文件, 它覆盖了一些默认值,以便在高可用性场景下进行设置, 类似于 linkerd install 中的 --ha 选项。我们可以通过获取 chart 文件来获得 values-ha.yaml:
1
|
$ helm fetch --untar linkerd/linkerd2
|
然后使用 -f flag 提供覆盖文件,例如:
1
2
3
4
5
6
7
8
|
## see above on how to set $exp
helm install linkerd2 \
--set-file identityTrustAnchorsPEM=ca.crt \
--set-file identity.issuer.tls.crtPEM=issuer.crt \
--set-file identity.issuer.tls.keyPEM=issuer.key \
--set identity.issuer.crtExpiry=$exp \
-f linkerd2/values-ha.yaml \
linkerd/linkerd2
|
采用哪种方式进行安装均可,到这里我们现在就完成了 Linkerd 的安装,重新执行 linkerd version 命令就可以看到 Server 端版本信息了:
1
2
3
|
$ linkerd version
Client version: stable-2.11.4
Server version: stable-2.11.4
|
示例
示例安装
接下来我们安装一个简单的示例应用 Emojivoto,该应用是一个简单的独立 Kubernetes 应用程序,它混合使用 gRPC 和 HTTP 调用,允许用户对他们最喜欢的表情符号进行投票。
通过运行以下命令可以将 Emojivoto 安装到 emojivoto 命名空间中:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$ curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/emojivoto.yml | kubectl apply -f -
namespace/emojivoto created
serviceaccount/emoji created
serviceaccount/voting created
serviceaccount/web created
service/emoji-svc created
service/voting-svc created
service/web-svc created
deployment.apps/emoji created
deployment.apps/vote-bot created
deployment.apps/voting created
deployment.apps/web created
|
该应用下可以看到一共包含 4 个 Pod 服务。
1
2
3
4
5
6
7
8
9
10
11
12
|
$ kubectl get pods -n emojivoto
NAME READY STATUS RESTARTS AGE
emoji-66ccdb4d86-s87z6 1/1 Running 0 81s
vote-bot-69754c864f-gdmkb 1/1 Running 0 81s
voting-f999bd4d7-pdpnw 1/1 Running 0 81s
web-79469b946f-9d88z 1/1 Running 0 81s
$ kubectl get svc -n emojivoto
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
emoji-svc ClusterIP 10.68.40.67 <none> 8080/TCP,8801/TCP 89s
voting-svc ClusterIP 10.68.56.23 <none> 8080/TCP,8801/TCP 89s
web-svc ClusterIP 10.68.210.35 <none> 80/TCP 89s
|
我们可以通过 port-forward 来暴露 web-svc 服务,然后便可在浏览器中访问该应用。
1
|
$ kubectl -n emojivoto port-forward svc/web-svc 8080:80
|
现在我们可以在浏览器通过 http://localhost:8080 访问 Emojivoto 应用了。

我们可以选择页面中喜欢的表情进行投票,但是选择某些表情后会出现一些错误,比如当我们点击甜甜圈表情符号的时候会得到一个 404 页面。

不过不用担心,这是应用中故意留下的错误,为的是后面使用 Linkerd 来识别该问题。
加入Service Mesh中
接下来我们可以将上面的示例应用加入到 Service Mesh 中来,向其添加 Linkerd 的数据平面代理,直接运行下面的命令即可将 Emojivoto 应用网格化:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$ 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.apps/emoji configured
deployment.apps/vote-bot configured
deployment.apps/voting configured
deployment.apps/web configured
|
上面的命令首先获取在 emojivoto 命名空间中运行的所有 Deployments,然后通过 linkerd inject 运行它们的清单,然后将其重新应用到集群。
注意 linkerd inject 命令只是在 Pod 规范中添加一个 linkerd.io/inject: enabled 的注解,并不会直接注入一个 Sidecar 容器,该注解即可指示 Linkerd 在创建 Pod 时将代理注入到其中,所以执行上面的命令后应用 Pod 中会新增一个 sidecar 的代理容器。
1
2
3
4
5
6
|
$ kubectl get pods -n emojivoto
NAME READY STATUS RESTARTS AGE
emoji-696d9d8f95-xhcnq 2/2 Running 0 3m13s
vote-bot-6d7677bb68-wvrnf 2/2 Running 0 3m13s
voting-ff4c54b8d-5jj96 2/2 Running 0 3m13s
web-5f86686c4d-57xcj 2/2 Running 0 3m13s
|
可以看到每个 Pod 现在都有 2 个容器,相较于之前多了一个 Linkerd 的 sidecar 代理容器。
检查数据平面状态
当应用更新完成后,我们就成功将应用引入到 Linkerd 的网格服务中来了,新增的代理容器组成了数据平面,我们也可以通过下面的命令检查数据平面状态:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
$ linkerd -n emojivoto check --proxy
......
linkerd-data-plane
------------------
√ data plane namespace exists
√ data plane proxies are ready
‼ data plane is up-to-date
some proxies are not running the current version:
* emoji-696d9d8f95-xhcnq (stable-2.11.4)
* vote-bot-6d7677bb68-wvrnf (stable-2.11.4)
* voting-ff4c54b8d-5jj96 (stable-2.11.4)
* web-5f86686c4d-57xcj (stable-2.11.4)
see https://linkerd.io/2.11/checks/#l5d-data-plane-version for hints
√ data plane and cli versions match
√ data plane pod labels are configured correctly
√ data plane service labels are configured correctly
√ data plane service annotations are configured correctly
√ opaque ports are properly annotated
Status check results are √
|
安装viz插件
我们可以通过 Linkerd 去查看应用实际上做了哪些事情,但是我们需要去单独安装一个插件,由于 Linkerd 的核心控制平面非常轻量级, 所以 Linkerd 附带了一些插件,这些插件为 Linkerd 添加了一些非关键但通常有用的功能,包括各种仪表板,比如我们可以安装一个 viz 插件,Linkerd-Viz 插件包含 Linkerd 的可观察性和可视化组件。安装命令如下所示:
1
|
$ linkerd viz install | kubectl apply -f -
|
上面的命令会创建一个名为 linkerd-viz 的命名空间,会在该命名空间中安装监控相关的应用,比如 Prometheus、Grafana 等。
1
2
3
4
5
6
7
8
|
$ kubectl get pods -n linkerd-viz
NAME READY STATUS RESTARTS AGE
grafana-db56d7cb4-lj7jf 2/2 Running 0 12m
metrics-api-595c7b564-8f6t6 2/2 Running 0 12m
prometheus-5d4dffff55-brpq5 1/2 Running 0 12m
tap-68c7fbb8cf-cw62v 2/2 Running 0 12m
tap-injector-7d97b9d57f-tdntv 2/2 Running 0 12m
web-6b6f65dbc7-gcqft 2/2 Running 0 12m
|
安装完成后,我们可以使用下面的命令打开一个 dashboard 页面:
1
|
$ linkerd viz dashboard &
|
当 viz 插件部署完成后,执行上面的命令后会自动在浏览器中打开一个 Linkerd 的可观察性的 Dashboard。
此外我们也可以通过 Ingress 来暴露 viz 服务,创建如下所示的资源对象:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
namespace: linkerd-viz
annotations:
nginx.ingress.kubernetes.io/upstream-vhost: $service_name.$namespace.svc.cluster.local:8084
nginx.ingress.kubernetes.io/configuration-snippet: |
proxy_set_header Origin "";
proxy_hide_header l5d-remote-ip;
proxy_hide_header l5d-server-id;
spec:
ingressClassName: nginx
rules:
- host: xxxx.xxx.xxx # 你自己的域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 8084
|
应用之后就可以使用对应的域名去访问viz了

在对应的资源后面包含一个grafana的图标,点击就可以自动跳转到grafana的监控页面。还有其他各种功能等后面在研究