您现在的位置是:首页 >其他 >[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组件都有使用。看看这篇文章
我来概括一下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概念?