kubernetes kube-proxy 配置参数

大番茄 2019年12月13日 839次浏览
--bind-address:

监听的地址,默认0.0.0.0 监听所有地址。

--cleanup:

执行清理iptables与ipvs规则,然后退出。
iptables规则可以清理,ipvs的只是把kube-ipvs网卡清理了。这个警告没关系。

[root@k8s-node5 bin]# /usr/local/k8s/bin/kube-proxy --cleanup
W1213 16:54:16.760644   16728 server.go:208] WARNING: all flags other than --config, --write-config-to, and --cleanup are deprecated. Please begin using a config file ASAP.
--cleanup-ipvs:

如果--cleanup也指定了, 除正常cleanup以外还会刷新ipvs规则。也没有测出什么来。

--cluster-cidr:

整个集群pod的范围,不是单个节点。 如: --cluster-cidr=10.1.0.0/16, 会在iptables添加相应的KUBE-FORWARD与KUBE-SERVICE规则。

--conntrack-max-per-core:

修改内核参数nat表大小,/proc/sys/net/netfilter/nf_conntrack_max
每cpu核设置的大小。根据cpu核数量,自动计算nat表大小。default 32768, 0表示不修改, 并忽略--conntrack-min参数。

--conntrack-min:

nat表最小有多大。default 131072。

--conntrack-tcp-timeout-close-wait:

修改内核参数nat表CLOSE_WAIT连接的超时间。/proc/sys/net/netfilter/nf_conntrack_tcp_timeout_close_wait。 默认 1h0m0s

--conntrack-tcp-timeout-established:

修改内核参数中nat表established连接的超时时间,/proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established。 默认: 24h0m0s

--healthz-bind-address:

健康检测地址,默认 0.0.0.0

--healthz-port:

健康检测端口,默认10256, 0 表示禁用。

--hostname-override:

用来识别集群节点的名称,会在集群中查找有没有相同名称的节点。 如果没有就会报下面的错误。而集群节点的名称是通过kubelet的--hostname-override参数指定的。默认都是主机名。

E1213 11:30:19.866389   30172 node.go:124] Failed to retrieve node info: nodes "172.100.101.198" not found
E1213 11:30:20.923691   30172 node.go:124] Failed to retrieve node info: nodes "172.100.101.198" not found
E1213 11:30:23.065507   30172 node.go:124] Failed to retrieve node info: nodes "172.100.101.198" not found
E1213 11:30:27.685217   30172 node.go:124] Failed to retrieve node info: nodes "172.100.101.198" not found
E1213 11:30:36.457646   30172 node.go:124] Failed to retrieve node info: nodes "172.100.101.198" not found
F1213 11:30:36.457735   30172 server.go:443] unable to get node IP for hostname 172.100.101.198
--iptables-masquerade-bit:

如果使用纯iptables的环境,则给需要SNAT的包添加mark。以进站添加mark,出站过滤mark的方式做SNAT。范围必须是0-31, 默认14。

这里的值是有多少位二进制1。
如默认的: --iptables-masquerade-bit=14。
十进制14也就是11111111111111,再加上1 = 100000000000000, 转换成十六进制就是0x4000。 至于为什么不直接使用加1以后的值,这就不清楚了。

会添加这两条规则:

-A KUBE-MARK-MASQ -j MARK --set-xmark 0x4000/0x4000
-A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -m mark --mark 0x4000/0x4000 -j MASQUERADE

参数值改成5就是这样两条规则:

-A KUBE-MARK-MASQ -j MARK --set-xmark 0x20/0x20
-A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -m mark --mark 0x20/0x20 -j MASQUERADE
--iptables-min-sync-period:

当节点与服务发生变化以后,iptables规则刷新的最小间隔。 (e.g. '5s', '1m', '2h22m')

--iptables-sync-period:

当节点与服务发生变化以后,iptables规则刷新的最大间隔。默认: 30s , 必须大于0.

--ipvs-exclude-cidrs:

指定一个逗号分隔的CIDR列表,当cleanup ipvs规则时,不能清理列表里的规则。--cleanup清理ipvs都没有测试成功。这个更别提了。

--ipvs-min-sync-period:

当节点与服务发生变化以后,ipvs规则刷新的最小间隔

--ipvs-sync-period:

当节点与服务发生变化以后,ipvs规则刷新的最大间隔

--ipvs-scheduler:

ipvs的调度规则(rr, wrr, sh, dh, lc, wlc, sed, nq, lblc, lblcr)。

--ipvs-strict-arp:

设置内核参数arp_ignore为1,arp_announce为2。就是这俩 /proc/sys/net/ipv4/conf/all/arp_ignore, /proc/sys/net/ipv4/conf/all/arp_announce


这三个不知道怎么测试。

--kube-api-burst:

每秒与 kubernetes apiserver 交互的数量, 默认 10.

