Linkerd 2.10(Step by Step)—配置代理并发

Linkerd 2.10 系列
- 快速上手 Linkerd v2 Service Mesh(服务网格)
- 腾讯云 K8S 集群实战 Service Mesh—Linkerd2 & Traefik2 部署 emojivoto 应用
- 详细了解 Linkerd 2.10 基础功能,一起步入 Service Mesh 微服务架构时代
- Linkerd 2.10(Step by Step)—1. 将您的服务添加到 Linkerd
- Linkerd 2.10(Step by Step)—2. 自动化的金丝雀发布
- Linkerd 2.10(Step by Step)—3. 自动轮换控制平面 TLS 与 Webhook TLS 凭证
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 必须配置
staticCPU 管理器策略 - 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)—配置代理并发的更多相关文章
- Linkerd 2.10(Step by Step)—多集群通信
Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traef ...
- Linkerd 2.10(Step by Step)—将 GitOps 与 Linkerd 和 Argo CD 结合使用
Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traef ...
- Linkerd 2.10(Step by Step)—使用 Debug Sidecar,注入调试容器来捕获网络数据包
Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 部署 ...
- Linkerd 2.10(Step by Step)—设置服务配置文件
Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 部署 ...
- Linkerd 2.10(Step by Step)—4. 如何配置外部 Prometheus 实例
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
- Linkerd 2.10(Step by Step)—使用 Kustomize 自定义 Linkerd 的配置
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
- Linkerd 2.10(Step by Step)—配置超时
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
- Linkerd 2.10(Step by Step)—配置重试
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
- Linkerd 2.10(Step by Step)—3. 自动轮换控制平面 TLS &Webhook TLS 凭证
Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...
随机推荐
- 微信小程序云开发-云函数-创建云函数
一.检查云函数环境 检查云函数环境时候,鼠标右键点击查看当前环境.如果存在多个云开发环境,要确保云函数的当前环境要与app.js中evn的环境值一致. 如果不一致,则鼠标右键切换当前云开发环境.(如果 ...
- 注解@ConfigurationProperties使用方法(二十)
前言 最近在思考使用java config的方式进行配置,java config是指基于java配置的spring.传统的Spring一般都是基本xml配置的,后来spring3.0新增了许多java ...
- innodb引擎相关参数
1.innodb_flush_log_at_trx_commit (双一标准之一) 作用:主要控制了innodb将log buffer中的数据写入日志文件并flush磁盘的时间点,取值分别为0.1.2 ...
- linux下利用JMX监控Tomcat
利用JMX监控Tomcat,就是相当于部署在tomcat上的应用作为服务端,也就是被管理资源的对象.然后通过程序或者jconsole远程连接到该应用上来.远程连接需要服务器端提供ip和port.如果需 ...
- JavaScript-编译与闭包
编译原理 尽管 JavaScript 经常被归类为"动态"或"解释执行"的语言,但实际上它是一门编译语言.JavaScript 引擎进行的编译步骤和传统编译语言 ...
- linux笔记2随笔
124.diff命令:文件内容对比 diff命令用于比较多个文本文件之间的差异,这在系统安全防范中非常重要.比如当黑客入侵系统之后,往往会修改一些系统配置文件,从而留下一些后门. 所以作为运维人员.最 ...
- C++STL——vector类
vector容器 1.1 vector容器的基本概念 Array 是静态空间,一旦配置了就不能改变,要换大一点或者小一 点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的 数据搬 ...
- SpringCloud升级之路2020.0.x版-11.Log4j2 监控相关
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford Log4j2 异步 ...
- Promise教程及用法
目录 1,介绍 2,特点 3,缺点 4,基本用法 5,then 6,catch 7,finally 8,all() 9,race() 10,allSettled() 11,any() 12,现有对象转 ...
- java.lang.instrument.Instrumentation
java.lang.instrument.Instrumentation 看完文档之后,我们发现这么两个接口:redefineClasses和retransformClasses.一个是重新定义cla ...