Linkerd 2.10 系列

Linkerd 2.10 中文手册持续修正更新中:

Linkerd 数据平面的代理是多线程(multithreaded)的,

并且能够运行可变数量的工作线程,

以便它们的资源使用(resource usage)与应用程序工作负载(application workload)相匹配。

当然,在真空(vacuum)中,当允许使用尽可能多的 CPU 内核时,

代理将表现出最佳的吞吐量(throughput)和最低的延迟(latency)。

但是,在实践中,还需要考虑其他因素。

真实世界的部署不是一个负载测试(load test),

在这个测试中,客户端和服务器除了用请求使代理饱和之外,没有其他工作要做。

相反,服务网格模型将代理实例部署为应用程序容器的 sidecar

每个代理只处理进出它注入的 pod 的流量。

这意味着吞吐量和延迟受应用程序工作负载的限制。

如果应用程序容器实例每秒只能处理这么多请求,那么代理可以处理更多的请求可能并不重要。

事实上,给代理提供比它需要的更多 CPU 内核来跟上应用程序可能会损害整体性能,

因为应用程序可能不得不与代理竞争有限的系统资源。

因此,单个代理有效处理其流量比配置所有代理以处理最大可能负载更为重要。

调整代理资源使用的主要方法是限制代理用于转发流量的工作线程数。有多种方法可以做到这一点。

使用 proxy-cpu-limit Annotation

配置代理线程池的最简单方法是使用 config.linkerd.io/proxy-cpu-limit annotation。

此 annotation 配置代理注入器以设置一个环境变量,该变量控制代理将使用的 CPU 核数。

使用 linkerd install CLI 命令安装 Linkerd 时,

--proxy-cpu-limit 参数会为 Linkerd 安装注入的所有代理全局设置此 annotation。例如,

linkerd install --proxy-cpu-limit 2 | kubectl apply -f -

对于更细粒度(fine-grained)的配置,可以将 annotation 添加到

任何可注入的 Kubernetes 资源,例如 namespace、pod 或 deployment。

例如,以下将配置 my-deployment 部署中的代理使用1个 CPU 内核:

kind: Deployment
apiVersion: apps/v1
metadata:
name: my-deployment
# ...
spec:
template:
metadata:
annotations:
config.linkerd.io/proxy-cpu-limit: '1'
# ...

与 Kubernetes CPU 限制和请求可以用 milliCPUs 表示不同,

proxy-cpu-limit 注解应该用 CPU 内核的整数来表示。小数值将四舍五入到最接近的整数。

使用 Kubernetes CPU Limits 与 Requests

Kubernetes 提供

CPU limits and CPU requests

来配置分配给任何 pod 或容器的资源。

这些也可用于配置 Linkerd 代理的 CPU 使用率。

但是,根据 kubelet 的配置方式,

使用 Kubernetes 资源限制

而不是 proxy-cpu-limit annotation 可能并不理想。

kubelet 使用两种机制之一来强制执行 pod CPU 限制。

这由

--cpu-manager-policy kubelet 选项

决定。

使用默认的 CPU 管理器策略

none

kubelet 使用

CFS 配额

来强制执行 CPU limits。

这意味着 Linux 内核被配置为限制属于给定进程的线程被调度的时间量。

或者,CPU 管理器策略可以设置为

static

在这种情况下,kubelet 将使用 Linux cgroups 对满足特定条件的容器实施 CPU limits。

proxy-cpu-limit annotation 配置的环境变量未设置时,

代理将运行与可用 CPU 内核数相等的工作线程数。

这意味着使用默认的 noneCPU 管理器策略,代理可能会产生大量工作线程,

但 Linux 内核会限制它们的调度频率。

这比简单地减少工作线程的数量效率更低,就像 proxy-cpu-limit 所做的那样:

更多的时间花在上下文切换上,每个工作线程的运行频率将降低,这可能会影响延迟。

另一方面,使用

cgroup cpusets

将限制进程可用的 CPU 核数。

从本质上讲,代理会认为系统的 CPU 内核数比实际少。

这将导致与 proxy-cpu-limit annotation 类似的行为。

