其他
在 Kubernetes 上用 Linkerd…
适用于在 Kubernetes 中搭建轻量、安全优先的 Linkerd 服务网格,配置 mTLS、流量策略、金丝雀发布、访问控制、多集群与调试监控。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 38/100 ×0.15
适用场景
在 Kubernetes 上用 Link特定
解决思路
- 安装 Linkerd CLI:`curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh`
- 安装前校验集群:`linkerd check --pre`
- 安装 CRDs:`linkerd install --crds | kubectl apply -f -`
- 安装控制平面:`linkerd install | kubectl apply -f -`
- 验证安装:`linkerd check`
- 可选安装 viz 扩展:`linkerd viz install | kubectl apply -f -`
- 为命名空间启用自动注入:在 Namespace 的 metadata.annotations 设置 `linkerd.io/inject: enabled`
- 或为特定 Deployment 启用注入:在 Deployment 的 metadata.annotations 和 spec.template.metadata.annotations 设置 `linkerd.io/inject: enabled`
- 创建 ServiceProfile:apiVersion 使用 `linkerd.io/v1alpha2`,kind 使用 `ServiceProfile`,metadata.name 使用 `my-service.my-namespace.svc.cluster.local`,namespace 使用 `my-namespace`
- 为 `GET /api/users` 配置路由:condition.method 使用 `GET`,pathRegex 使用 `/api/users`,responseClasses 的 condition.status 设置 min `500`、max `599`,isFailure 设置 `true`,isRetryable 设置 `true`
- 为 `POST /api/users` 配置路由:condition.method 使用 `POST`,pathRegex 使用 `/api/users`,isRetryable 设置 `false`
- 为 `GET /api/users/{id}` 配置路由:condition.method 使用 `GET`,pathRegex 使用 `/api/users/[^/]+`,timeout 设置 `5s`,isRetryable 设置 `true`
- 配置 retryBudget:retryRatio 设置 `0.2`,minRetriesPerSecond 设置 `10`,ttl 设置 `10s`
- 创建 TrafficSplit 做金丝雀:apiVersion 使用 `split.smi-spec.io/v1alpha1`,kind 使用 `TrafficSplit`,metadata.name 使用 `my-service-canary`,namespace 使用 `my-namespace`,spec.service 使用 `my-service`
- 设置 TrafficSplit 后端权重:`my-service-stable` weight 使用 `900m`(90%),`my-service-canary` weight 使用 `100m`(10%)
- 定义 Server:apiVersion 使用 `policy.linkerd.io/v1beta1`,kind 使用 `Server`,metadata.name 使用 `my-service-http`,namespace 使用 `my-namespace`,spec.podSelector.matchLabels.app 使用 `my-service`,port 使用 `http`,proxyProtocol 使用 `HTTP/1`
- 创建 ServerAuthorization 允许指定客户端:kind 使用 `ServerAuthorization`,metadata.name 使用 `allow-frontend`,namespace 使用 `my-namespace`,spec.server.name 使用 `my-service-http`,client.meshTLS.serviceAccounts 指定 name `frontend`、namespace `my-namespace`
- 创建 ServerAuthorization 允许未认证流量(如 ingress):kind 使用 `ServerAuthorization`,metadata.name 使用 `allow-ingress`,namespace 使用 `my-namespace`,spec.server.name 使用 `my-service-http`,client.unauthenticated 设置 `true`,client.networks 的 cidr 使用 `10.0.0.0/8`
- 创建 HTTPRoute 做高级路由:apiVersion 使用 `policy.linkerd.io/v1beta2`,kind 使用 `HTTPRoute`,metadata.name 使用 `my-route`,namespace 使用 `my-namespace`
- 设置 HTTPRoute parentRefs:name 使用 `my-service`,kind 使用 `Service`,group 使用 `core`,port 使用 `8080`
- 设置 HTTPRoute 规则 1:matches 的 path type 使用 `PathPrefix`、value 使用 `/api/v2`,并设置 headers name `x-api-version`、value `v2`;backendRefs name 使用 `my-service-v2`、port 使用 `8080`
- 设置 HTTPRoute 规则 2:matches 的 path type 使用 `PathPrefix`、value 使用 `/api`;backendRefs name 使用 `my-service-v1`、port 使用 `8080`
- 多集群:在每个集群安装 `linkerd multicluster install | kubectl apply -f -`
- 链接集群:`linkerd multicluster link --cluster-name west --api-server-address https://west.example.com:6443 | kubectl apply -f -`
- 导出服务到其他集群:`kubectl label svc/my-service mirror.linkerd.io/exported=true`
- 验证跨集群连通性:`linkerd multicluster check`
- 查看多集群网关:`linkerd multicluster gateways`
- 实时流量视图:`linkerd viz top deploy/my-app`
- 按路由指标:`linkerd viz routes deploy/my-app`
- 查看代理状态:`linkerd viz stat deploy -n my-namespace`
- 查看服务依赖:`linkerd viz edges deploy -n my-namespace`
- 打开仪表盘:`linkerd viz dashboard`
- 检查注入状态:`linkerd check --proxy -n my-namespace`
- 查看代理日志:`kubectl logs deploy/my-app -c linkerd-proxy`
- 调试 identity/TLS:`linkerd identity -n my-namespace`
- 实时 tap 流量:`linkerd viz tap deploy/my-app --to deploy/my-backend`
- 最佳实践 Do:启用 mTLS everywhere,Linkerd 会自动处理
- 最佳实践 Do:使用 ServiceProfiles,获得 per-route metrics 和 retries
- 最佳实践 Do:设置 retry budgets,防止 retry storms
- 最佳实践 Do:监控 golden metrics,包括 success rate、latency、throughput
- 最佳实践 Don't:不要跳过 check,变更后总是运行 `linkerd check`
- 最佳实践 Don't:不要过度配置,Linkerd 默认值是合理的
- 最佳实践 Don't:不要忽略 ServiceProfiles,它们解锁高级功能
- 最佳实践 Don't:不要忘记 timeouts,为每个路由设置适当值
适用边界 · 注意事项
- 非 Kubernetes 环境或无权安装 Linkerd CRD/控制平面时不适用。
- 已采用其他服务网格(如 Istio)且不打算引入 Linkerd 时不适用。
- 只需要简单 Service/Ingress,不需要 mTLS、按路由重试、流量切分或服务网格可观测性时不适用。