标签: kube-proxy

用户空间模式在kube-proxy的代理模式中意味着什么?

kube-proxy有一个名为--proxy-mode的选项,根据帮助消息,这个选项可以是userspaceiptables.(见下文)

# 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 kube-proxy

15
推荐指数
1
解决办法
5806
查看次数

如何在Kubernetes中管理持久连接

在Kubernetes中,服务通过服务ip相互通信。使用iptables或类似的东西,每个TCP连接都透明地路由到可用于被叫服务的pod之一。如果呼叫服务未关闭TCP连接(例如使用TCP keepalive或连接池),它将连接到一个Pod,而不使用可能产生的其他Pod。

处理这种情况的正确方法是什么?


我自己不满意的想法:

每次api调用后关闭连接

我将每个呼叫的速度变慢只是为了能够将请求分配到不同的Pod吗?感觉不对。

最小连接数

我可以强制调用者打开多个连接(假设它将随后在这些连接中分配请求),但是应该打开几个?呼叫者不知道(可能不应该知道)有多少个豆荚。

禁用突发

我可以限制被调用服务的资源,因此它在多个请求上变得很慢,并且调用方将打开更多连接(希望与其他Pod连接)。同样,我不喜欢任意放慢请求的想法,这仅适用于cpu绑定的服务。

kubernetes kube-proxy

11
推荐指数
1
解决办法
695
查看次数

Kube-proxy或ELB"延迟"HTTP请求的数据包

我们在AWS上的Kubernetes(1.9.3)上运行了一个Web API应用程序(使用KOPS设置).该应用程序是一个部署,由服务(类型:LoadBalancer)表示,该服务实际上是AWS上的ELB(v1).这通常有效 - 除了一些数据包(HTTP请求的片段)在客户端< - > app容器之间的某处"延迟".(在终止于ELB的HTTP和HTTPS中).

从节点方面:

(注意:服务器端的几乎所有数据包都会重复3次)

我们使用keep-alive,因此tcp套接字是打开的,请求到达并返回相当快.然后问题发生了:

  • 首先,只有头部的数据包到达[PSH,ACK](我在tcpdump中查看有效负载中的头部).
  • 一个[ACK]由容器发回.
  • tcp套接字/流安静很长时间(最多30秒甚至更多 - 但是间隔不一致,我们认为> 1s是一个问题).
  • 另一个带有HTTP数据的[PSH,ACK]到达,最终可以在应用程序中处理该请求.

从客户端:

我从我的计算机上运行一些流量,在客户端记录它以查看问题的另一端,但不是100%确定它代表真正的客户端.

  • 一个[PSH,ASK]标题出来了.
  • 带有部分有效负载的几个[ACK]开始出去.
  • 没有响应到达几秒钟(或更长时间),没有更多的数据包熄灭.
  • 标记为[TCP窗口更新]的[ACK]到达.
  • 再次短暂停顿,[ACK]开始到达,会话一直持续到有效载荷结束.

这只发生在负载下.

根据我的理解,这是介于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"- 问题仍然存在.
  • (玩弄ELB设置希望有什么东西可以做到这一点¯_(ツ)_ /¯)
  • 在Kube-Proxy中查找错误,发现以下情况很少见:

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 …

amazon-elb kubernetes project-calico kops kube-proxy

10
推荐指数
0
解决办法
309
查看次数

如何更改 kube-proxy 配置?

我尝试更改 kube-proxy configMap 和 kube-proxy 命令来设置,metricsBindAddress但 kubernetes 在几秒钟后重置这些更改(没有任何警告)。

  1. kubectl edit cm kube-proxy-config -n kube-system=>添加metricsBindAddress=>等待几秒钟并打开配置-有空的metricsBindAddress
  2. kubectl 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

kubernetes kube-proxy

10
推荐指数
2
解决办法
1万
查看次数

如何查找 kube-proxy 正在运行的模式

默认情况下,当配置中未指定任何值时,kube-proxy 可能会在 iptables 或用户空间模式下运行:

--proxy-mode 代理模式

使用哪种代理模式:“userspace”(较旧)或“iptables”(更快)或“ipvs”或“kernelspace”(Windows)。如果为空,则使用最佳可用代理(当前为 iptables)。如果选择了 iptables 代理,无论如何,但系统的内核或 iptables 版本不足,这总是会回落到用户空间代理

文档

由于用户空间和 iptables 模式似乎都会在节点上创建 iptables 规则,因此有没有可靠的方法可以找出 kube-proxy 默认使用的代理模式?

kubernetes kube-proxy

10
推荐指数
1
解决办法
6510
查看次数

Kubernetes Kube代理机制

假设在Kubernetes中,我们有三个Pod,它们物理上托管在Node X,Y和Z上。当我使用'kubectl暴露'将它们作为服务公开时,集群中的所有节点都是(除了X,Y和Z )配置方式相同?具体来说,集群中每个节点中的kube-proxy会监视apiserver,构建一堆iptables规则并引用门户IP(由apiserver选择),然后将这些规则插入其所驻留的节点?

我认为必须在所有节点上完成的原因是集群不知道客户端来自哪个节点来打入口IP?

kubernetes kube-proxy

6
推荐指数
1
解决办法
1万
查看次数

在 Kubernetes 节点上实现 iptables 规则

我想在 Kubernetes(kube-proxy)开始发挥它的魔力之前实现我自己的 iptables 规则,并根据在节点上运行的服务/pods 动态创建规则。kube-proxy 正在运行--proxy-mode=iptables

每当我在启动节点时尝试加载规则时,例如在INPUT链中,即使我的规则也带有标志,Kubernetes 规则 (KUBE-EXTERNAL-SERVICESKUBE-FIREWALL) 会插入到链的顶部-I

我错过了什么或做错了什么?

如果它有某种关系,我正在为 pod 网络使用 weave-net 插件。

iptables kubernetes kube-proxy

6
推荐指数
1
解决办法
3876
查看次数

有没有办法在 GKE 集群上启用 IPVS 代理模式?

我想尝试这种新的代理模式以及它为我们的一些应用程序提供的各种调度程序。到目前为止,我一直无法找到一个方法来改变默认的模式iptablesipvs对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

google-kubernetes-engine kube-proxy

6
推荐指数
1
解决办法
1618
查看次数

Kubernetes kube-proxy正在运行但找不到指定的kubeconfig文件

我想设置 k8skube-proxy配置文件权限以进行强化。

我正在描述如何在将标志设置为无法找到的路径 ( ) 的kube-proxy情况下运行进程......--configvar/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)

为什么?

kubernetes kube-proxy

6
推荐指数
1
解决办法
4368
查看次数

Kubernetes pod 长时间处于终止状态接收流量

我有一个应用程序服务,运行着 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

6
推荐指数
0
解决办法
1511
查看次数