深入理解Kubernetes service - 如何扩展现有的kube-proxy架构?

本文是关于Kubernetes service解析的第4章 深入理解Kubernetes service - 你真的理解service吗? 深入理解Kubernetes service - EndpointSlices做了什么? 深入理解Kubernetes service - kube-proxy架构分析 深入理解Kubernetes service - 如何扩展现有的kube-proxy架构 kube-proxy如何保证规则的一致性 所有关于Kubernetes service 部分代码上传至仓库 github.com/cylonchau/kube-haproxy Overview 在前两部分中,学习了一些 service,于kube-proxy在设计架构,但存在扩展问题将引入了一些问题: 为什么需要了解这部分内容呢? 与传统架构有什么区别呢? 于eBPF 的 cilium又有什么区别呢? 既然eBPF可以做到,那为什么要这部分内容呢? 接下来的内容将围绕这四个问题展开来讲,而不是代码的讲解,代码可以看置顶 IPVS与iptables在kubernetes中应用时的问题 对于在使用了kubernetes用户以及了解 kube-proxy 架构后,知道当集群规模过大时,service必将增多,而一个service未必是一条iptables/ipvs规则,对于kubernetes这种分布式架构来说,集群规模越大,集群状态就越不可控,尤其时kube-proxy。 为什么单指kube-proxy呢?想想可以知道,pod的故障 或 node 的故障对于kubernetes集群来说却不是致命的,因为 这些资源集群中存在 避免方案,例如Pod的驱逐。而kube-proxy或iptables/IPVS问题将导致服务的不可控 『抖动』例如规则生成的快慢和Pod就绪的快慢不一致,部分节点不存在 service 此时服务必然抖动。 再例如 iptables/IPVS 排查的难度对于普通运维工程师或开发工程师的技术水平有很高的要求,网上随处可见分析该类问题的帖子: kube-proxy源码分析与问题定位 案例分析:怎么解决海量IPVS规则带来的网络延时抖动问题? ipvs 连接复用引发的系列问题 Investigating Causes of Jitter in Container Networking ContainerNative network LoadBalancer IPVS jitter 对于上述问题,相信遇到了很难定位处理,虽然现在已fixed,并有eBPF技术的加入减少了此类问题的发生,但是eBPF实际同理于IPVS 都是需要对Linux内核有一定了解后才可以,这也就是为什么需要了解这部分 如果需要自定义proxier为什么会解决这个问题 这里就是放大到kubernetes意外的传统架构中,当直接部署于Linux系统上使用nginx等传统LB时就很少有人提到这些问题了,而这些问题存在一个关键字「Container」;而引发这个问题的则是 service。去除 service 的功能,传统架构于Kubernetes架构部署的应用则是相同的,只是区分了名称空间。...

 ·  · 

深入理解Kubernetes service - kube-proxy架构分析

本文是关于Kubernetes service解析的第3章 深入理解Kubernetes service - 你真的理解service吗? 深入理解Kubernetes service - EndpointSlices做了什么? 深入理解Kubernetes service - kube-proxy架构分析 深入理解Kubernetes service - 如何扩展现有的kube-proxy架构 kube-proxy如何保证规则的一致性 所有关于Kubernetes service 部分代码上传至仓库 github.com/cylonchau/kube-haproxy 前提概述 kubernetes集群中运行在每个Worker节点上的组件 kube-proxy,本文讲解的是如何快速的了解 kube-proxy 的软件架构,而不是流程的分析,专注于 proxy 层面的设计讲解,而不会贴大量的代码 kube-proxy软件设计 kube-proxy 在设计上分为三个模块 server 于 proxy: server: 是一个常驻进程用于处理service的事件 proxy: 是 kube-proxy 的工作核心,实际上的角色是一个 service controller,通过监听 node, service, endpoint 而生成规则 proxier: 是实现service的组件,例如iptables, ipvs…. 如何快速读懂kube-proxy源码 要想快速读懂 kube-proxy 源码就需要对 kube-proxy 设计有深刻的了解,例如需要看 kube-proxy 的实现,我们就可以看 proxy的部分,下列是 proxy 部分的目录结构 bash 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 $ tree -L 1 ....

 ·  · 

深入理解Kubernetes service - 你真的理解service吗?

本文是关于Kubernetes service解析的第1章 深入理解Kubernetes service - 你真的理解service吗? 深入理解Kubernetes service - EndpointSlices做了什么? 深入理解Kubernetes service - kube-proxy架构分析 深入理解Kubernetes service - 如何扩展现有的kube-proxy架构 kube-proxy如何保证规则的一致性 所有关于Kubernetes service 部分代码上传至仓库 github.com/cylonchau/kube-haproxy 前景 对于了解kubernetes架构时,已知的是 service 是kubernetes在设计时为了避免Pod在频繁创建和销毁时IP变更问题,从而给集群内服务(一组Pod)提供访问的一个入口。而Pod在这里的角色是 『后端』( backend ) ,而 service 的角色是 『前端』( frontend )。本文将阐述service的生命周期 为什么需要了解这部分内容呢 对于 without kube-proxy来说,这部分是最重要的部分,因为service的生成不是kube-proxy来完成的,而这部分也就是service ip定义的核心。 控制器 service的资源创建很奇妙,继不属于 controller-manager 组件,也不属于 kube-proxy 组件,而是存在于 apiserver 中的一个被成为控制器的组件;而这个控制器又区别于准入控制器。更准确来说,准入控制器是位于kubeapiserver中的组件,而 控制器 则是存在于单独的一个包,这里包含了很多kubernetes集群的公共组件的功能,其中就有service。这也就是在操作kubernetes时 当 controller-manager 于 kube-proxy 未工作时,也可以准确的为service分配IP。 首先在构建出apiserver时,也就是代码 cmd/kube-apiserver/app/server.go go 1 2 3 4 serviceIPRange, apiServerServiceIP, err := master.ServiceIPRange(s.PrimaryServiceClusterIPRange) if err !...

 ·  · 

