Linkerd:极简且安全的服务网格
Linkerd 是什么?为什么选择它?
Linkerd 是一个超轻量级、安全优先的服务网格(Service Mesh),专为云原生环境设计。它通过在应用实例之间注入一个透明的网络代理层,为微服务提供可观测性、可靠性以及零信任安全,而无需修改一行应用代码。与 Istio 等“重量级”网格不同,Linkerd 在功能与复杂度之间做出了极致的取舍:只保留最必要的网格功能,使得学习曲线平缓、资源占用极小、运维心智负担极低。
Linkerd 的核心优势:
- 极简架构:不含 Sidecar 代理之外的任何数据中心组件(没有 Mixer、没有 Galley、没有 Citadel 等),功能由 Rust 编写的微代理
linkerd-proxy完成。 - 卓越性能:
linkerd-proxy使用 Rust 编写,内存和 CPU 开销远低于 Envoy 等代理,P99 延迟增加通常在 1ms 以内。 - 安全第一:默认启用双向 TLS(mTLS) 且自动旋转证书。所有服务间通信均被加密和身份验证,实现零信任网络。
- 即装即用:极简的 CLI 工具,一条命令即可完成安装,几分钟内就能为应用注入网格。
- 关注点分离:开发者无需在代码中处理故障重试、超时、指标埋点等问题,平台团队负责通过网格统一管控。
- 生产就绪:由 CNCF 孵化,已被 Expedia、Salesforce、HP、Nordstrom 等企业大规模用于生产环境。
本教程将带你从零开始,在本地 Kubernetes 环境中安装 Linkerd,部署演示应用,并体验其强大的可观测性和安全能力。
环境准备
开始之前,请确保你的本地环境满足以下条件:
- Kubernetes 集群:版本为
1.21至1.28之间。推荐使用minikube、kind或Docker Desktop内置的 Kubernetes。本教程以minikube为例。 - kubectl:已安装并可以正常操作集群。
- 本地终端:Linux 或 macOS 终端,Windows 用户可使用 WSL2 或 Git Bash。
- 足够的资源:至少为集群分配 4 个 CPU、8 GB 内存(Linkerd 控制面资源开销极低,但需要预留运行示例应用的空间)。
快速搭建本地集群 (minikube 示例)
# 启动 minikube 并分配资源
minikube start --cpus=4 --memory=8192 --kubernetes-version=v1.27.0
# 验证集群状态
kubectl version --short
安装 Linkerd CLI
Linkerd 官方提供了简单的 CLI 安装脚本,同时也支持手动下载发行包。
方式一:使用安装脚本(推荐)
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh
该脚本会自动检测你的操作系统,下载最新稳定版,并将其解压到 ~/.linkerd2/bin 目录。
方式二:直接下载二进制文件
访问 Linkerd GitHub Releases 页面,下载对应系统的可执行文件,并将其加入 PATH 环境变量。
验证安装
# 将 CLI 加入当前会话的 PATH(或永久写入 .bashrc / .zshrc)
export PATH=$PATH:$HOME/.linkerd2/bin
# 检查版本
linkerd version
输出示例:
Client version: stable-2.14.10
Server version: unavailable
“Server version: unavailable” 是正常的,因为此时我们尚未在集群中安装 Linkerd 控制平面。
安装 Linkerd 控制平面到集群
Linkerd 控制平面包括少量的 Kubernetes 资源:一个控制器部署(linkerd-controller)、一个用于指标收集的 Grafana/Prometheus 组件、以及证书签发器等。安装过程分为预检和实际安装两步。
第一步:环境预检
在安装之前,Linkerd CLI 提供 check 命令来确认集群是否满足所有前置依赖。
linkerd check --pre
如果一切正常,你将看到绿色的 ✓ 列表。若有缺失项(例如 kube-system 命名空间下的标签错误),命令会给出修复建议。常见需要修复的项:
# 如果集群不支持 service type LoadBalancer(如 minikube 的某些网络插件),可以忽略或提前设置
# 通常 minikube 使用 tunnel 可获取 LoadBalancer IP,可直接安装
第二步:安装控制平面
通过一条命令将 Linkerd 控制平面资源部署到 linkerd 命名空间:
linkerd install | kubectl apply -f -
linkerd install 命令会生成完整的 Kubernetes 清单,然后通过管道交由 kubectl apply 进行部署。安装过程会创建 linkerd 命名空间并部署控制器。
第三步:验证安装
安装完成后,等待所有 Pod 进入 Running 状态,然后执行全面检查:
# 查看 linkerd 命名空间下 Pod 状态
kubectl get pods -n linkerd -w
# 执行最终安装验证
linkerd check
当所有检查项均为 ✓ 时,Linkerd 控制平面已就绪。
输出示例:
linkerd-identity ...
linkerd-controller ...
...
Status check results are √
部署演示应用:Emojivoto
为了直观体验 Linkerd 的功能,官方提供了一个微服务示例应用 Emojivoto。它是一个简单的表情符号投票应用,由以下几个微服务组成:
emoji-svc:提供表情符号数据voting-svc:处理投票逻辑web-svc:前端 Web 界面emoji-svc和voting-svc之间会相互调用,其中一个服务故意包含一个错误,便于展示网格的故障检测能力。
部署 Emojivoto
首先将 Emojivoto 部署到一个新的命名空间中:
# 创建命名空间
kubectl create namespace emojivoto
# 部署应用(原始清单不含 Linkerd 代理)
curl -sL https://run.linkerd.io/emojivoto.yml | kubectl apply -n emojivoto -f -
此时应用尚未纳入网格,所有通信都是“裸”的。接下来我们将利用 Linkerd 进行 Sidecar 注入。
注入 Linkerd 代理(Sidecar)
Linkerd 采用 Sidecar 模式,为每个 Pod 注入一个极轻量的 linkerd-proxy 容器。注入方式有两种:
- 基于命名空间的注解自动注入
- 手动通过 CLI 注入并重新部署
为了快速体验,我们先手动注入 Emojivoto 的部署:
# 将 emojivoto 命名空间中已部署的资源导出,通过 linkerd inject 添加 Sidecar 配置,再重新 apply
kubectl get deployments,statefulsets -n emojivoto -o yaml \
| linkerd inject - \
| kubectl apply -n emojivoto -f -
命令解释:
kubectl get ... -o yaml取出当前所有工作负载的 YAML。linkerd inject -从标准输入读取,为每一个 Pod 模板注入linkerd-proxy容器的配置。- 最终通过
kubectl apply更新资源,触发滚动重启。
等待所有 Pod 重新启动完毕:
kubectl -n emojivoto rollout status deploy/web
kubectl -n emojivoto rollout status deploy/emoji
kubectl -n emojivoto rollout status deploy/voting
kubectl -n emojivoto rollout status deploy/vote-bot
kubectl get pods -n emojivoto
你会看到每个 Pod 现在都包含了 2/2 个容器(一个应用容器 + 一个 Linkerd 代理)。
探索 Linkerd 的可观测性
访问 Linkerd Dashboard
Linkerd 提供了一个内置的 Web Dashboard,用于可视化服务的实时拓扑、成功率、延迟等指标。
由于 Dashboard 默认不对外暴露,我们利用 linkerd viz 子命令来安装可视化组件(包括 Prometheus、Grafana、Dashboard 和 Tap 服务):
linkerd viz install | kubectl apply -f -
# 等待 viz 组件就绪
linkerd check
安装成功后,启动本地代理以访问 Dashboard:
linkerd viz dashboard &
该命令会在后台启动端口转发,并自动打开浏览器。Dashboard 的主页面会展示全局摘要,点击命名空间 emojivoto 即可深入分析。
查看服务拓扑和流量指标
在 Dashboard 中:
- 命名空间视图:展示各服务的成功率和每秒请求数(RPS)。你会立即看到
web、voting等服务都有指标,而emoji服务可能存在部分失败(因为应用中故意包含了一个错误调用)。 - 拓扑图:以图形方式展示服务之间的依赖关系,边上的颜色表示请求成功率(绿色为健康,红色为故障)。你可以直观地发现流量在
voting和emoji之间流转,且有一个错误分支。 - 服务详情:点击某个服务可查看其 P50/P95/P99 延迟、入站/出站流量等细粒度指标。
使用 CLI 查询实时数据
除了 Dashboard,linkerd viz 提供了强大的命令行工具。
实时查看命名空间的流量状态:
linkerd viz stat namespace emojivoto
输出会列出该命名空间下所有网格化服务的请求量、成功率、延迟等。
实时查看特定服务的流量:
linkerd viz stat deploy -n emojivoto
实时“tap”某个服务的请求流:
linkerd viz tap deploy/web -n emojivoto --to deploy/voting
你会看到类似 tcpdump 的请求流,展示源、目标、响应码和延迟。
体验 mTLS 的零信任安全
Linkerd 的一大特性是默认启用并强制 mTLS。一旦 Pod 被注入 Sidecar,所有进出流量都会自动进行身份验证和加密,无需额外配置。
验证 mTLS 已启用
运行以下命令查看网格化 Pod 之间通信的 TLS 状态:
linkerd viz edges pods -n emojivoto
输出会显示每条连接边上都标记了 SECURE,说明通信已被 mTLS 保护。你还可以查看具体的身份证书信息:
linkerd identity -n emojivoto pod/<pod-name>
自动证书轮换
Linkerd 控制平面中的 identity 服务负责签发短期证书(默认 24 小时有效期),并由 Sidecar 自动轮换。整个过程对应用完全透明,保障了长期运行的安全性。
服务授权策略(可选)
Linkerd 提供了基于角色的访问控制,允许你定义哪些服务可以互相通信。默认的策略是全部允许,你可以通过 Server 和 ServerAuthorization 资源创建精细化策略,从而在网络层实现“默认拒绝,只有授权的流量才能通过”。这比传统的 Kubernetes NetworkPolicy 更简单且更安全,因为它基于服务身份(TLS 证书中的 SAN)而非 IP。
一个基础的授权示例:
apiVersion: policy.linkerd.io/v1beta1
kind: ServerAuthorization
metadata:
name: voting-from-web
namespace: emojivoto
spec:
server:
name: voting
client:
meshTLS:
identities:
- "web.emojivoto.serviceaccount.identity.linkerd.cluster.local"
此策略仅允许 web 服务的 ServiceAccount 身份访问 voting 服务。这种细粒度的控制完全基于加密身份,极大加强了微服务的安全性。
常用运维命令速查
| 命令 | 作用 |
|---|---|
linkerd check |
检查 Linkerd 控制面和数据面健康状况 |
linkerd viz stat ns <ns> |
查看某命名空间的网格流量统计 |
linkerd viz stat deploy |
查看部署级别的流量统计 |
linkerd viz tap deploy/<name> |
实时捕获某个部署的请求流 |
linkerd viz top deploy/<name> |
类似 top 的实时流量概览 |
linkerd viz edges pods -n <ns> |
查看 Pod 之间的连接和是否为 mTLS |
linkerd dg proxy-metrics pod/<pod> |
直接抓取某个 Pod 的代理指标 |
| `linkerd uninstall | kubectl delete -f -` |
清理与卸载
当你完成实验后,可以按顺序清理资源。
# 1. 删除注入的应用
kubectl delete namespace emojivoto
# 2. 卸载可视化组件
linkerd viz uninstall | kubectl delete -f -
# 3. 卸载 Linkerd 控制平面
linkerd uninstall | kubectl delete -f -
# (可选)删除已下载的 CLI
rm -rf ~/.linkerd2
总结与下一步
至此,你已经成功在本地 Kubernetes 中安装 Linkerd,为示例应用注入 Sidecar 代理,并探索了其出色的可观测性和透明 mTLS 安全能力。Linkerd 以极低的资源开销和运维成本,为微服务带来了生产级的可靠性保障,是云原生环境下“极简网格”的最佳实践。
深入学习路径:
- 阅读官方文档 https://linkerd.io/docs/ ,了解故障注入、超时重试、流量拆分等高级功能。
- 尝试为自有应用注入网格,观察真实流量。
- 配置服务授权策略,实现零信任网络。
- 将 Linkerd 与你的 CI/CD 流水线集成(例如利用
linkerd inject在部署时自动注入)。
Linkerd 让你用最小的复杂度,享受到云原生网格带来的巨大价值。现在,就用它来强化你的微服务吧!