针对linux–通过特定接口路由应用程序流量和linux指定路由这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Kubernetes集群滚动更新导致Pod应用程序流量丢失的原因、Linux/
针对linux – 通过特定接口路由应用程序流量和linux指定路由这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Kubernetes 集群滚动更新导致 Pod 应用程序流量丢失的原因、Linux / Bash,使用ps -o通过特定名称获取进程?、linux – “绑定”USB键盘专门用于特定应用程序、linux – 使用shell脚本(bash)查找特定接口的系统的IP地址等相关知识,希望可以帮助到你。
本文目录一览:- linux – 通过特定接口路由应用程序流量(linux指定路由)
- Kubernetes 集群滚动更新导致 Pod 应用程序流量丢失的原因
- Linux / Bash,使用ps -o通过特定名称获取进程?
- linux – “绑定”USB键盘专门用于特定应用程序
- linux – 使用shell脚本(bash)查找特定接口的系统的IP地址
linux – 通过特定接口路由应用程序流量(linux指定路由)
我有一个debian linux 5.0服务器,有两个公共接口.我想通过一个接口路由来自应用程序的一个实例的出站流量,而通过第二个接口路由第二个实例.有一些挑战:
>应用程序的两个实例都使用相同的协议
>应用程序的两个实例都可以访问整个Internet(无法基于dest网络路由)
>我无法更改应用程序的代码
>我认为负载均衡所有流量的典型方法不会很好,因为在出站流量中访问的目标服务器相对较少,并且所有流量确实需要在这些相对较少的服务器上均匀分布.
我可能在盒子上运行两个虚拟化服务器并将它们绑定到不同的接口,但我正在寻找一个更简单的解决方案,可能使用iproute或iptables?
对我有什么想法吗?提前致谢 – 我很乐意回答任何问题.
解决方法
这使您可以根据UID,GID,PID,SID和命令名称设置OUTPUT链规则.
Kubernetes 集群滚动更新导致 Pod 应用程序流量丢失的原因

