首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏k-cloud-labs

    Kube-apiserver watch实现

    kubelet、kube-controller-manager、kube-scheduler需要监控各种资源(pod、service等)的变化,当这些对象发生变化时(add、delete、update),kube-apiserver 转载自https://zhuanlan.zhihu.com/p/33335726,有修改 **第一部分:**kube-apiserver对etcd的List-watch机制 流程示意图 构建PodStorage kube-apiserver针对每一类资源(pod、service、endpoint、replication controller、depolyments)都会构建Storage对象,如:PodStorage 对etcd的watch机制,除此之外,kube-apiserver会向其他组件提供watch接口,下面将分析kube-apiserver的watch API。 第二部分:kube-apiserver的watch restful API kube-apiserver提供watch restful API给其他组件(kubelet、kube-controller-manager

    1.1K20编辑于 2023-03-06
  • 来自专栏k-cloud-labs

    kube-apiserver 内存优化进阶

    背景 前面我们已经对 kube-apiserver 内存消耗 进行了阐述,文中最后提到了使用流式的请求来支持 List 的效果,从而实现对于单个请求来说,空间复杂度从 O(n) 转换成 O(1),也讲述了其原理和流程 kube-apiserver 又 OOM 了? kube-apiserver 已经支持基于 gzip 的数据压缩,只需要设置 Accept-Encoding 为 gzip 即可,详情可以参考官网介绍。 kube-apiserver watch 请求就与这个场景非常吻合。 下文会就 kube-apiserver 中是如何就这两点进行的优化做一个介绍。 效果 通过 WatchList 以及上述的种种优化,社区给出了优化效果 优化前 优化后 最后 Kube-apiserver 内存优化系系列包含前面的铺垫,到此也 6 篇了,如果把这其中涉及到的知识都搞懂了

    1K10编辑于 2023-12-03
  • 来自专栏k-cloud-labs

    Kube-apiserver goroutine leak

    从监控上看和另外一个程序(管理员平台)的内存使用情况吻合,使用率降下来是因为重启了apiserver和管理员平台,且问题只出现在最近两天的晚上,管理员平台中有一段逻辑是定时全量拉取集群数据(设计不合理,后续需要改),管理员平台的日志里显示拉取数据超时,基本猜测和管理员平台调用k8s api不合理有关,且k8s apiserver应该也有bug,导致内存泄露或者goroutine泄露。但是最近代码都没动过,为啥之前没事呢,后负责管理员平台的同事说近两天美东专线有问题,延迟是之前的3倍,而且出现问题的时间正好匹配,那接下来就查一下具体原因。

    59730编辑于 2023-03-06
  • 来自专栏k-cloud-labs

    kube-apiserver 又 Panic 了 - handler

    现象 Kube-apiserver 在处理外部请求时发生不可恢复的报错,直接 Fatal 退出运行。 Kube-apiserver 在启动时通过 DefaultBuildHandlerChain 注册了特别多的 filter/handler,其中就有一个专门用来控制请求超时的 timeoutHandler kube-apiserver 并没有为单独的 handler 或者对应的 Goroutine 设置一个 WriteTimeout 的超时,而是单纯的通过 timeoutHandler 实现全部 NonLongRunning kube-apiserver Panic 的一个影响是上面的所有请求可能与其他实例建立连接,如果量比较大,而 k8s 服务端本身又没有做好限流保护的话,很可能会导致其他实例出现 OOM,导致 k8s 控制面雪崩

    42610编辑于 2024-02-05
  • 来自专栏田飞雨的专栏

    kube-apiserver 中 apiserver service 的实现

    kubernetes 集群在初始化完成后就会创建一个 kubernetes service,该 service 是 kube-apiserver 创建并进行维护的,如下所示: $ kubectl get kubernetes service 是由 kube-apiserver 中的 bootstrap controller 进行控制的,其主要以下几个功能: 创建 kubernetes service; 的修复及检查功能; 提供基于 Service NodePort 的修复及检查功能; kubernetes service 默认使用 ClusterIP 对外暴露服务,若要使用 nodePort 的方式可在 kube-apiserver = nil { return } // 1、首次启动时首先从 kubernetes endpoints 中移除自身的配置, // 此时 kube-apiserver 总结 本文主要分析了 kube-apiserver 中 apiserver service 的实现,apiserver service 是通过 bootstrap controller 控制的,bootstrap

    3.1K31发布于 2020-03-06
  • 来自专栏k-cloud-labs

    kube-apiserver 又 OOM 了?

    我们知道大规模集群下,kube-apiserver 会成为瓶颈,尤其在内存方面,相信很多人也遇到过 kube-apiserver OOM 等问题(碰巧的是最近线上连续出现两次 kube-apiserver 本篇主要讲 kube-apiserver 中 Informer 需要用到的两个接口 list 和 watch 的实现。 kube-apiserver OOM 内存消耗来源 kube-apiserver 的内存消耗,主要两个来源: 一部分来自于他缓存了集群所有数据(Event 除外,此 Event 为 k8s 的资源类型) ,对 kube-apiserver 内存的压力也增加,在没有任何防护措施(限流)的情况下,很容易造成 kube-apiserver 的 OOM,而且在 OOM 之后,异常连接转移到其他 master 节点 例如是否在 list 请求时传 RV=0 就一定会走 kube-apiserver 的缓存?

    99110编辑于 2023-10-28
  • 来自专栏玖叁叁

    kubernetes组件kube-apiserver介绍

    kube-apiserver 的概述kube-apiserver 是 Kubernetes 的控制平面组件之一,它充当 Kubernetes API 的前端。 kube-apiserver 的架构kube-apiserver 的架构是一个多层的系统,由以下组件组成:(1) HTTP Serverkube-apiserver 作为 HTTP Server 提供 kube-apiserver 和 Etcd 之间使用一致性协议来保证数据的一致性和可靠性。 kube-apiserver 的启动参数kube-apiserver 启动时需要提供一系列参数来配置其行为。 kube-apiserver 的示例以下是启动 kube-apiserver 的示例命令:kube-apiserver --advertise-address=192.168.1.100 \--allow-privileged

    1.4K31编辑于 2023-04-28
  • 来自专栏小陈运维

    kube-apiserver启动命令参数解释

    [图片] 我的kube-apiserver启动命令参数: cat > /usr/lib/systemd/system/kube-apiserver.service << EOF [Unit] Description =https://github.com/kubernetes/kubernetes After=network.target [Service] ExecStart=/usr/local/bin/kube-apiserver --proxy-client-cert-file string 当必须调用外部程序以处理请求时,用于证明聚合器或者 kube-apiserver 的身份的客户端证书。 --proxy-client-key-file string 当必须调用外部程序来处理请求时,用来证明聚合器或者 kube-apiserver 的身份的客户端私钥。 官方文档: https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-apiserver/ https://www.oiox.cn

    3K40编辑于 2022-03-07
  • 来自专栏田飞雨的专栏

    kube-apiserver 的设计与实现

    处理流程 kube-apiserver 主要通过对外提供 API 的方式与其他组件进行交互,可以调用 kube-apiserver 的接口 $ curl -k https://<masterIP>: 了解了 kube-apiserver 的 API 后,下面会介绍 kube-apiserver 如何处理一个 API 请求,一个请求完整的流程如下图所示: ? 此处以一次 POST 请求示例说明,当请求到达 kube-apiserver 时,kube-apiserver 首先会执行在 http filter chain 中注册的过滤器链,该过滤器对其执行一系列过滤操作 在 k8s.io/kubernetes/plugin/pkg/admission 目录下可以看到 kube-apiserver 可以使用的所有全局约束插件,kube-apiserver 在启动时通过设置 启动流程分析 kubernetes 版本:v1.16 首先分析 kube-apiserver 的启动方式,kube-apiserver 也是通过其 Run 方法启动主逻辑的,在Run 方法调用之前会进行解析命令行参数

    3.5K31发布于 2020-02-27
  • 来自专栏玖叁叁

    kubernetes组件kube-apiserver启动参数详解

    --advertise-address 此参数用于指定 kube-apiserver 在哪个 IP 地址上公开服务。默认情况下,kube-apiserver 将在监听地址上公开服务。 kube-apiserver 将使用此 CA 文件验证客户端证书的有效性。 kube-apiserver 将使用此 CA 证书文件验证与 etcd 的通信。 kube-apiserver 将使用此地址列表连接到 etcd。 如果设置为 true,则 kube-apiserver 将使用 HTTPS 与 kubelet 进行通信。否则,kube-apiserver 将使用 HTTP 与 kubelet 进行通信。

    2.7K32编辑于 2023-04-28
  • 来自专栏我的小碗汤

    kube-apiserver审计日志记录和采集

    Kube-apiserver 执行审计。每个执行阶段的每个请求都会生成一个事件,然后根据特定策略对事件进行预处理并写入后端。 每个请求都可以用相关的 “stage” 记录。 您可以使用 --audit-policy-file 标志将包含策略的文件传递给 kube-apiserver。如果不设置该标志,则不记录事件。注意 rules 字段必须在审计策略文件中提供。 以下实践组件版本docker ce17,k8s 1.9.2 可以使用以下 kube-apiserver 标志配置 Log 审计后端: --audit-log-path 指定用来写入审计事件的日志文件路径 修改完成后,kubelet会自动删除重建kube-apiserver的pod(如果pod被删除后,过几分钟还不被创建,可以修改--audit-log-maxbackup的值保存退出,等待pod被创建-- 之后需要重启一下kube-apiserver节点的fluentd pod,fluentd采集时,也会输出日志到宿主机的/var/log/fluentd.log里,可以看到错误日志等信息,用于定位问题。

    3.7K20发布于 2019-01-23
  • 来自专栏风云笔记

    kube-apiserver的工作流程 (一)

    FullHandlerChain http.Handler … } 2.4 kube-apiserver启动http server // ServeHTTP makes it an http.Handler default: return nil, nil, fmt.Errorf("unknown storage type: %s", c.Type) } } 处理请求的流程 1.当请求到达 kube-apiserver 时,kube-apiserver 首先会执行在 http filter chain 中注册的过滤器链,该过滤器对其执行一系列过滤操作,主要有认证、鉴权等检查操作。 6.准入控制从这里开始调用的,kube-apiserver 在启动时通过设置 --enable-admission-plugins 参数来开启需要使用的插件,通过 ValidatingAdmissionWebhook 启用 API Aggregation 在 kube-apiserver 中需要增加以下配置来开启 API Aggregation: --proxy-client-cert-file=/etc/kubernetes

    3.4K60发布于 2020-03-05
  • 来自专栏k-cloud-labs

    high QPS for configmap GET requests in kube-apiserver - 3

    背景 线上 k8s 集群 kube-apiserver 的 ConfigMap Get 操作 QPS 较高,且同时间段 Etcd 中 ConfigMap 资源的 Get 操作 QPS 也较高,看日志多数请求的发起方是 kube-apiserver 日志大致如下: 图片 由来 定位此问题的过程中花了一定的时间,同时也纠正了一些有关 kubelet 内 Pod 处理的错误理解。 为什么没有走 kube-apiserver 缓存? 问题如何解决? 本篇主要介绍问题如何解决。

    37630编辑于 2023-09-09
  • 来自专栏k-cloud-labs

    high QPS for configmap GET requests in kube-apiserver - 1

    背景 线上 k8s 集群 kube-apiserver 的 ConfigMap Get 操作 QPS 较高,且同时间段 Etcd 中 ConfigMap 资源的 Get 操作 QPS 也较高,看日志多数请求的发起方是 kube-apiserver 日志大致如下: 图片 由来 定位此问题的过程中花了一定的时间,同时也纠正了一些有关 kubelet 内 Pod 处理的错误理解。 为什么没有走 kube-apiserver 缓存? 问题如何解决? 因为从 kube-apiserver 日志中看到的现象是请求直接穿透到了 Etcd,再结合上面 Get 方法,可以知道是命中了 item.data == nil 之后执行 item.data = &objectData

    40020编辑于 2023-09-06
  • 来自专栏深度学习与python

    字节跳动开源 kube-apiserver 高可用方案 KubeGateway

    KubeGateway 是字节跳动针对 kube-apiserver 流量特征专门定制的七层网关,它彻底解决了 kube-apiserver 负载不均衡的问题,同时在社区范围内首次实现了对 kube-apiserver kube-apiserver 本质上是一个无状态的服务器,为了实现其高可用,通常会部署多个 kube-apiserver 实例,同时引入外部负载均衡器(以下简称 LB)进行流量代理。 ,导致 kube-apiserver 无法认证用户。 在 kube-apiserver 滚动升级或者某个实例重启时,很容易引起迟些启动的 kube-apiserver 在长时间内只有很少的请求数。 为 kube-apiserver 分组提供基础能力,以低运维成本实现 kube-apiserver 组之间的隔离性,提高集群稳定性。

    1.4K20编辑于 2023-03-29
  • 来自专栏k-cloud-labs

    kube-apiserver 连接数也会影响内存?

    之前从资源对象的获取方式、序列化、深拷贝的角度分别分析了对 kube-apiserver 内存使用量的影响以及社区是如何进行优化的,这一篇围绕网络连接展开分析其对 kube-apiserver 内存的影响 涉及到如下内容: 连接数是如何影响 kube-apiserver 内存的 client-go 是如何与 kube-apiserver 建立连接的 kube-apiserver 是如何与 etcd 建立连接的 k8s 使用的 golang 版本如果有问题的话,影响的是客户端访问 kube-apiserver; etcd 使用的 golang 版本有问题的话,影响的是 kube-apiserver 从 etcd 由于 kube-apiserver 不管有多少实例,每个实例都需要与 etcd 建立连接,所以无法通过增加 kube-apiserver 实例数来缓解这个问题。 client-go 与 kube-apiserver 的连接 除了 kube-apiserver 与 etcd 会建立连接外,客户端也会与 kube-apiserver 建立连接,那么维护这些连接会不会也会造成内存使用明显增长的问题呢

    74010编辑于 2023-12-20
  • 来自专栏k-cloud-labs

    high QPS for configmap GET requests in kube-apiserver - 2

    背景 线上 k8s 集群 kube-apiserver 的 ConfigMap Get 操作 QPS 较高,且同时间段 Etcd 中 ConfigMap 资源的 Get 操作 QPS 也较高,看日志多数请求的发起方是 kube-apiserver 日志大致如下: 图片 由来 定位此问题的过程中花了一定的时间,同时也纠正了一些有关 kubelet 内 Pod 处理的错误理解。 为什么没有走 kube-apiserver 缓存? 问题如何解决? 本篇主要介绍 QPS 为什么高,为什么请求会穿透到 Etcd。

    38020编辑于 2023-09-06
  • 来自专栏后端开发随笔

    配置kube-apiserver基于token的认证机制

    $ cat /etc/kubernetes/token_auth_file admin,admin,1 system,system,2 (2)设置kube-apiserver的启动参数“--token-auth-file kubernetes/apiserver中添加如下参数: --secure-port=6443 --token-auth-file=/etc/kubernetes/token_auth_file 重启kube-apiserver :systemctl restart kube-apiserver (3)用curl客户端工具通过token访问API Server: # 给apiserver添加Token认证之后,再次访问apiserver

    55420编辑于 2023-10-15
  • 来自专栏kinnylee钻研技术

    k8s源码分析(2)- kube-apiserver

    概述 kube-apiserver作为k8s最核心的组件,是各个组件之间沟通的桥梁,各个组件不会直接通信,而是都要经过api-server做中转。 详见之前的另一篇博客,本文从源码角度分析api-server kube-apiserver主要职责 提供整个集群的api接口管理,提供api注册、发现 --- 通过go-restful框架实现 资源操作的唯一入口 --- 操作etcd资源 集群内部各个组件的枢纽 提供请求认证、授权、访问控制等安全控制 三大服务 kube-apiserver提供了3种http server服务,用于将庞大的kube-apiserver 入口函数 kube-apiserver组件是一个单独的进程,启动的入口函数如下: 源码位置:cmd/kube-apiserver/apiserver.go import ( ... // 引入legacyscheme kube-apiserver组件通过Cobra填充配置参数默认值并验证参数,前面第0步介绍的app.NewAPIServerCommand() 源码位置:cmd/kube-apiserver/app/server.go

    6K91发布于 2020-10-15
  • 来自专栏才浅coding攻略

    图解K8s源码 - kube-apiserver

    在进入组件源码分析前我们先来看下在k8s中创建一个Pod资源对象的流程是怎样的: 使用 kubectl 工具向 kube-apiserver 发起创建 pod 资源对象请求; kube-apiserver pod 资源对象选择最优节点并通知 kube-apiserverkube-apiserver 将最优节点持久化保存到 Etcd 集群中; kube-apiserver 通知最优节点上的 kubelet kube-apiserver kube-apiserver 组件,它负责将 k8s 中的“资源组/资源版本/资源”以 RESTful 风格的形式对外暴露并提供服务。 kube-apiserver 中的组件 kube-apiserver 提供了3种 HTTP Server 服务用于将 kube-apiserver组件功能进行解耦,分别是 APIExtensionsSerer kube-apiserver 权限控制及认证 kube-apiserver 作为k8s集群请求入口,接收集群中组件和客户端访问请求, kube-apiserver 对接口访问请求提供了3种安全权限控制

    3.7K21编辑于 2022-12-12
领券