但是,值得注意的是,要使用此机制,必须满足某些条件:

  • kubelet 必须配置 static CPU 管理器策略
  • Pod 必须属于有

    Guaranteed QoS class

    这意味着 pod 中的所有容器都必须同时具有内存和 CPU 的 limit 和 request,并且每个的 limit 必须与 request 具有相同的值。
  • CPU limit 和 CPU request 必须是大于或等于 1 的整数。

如果您不确定是否会全部满足这些条件,除了任何 Kubernetes CPU limits 和 requests 之外,

最好使用 proxy-cpu-limit annotation。

使用 Helm

使用 Helm 时,如果不满足上述基于 cgroup 的 CPU 限制条件,

用户必须注意设置 proxy.cores Helm 变量和 proxy.cpu.limit 之外的变量。

我是为少
微信:uuhells123
公众号:黑客下午茶
加我微信(互相学习交流),关注公众号(获取更多学习资料~)

Linkerd 2.10(Step by Step)—配置代理并发的更多相关文章

  1. Linkerd 2.10(Step by Step)—多集群通信

    Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traef ...

  2. Linkerd 2.10(Step by Step)—将 GitOps 与 Linkerd 和 Argo CD 结合使用

    Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traef ...

  3. Linkerd 2.10(Step by Step)—使用 Debug Sidecar,注入调试容器来捕获网络数据包

    Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 部署 ...

  4. Linkerd 2.10(Step by Step)—设置服务配置文件

    Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 部署 ...

  5. Linkerd 2.10(Step by Step)—4. 如何配置外部 Prometheus 实例

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  6. Linkerd 2.10(Step by Step)—使用 Kustomize 自定义 Linkerd 的配置

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  7. Linkerd 2.10(Step by Step)—配置超时

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  8. Linkerd 2.10(Step by Step)—配置重试

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  9. Linkerd 2.10(Step by Step)—3. 自动轮换控制平面 TLS &Webhook TLS 凭证

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

随机推荐

  1. .net core工具组件系列之Redis—— 第一篇:Windows环境配置Redis(5.x以上版本)以及部署为Windows服务

    Cygwin工具编译Redis Redis6.x版本是未编译版本(官方很调皮,所以没办法,咱只好帮他们编译一下了),所以咱们先下载一个Cygwin,用它来对Redis进行编译. Cygwin下载地址: ...

  2. 网络损伤仪WANsim的队列深度功能

    什么是队列深度 在网络损伤仪WANsim中,队列是指一个用于缓存报文的缓冲池.深度是指缓冲池可以存储的最大数据量.当WANsim接受的报文超出了带宽限制的量时,溢出的报文会进入队列中. 我们可以在WA ...

  3. Docker与k8s的恩怨情仇(六)—— “容器编排”上演“终结者”大片

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 在上节中,我们为大家介绍了Pod的基础内容,Kubernetes如何站在上帝视角上处理容器和容器之间的关系. ...

  4. bs4爬取笔趣阁小说

    参考链接:https://www.cnblogs.com/wt714/p/11963497.html 模块:requests,bs4,queue,sys,time 步骤:给出URL--> 访问U ...

  5. C++第四十一篇 -- 安装成功的第一个驱动文件

    参考链接:https://blog.csdn.net/LEON1741/article/details/87291839 一.新建工程 二.写一个Driver.c #include <ntddk ...

  6. Django报错:'Specifying a namespace in include() without providing an app_name '

    环境:win10(64)+pycharm2018.3+python3.7 在网页项目中使用include()方法 项目目录中同时存在app/urls.py和proj/urls.py 在proj/url ...

  7. Python脚本:批量将.doc文件转化为.docx文件

    将.doc转换为.docx文件有几种常用的方法: Microsoft Word 和 WPS 自带.doc转换.docx功能,但只能一个文件一个文件转换,批量转换要会员 在线网页 Office-Conv ...

  8. 构建后端第3篇之---springb @Alias注解使用

    write by 张艳涛 in 202210210,after today i will  write aritles by english,because english is so diffent ...

  9. 🔥 LeetCode 热题 HOT 100(21-30)

    46. 全排列 思路:典型回溯法 class Solution { public List<List<Integer>> permute(int[] nums) { Linke ...

  10. tensorflow踩坑合集2. TF Serving & gRPC 踩坑

    这一章我们借着之前的NER的模型聊聊tensorflow serving,以及gRPC调用要注意的点.以下代码为了方便理解做了简化,完整代码详见Github-ChineseNER ,里面提供了训练好的 ...