转:
Kubernetes 集群滚动更新导致 Pod 应用程序流量丢失的原因
Kubernetes 滚动更新导致 Pod 流量丢失的原因
文章目录
- Kubernetes 滚动更新导致 Pod 流量丢失的原因
-
- 1.Pod 流量丢失的原因
- 2. 如何优雅的处理 Pod 流量丢失的问题
-
- 2.1. 理解 Pod 删除过程
- 2.2. 如何优雅的避免 Pod 流量丢失
1.Pod 流量丢失的原因
我们在 K8S 集群中的 Pod 应用程序需要经常性的进行滚动更新,每次滚动更新都会导致 Pod 流量的丢失,每次滚动更新之后,新的 Pod 虽然被创建出来了,但是只要新的创建并且启动成功后,就会将旧的 Pod 资源立刻删除,旧的 Pod 应用程序很有可能此时正在提供服务,直接将旧的 Pod 资源删除,如果没有做任何处理的话,是会对应用程序的流量造成一定的影响,正在访问被删除的旧 Pod 资源的用户就可能会出现接口异常的报错信息。
如果我们的 Pod 资源没有设置健康检查探针(readlinessprobe/livenessprobe)的话,Pod 的应用状态一直会被认为是就绪状态的,即使 Pod 出现了故障,也会将用户的请求转发到该 Pod 上,并且在滚动更新过程中,新的 Pod 资源只要一处于 Running 状态,Kube-Proxy 更新第一个 iptables 转发规则后,K8S 就会将流量转发到应用程序 Server 资源下管理的 Pod 资源,Pod 资源这时也会告诉 K8S 集群已经就绪了,其实这时候 Pod 资源只是启动了,里面的应用程序换没有真正的启动完毕,还不能正常处理流量的转发,那么用户的请求落在这个 Pod 应用程序后,就会收到节点异常连接失败的报错信息。
2. 如何优雅的处理 Pod 流量丢失的问题
2.1. 理解 Pod 删除过程
Kubernetes 的各个组件之间都是独立运行的,是一个巨大的整体,这些组件在同步数据过程中会花费一定的时间,并不是实时性的同步。
当 APIserver 收到一个 Pod 资源删除的请求后,首先去修改 Etcd 数据库中的 Pod 资源状态,也就是修改成 Terminating 状态。然后通知 Kubelet 组件删除具体的 Pod 资源,删除掉 Pod 资源后,会调用 Kube-Proxy 将该 Pod 资源的转发规则在 iptables 中删除,此时就会迅速在 Endpoints 控制器中将删除的 Pod 资源剔除,由于 APIserver 调用 Kube-Proxy 删除 iptables 转发规则并不是实时性的,会有一定的延迟,也就是说在 iptables 规则还没有得到删除时,用户的流量还是会被分配到被删除的 Pod 资源上,但是实际上提供服务的 Pod 资源已经被删除了,就会造成流量的丢失。
Pod 的删除过程一共分为两个事件
- 事件 A:APIserver 收到 Pod 的删除请求后,会尽快通知各个组件停止 Pod 一系列操作,此时就会调用 Kubelet 删除 Pod 资源,并且会调用 Kube-proxy 将该 Pod 资源的 iptables 转发规则删除,如果 Pod 资源没有响应,就会将 Pod 资源强制删除。如果 Pod 在这些操作过程中相应了 Kubelet 的删除请求,就会迅速进行删除,此时用户在该 Pod 上的流量就会丢失。
- 事件 B:收到 Pod 的删除请求后,APIserver 会向 Endpoints 资源发送一个 RESET 请求,然后将 Service 管理的 Pod 副本中将这个被删除的 Pod 资源剔除。
事件 A 与事件 B 都是同一时刻去处理的,但是从 Endpoints 中剔除应用程序的时间要比清除 iptables 转发规则时间要短一些,APIServer 需要向每一个节点的 Kube-Proxy 发送删除 Pod 的 iptables 的转发规则的请求,所以用时会稍微长一些,但是删除资源的信息先被 Endpoints 控制器处理完了,转发请求还没有清理,用户的请求就会被转发到一个被删除的 Pod 资源上,此时就产生了用户访问应用程序的流量丢失。
2.2. 如何优雅的避免 Pod 流量丢失
我们已经明确了 Endpoints 会在转发请求删除之前就会将 Pod 资源删除,如果我们可以让 Endpoints 处理删除 Pod 资源的请求时,让 Pod 资源不要立刻删除,稍微等待几十秒,再让 Endpoints 删除该 Pod,就可以避免由于 iptables 规则没有清除导致 Pod 流量丢失的问题,因为删除 Pod 资源和清除 iptables 规则是同时去做的,只是 iptables 的清除时间稍微长一些而已。
官方之前也提到过采用健康检查探针的方式去解决这个问题,但是健康检查探针是在容器启动之前去处理的,并不能在容器退出时去完成这些操作。
针对如果让 Pod 资源等待一段时间再去删除的情况,我们可以通过 Pod 的钩子函数来实现。
Pod 的钩子函数提供了容器在运行前和退出后执行一些操作的功能,我们可以配置一个容器退出后的钩子函数,让容器接收到被删除的指令,在准备退出时执行一条命令比如 sleep 30,让容器等待几十秒之后再退出,再这个时间内足够能让 iptables 的转发规则得到清除,避免用户的流量造成丢失。
lifecycle:
preStop:
exec:
command: ["sh","-c","sleep 5"]
关于 Pod 钩子函数在这里也有详细讲解到:Kubernetes 集群 Pod 资源钩子函数详解
转:
Kubernetes 集群滚动更新导致 Pod 应用程序流量丢失的原因
--Posted from Rpc
Linux / Bash,使用ps -o通过特定名称获取进程?
我正在尝试使用ps
-o命令获取有关与某个名称匹配的进程的特定信息。但是,我遇到了一些问题,当我尝试使用它甚至只是获取所有进程时,就像这样,它只返回正常返回值的子集ps
-ef
(它不会返回几乎相同数量的结果,因此它不会返回所有正在运行的进程)
ps -ef -o pid,time,comm
我想尝试这样的事情(如下),但结合了ps -o只是从中获取特定信息(只是PID)
ps -ef |grep `whoami`| grep firefox-bin
感谢您提供有关如何正确执行此操作的任何建议,谢谢
linux – “绑定”USB键盘专门用于特定应用程序
> Linux机器(debian stable)没有显示器,键盘,没有X运行
> USB设备,就像一个USB键盘(就像很多条码阅读器[1])
我(不)想要的:
>我想仅将此设备用于特定应用.
>我不希望此设备干扰例如启动后的登录过程或其他任何内容 – 除了一个应用程序.
>无论如何,我希望能够插入一个普通的旧USB键盘,并使用它 – 与上面提到的其他USB设备的连接数量无关.
我(不)知道的:
>我找到了一些示例代码,关于如何直接从事件设备中读取,如果需要,可以在我的应用程序中使用它.
>我不知道,除了这个特定的应用程序,如何禁用整个系统的特定键盘?这有可能吗?
谢谢你的任何提示……!
[1]当设备读取条形码时,它会将检测到的代码作为单键按下并提交返回.
解决方法
我认为udev可能会做到这一点.创建一个文件/etc/udev/rules.d/99-barcode-reader.rules并在其中添加类似的内容:
ACTIONS!="add",GOTO="barcode_end" SUBSYstem=="usb",ENV{DEVTYPE}=="usb_device",ATTRS{idvendor}=="dead",ATTRS{idProduct}=="beef",PROGRAM="/bin/sh -c 'logger -p user.info hey,I see a new device $env{BUSNUM} $env{DEVNUM}'",RUN+="/bin/sh -c '/usr/local/bin/your_barcode_application &'" LABEL="barcode_end"
将“dead”和“beef”替换为使用lsusb获取的idvendor和idProduct的值.
重新启动udevd或只是你的服务器,看看会发生什么.
linux – 使用shell脚本(bash)查找特定接口的系统的IP地址
我试图通过shell脚本找到我自己系统的ip-address并写入我脚本内容的文本
#!/bin/bash
wifiip=$(ip addr | grep inet | grep wlan0 | awk -F" " '{print $2}'| sed -e 's/\/.*$//')
eth0ip=$(ip addr | grep inet | grep eth0 | awk -F" " '{print $2}' | sed -e 's/\/.*$//')
if [ "$eth0ip" == "0" ]; then
echo "$eth0ip" | grep [0-9]$> /home/pi/att/ip.txt
else
echo "$wifiip" | grep [0-9]$> /home/pi/att/ip.txt
fi
并尝试做一些事情,如果一个接口没有在ip.txt中打印另一个IP
但它正在给予
ip.sh: 14: [: unexpected operator
wifiip=$(ip addr | grep inet | grep wlan0 | awk -F" " '{print $2}'| sed -e 's/\/.*$//')
可以简单地写成:
wifiip=$(ip addr | awk '/inet/ && /wlan0/{sub(/\/.*$/,"",$2); print $2}')
但是你的整个脚本只能写成一个awk命令.
我需要你用ip addr命令的一些示例输出来更新你的问题,给出输入你想要的awk命令的输出,并更清楚地解释你想要做什么,以便向你展示正确的写法但它可能是这样的:
ip addr | awk '
/inet/ { ip[$NF] = $2; sub(/\/.*$/,ip[$NF]) }
END { print ( "eth0" in ip ? ip["eth0"] : ip["wlan0"] ) }
' > /home/pi/att/ip.txt
今天关于linux – 通过特定接口路由应用程序流量和linux指定路由的介绍到此结束,谢谢您的阅读,有关Kubernetes 集群滚动更新导致 Pod 应用程序流量丢失的原因、Linux / Bash,使用ps -o通过特定名称获取进程?、linux – “绑定”USB键盘专门用于特定应用程序、linux – 使用shell脚本(bash)查找特定接口的系统的IP地址等更多相关知识的信息可以在本站进行查询。
本文标签: