Linkerd2入门

Linkerd2入门,第1张

目录
    • 1. 引言
    • 2. Linkerd入门
      • 2.1 安装Linkerd CLI(Command Line Interface)工具
      • 2.2 安装Linkerd控制平面Control Plane
      • 2.3 安装示例程序
      • 2.4 将示例程序加入到Linkerd服务网格(即注入linkerd-proxy)
      • 2.5 安装Linkerd扩展viz
      • 2.6 使用Linkerd viz Dashboard调试HTTP/GRPC请求

1. 引言

随着单个服务的代码库越来越大(提交冲突、维护困难)、服务逻辑越来越复杂、单体服务性能出现瓶颈(分布式、功能拆分重点优化)以及开发团队的日益壮大(部门拆分、职能分工),我们将服务进行拆分进行微服务化管理。但是微服务化后也加重了服务部署、监控、运维的难度,例如使用Spring Cloud框架会将微服务管理的功能引入到业务代码中,增加了应用的集成、开发难度,且具有一定学习难度。而随着K8S以及Service Mesh的兴起,引入Sidecar代理的方式(不侵入代码、应用无感知)来接管微服务管理的功能,带来了更便捷的微服务接入方式,使得开发人员仅需关注核心业务逻辑开发,而由架构和运维人员统一制定Service Mesh管理策略。但Servie Mesh也不是万能药水,由于额外引入了Sidecar代理(A -> proxy for A -> proxy for B -> B)所以资源消耗(CPU、内存)、请求延时均有所增加,所以要考虑清楚是否真的需要Service Mesh(取舍)。

记得当初团队决定接入Istio,是建立在:

  • 团队技术栈由Spring刚升级到SpringBoot(并无实际落地SpringCloud的经验)
  • 对服务路由编排有要求(例如服务编号s257到具体服务的映射)
  • 服务间请求调用采用HTTP + JSON
  • Pass平台决定升级K8S
  • 开发语言包括Java、Python、Nodejs等

在上述场景下,借助Istio应该是成本最小的微服务升级:

  • 建立在K8s之上
  • 不侵入代码(后续服务追踪需透传tracing相关请求头)且语言无关(开发人员无感)
  • 丰富的流量路由策略(VirtualService、Destination、Gateway)

由于Service Mesh(无论Istio还是本文介绍的Linkerd)是具有一定难度和门槛的,所以要充分考虑好团队是否真正需要接入Service Mesh:

  • 如已全栈接入Spring Cloud(功能比Service Mesh更强大),则可优先使用SpringCloud相关模块解决问题(但相比起侵入代码的微服务框架我更看好Service Mesh的前景)。
  • Service Mesh需配合K8S使用(通过K8S可以方便的部署服务及其Sidecar代理)
  • 目前Service Mesh对HTTP/1.1、 HTTP/2、gRPC支持的较为完善,其他RPC协议还有待完善,所以团队若使用其他RPC目前并不适合接入ServiceMesh。
  • 关于代理的形式Sidecar(每个Pod内注入代理)、Per-node(每个K8s节点注入代理)、Per-service-account、eBPF还有待观望(目前Istio、Linkerd均使用Sidecar模式,且Linker1.x由最初的Per-node模式调整为Linker2.x的Sidecar模式)。
  • 如果对安全要求较高,如需集群内服务均采用TLS或mTLS加密通信,则可考虑Service Mesh无侵入全栈升级TLS。
  • 如全栈无侵入接入OAuth2协议,服务作为Resource Sever(借助Istio RequestAuthentication、AuthorizationPolicy)。
  • 以较小侵入(如透传tracing相关请求头)集成分布式服务追踪(HTTP、GRPC)、请求监控。
  • 有灰度发布的需求(如按比例、用户拆分流量等)

由于之前有过使用Istio的经验(上手较难、配置比较多),现在同样想对Linkerd2进行了解,所以有了本次的Linkerd快速上手。
Linkerd相较于Istio,官方号称其更轻量级、更简单,且其代理实现linkerd-proxy(Rust编写)相较于Istio Envoy(C++编写)实现在资源消耗、性能上提升近乎10倍,但目前支持的功能不如Istio丰富,且其采用和Istio类似的数据平面Data Plane(由linkerd-proxy组成)、控制平面Controll Plane的架构,如下图:

关于Linkerd架构的详细说明可参见:
https://linkerd.io/2.11/reference/architecture/

