如何检查 Kubernetes 网络配置

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

简介

Kubernetes 是一个容器编排系统,可以管理集群中的容器化应用程序。在集群中保持所有容器之间的网络连接需要一些高级网络技术。在本文中,我们将简要介绍一些工具和技术,用于检查这种网络设置。

如果您正在调试连接问题,调查网络吞吐量问题,或者探索 Kubernetes 的运行方式,这些工具可能会很有用。

如果您想了解更多关于 Kubernetes 的一般信息,我们的指南《Kubernetes 简介》涵盖了基础知识。对于 Kubernetes 的网络概述,请阅读《深入了解 Kubernetes 网络》。

如果您正在寻找托管的 Kubernetes 服务,可以查看我们为增长而构建的简单、托管的 Kubernetes 服务。

入门指南

本教程将假定您已经有一个 Kubernetes 集群,并在本地安装并配置了 kubectl 以连接到该集群。

以下各节包含许多命令,这些命令旨在在 Kubernetes 节点上运行。它们看起来像这样:

echo '这是一个节点命令'

应在本地机器上运行的命令将具有以下外观:

[本地环境]
echo '这是一个本地命令'

查找 Pod 的集群 IP

要查找 Kubernetes Pod 的集群 IP 地址,请在本地机器上使用 kubectl get pod 命令,并带有 -o wide 选项。此选项将列出更多信息,包括 Pod 所在的节点以及 Pod 的集群 IP。

[本地环境]
kubectl get pod -o wide
[本地环境]NAME                           READY     STATUS    RESTARTS   AGE       IP            NODE
hello-world-5b446dd74b-7c7pk   1/1       Running   0          22m       10.244.18.4   node-one
hello-world-5b446dd74b-pxtzt   1/1       Running   0          22m       10.244.3.4    node-two

IP 列将包含每个 Pod 的内部集群 IP 地址。

如果您没有看到您要查找的 Pod,请确保您在正确的命名空间中。您可以通过添加 --all-namespaces 标志来列出所有命名空间中的所有 Pod。

查找服务的 IP

我们也可以使用 kubectl 来查找服务 IP。在这种情况下,我们将列出所有命名空间中的所有服务:

[本地环境]
kubectl get service --all-namespaces
[本地环境]NAMESPACE     NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
default       kubernetes                 ClusterIP   10.32.0.1       <none>        443/TCP         6d
kube-system   csi-attacher-doplugin      ClusterIP   10.32.159.128   <none>        12345/TCP       6d
kube-system   csi-provisioner-doplugin   ClusterIP   10.32.61.61     <none>        12345/TCP       6d
kube-system   kube-dns                   ClusterIP   10.32.0.10      <none>        53/UDP,53/TCP   6d
kube-system   kubernetes-dashboard       ClusterIP   10.32.226.209   <none>        443/TCP         6d

服务 IP 可以在 CLUSTER-IP 列中找到。

查找并进入 Pod 网络命名空间

每个 Kubernetes Pod 都被分配了自己的网络命名空间。网络命名空间(或 netns)是 Linux 的网络原语,提供了网络设备之间的隔离。

从 Pod 的 netns 中运行命令可能很有用,以检查 DNS 解析或一般网络连接。为此,我们首先需要查找一个 Pod 中容器的进程 ID。对于 Docker,我们可以使用两个命令来完成。首先,列出在节点上运行的容器:

docker ps
CONTAINER ID        IMAGE                                   COMMAND                  CREATED             STATUS              PORTS               NAMES
173ee46a3926        gcr.io/google-samples/node-hello        "/bin/sh -c 'node se…"   9 days ago          Up 9 days                               k8s_hello-world_hello-world-5b446dd74b-pxtzt_default_386a9073-7e35-11e8-8a3d-bae97d2c1afd_0
11ad51cb72df        k8s.gcr.io/pause-amd64:3.1              "/pause"                 9 days ago          Up 9 days                               k8s_POD_hello-world-5b446dd74b-pxtzt_default_386a9073-7e35-11e8-8a3d-bae97d2c1afd_0
. . .

找到您感兴趣的 Pod 中的任何容器的 容器 ID名称。在上面的输出中,我们展示了两个容器:

  • 第一个容器是在 hello-world Pod 中运行的 hello-world 应用程序
  • 第二个是在 hello-world Pod 中运行的 pause 容器。此容器仅用于保存 Pod 的网络命名空间

要获取任一容器的进程 ID,请记下容器 ID 或名称,并将其用于以下 docker 命令:

docker inspect --format '{{ .State.Pid }}' container-id-or-name
14552

将输出一个进程 ID(或 PID)。现在我们可以使用 nsenter 程序在该进程的网络命名空间中运行命令:

nsenter -t your-container-pid -n ip addr

