> 文章列表 > [k8s] 八股文

[k8s] 八股文

[k8s] 八股文

最近在基于k8s做集群管理系统,心里有一些问题,在这里记录一下。

k8s中的服务发现?

这一点项目中有用到。任务模块通过gprc调用用户模块的服务时,使用了svc-user-v0.shuwd:8002,k8s是怎么将该流量转发到对应的pod上的?

这是k8s中非常基础的问题,可以看看 https://blog.fleeto.us/post/demystifying-kubernetes-service-discovery/

总结来说,服务发现离不开两个重要组件:

  • coreDNS。service创建时,会在coreDNS注册服务,也就是将service名称和cluster ip绑定。这样,service名称可以被coreDNS解析为对应的cluster ip。
  • kubeproxy。监听api server,当监听到srevice,为其配置相应的iptables或者ipvs。iptables的作用是将发往service ip的流量重定向到对应的endpoints(实际上就是可用的pods列表),对每个pod的转发概率其实就是负载均衡的体现。

关于iptables,看看这篇文章 https://yuerblog.cc/2019/12/09/k8s-%E6%89%8B%E6%8A%8A%E6%89%8B%E5%88%86%E6%9E%90service%E7%94%9F%E6%88%90%E7%9A%84iptables%E8%A7%84%E5%88%99/

informer原理

这一点项目中有用到。任务模块通过informer监听pytorchjob,实时修改数据库中的记录。

其实informer很晦涩,很难。informer是client-go中非常重要的工具包,很多k8s组件都有使用。看看这篇文章

  • https://www.jianshu.com/p/cc1444867c70
  • https://zhuanlan.zhihu.com/p/59660536

我来概括一下informer的两点主要功能。

  • informer有一个自己的本地存储,用户get/list资源时是从这个本地存储获取,因此可以减轻api server 和etcd的压力。
  • Informer可以监听api server中的增量事件
    • 一方面,informer可以通过增量事件对本地存储进行相应修改,从而和etcd中的数据保持一致性。
    • 另一方面,informer可以根据事件类型,触发用户自定义的事件处理函数。

informer如何维护storage和etcd的一致性呢?

依赖于informer的list&watch机制。informer初始化时会使用list获取所有资源存在storage中,之后通过watch增量事件对本地存储进行修改,从而和etcd中的数据保持一致性。

informer中的二级缓存?

增量队列是存储从api server中监听到的增量事件。本地存储用来

informer为什么要定期resync?

resync并不是list,不是和api server交互,而是把storage中的数据放入增量队列(DeltaFIFO)中进行重放。目的是防止有些 handler 处理失败了而缺乏重试的机会。看这篇文章 https://gobomb.github.io/post/whats-resync-in-informer/

informer中的resource version概念?