操作版本:
[root@k8s-master1 ~]# cat /etc/redhat-release
Rocky Linux release 8.6 (Green Obsidian)
[root@k8s-master1 ~]# linkerd version
Client version: stable-2.11.2
Server version: stable-2.11.2
[root@k8s-master1 ~]# kubectl version --short
Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
Client Version: v1.24.1
Kustomize Version: v4.5.4
Server Version: v1.24.0
Linkerd 官方文档地址: https://linkerd.io/2.11/tasks/installing-multicluster/
安装 Linkerd
在使用 Linkerd 之前,您需要安装 核心控制平面。本页介绍了如何实现这一点,以及您可能遇到的常见问题。
请注意,控制平面通常使用 Linkerd 的 CLI 安装。有关如何将 CLI 安装到本地环境的信息,请参阅 入门。
Linkerd 还包含一些第一方扩展,这些扩展添加了附加功能,即viz
,multicluster
和jaeger
. 请参阅扩展 以了解如何安装它们。
安装 CLI
如果这是您第一次运行 Linkerd
,则需要将 linkerd
命令行界面 (CLI) 下载到本地计算机上。 CLI
将允许您与 Linkerd
部署进行交互。
要手动安装 CLI
,请运行:
curl -fsL https://run.linkerd.io/install | sh
Validating checksum...
Checksum valid.
Linkerd stable-2.11.2 was already downloaded; making it the default 🎉
To force re-downloading, delete '/root/.linkerd2/bin/linkerd-stable-2.11.2' then run me again.
Add the linkerd CLI to your path with:
export PATH=$PATH:/root/.linkerd2/bin
Now run:
linkerd check --pre # validate that Linkerd can be installed
linkerd install | kubectl apply -f - # install the control plane into the 'linkerd' namespace
linkerd check # validate everything worked!
linkerd dashboard # launch the dashboard
Looking for more? Visit https://linkerd.io/2/tasks
Linkerd 2.x 需要运行正常的 Kubernetes 集群。该集群可以托管在云提供商上,也可以通过 Minikube 或 Docker for Desktop 在本地运行。
您可以通过运行验证此 Kubernetes 集群是否为 Linkerd 正确配置
linkerd check --pre
linkerd install | kubectl apply -f -
# rocky linux 此版本bug bug最新解决地址: https://github.com/linkerd/linkerd2/issues/8732
#netfilter框架在内核中支持两种不同的API来进行数据包匹配:iptables和nftables [1].配置路由规则时,链接器proxy-init容器利用了前者。正在…iptables本身被广泛使用,越来越多的发行版已经开始采用更新、更高效的nftables作为默认防火墙。
# 最近,我们开始看到采纳者无法使用我们的proxy-init某些Kubernetes发行版中的容器。例如,这在RHEL的主机中很普遍。这并不罕见proxy-init容器失败,因为它使用的API和内核默认使用的API不匹配。这方面的一个很好的例子可以在以下两个问题中找到:
linkerd install-cni | kubectl apply -f -
linkerd upgrade --linkerd-cni-enabled | kubectl apply -f -
#检查是否安装成功
linkerd check
$ kubectl get pods -A
linkerd-cni linkerd-cni-9r26r 1/1 Running 0 21h
linkerd-cni linkerd-cni-blbqn 1/1 Running 0 21h
linkerd-cni linkerd-cni-kxvkh 1/1 Running 0 21h
linkerd-cni linkerd-cni-t7zzk 1/1 Running 0 21h
linkerd-jaeger collector-76848755b7-7q78k 2/2 Running 0 48m
linkerd-jaeger jaeger-79bffbb987-dc7mh 2/2 Running 0 48m
linkerd-jaeger jaeger-injector-7bdff4dd59-d7vgv 2/2 Running 0 48m
linkerd-viz grafana-5595bcc798-vcl9c 2/2 Running 0 87m
linkerd-viz metrics-api-69d57b76db-nxch7 2/2 Running 0 87m
linkerd-viz prometheus-5db449486f-5jh5j 2/2 Running 0 87m
linkerd-viz tap-d84768c64-fb8mw 2/2 Running 0 31m
linkerd-viz tap-injector-7fcdb7c676-nrcdp 2/2 Running 0 31m
linkerd-viz web-84774ff94d-bqfq9 2/2 Running 0 31m
linkerd linkerd-destination-7db4cfdfdb-vkb5l 4/4 Running 0 90m
linkerd linkerd-identity-776b67d979-qwgmt 2/2 Running 0 90m
linkerd linkerd-proxy-injector-f9dff869-fp28b 2/2 Running 0 90m
metallb-system controller-7476b58756-t6lph 1/1 Running 0 17h
metallb-system speaker-ddmk6 1/1 Running 0 17h
metallb-system speaker-gp48w 1/1 Running 0 17h
metallb-system speaker-qg2gn 1/1 Running 0 17h
metallb-system speaker-ql9v4 1/1 Running 0 17h
暴露dashboard仪表盘
# linkerd暴露dashboard仪表盘官方文档 https://linkerd.io/2.11/tasks/exposing-dashboard/
以下为ingress 配置文件
Exposing the Dashboard
Instead of using linkerd viz dashboard
every time you’d like to see what’s going on, you can expose the dashboard via an ingress. This will also expose Grafana.
Nginx
Nginx with basic auth
A sample ingress definition is:
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: web-ingress-auth
namespace: linkerd-viz
data:
auth: YWRtaW46JGFwcjEkbjdDdTZnSGwkRTQ3b2dmN0NPOE5SWWpFakJPa1dNLgoK
---
# apiVersion: networking.k8s.io/v1beta1 # for k8s < v1.19
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;
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: web-ingress-auth
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
spec:
ingressClassName: nginx
rules:
- host: dashboard.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 8084
This exposes the dashboard at dashboard.example.com
and protects it with basic auth using admin/admin. Take a look at the ingress-nginx documentation for details on how to change the username and password.
cat /etc/hosts
X.X.X.X dashboard.example.com
要安装Linkerd-Jaeger扩展,请运行以下命令:
linkerd jaeger install | kubectl apply -f -
您可以通过运行以下命令来验证Linkerd-Jaeger扩展安装是否正确:
linkerd jaeger check
安装Emojivoto
将emojivoto添加到您的集群中,并用Linkerd代理注入它:
linkerd inject https://run.linkerd.io/emojivoto.yml | kubectl apply -f -
在进入下一步之前,确保一切都已启动并运行kubectl
:
kubectl -n emojivoto rollout status deploy/web
修改应用程序
与服务网格的大多数功能不同,分布式跟踪需要修改应用程序的源代码。跟踪需要某种方式将传入的请求绑定到您的应用程序,并将传出的请求绑定到相关的服务。为此,在每个请求中添加了一些头,其中包含跟踪的唯一ID。Linkerd使用b3传播格式将这些东西联系在一起。
我们已经修改了emojivoto,用这些信息来处理它的请求犯罪展示了这是如何做到的。对于大多数编程语言来说,只需要添加一个客户端库来处理这个问题。Emojivoto使用OpenCensus客户端,但也可以使用其他客户端。
要在emojivoto中启用跟踪,请运行:
kubectl -n emojivoto set env --all deploy OC_AGENT_HOST=collector.linkerd-jaeger:55678
该命令将添加一个环境变量,使应用程序能够传播上下文并发出范围。
探索耶格
随着vote-bot
开始跟踪每个请求,跨度现在应该会显示在耶格。要访问UI,请运行:
linkerd jaeger dashboard
您可以在下拉列表中搜索任何服务,然后单击Find Traces。vote-bot
是一个很好的开始方式。
单击特定的跟踪将提供所有的细节,您将能够看到每个代理的跨度!
确实有很多linkerd-proxy
输出中的跨度。在内部,代理有一个服务器和客户端。当请求通过代理时,它由服务器接收,然后由客户机发出。对于在两个网状pod之间传递的单个请求,总共有4个跨度。当请求遍历该代理时,两个位于源端,当远程代理接收到请求时,两个位于目的端。
与仪表板集成
设置了Linkerd-Jaeger扩展后,由于代理添加了应用程序元数据作为跟踪属性,用户可以通过单击指标表中的Jaeger图标直接从linkerd-web仪表板跳转到相关资源跟踪,如下所示:
要获得该功能,您需要安装(或升级)Linkerd-Viz扩展来指定暴露Jaeger UI的服务。默认情况下,应该是这样的:
linkerd viz install --set jaegerUrl=jaeger.linkerd-jaeger:16686
清除
要进行清理,请运行以下命令卸载Linkerd-Jaeger扩展和emojivoto:
linkerd jaeger uninstall | kubectl delete -f -
kubectl delete ns emojivoto