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"