--kube-api-content-type:

发送到apiserver的请求类型,默认: "application/vnd.kubernetes.protobuf"

--kube-api-qps:

与 kubernetes apiserver 交互时使用的 QPS。


--kubeconfig:

指定连接apiserver的kubeconfig文件。

--log-dir:

如果非空, 写日志到指定的目录。

--log-file:

如果非空, 写日志到指定的文件。

--log-file-max-size:

日志大小,单位M bytes。 默认, 1800.

--log-flush-frequency:

不清楚是不是刷新到磁盘的时间, 默认: 5s

--logtostderr:

是否把日志写入到标准错误输出。

--masquerade-all:

纯使用iptables的环境,snat所有service cluster ip的流量。(并不常用)

--master:

apiserver地址,都在kubeconfig文件里已经指定了。会覆盖kubeconfig里的值。


prometheus 监控

--metrics-bind-address:

提供metrics监控接口的地址,默认127.0.0.1.

--metrics-port:

提供metrics监控接口的端口, 默认10249.


--nodeport-addresses:

指定用于 NodePorts 的地址。(e.g. 1.2.3.0/24, 1.2.3.4/32), 默认所有地址。

--oom-score-adj:

内存OOM分数的取值。指定oom-score-adj值。 范围 -1000-1000 (default -999)。

--profiling:

在web页面的/debug/pprof接口启用分析页面。web页面的地址与端口就是--metrics-bind-address与--metrics-port指定的。

--proxy-mode:

负载均衡模式, 包含: userspace, iptables, ipvs。 默认iptables。

--proxy-port-range # 指定主机端口范围。 就是kube-proxy可以使用的端口范围。如果不指定,指定为0,或是0-0, 都会随机使用端口。
至于为什么会使用端口,比如kube-proxy工作在userspace模式下就是代理(类似于haproxy, nginx stream),需要使用端口来访问后端。下面是在userspace模式下报的错:

随机的端口正在使用

E1213 16:21:28.554603   32311 proxier.go:532] Failed to open portal for "monitor/monitor-prometheus-node-exporter:metrics": can't open node port for 10.0.215.216:9100/TCP: listen tcp 10.0.215.216:9100: bind: address already in use
E1213 16:21:29.937213   32311 proxier.go:392] Failed to ensure portal for "monitor/monitor-prometheus-node-exporter:metrics": can't open node port for 10.0.215.216:9100/TCP: listen tcp 10.0.215.216:9100: bind: address already in use

没有端口可用。

E1213 16:21:14.713787   32109 proxier.go:506] failed to allocate proxy port for service "ingress-controller/ingress-nginx:http": port allocation failed; there are no remaining ports left to allocate in the accepted range
E1213 16:21:15.714280   32109 proxier.go:506] failed to allocate proxy port for service "ingress-controller/ingress-nginx:https": port allocation failed; there are no remaining ports left to allocate in the accepted range
--udp-timeout:

空闲的udp连接保持打开的时长, 只能用于userspace模式, 默认:250ms.

--write-config-to:

把默认配置以及命令行指定的配置写入到config文件。 有一些config文件不支持的写不进去。

不知道config文件是什么格式,现在知道了吧。
[root@k8s-node5 bin]# /usr/local/k8s/bin/kube-proxy --kubeconfig=/usr/local/k8s/conf/kube-proxy.kubeconfig.yaml --proxy-mode=ipvs --log-dir=/usr/local/k8s/logs --logtostderr=false --v=4 --cluster-cidr=10.1.0.0/16 --write-config-to=333
[root@k8s-node5 bin]# cat 333
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: 0.0.0.0
clientConnection:
  acceptContentTypes: ""
  burst: 10
  contentType: application/vnd.kubernetes.protobuf
  kubeconfig: /usr/local/k8s/conf/kube-proxy.kubeconfig.yaml
  qps: 5
clusterCIDR: 10.1.0.0/16
configSyncPeriod: 15m0s
conntrack:
  maxPerCore: 32768
  min: 131072
  tcpCloseWaitTimeout: 1h0m0s
  tcpEstablishedTimeout: 24h0m0s
enableProfiling: false
healthzBindAddress: 0.0.0.0:10256
hostnameOverride: ""
iptables:
  masqueradeAll: false
  masqueradeBit: 14
  minSyncPeriod: 0s
  syncPeriod: 30s
ipvs:
  excludeCIDRs: null
  minSyncPeriod: 0s
  scheduler: ""
  strictARP: false
  syncPeriod: 30s
kind: KubeProxyConfiguration
metricsBindAddress: 127.0.0.1:10249
mode: ipvs
nodePortAddresses: null
oomScoreAdj: -999
portRange: ""
udpIdleTimeout: 250ms
winkernel:
  enableDSR: false
  networkName: ""
  sourceVip: ""