k8s源码分析1--kube-proxy
kube-proxy什么鬼?(查看前的备注)
备注:楼主在边看代码边更新,所以过几个小时楼主又更新了。
看过很多文章和自己日常应用分析作出如下解释:
kube-proxy 部署在节点上,主要是为了:
- 和k8s-apiserver交互,维持service相关的ip状态。
- 调用系统层的工具创建service相关的链路和规则,主要是iptables,包含 使用iptables维持的负载均衡。
解释很简单,到底是不是?接下来我们打开源码看看。
kube-proxy什么鬼?(查看代码后的功能总结)
- 从kube-apiserver list-watch数据—informers(client-go)
- 当查询到数据变化,更新本地的iptables(如果模式设置iptables)
- 数据变化指的是,add/update/delete,对象是service/endpoint
- 日志处理/事件广播/metrics/健康检查。
代码重点注意
入口
位置文件:kubernetes/cmd/kube-proxy/proxy.go
```golang
// An highlighted block
command := app.NewProxyCommand()
if err := command.Execute(); err != nil {
os.Exit(1)
}
参数格式化处理
位置文件:kubernetes/cmd/kube-proxy/app/server.go
```golang
// An highlighted block
func NewProxyCommand() *cobra.Command {...}
运行服务前的各种client初始化
位置文件:kubernetes/cmd/kube-proxy/app/server_others.go
```golang
// An highlighted block
func NewProxyServer(o *Options) (*ProxyServer, error) {}
开启协程对资源service[endpoint略]开始list-watch kube-apiserver
文件位置:kubernetes/cmd/kube-proxy/app/server.go
```golang
// An highlighted block
func (proxier *Proxier) syncProxyRules() {
go serviceConfig.Run(wait.NeverStop)
}
开启定时器/循环执行
文件位置:kubernetes/pkg/proxy/iptables/proxier.go
```golang
// An highlighted block
func (bfr *BoundedFrequencyRunner) Loop(stop <-chan struct{}) {
klog.V(3).Infof("%s Loop running", bfr.name)
bfr.timer.Reset(bfr.maxInterval)
for {
select {
case <-stop:
bfr.stop()
klog.V(3).Infof("%s Loop stopping"

本文介绍了kube-proxy的作用,它作为Kubernetes集群中的节点组件,负责与apiserver交互并维护service的IP状态。通过iptables实现service的负载均衡。通过源码分析,探讨了kube-proxy的主要功能,包括参数处理、client初始化、list-watch机制以及iptables规则的更新。文章详细讲解了入口文件、参数格式化和主要功能实现的代码路径。
最低0.47元/天 解锁文章
1144

被折叠的 条评论
为什么被折叠?



