【问题标题】:How to find which mode kube-proxy is running in如何找到 kube-proxy 正在运行的模式
【发布时间】:2021-06-19 02:18:20
【问题描述】:
默认情况下,当配置中没有指定值时,kube-proxy 可能运行在 iptables 或用户空间模式:
--proxy-mode ProxyMode
使用哪种代理模式:“userspace”(旧)或“iptables”(更快)或“ipvs”或“内核空间”(Windows)。 如果为空,请使用最可用的代理(当前为 iptables)。如果选择了 iptables 代理,无论如何,但系统的内核或 iptables 版本不足,这总是回退到用户空间代理。
doc
由于用户空间和iptables模式似乎都在节点上创建iptables规则,有没有可靠的方法来找出kube-proxy默认的代理模式?
【问题讨论】:
标签:
kubernetes
kube-proxy
【解决方案1】:
kube-proxy 提出的 Mode 在 kube-proxy 日志文件中提到。
W0322 08:09:44.312816 1 server_others.go:578] Unknown proxy mode "", assuming iptables proxy
I0322 08:09:44.313052 1 server_others.go:185] Using iptables Proxier.
签入代码https://github.com/kubernetes/kubernetes/blob/master/cmd/kube-proxy/app/server_others.go
func getProxyMode(proxyMode string, canUseIPVS bool, kcompat iptables.KernelCompatTester) string {
switch proxyMode {
case proxyModeUserspace:
return proxyModeUserspace
case proxyModeIPTables:
return tryIPTablesProxy(kcompat)
case proxyModeIPVS:
return tryIPVSProxy(canUseIPVS, kcompat)
}
klog.Warningf("Unknown proxy mode %q, assuming iptables proxy", proxyMode)
return tryIPTablesProxy(kcompat)
}
func tryIPTablesProxy(kcompat iptables.KernelCompatTester) string {
// guaranteed false on error, error only necessary for debugging
useIPTablesProxy, err := iptables.CanUseIPTablesProxier(kcompat)
if err != nil {
utilruntime.HandleError(fmt.Errorf("can't determine whether to use iptables proxy, using userspace proxier: %v", err))
return proxyModeUserspace
}
if useIPTablesProxy {
return proxyModeIPTables
}
// Fallback.
klog.V(1).Infof("Can't use iptables proxy, using userspace proxier")
return proxyModeUserspace
}