kube-proxy有一个名为--proxy-mode的选项,根据帮助消息,这个选项可以是userspace或iptables.(见下文)
# kube-proxy -h
Usage of kube-proxy:
...
--proxy-mode="": Which proxy mode to use: 'userspace' (older, stable) or 'iptables' (experimental). If blank, look at the Node object on the Kubernetes API and respect the 'net.experimental.kubernetes.io/proxy-mode' annotation if provided. Otherwise use the best-available proxy (currently userspace, but may change in future versions). If the iptables proxy is selected, regardless of how, but the system's kernel or iptables versions are insufficient, this always falls back to the userspace …
Run Code Online (Sandbox Code Playgroud) 在Kubernetes中,服务通过服务ip相互通信。使用iptables或类似的东西,每个TCP连接都透明地路由到可用于被叫服务的pod之一。如果呼叫服务未关闭TCP连接(例如使用TCP keepalive或连接池),它将连接到一个Pod,而不使用可能产生的其他Pod。
处理这种情况的正确方法是什么?
我自己不满意的想法:
我将每个呼叫的速度变慢只是为了能够将请求分配到不同的Pod吗?感觉不对。
我可以强制调用者打开多个连接(假设它将随后在这些连接中分配请求),但是应该打开几个?呼叫者不知道(可能不应该知道)有多少个豆荚。
我可以限制被调用服务的资源,因此它在多个请求上变得很慢,并且调用方将打开更多连接(希望与其他Pod连接)。同样,我不喜欢任意放慢请求的想法,这仅适用于cpu绑定的服务。
我们在AWS上的Kubernetes(1.9.3)上运行了一个Web API应用程序(使用KOPS设置).该应用程序是一个部署,由服务(类型:LoadBalancer)表示,该服务实际上是AWS上的ELB(v1).这通常有效 - 除了一些数据包(HTTP请求的片段)在客户端< - > app容器之间的某处"延迟".(在终止于ELB的HTTP和HTTPS中).
从节点方面:
(注意:服务器端的几乎所有数据包都会重复3次)
我们使用keep-alive,因此tcp套接字是打开的,请求到达并返回相当快.然后问题发生了:
从客户端:
我从我的计算机上运行一些流量,在客户端记录它以查看问题的另一端,但不是100%确定它代表真正的客户端.
这只发生在负载下.
根据我的理解,这是介于ELB和Kube-Proxy之间的某个地方,但我很无能为力,急需帮助.
这是Kube-Proxy运行的参数:
Commands: /bin/sh -c mkfifo /tmp/pipe; (tee -a /var/log/kube-proxy.log < /tmp/pipe & ) ; exec /usr/local/bin/kube-proxy --cluster-cidr=100.96.0.0/11 --conntrack-max-per-core=131072 --hostname-override=ip-10-176-111-91.ec2.internal --kubeconfig=/var/lib/kube-proxy/kubeconfig --master=https://api.internal.prd.k8s.local --oom-score-adj=-998 --resource-container="" --v=2 > /tmp/pipe 2>&1
我们使用Calico作为CNI:
到目前为止,我已经尝试过:
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
- 问题仍然存在.E0801 04:10:57.269475 1 reflector.go:205] k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/factory.go:85:无法列出*core.Endpoints:获取https:// api. internal.prd.k8s.local/api/v1/endpoints?limit = 500&resourceVersion = 0 …
我尝试更改 kube-proxy configMap 和 kube-proxy 命令来设置,metricsBindAddress
但 kubernetes 在几秒钟后重置这些更改(没有任何警告)。
kubectl edit cm kube-proxy-config -n kube-system
=>添加metricsBindAddress
=>等待几秒钟并打开配置-有空的metricsBindAddresskubectl edit ds kube-proxy -n kube-system
=> 添加--metrics-bind-address
到命令 => 等待几秒钟 => 该命令已重置为默认值如何更改 kube-proxy 配置并保留这些更改?
库伯内特版本 1.17
更新(正如您所见,几秒钟后,metricsBindAddress 更改为空字符串):
更新2(注意metricsBinAddress,大约40-50秒后更改):
最终更新:云提供商(Yandex)的回答 -kube-proxy pod it is on the host's network, so to prevent security problems, it listens exclusively on the loopback address and therefore the parameter will be reset
ps https://github.com/helm/charts/tree/master/stable/prometheus-operator#kubeproxy - 我想让 prometheus 可以访问 kube-proxy
默认情况下,当配置中未指定任何值时,kube-proxy 可能会在 iptables 或用户空间模式下运行:
--proxy-mode 代理模式
使用哪种代理模式:“userspace”(较旧)或“iptables”(更快)或“ipvs”或“kernelspace”(Windows)。如果为空,则使用最佳可用代理(当前为 iptables)。如果选择了 iptables 代理,无论如何,但系统的内核或 iptables 版本不足,这总是会回落到用户空间代理。
由于用户空间和 iptables 模式似乎都会在节点上创建 iptables 规则,因此有没有可靠的方法可以找出 kube-proxy 默认使用的代理模式?
假设在Kubernetes中,我们有三个Pod,它们物理上托管在Node X,Y和Z上。当我使用'kubectl暴露'将它们作为服务公开时,集群中的所有节点都是(除了X,Y和Z )配置方式相同?具体来说,集群中每个节点中的kube-proxy会监视apiserver,构建一堆iptables规则并引用门户IP(由apiserver选择),然后将这些规则插入其所驻留的节点?
我认为必须在所有节点上完成的原因是集群不知道客户端来自哪个节点来打入口IP?
我想在 Kubernetes(kube-proxy)开始发挥它的魔力之前实现我自己的 iptables 规则,并根据在节点上运行的服务/pods 动态创建规则。kube-proxy 正在运行--proxy-mode=iptables
。
每当我在启动节点时尝试加载规则时,例如在INPUT
链中,即使我的规则也带有标志,Kubernetes 规则 (KUBE-EXTERNAL-SERVICES
和KUBE-FIREWALL
) 会插入到链的顶部-I
。
我错过了什么或做错了什么?
如果它有某种关系,我正在为 pod 网络使用 weave-net 插件。
我想尝试这种新的代理模式以及它为我们的一些应用程序提供的各种调度程序。到目前为止,我一直无法找到一个方法来改变默认的模式iptables
来ipvs
对GKE节点。
Everywere 说要传递--proxy-mode=ipvs
给 kube-proxy,但这对作为 GKE 的“弹性/动态”部署没有意义,新节点不会进行这些更改。
我也在这里看到:https : //kubernetes.io/blog/2018/07/09/ipvs-based-in-cluster-load-balancing-deep-dive/那个“GCE脚本”(我不真的知道那些是什么)支持设置KUBE_PROXY_MODE=ipvs
环境变量,但我找不到在创建时通过gcloud
或 Web 界面将 env 变量传递给节点池的方法。
知道这是否可能吗?(顺便说一下,我正在使用 version 1.11.6-gke.2
)
我想设置 k8skube-proxy
配置文件权限以进行强化。
我正在描述如何在将标志设置为无法找到的路径 ( ) 的kube-proxy
情况下运行进程......--config
var/lib/kube-proxy/config.conf
事实上检查kube-proxy
过程给出了这个:
[centos@cpu-node0 ~]$ ps -ef | grep kube-proxy
root 20890 20872 0 Oct20 ? 00:19:23 /usr/local/bin/kube-proxy --config=/var/lib/kube-proxy/config.conf --hostname-override=cpu-node0
centos 55623 51112 0 14:44 pts/0 00:00:00 grep --color=auto kube-proxy
Run Code Online (Sandbox Code Playgroud)
但该文件/var/lib/kube-proxy/config.conf
不存在:
[centos@cpu-node0 ~]$ ll /var/lib/kube-proxy/config.conf
ls: cannot access /var/lib/kube-proxy/config.conf: No such file or directory
Run Code Online (Sandbox Code Playgroud)
为什么?
我有一个应用程序服务,运行着 2 个 pod,这些 pod 正在接收来自 Kubernetes 集群中另一个服务的流量。
我面临的问题是我的 Pod 被终止并且无法满足飞行中的请求。
因此,为了解决这个问题,我添加了一个 pod 生命周期 preStop 挂钩,以等待 250 秒来完成所有待处理的请求,并将 TerminationGracePeriodSeconds设置 为 300 秒。
lifecycle:
preStop:
exec:
command:
- /bin/sleep
- "250"
Run Code Online (Sandbox Code Playgroud)
现在我期望的是,当 Pod 转换到 Terminate 状态时,它应该停止接收新请求,只满足它已经有的请求,但这并没有发生。
Pod 持续接收流量直到最后一秒,最终在 preStop 完成后被杀死,最终调用应用程序收到 502 错误代码。
因此,为了调试此问题,我进一步进行了操作,并怀疑可能是端点在服务中未正确更新,但我错了。当 Pod 转换到终止状态时,端点将从服务中删除,但 Pod 继续获取流量。
然后我登录到节点并检查 IPtables 以获取 IP 表转发规则,以验证 pod IP 是否仍然存在,但当 pod 转换为 Terminate 时,IPtable 转发规则立即更新。
>sudo iptables -t nat -L KUBE-SVC-MYVS2X43QAGQT6BT -n | column -t
Chain KUBE-SVC-MYVS2X43QAGQT6BT (1 references)
target prot opt source destination
KUBE-SEP-HDK3MJ4L3R3PLTOQ …
Run Code Online (Sandbox Code Playgroud) amazon-web-services kubernetes kube-proxy amazon-eks nginx-ingress