- 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请求
随着单个服务的代码库越来越大(提交冲突、维护困难)、服务逻辑越来越复杂、单体服务性能出现瓶颈(分布式、功能拆分重点优化)以及开发团队的日益壮大(部门拆分、职能分工),我们将服务进行拆分进行微服务化管理。但是微服务化后也加重了服务部署、监控、运维的难度,例如使用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/
基础环境:
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直接下载:
即通过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查看表情的投票排行榜。
如下为投票排行榜页面:
如上安装完成后,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代理:
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页面。
可以点击进入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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)