k8s-linkerd2入门


操作版本:

[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,multiclusterjaeger. 请参阅扩展 以了解如何安装它们。

安装 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

image-20220628105137114

image-20220628105208922

image-20220628105329702

要安装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

Jaeger贼鸥

您可以在下拉列表中搜索任何服务,然后单击Find Traces。vote-bot是一个很好的开始方式。

Search搜索

单击特定的跟踪将提供所有的细节,您将能够看到每个代理的跨度!

Search搜索

确实有很多linkerd-proxy输出中的跨度。在内部,代理有一个服务器和客户端。当请求通过代理时,它由服务器接收,然后由客户机发出。对于在两个网状pod之间传递的单个请求,总共有4个跨度。当请求遍历该代理时,两个位于源端,当远程代理接收到请求时,两个位于目的端。

与仪表板集成

设置了Linkerd-Jaeger扩展后,由于代理添加了应用程序元数据作为跟踪属性,用户可以通过单击指标表中的Jaeger图标直接从linkerd-web仪表板跳转到相关资源跟踪,如下所示:

Linkerd-Jaeger林克尔德-耶格

要获得该功能,您需要安装(或升级)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

Author: 千里
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source 千里 !
  TOC