2. Linkerd入门

基础环境:

VirtualBox Ubuntu 20.04.3-live-server
IP: 192.168.3.120
Kubephere All-in-One V3.2.0
Kubernetes v1.21.5

可通过如下命令查看K8s版本:

kubectl version --short

2.1 安装Linkerd CLI(Command Line Interface)工具

可直接通过官方提供的脚本进行安装:

curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh

注:
可通过curl --proto ‘=https’ --tlsv1.2 -sSfL https://run.linkerd.io/install查看脚本内容,
具体脚本内容可参见:https://gitee.com/luoex/linkerd-install/blob/master/get-started/linkerd-cli.install

安装过程如下图:

在Github下载https://github.com/linkerd/linkerd2/releases/download/stable-2.11.2/linkerd2-cli-stable-2.11.2-linux-amd64 ,
总共44.7M花了半个小时😭

安装完成后按照提示将linkerd工具添加到PATH路径:

export PATH=$PATH:/root/.linkerd2/bin

之后即可使用linkerd命令行工具,如查看linkerd版本:

linkerd version

亦可直接到GitHub linkerd2 releases直接下载:

2.2 安装Linkerd控制平面Control Plane

即通过Linker CLI工具将Linkerd控制平面安装到对应的K8S集群中,
首先校验当前K8s集群是否满足安装要求,

linkerd check --pre


若校验未通过,需要按照提示修复相关问题后才可安装linkerd控制平面。
根据上图提示,可通过如下命令查看安装Linkerd控制平面到K8s的相关资源:

linkerd install --set proxyInit.runAsRoot=true

具体资源定义可参见:https://gitee.com/luoex/linkerd-install/blob/master/get-started/linkerd-controll-plane.install

可直接通过如下命令安装linkerd控制平面到K8S:

linkerd install --set proxyInit.runAsRoot=true | kubectl apply -f -

2.3 安装示例程序

示例程序是一个为喜欢的Emoji表情进行投票的应用,并可以查看Emoji的投票数。

curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/emojivoto.yml | kubectl apply -f -

注:
可通过curl --proto ‘=https’ --tlsv1.2 -sSfL https://run.linkerd.io/emojivoto.yml查看具体示例程序K8s资源定义,
资源定义可参见:https://gitee.com/luoex/linkerd-install/blob/master/get-started/emojivoto.yml

进入Kubesphere管理界面中emojivoto项目(即对应K8s Namespace)中即可查看对应的示例程序资源,如下图:

修改K8s Service web-svc其外部访问模式为NodePort:


如下图即为修改后的web-svc服务对应的Node访问端口,即30225。

通过K8s集群任一节点的IP加上上述NodePort值即可访问对应的web-svc服务,
http://192.168.3.120:30225

如下为投票界面,点击任一喜欢的表情即可进行投票,亦可通过View the leaderboard查看表情的投票排行榜。

如下为投票排行榜页面:

2.4 将示例程序加入到Linkerd服务网格(即注入linkerd-proxy)

如上安装完成后,emojivoto应用还需进行如下 *** 作将Linkerd数据平面Data Plaine对应的代理proxy注入到对应的Deployment中后才算真正的加入到Linkerd服务网格的管理中。

# 查询所有emojivot命名空间下的的Deployment资源,
# 修改Deployment注入Linkerd代理。
kubectl get -n emojivoto deploy -o yaml \
  | linkerd inject - \
  | kubectl apply -f -

注:
可通过kubectl get -n emojivoto deploy -o yaml | linkerd inject - 查看注入proxy后的Deloyment,
注入后的Deployment资源文件参见:https://gitee.com/luoex/linkerd-install/blob/master/get-started/emojivoto-inject.yml

除了通过linkerd inject命令,还可以直接修改K8s中namespace、deployment、pod的annotation linkerd.io/inject: enabled | disabled来开启或关闭linkerd-proxy的注入(linkerd inject命令也是向对应资源添加该注解)。

注入完成后,可查看Deployment对应的Pod容器,如下图已自动注入linkerd-init初始化容器和linkerd-proxy代理:

2.5 安装Linkerd扩展viz

linkerd的核心控制平面非常小,所以Linkerd提供了一些非关键的但是常用功能的扩展组件,包含各种dashboard,例如安装viz扩展(指标栈、仪表板)。

linkerd viz install | kubectl apply -f - 