请确保使用您自己的 PID,并将 ip addr 替换为您想在 Pod 的网络命名空间中运行的命令。

查找 Pod 的虚拟以太网接口

每个 Pod 的网络命名空间通过虚拟以太网管道与节点的根 netns 进行通信。在节点端,这个管道会显示为一个设备,通常以 veth 开头并以唯一标识符结尾,比如 veth77f2275veth01。在 Pod 内部,这个管道会显示为 eth0

将特定的 veth 设备与相应的 Pod 相关联可能会很有用。为了做到这一点,我们将列出节点上的所有网络设备,然后列出 Pod 的网络命名空间中的设备。然后我们可以对比这两个列表中的设备编号,以建立它们之间的关联。

首先,在 Pod 的网络命名空间中使用 nsenter 运行 ip addr。有关如何执行此操作,请参考前面的章节 查找并进入 Pod 网络命名空间

nsenter -t your-container-pid -n ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group defaultlink/ether 02:42:0a:f4:03:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.244.3.4/24 brd 10.244.3.255 scope global eth0valid_lft forever preferred_lft forever

该命令将输出 Pod 的接口列表。请注意示例输出中 eth0@ 后面的 if11 编号。这意味着该 Pod 的 eth0 连接到节点的第 11 个接口。现在在节点的默认命名空间中运行 ip addr 以列出其接口:

ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever. . .7: veth77f2275@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master docker0 state UP group defaultlink/ether 26:05:99:58:0d:b9 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet6 fe80::2405:99ff:fe58:db9/64 scope linkvalid_lft forever preferred_lft forever
9: vethd36cef3@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master docker0 state UP group defaultlink/ether ae:05:21:a2:9a:2b brd ff:ff:ff:ff:ff:ff link-netnsid 1inet6 fe80::ac05:21ff:fea2:9a2b/64 scope linkvalid_lft forever preferred_lft forever
11: veth4f7342d@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master docker0 state UP group defaultlink/ether e6:4d:7b:6f:56:4c brd ff:ff:ff:ff:ff:ff link-netnsid 2inet6 fe80::e44d:7bff:fe6f:564c/64 scope linkvalid_lft forever preferred_lft forever

在这个示例输出中,第 11 个接口是 veth4f7342d。这是我们要调查的 Pod 的虚拟以太网管道。

检查 Conntrack 连接跟踪

在 1.11 版本之前,Kubernetes 使用 iptables NAT 和 conntrack 内核模块来跟踪连接。要列出当前正在被跟踪的所有连接,使用 conntrack 命令:

conntrack -L

要持续监视新连接,使用 -E 标志:

conntrack -E

要列出针对特定目标地址进行 conntrack 跟踪的连接,使用 -d 标志:

conntrack -L -d 10.32.0.1

如果您的节点在与服务建立可靠连接时出现问题,可能是您的连接跟踪表已满,新连接正在被丢弃。如果是这种情况,您可能会在系统日志中看到以下消息:

Jul 12 15:32:11 worker-528 kernel: nf_conntrack: table full, dropping packet.

有一个 sysctl 设置用于跟踪的最大连接数。您可以使用以下命令列出当前值:

sysctl net.netfilter.nf_conntrack_max
net.netfilter.nf_conntrack_max = 131072

要设置新值,使用 -w 标志:

sysctl -w net.netfilter.nf_conntrack_max=198000

要使此设置永久生效,将其添加到 sysctl.conf 文件中:

. . .
net.ipv4.netfilter.ip_conntrack_max = 198000

检查 Iptables 规则

在版本 1.11 之前,Kubernetes 使用 iptables NAT 来实现服务 IP 的虚拟 IP 转换和负载均衡。

要在节点上转储所有 iptables 规则,请使用 iptables-save 命令:

iptables-save

由于输出可能很长,您可能希望将其重定向到文件(iptables-save > output.txt)或使用分页器(iptables-save | less)以便更轻松地查看规则。

要仅列出 Kubernetes 服务 NAT 规则,请使用 iptables 命令和 -L 标志来指定正确的链:

iptables -t nat -L KUBE-SERVICES

Chain KUBE-SERVICES (2 references)
target     prot opt source               destination
KUBE-SVC-TCOU7JCQXEZGVUNU  udp  --  anywhere             10.32.0.10           /* kube-system/kube-dns:dns cluster IP */ udp dpt:domain
KUBE-SVC-ERIFXISQEP7F7OF4  tcp  --  anywhere             10.32.0.10           /* kube-system/kube-dns:dns-tcp cluster IP */ tcp dpt:domain
KUBE-SVC-XGLOHA7QRQ3V22RZ  tcp  --  anywhere             10.32.226.209        /* kube-system/kubernetes-dashboard: cluster IP */ tcp dpt:https
. . .

查询集群 DNS

调试集群 DNS 解析的一种方法是部署一个带有您需要的所有工具的调试容器,然后使用 kubectl 在其上执行 nslookup。这在官方 Kubernetes 文档中有描述。

另一种查询集群 DNS 的方法是在节点上使用 dignsenter。如果在基于 Debian 的 Linux 发行版上未安装 dig,可以使用 apt 进行安装:

apt install dnsutils

首先,找到 kube-dns 服务的集群 IP:

[environment local]
kubectl get service -n kube-system kube-dns
[environment local]NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)         AGE
kube-dns   ClusterIP   10.32.0.10   <none>        53/UDP,53/TCP   15d

上面突出显示了集群 IP。接下来,我们将使用 nsenter 在容器命名空间中运行 dig。有关此操作的更多信息,请参阅 查找并进入 Pod 网络命名空间 部分:

nsenter -t 14346 -n dig kubernetes.default.svc.cluster.local @10.32.0.10

dig 命令查找了服务的完整域名 service-name.namespace.svc.cluster.local,并指定了集群 DNS 服务 IP 的 IP(@10.32.0.10)。

查看 IPVS 详细信息

从 Kubernetes 1.11 开始,kube-proxy 可以配置 IPVS 来处理虚拟服务 IP 到 Pod IP 的转换。您可以使用 ipvsadm 列出 IP 的转换表:

ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  100.64.0.1:443 rr-> 178.128.226.86:443           Masq    1      0          0
TCP  100.64.0.10:53 rr-> 100.96.1.3:53                Masq    1      0          0-> 100.96.1.4:53                Masq    1      0          0
UDP  100.64.0.10:53 rr-> 100.96.1.3:53                Masq    1      0          0-> 100.96.1.4:53                Masq    1      0          0

要显示单个服务 IP,请使用 -t 选项并指定所需的 IP:

ipvsadm -Ln -t 100.64.0.10:53

Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  100.64.0.10:53 rr-> 100.96.1.3:53                Masq    1      0          0-> 100.96.1.4:53                Masq    1      0          0

结论

在本文中,我们回顾了一些用于探索和检查 Kubernetes 集群网络细节的命令和技术。有关 Kubernetes 的更多信息,请查看我们的 Kubernetes 教程标签和官方 Kubernetes 文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34159.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iptables(7)扩展模块state

简介 前面文章我们已经介绍了一些扩展模块,如iprange、string、time、connlimit、limit,还有扩展匹配条件如--tcp-flags、icmp。这篇文章我们介绍state扩展模块 state 在 iptables 的上下文中,--state 选项并不是直接关联于一个扩展模块,而是与 iptables 的 state 匹配机制…

长尾问题定义及如何解决长尾分布问题

目录 长尾问题定义主要挑战解决方法应用场景结论 长尾问题 定义 长尾问题&#xff08;Long Tail Problem&#xff09;是指在某些数据分布中&#xff0c;少数类别&#xff08;或事件&#xff09;出现的频率非常高&#xff0c;而多数类别&#xff08;或事件&#xff09;出现的频…

golang 最小堆获取前 n 的数据

背景 大量数据&#xff0c;想获取其中 Num 降序前五的数据 实现 package testimport ("container/heap""fmt""testing" )type Element struct {Content stringNum int }// 定义一个最小堆 type ElementMinHeap []Element// 重写方法 func…

oracle报错-ORA-12638:身份证明检索失败

navicat16连接本地oracle数据库成功后&#xff0c;连接远程数据库&#xff0c;同样是oracle11g&#xff0c;确认网络、用户名、密码都没问题的情况下&#xff0c;报错ora-12638。 解决方法&#xff1a; 这是由于Oracle的认证方式使用了本地操作系统认证&#xff08;NTS&#x…

记一次服务器崩溃事件

今天在安装Jenkins的时候&#xff0c;进行到插件安装这一步&#xff0c;本来一切顺利&#xff0c;结果最后安装完成之后一直进不去网页&#xff0c;显示连接超时&#xff0c;网上搜索了一圈也没发现什么相似的情况&#xff0c;当我疑惑的时候回到Linux控制台&#xff0c;发现命…

使用pkg -r 命令选项向jail虚拟子系统里安装软件@FreeBSD

刷FreeBSD 论坛的时候&#xff0c;看到这样一招&#xff1a;使用pkg -r选项&#xff0c;往jail等虚拟机子系统里安装软件。jails - How to install a pkg offline into a jail? | The FreeBSD Forums rootfbhost:~ # pkg pkg: not enough arguments Usage: pkg [-v] [-d] [-l…

Java项目:基于SSM框架实现的电子竞技管理平台【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的电子竞技管理平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