理解Kubernetes驱逐核心 - Pod QoS

服务质量 Quality of Service (QoS),在Kubernetes是用于解决资源抢占,延迟等方向的一种技术,是服务于调度与抢占之间的条件。 QoS 级别 QoS 与 资源限制紧密相关,正如下属展示,是一个Pod资源限制部分的配置 yaml 1 2 3 4 5 6 7 resources: limits: cpu: 200m memory: 1G requests: cpu: 500m memory: 1G 而Kubernetes 将Pod QoS 根据 CPU 与 内存的配置,将QoS分为三个等级: Guaranteed:确保的,只设置 limits 或者 requests 与 limits 为相同时则为该等级 Burstable:可突发的,只设置 requests 或 requests 低于 limits 的场景 Best-effort: 默认值,如果不设置则为这个等级 为什么要关心Pod QoS级别 在Kubernetes中,将资源分为两类:可压缩性资源 “CPU”,不可压缩性资源 “内存”。当可压缩性资源用尽时,不会被终止与驱逐,而不可压缩性资源用尽时,即Pod内存不足,此时会被OOMKiller杀掉,也就是被驱逐等操作,而了解Pod 的QoS级别可以有效避免关键Pod被驱逐。 图:Pod QoS分类 Source:https://doc.kaas.thalesdigital.io/docs/BestPractices/QOS 有上图可知,BestEffort 级别的 Pod 能够使用节点上所有资源,浙江导致其他 Pod 出现资源问题。所以这类 Pod 优先级最低,如果系统没有内存,将首先被杀死。 Pod是如何被驱逐的 当节点的计算资源不足时,kubelet 会发起驱逐,这个操作是为了避免系统OOM事件,而QoS的等级决定了驱逐的优先级,没有限制资源的 BestEffort 类型的Pod最先被驱逐,接下来资源使用率低于 Requests 的 Guaranteed 与 Burstable 将不会被其他Pod的资源使用量而驱逐,其次对于此类Pod而言,如果Pod使用了比配置(Requests)更多的资源时,会根据这两个级别Pod的优先级进行驱逐。 BestEffort 与 **Burstable **将按照先优先级,后资源使用率顺序进行驱逐...

 ·  · 

kubernetes概念 - 理解Kubernetes的驱逐机制

驱逐 (eviction) 是指终止在Node上运行的Pod,保证workload的可用性,对于使用Kubernetes,了解驱逐机制是很有必要性的,因为通常情况下,Pod被驱逐是需要解决驱逐背后导致的问题,而想要快速定位就需要对驱逐机制进行了解。 Pod被驱逐原因 Kubernetes官方给出了下属Pod被驱逐的原因: 抢占驱逐 (Preemption and Eviction) [1] 节点压力驱逐 (Node-pressure) [2] 污点驱逐 (Taints) [3] 使用API发起驱逐 (API-initiated) [4] 排出Node上的Pod (drain) [5] 被 controller-manager 驱逐 抢占和优先级 抢占是指当节点资源不足以运行新添加的Pod时,kube-scheduler 会检查低优先级Pod而后驱逐掉这些Pod以将资源分配给优先级高的Pod。这个过程称为 “抢占” 例如这个实例是 kube-proxy 被驱逐的场景 节点压力驱逐 节点压力驱逐是指,Pod所在节点的资源,如CPU, 内存, inode等,这些资源被分为可压缩资源CPU (compressible resources) 与不可压缩资源 (incompressible resources) 磁盘IO, 内存等,当不可压缩资源不足时,Pod会被驱逐。对于此类问题的驱逐 是每个计算节点的 kubelet 通过捕获 cAdvisor 指标来监控节点的资源使用情况。 被 controller-manager 驱逐 kube-controller-manager 会定期检查节点的状态,如节点处于 NotReady 超过一定时间,或Pod部署长时间失败,这些Pod由控制平面 controller-manager 创建新的Pod已替换存在问题的Pod 通过API发起驱逐 Kubernetes为用户提供了驱逐的API,用户可以通过调用API来实现自定义的驱逐。 对于 1.22 以上版本,可以通过API policy/v1 进行驱逐 bash 1 2 3 4 5 6 7 8 9 10 11 curl -v \ -H 'Content-type: application/json' \ https://your-cluster-api-endpoint....

 ·  ·