执行命令后可以进入linkerd-viz命名空间内查看viz相关资源。

注:
实际安装viz过程中Demployment提示超时失败,
所以在K8s节点上手动docker pull的镜像,
拉取镜像成功后则Deployment相继自动启动成功。

直接通过K8s Service NodePort或者Ingress暴露web服务(即对应Linkerd Dashboard),都会出现如下拒绝访问的提示,即访问域名不匹配。


关于viz访问域名的配置可参见:
https://linkerd.io/2.11/tasks/exposing-dashboard

viz web工作负载出于安全考虑(防止DNS-rebinding攻击),仅允许请求头host为localhost, 127.0.0.1, web.linkerd-viz.svc的请求通过(grafana dashboard也有类似机制),所以直接通过NodePort或者Ingress域名的方式均无法直接访问(host不匹配),可通过如下两种方式解决此host问题:
方式1(实际采用):设置Ingress重写host
例如本例中使用的nginx-ingress-controller:v0.48.1作为集群网关入口,支持使用注解nginx.ingress.kubernetes.io/upstream-vhost重置host。

完整的Ingess(及Basic登录密钥)定义如下:

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: web-ingress-auth
  namespace: linkerd-viz
  annotations:
    kubesphere.io/creator: admin
    kubesphere.io/description: K8s Ingress - linkerd-viz-web对应的Basic认证信息(admin/Luo123456)
data: 
  # Basic认证信息(admin/Luo123456)
  # 关于Ingress Basic认证的Secret定义可参见:
  # https://github.com/kubernetes/ingress-nginx/blob/main/docs/examples/auth/basic/README.md
  # 本例出于简单直接使用htpasswd在线生成工具(使用Crypt算法):https://tool.oschina.net/htpasswd
  # 输入用户名/密码admin/Luo123456则生成admin:EBVXJbzNlFchk,将此字符串进行Base64编码后即对应下面的auth内容。
  auth: YWRtaW46RUJWWEpiek5sRmNoaw==
---
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: linkerd-viz-web
  namespace: linkerd-viz
  annotations:
    kubesphere.io/creator: admin
    nginx.ingress.kubernetes.io/auth-realm: Authentication Required
    nginx.ingress.kubernetes.io/auth-secret: web-ingress-auth
    nginx.ingress.kubernetes.io/auth-type: basic
    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/upstream-vhost: '$service_name.$namespace.svc.cluster.local:8084'
spec:
  rules:
    - host: web.linkerd-viz.192.168.3.120.nip.io
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 8084

方式2:修改viz web工作负载的enforced-host容器参数
如果Ingress(或者其他LB)不支持重写请求头host,亦可以修改viz web工作负载对于host的验证规则(正则表达式),如下图可通过容器参数enforce-host进行修改(Helm安装可通过enforcedHostRegexp进行设置)。

访问Linkerd Dashboard:
http://web.linkerd-viz.192.168.3.120.nip.io:30428/
由于之前在Ingress处设置的Basic认证,所以需要进行Basic登录(admin/Luo123456),登录成功后即进入Linkerd Dashboard页面。

2.6 使用Linkerd viz Dashboard调试HTTP/GRPC请求

可以点击进入emojivoto命名空间(对应我们之前部署的示例程序),进入后(如下图)即可查看具体工作负载的相关实时监控信息(如请求成功率Success Rate、RPS - Request Per Second、延时分位数等)。

点击上图中Deployments中的web,即进入web应用的具体监控页面,

具体观察实时监控LIVE CALLS表格,如下图中的2个请求成功率不是100%(即存在错误):

点击最右侧的tap按钮,即可进入对应请求的实时监控页面:

点击START按钮后即可时间监控对应请求,如下图:

如上监控到的错误实际上是emojivoto示例程序有意设置的错误,即在对甜甜圈doughnut投票时便会出现如上错误。


参考:
https://buoyant.io/service-mesh-manifesto/
https://linkerd.io/2020/12/03/why-linkerd-doesnt-use-envoy/index.html
https://linkerd.io/2.11/reference/architecture/
https://linkerd.io/2.11/getting-started/
https://linkerd.io/2.11/tasks/exposing-dashboard
https://linkerd.io/2.11/tasks/debugging-your-service/
https://github.com/linkerd/linkerd2/issues/5897
https://github.com/kubernetes/ingress-nginx/blob/main/docs/examples/auth/basic/README.md

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/799702.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存