雨量传感器的分类和选型建议

物理原理分类 机械降雨量计&#xff08;雨量桶&#xff09;&#xff1a;最早使用的降雨量传感器&#xff0c;通过漏斗收集雨水并记录。主要用于长期降雨统计&#xff0c;故障率较低。电容式降雨量传感器&#xff1a;基于两个电极之间的电容变化来计算降雨量。当降雨时&#xff…

ES6 逐点突破系列 -- 函数的扩展

} f() // 1 var x 1; function foo(x, y function() { x 2; }) { var x 3; y(); console.log(x); } foo() // 3 x // 1 上面代码中&#xff0c;函数foo的参数形成一个单独作用域。这个作用域里面&#xff0c;首先声明了变量x&#xff0c;然后声明了变量y&#xf…

【C#】 读取图像为位图Bitmap

在C#中&#xff0c;要读取路径指定的图像文件并将其加载为Bitmap对象&#xff0c;可以使用Image.FromFile方法或者直接使用Bitmap构造函数。 一、使用 Image.FromFile 方法 using System.Drawing;public class ImageLoader {public static Bitmap LoadImageAsBitmap(string i…

linux桌面运维---第二天

1、启动Linux操作系统&#xff1a; 超级用户&#xff08;root&#xff09;的提示符是“#”,普通用户的提示符是“$”【重点】 [rootlocalhost home]# 解析&#xff1a; ​ root-----当前登录的用户的用户名 ​ ---表示地址域名 localhost---表示…

晨持绪科技:开好一家抖音小店运营怎么做

在数字时代&#xff0c;抖音小店以其独特的社交媒体优势迅速崛起&#xff0c;成为许多创业者的新宠。但如何有效运营&#xff0c;却是一门学问。首要任务是确定你的小店定位&#xff0c;这关系到后续的产品选择、目标客户群及营销策略。定位明确后&#xff0c;接下来便是挑选适…

深入解析NFS:原理、架构与实战操作

引言 在网络存储领域&#xff0c;NFS&#xff08;Network File System&#xff09;以其稳定性和高效性赢得了广泛的认可。作为一种分布式文件系统协议&#xff0c;NFS允许计算机客户端远程访问服务器上的文件&#xff0c;就如同访问本地文件一样便捷。本文将从技术角度深入探讨…

泡泡玛特携手浦东美术馆 推出SKULLPANDA重磅联名

6月20日&#xff0c;泡泡玛特“SKULLPANDA入画”快闪店在上海浦东美术馆重磅开幕&#xff0c;现场SKULLPANDA x 浦东美术馆联名吊卡“SKULLPANDA入画”重磅上线&#xff0c;这是潮流艺术家熊喵首次和国内顶级美术馆联动合作&#xff0c;除了吊卡以外&#xff0c;现场还有系列衍…

为什么有人说ipfs的核心是上传、下载和 Pin?

人们之所以说 IPFS 的核心是上传、下载和 Pin&#xff0c;主要是因为这些操作是 IPFS 协议的基本功能&#xff0c;同时也是 IPFS 实现分布式文件系统的关键步骤。 1. 上传&#xff08;Add&#xff09;&#xff1a;在 IPFS 中&#xff0c;上传是指将数据添加到 IPFS 网络中。当你…

IP地址SSL证书快速申请攻略

一、IP地址定义 互联网协议地址&#xff08;IP地址&#xff09;是为互联网上的每台设备分配的一个唯一标识符。它就像是设备在网络中的“家庭住址”&#xff0c;使得数据包能够准确地发送到目的地。IP地址有两种主要类型&#xff1a;IPv4和IPv6。IPv4使用32位地址&#xff0c;…

vue+element-ui实现动态的权限管理和菜单渲染_权限设置ui

需求&#xff1a;需要根据不用的用户匹配不同的管理权限&#xff0c;既&#xff1a;匹配不同的操作导航&#xff0c;尤其体现在后台管理系统内&#xff0c;如果仅仅只是在导航菜单内不予显示&#xff0c;仍然是可以通过路径直接打开页面&#xff0c;因为其路由信息已经在路由信…

简单使用百度地图

官方文档 <!DOCTYPE html> <html> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="viewport" content

统计每2个小时时间段的设备各种状态时长,使用SQL做数据分析,“查表法”“表驱动法”使用案例分析

“表驱动法”是一种编程设计模式。 使用一个表&#xff08;使用数据结构&#xff0c;如数组、字典&#xff0c;Map等&#xff09;来存储和关联相关的数据和行为。 通过“查表”来根据输入参数&#xff0c;确定相应的处理逻辑或结果&#xff0c;从而减少使用大量的条件判断语句…

执行shell脚本出现 $‘ \r‘ 符号导致执行失败【解决】

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…