标签 网络 下的文章

nmcli 命令赋予你直接在 Linux 命令行操作 NetworkManager 工具的能力。

nmcli 命令赋予你直接在 Linux 命令行操作 NetworkManager 工具的能力。它是 NetworkManager 软件包集成的一部分,通过使用一些 应用程序接口(API)来获取 NetworkManager 的功能。

nmcli 发布于 2010 年,用以替代其他配置网络接口和连接的方法,例如 ifconfig。因为它是一个 命令行界面(CLI)工具,被设计用在终端窗口和脚本中,所以对于那些工作在没有 图形用户界面(GUI)的系统的管理员来说,它是一个非常理想的工具。

ncmli 的语法

nmcli 命令可以使用选项来更改它的行为,使用子命令来告诉 nmcli 想使用它的那部分功能,使用操作来告诉 nmcli 你想执行什么操作。

$ nmcli <选项> <子命令> <操作>

nmcli 一共有 8 个子命令,每个子命令有一些相关的网络操作:

  • help 提供有关 nmcli 命令和使用方法的帮助信息
  • general 返回 NetworkManager 的状态和总体配置信息
  • networking 提供命令来查询某个网络连接的状态和启动、禁用连接的功能
  • radio 提供命令来查询某个 WiFi 网络连接的状态和启动、禁用连接的功能
  • monitor 提供命令来监控 NetworkManager 的活动并观察网络连接的状态改变
  • connection 提供命令来启用或禁用网络接口、添加新的连接、删除已有连接等功能
  • device 主要被用于更改与某个设备(例如接口名称)相关联的连接参数或者使用一个已有的连接来连接设备
  • secret 注册 nmcli 来作为一个 NetworkManager 的秘密代理,用以监听秘密信息。这个子命令很少会被用到,因为当连接到网络时,nmcli 会自动做这些事

简单的示例

首先,我们验证一下 NetworkManager 正在运行并且 nmcli 可以与之通信:

$ nmcli general
STATE      CONNECTIVITY  WIFI-HW  WIFI     WWAN-HW  WWAN    
connected  full          enabled  enabled  enabled  enabled

探测总是管理一个系统的首要部分。为了列出内存或磁盘上的网络连接配置,可以使用下面的命令:

$ nmcli connection show
NAME                UUID                                  TYPE      DEVICE
Wired connection 1  ac3241e4-b424-35d6-aaa7-07498561688d  ethernet  enp0s3
Wired connection 2  2279d917-fa02-390c-8603-3083ec5a1d3e  ethernet  enp0s8
Wired connection 3  52d89737-de92-35ec-b082-8cf2e5ac36e6  ethernet  enp0s9

上面的命令使用了 connection 子命令中的 show 操作。

用来运行上面这个例子的测试机器上运行着 Ubuntu 20.04,它安装了 3 个网络适配器:enp0s3enp0s8enp0s9

连接管理

理解 nmcli 的术语是非常重要的。一个网络 连接 connection 包含了一个连接的所有信息。你可以将它看作一个网络 配置 configuration 。“连接”包含了与其相关的所有信息,包括 数据链路层IP 地址信息 。它们是 OSI 网络模型 中的第 2 和第 3 层。

当你在 Linux 上配置网络时,通常来说你是在为某个网络设备(它们是安装在一个电脑中的网络接口)配置连接。当一个连接被某个设备所使用,那么就可以说这个连接被 激活 active 或者 上线 up 了,反之是 停用 inactive 下线 down

添加网络连接

nmcli 允许你快速地创建网络连接并同时为该连接指定参数。为了通过使用“有线连接 2” enp0s8 来创建一个新的连接,你可以利用 sudo 来运行下面的命令:

$ sudo nmcli connection add type ethernet ifname enp0s8
Connection 'ethernet-enp0s8' (09d26960-25a0-440f-8b20-c684d7adc2f5) successfully added.

其中 type 选项指定需要一个 Ethernet 类型的连接,而 ifname(接口名)选项指定你想要为这个连接使用的网络接口设备。

让我们看看发生了什么变化:

$ nmcli connection show
NAME                UUID                                  TYPE      DEVICE
Wired connection 1  ac3241e4-b424-35d6-aaa7-07498561688d  ethernet  enp0s3
Wired connection 2  2279d917-fa02-390c-8603-3083ec5a1d3e  ethernet  enp0s8
Wired connection 3  52d89737-de92-35ec-b082-8cf2e5ac36e6  ethernet  enp0s9
ethernet-enp0s8     09d26960-25a0-440f-8b20-c684d7adc2f5  ethernet  --  

通过上图可以看到新的连接 ethernet-enp0s8 已经创建好了。它的 通用唯一标识符 Universally Unique IDentifier (UUID)也一同被赋予,并且其连接类型为 “Ethernet”。我们可以使用 up 子命令再加上连接名称(或 UUID)来使得这个连接被激活:

$ nmcli connection up ethernet-enp0s8
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)

再次查看激活的连接:

$ nmcli connection show --active
NAME                UUID                                  TYPE      DEVICE
Wired connection 1  ac3241e4-b424-35d6-aaa7-07498561688d  ethernet  enp0s3
ethernet-enp0s8     09d26960-25a0-440f-8b20-c684d7adc2f5  ethernet  enp0s8
Wired connection 3  52d89737-de92-35ec-b082-8cf2e5ac36e6  ethernet  enp0s9

可以看到新的连接 ethernet-enp0s8 现在已经被激活了,并且与 enp0s8 网络接口设备绑定。

调整连接

nmcli 命令使得调整现有连接的参数变得更加容易。也许你想将某个网络接口从 动态主机配置协议 Dynamic Host Configuration Protocol (DHCP)改为静态 IP 地址。

假设你需要为你的新连接分配一个固定的 IP 地址 192.168.4.26,那么你需要使用两个命令,一个用于设定 IP 地址,另一个用来将获取 IP 地址的方法改为 manual(手动):

$ nmcli connection modify ethernet-enp0s8 ipv4.address 192.168.4.26/24
$ nmcli connection modify ethernet-enp0s8 ipv4.method manual

记得指定 子网掩码,在我们这个测试的连接中,它是 无类域间路由 Classless Inter-Domain Routing (CIDR)中的 255.255.255.0/24

为了使得你的更改生效,你需要通过停止再重新启用该连接。下面的第一个命令是停用该连接,第二个命令则是启用它:

$ nmcli connection down ethernet-enp0s8
Connection 'ethernet-enp0s8' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
$ nmcli connection up ethernet-enp0s8
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6)

假如你想将连接设置为使用 DHCP,则需要将上面的 manual 改为 auto(自动):

$ nmcli connection modify ethernet-enp0s8 ipv4.method auto

设备管理

nmcli 命令中的 device 子命令允许你管理安装在你电脑中的网络接口。

检查设备状态

可以使用下面的命令来快速检查所有网络接口的状态:

$ nmcli device status
DEVICE  TYPE      STATE      CONNECTION        
enp0s3  ethernet  connected  Wired connection 1
enp0s8  ethernet  connected  ethernet-enp0s8    
enp0s9  ethernet  connected  Wired connection 3
lo      loopback  unmanaged  --  

显示设备详情

为了检查某个网络接口的详情,可以使用 device 子命令中的 show 操作。假如你不提供某个设备的名称,那么会获取并展示所有设备的详情。你可以上下翻动来查看这些信息。

要查看你最近添加的连接所对应的设备 enp0s8,你可以使用下面的命令,请注意验证它使用的 IP 地址是否为先前你要求设置的那个:

$ nmcli device show enp0s8
GENERAL.DEVICE:                         enp0s8
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         08:00:27:81:16:20
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (connected)
GENERAL.CONNECTION:                     ethernet-enp0s8
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/6
WIRED-PROPERTIES.CARRIER:               on
IP4.ADDRESS[1]:                         192.168.4.26/24
IP4.GATEWAY:                            --
IP4.ROUTE[1]:                           dst = 192.168.4.0/24, nh = 0.0.0.0, mt = 103
IP6.ADDRESS[1]:                         fe80::6d70:90de:cb83:4491/64
IP6.GATEWAY:                            --
IP6.ROUTE[1]:                           dst = fe80::/64, nh = ::, mt = 103
IP6.ROUTE[2]:                           dst = ff00::/8, nh = ::, mt = 256, table=255

上面的输出非常细致,它主要显示了下面这些内容:

  • 网络接口名称,在这个示例中是 enp0s8,它是 udev 分配的
  • 网络连接类型,在这个示例中是物理的 Ethernet 连接
  • 设备的 媒介访问控制 media access control (MAC)地址,它被用来在网络中识别该设备
  • 最大传输单元,在单个传输中最大协议数据单位的大小,任何大于这个大小的数据将被分为多个包来进行传输
  • 该设备当前已经处于连接状态
  • 这个设备使用的连接名称是 ethernet-enp0s8
  • 这个设备使用的 IP 地址如上面所要求的那样,被设置为 192.168.4.26/24

其他的信息则是与这个设备连接的网络相关的默认路由和网关设置信息。

nmcli 的交互式编辑器

尽管 nmcli 是一个命令行工具,但它还包含一个基本的交互式编辑器,edit 子命令将为你指定的连接打开一个交互式编辑器,例如:

$ nmcli connection edit ethernet-enp0s8

它将显示少量的帮助文字,接着是 nmcli 的命令提示符:

===| nmcli interactive connection editor |===

Editing existing '802-3-ethernet' connection: 'ethernet-enp0s8'

Type 'help' or '?' for available commands.
Type 'print' to show all the connection properties.
Type 'describe [<setting>.<prop>]' for detailed property description.

You may edit the following settings: connection, 802-3-ethernet (ethernet), 802-1x, dcb, sriov, ethtool, match, ipv4, ipv6, tc, proxy
nmcli>

假如你输入 print 然后敲击 Enter 键, nmcli 将列举出与这个接口相关的所有属性。这些属性有很多,你可以上下翻动来查看这个列表:

===============================================================================
                 Connection profile details (ethernet-enp0s8)
===============================================================================
connection.id:                          ethernet-enp0s8
connection.uuid:                        09d26960-25a0-440f-8b20-c684d7adc2f5
connection.stable-id:                   --
connection.type:                        802-3-ethernet
connection.interface-name:              enp0s8
connection.autoconnect:                 yes
connection.autoconnect-priority:        0
connection.autoconnect-retries:         -1 (default)
connection.multi-connect:               0 (default)
connection.auth-retries:                -1
connection.timestamp:                   1593967212
connection.read-only:                   no
connection.permissions:                 --
connection.zone:                        --
connection.master:                      --
connection.slave-type:                  --
connection.autoconnect-slaves:          -1 (default)
connection.secondaries:                 --

如果你想将你的连接改为 DHCP,则请输入 goto ipv4 然后敲 Enter 键:

nmcli> goto ipv4
You may edit the following properties: method, dns, dns-search, dns-options, dns-priority, addresses, gateway, routes, route-metric, route-table, routing-rules, ignore-auto-routes, ignore-auto-dns, dhcp-client-id, dhcp-iaid, dhcp-timeout, dhcp-send-hostname, dhcp-hostname, dhcp-fqdn, dhcp-hostname-flags, never-default, may-fail, dad-timeout
nmcli ipv4>

你想改变的属性是 method,再继续敲 set method auto 然后敲 Enter 键:

nmcli ipv4> set method auto
Do you also want to clear 'ipv4.addresses'? [yes]:

假如你想让这个连接清除掉这个静态 IP 地址,则请敲 Enter 键,如果要保留,则输入 no 然后敲 Enter 键。假如你想在将来再次使用它,你可以保留这个 IP 地址。即便存储了一个静态的 IP 地址,如果 method 被设置为 auto ,它仍然会使用 DHCP。

最后输入 save 来保存你的更改:

nmcli ipv4> save
Connection 'ethernet-enp0s8' (09d26960-25a0-440f-8b20-c684d7adc2f5) successfully updated.
nmcli ipv4>

输入 quit 来离开 nmcli 的交互式编辑器窗口。假如你不想离开,可以输入 back 来回到最开始的命令行提示符界面,然后继续使用这个编辑器。

nmcli 的更多内容

浏览交互式编辑器,你就可以看到 nmcli 有多少设定和每个设定有多少属性。交互式编辑器是一个简洁的工具,但如果需要在命令行或者在脚本中使用 nmcli,你还是需要使用常规的命令行版本。

现在你有了这些基础知识,你还可以查看 nmcliman 页面 来查看它还可以提供什么更多功能。


via: https://opensource.com/article/20/7/nmcli

作者:Dave McKay 选题:lujun9972 译者:FSSLC 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

由于 COVID-19 的肆虐,IBM、谷歌、亚马逊、AT&T、思科、苹果等公司都争先恐后地为远程办公提供了技术上的支持,这为远程网络带来了不少的压力。

在新型冠状病毒广泛传播的大环境下,很多公司都要求员工留在家中远程办公,远程网络技术因此承受了更大的压力,一些带宽和安全方面的问题也接踵而至。

在过去的几十年当中,由于企业的蓬勃发展,远程办公的人数估计增加了 400 多万。而当前疫情流行的背景下,远程办公的需求激增,有望达到一个新的高峰。

一家 虚拟私有网络 Virtual Private Network (缩写:???)提供商 Atlas 的一份研究表明,在今年 3 月 9 日到 3 月 15 日之间,美国的虚拟私有网络使用量增加了 53%,并且还会继续提高。而在意大利这个疫情爆发比美国早两周的国家,过去一周内的虚拟私有网络使用量甚至增加了 112%。Atlas 虚拟私有网络的首席执行官 Rachel Welch 在一份声明中称,美国的虚拟私有网络使用量在 3 月底预估会达到 150% 的增幅。

部分企业正在尝试通过 一日测试 one-day test 来评估远程办公的可行性。据《芝加哥论坛报》的报道,摩根大通、晨星以及一家数据分析方面的初创公司 Arity 已经通过让员工在家办公一天来测试整个办公系统的稳定性。

在政府方面,美国国家海洋与大气管理局和 NASA 都已经进行或计划进行网络方面的压力测试,评估是否有足够的网络容量足以让上千名工作人员远程办公,以及远程办公可能造成的影响。而放眼整个美国,供职于美国政府部门的员工数量在 200 万左右。

为了避免蜂窝数据网络发生拥堵,美国联邦通信委员会已批准 T-mobile 临时访问已分配给其它运营商的 600MHz 频段,T-mobile 表示“将使用这个频段让美国人更方便地享受远程医疗、参与远程工作和学习,同时在保持‘物理距离’的情况下保持联系”。

但也有一些业内人士指出,在一些对蜂窝网络有较强依赖的的场景下,“最后一英里”的网络访问会变得非常拥堵。

网络情报公司 ThousandEyes 的主要产品是局域网和广域网性能分析的软件,该公司的产品经理 Alex Cruz Farmer 表示,网络瓶颈在于一些较为偏远的农村地区,因为那些地区的网络基础设施较为薄弱,主要通过微波或蜂窝网络来访问互联网。最大的挑战在于现有的解决方案所能提供的带宽远远不足。

Alex Cruz Farmer 还补充道,尽管持续时间不长,但现在的确已经出现一些由于运营商问题或网络负载增加导致的故障现象。

AT&T 表示目前已经留意到蜂窝网络使用量的变化,但网络容量并没有作出提高。

AT&T 在一份声明中称,在新冠病毒传播最严重的城市中,由于越来越多的人留在了家中远程办公,减少了通勤和人群聚集,很多特定位置和特定时段的蜂窝网络使用量峰值都明显降低了。他们还使用了一些工具对网络带宽进行了统计和监控,通过这些工具,他们可以更直观地了解网络使用情况的趋势,同时获取网络性能和网络容量方面的报告,进而管理整个通信网络。

Verison 表示,自从新型冠状病毒疫情爆发以来,尽管在家办公的用户数量大增,但使用的数据量并没有明显的上升。他们在一份声明中称:“Verison 的网络是为满足未来的需求设计建造的,面对各种需求量的增加或使用方式的改变,我们都有充分的准备。虽然这是一次前所未有的社会事件,整个局面也在不断发生改变,但随着不断了解实际需求的变化情况,我们随时可以对网络资源作出调整”。

Verison 一直在关注受影响最严重的地区的网络使用情况,并承诺将会与医院、医护人员、政府机构合作,制定网络资源使用的优先级,以满足他们的需求。Verison 还宣布计划在 2020 年将支出在 170 亿至 180 亿美元的基础上再提高 5 亿美元,以实现“加快 Verison 向 5G 过渡并在困难时期帮助支撑经济”的目标。

企业虚拟私有网络安全问题

对于企业来说,数据中心与远程用户之间的网络和安全问题解决起来绝非易事,尤其是使用虚拟私有网络进行远程访问时,来自用户所在住宅网络的访问几乎无法由企业控制。CIMI 公司总裁 Tom Nolle 认为,IT 部门有必要验证这些连接是否符合企业的标准(关于 Tom Nolle 更多关于在家办公的看法,可以查阅这里)。

Tom Nolle 认为像 ISP、DNS 和 Wi-Fi 这些常见的家用网络要素都应该作为适合远程办公网络业务认证的一部分。他发现 Google 的 DNS 服务比 ISP 提供的服务更能承受压力,OpenDNS 也是一个很好的选择,这说明用户可以考虑使用其中一种。

Tom Nolle 还说,家庭 Wi-Fi 网络的安全性也是一个问题,IT 部门应该要求远程办公的员工提交 Wi-Fi 配置的屏幕截图,以保证使用了正确的加密方式。之所以有这样的想法,是因为他觉得很多远程办公的员工都会绕过企业预设的一些安全措施。

DNS 软件公司 BlueCat 的首席战略官 Andrew Wertkin 表示,对一些刚刚开始在家远程办公的员工来说,适当提供相关指导是很有必要的。大部分员工从来没有尝试过在家远程办公,他们或许并不了解安全的重要性。如果员工访问公司网络的时候使用的是个人设备而不是公司设备,就更有可能出现问题。

而使用虚拟私有网络远程办公的人数激增也会为企业带来成本上的挑战。

“虚拟私有网络设备并不便宜,如果考虑到计算资源的成本和每个人的均摊成本,迁移到云上的虚拟环境会带来一笔不小的开支,这还不包括每个虚拟私有网络许可证价格的上升”,Alex Cruz Farmer 坦言。

在容量方面,随着远程访问量的增加,用于分配 IP 地址的 DHCP 服务也会承受巨大的压力。Andrew Wertkin 指出,如果进行远程连接的设备无法获取到网络地址,则是否具有足够的虚拟私有网络许可证并不重要。企业内部必须对这些风险进行测试,了解其中存在瓶颈的部分,并制定规避这些风险的策略。

按照这个思路,企业甚至需要验证数据中心可以用于公开的 SSL 套接字数量,否则也会面临数量不足的风险。

微软 Office 365 产品团队的高级程序经理 Paul Collinge 也表达了类似的担忧。他在一篇关于优化 Office 365 员工远程办公流量的博客中写道,当大量员工在同时接入企业网络时,会对诸如虚拟私有网络集中器、中央网络出口设备(例如代理、DLP)、中央互联网带宽、回程 MPLS 和 NAT 等网络要素产生巨大的压力。最终导致的结果是低下的性能、低下的生产力,以及员工们低下的使用体验。

Alex Cruz Farmer 提出,企业很可能需要增加网络上虚拟私有网络集中器的数量,这样就可以让远程用户分布在多个不同的虚拟私有网络端点上,避免产生拥堵。退而求其次,只能在防火墙上把某些端口放开,允许特定应用程序的公开访问,尽管这样有助于提高工作效率,但却降低了整体的安全性。

虚拟私有网络隧道分割技术有效吗?

业内人士对 隧道分割 tunneling split 有不同的看法。

BlueCat 的 Andrew Wertkin 认为,虚拟私有网络可以使用隧道分割技术,使得仅有需要访问企业内部网络的流量才通过虚拟私有网络隧道访问,其余流量则直接进入互联网。这意味着会有部分流量不受隧道和企业网络内部的安全控制,用户的计算机会暴露在互联网当中,进而导致企业的数据和网络面临安全风险。

尽管如此,微软在上周还是建议 IT 管理员使用隧道分割技术以缓解 Office 365 由于大量远程用户涌入导致的拥堵问题。微软在建议中提供了相关接入点的 URL 和 IP 地址列表,并引导 IT 人员如何按照这个方式将流量路由到 Office 365。

按照 Paul Collinge 的说法,虚拟私有网络客户端需要经过配置,才能将流量路由到已标识的 URL/IP/ 端口上,进而为全球的用户提供高性能的服务。

Alex Cruz Farmer 认为,在虚拟私有网络使用率上升之后,企业很有必要对网络安全进行一个全面的审查。对于仍然在使用传统网络安全架构的企业来说,应该开始考虑基于云端的网络安全方案了,这不仅可以提升远程办公的性能,还能减少企业对于广域网的使用量。

其它相关情况:

  • FCC 呼吁,宽带提供商应该适当放宽数据传输的限制,电话运营商应该适当免除用户的长途电话费,远程教育提供商应该合作为社会提供远程学习的机会,网络运营商应该优先考虑医院或医疗机构的网络连接需求。对此,AT&T 已经作出了相关的回应和行动。
  • 美国参议员 Mark R. Warner (D-VA) 和其他 17 名参议员致信了 AT&T、CenturyLink、Charter Communications、Comcast、Cox Communications、Sprint、T-Mobile、Verizon 这八家主要 ISP 的首席执行官,呼吁这些公司应该采取措施应对远程办公、在线教育、远程医疗、远程支持服务等方面需求激增带来的压力。这些参议员在信中呼吁,各公司应该降低可能对远程服务产生影响的限制和费用,同时还应该为受到疫情影响的学生提供免费或收费的宽带服务,否则学生在疫情期间无法接入网络进行在线学习。
  • 思科、微软、谷歌LogMeInSpectrum 等供应商都提供了一些免费工具,帮助用户在疫情爆发期间正常进行安全通信。

via: https://www.networkworld.com/article/3532440/coronavirus-challenges-remote-networking.html

作者:Michael Cooney 选题:lujun9972 译者:HankChow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

有时一个网络接口是不够的。网络绑定允许将多条网络连接与单个逻辑接口一起工作。你可能因为需要给单条连接更多的带宽而这么做,或者你可能希望在有线和无线网络之间来回切换而不会丢失网络连接。

我是后面一种情况。在家工作的好处之一是,当天气晴朗时,在阳光明媚的阳台而不是在室内工作是很愉快的。但每当我这样做时,我都会失去网络连接。IRC、SSH、VPN,一切都断开了,客户端重连至少需要一会。本文介绍了如何在 Fedora 30 笔记本上设置网络绑定,以便从笔记本扩展坞的有线连接无缝切换到 WiFi。

在 Linux 中,接口绑定由内核模块 bonding 处理。默认情况下,Fedora 没有启用此功能,但它包含在 kernel-core 软件包中。这意味着启用接口绑定只需一个命令:

sudo modprobe bonding

请注意,这只会在你重启之前生效。要永久启用接口绑定,请在 /etc/modules-load.d 目录中创建一个名为 bonding.conf 的文件,该文件仅包含单词 bonding

现在你已启用绑定,现在可以创建绑定接口了。首先,你必须获取要绑定的接口的名称。要列出可用的接口,请运行:

sudo nmcli device status

你将看到如下输出:

DEVICE          TYPE      STATE         CONNECTION
enp12s0u1       ethernet  connected     Wired connection 1
tun0            tun       connected     tun0
virbr0          bridge    connected     virbr0
wlp2s0          wifi      disconnected  --
p2p-dev-wlp2s0  wifi-p2p  disconnected  --
enp0s31f6       ethernet  unavailable   --
lo              loopback  unmanaged     --
virbr0-nic      tun       unmanaged     --

在本例中,有两个(有线)以太网接口可用。 enp12s0u1 在笔记本电脑扩展坞上,你可以通过 STATE 列知道它已连接。另一个是 enp0s31f6,是笔记本电脑中的内置端口。还有一个名为 wlp2s0 的 WiFi 连接。 enp12s0u1wlp2s0 是我们在这里感兴趣的两个接口。(请注意,阅读本文无需了解网络设备的命名方式,但如果你感兴趣,可以查看 systemd.net-naming-scheme 手册页。)

第一步是创建绑定接口:

sudo nmcli connection add type bond ifname bond0 con-name bond0

在此示例中,绑定接口名为 bond0con-name bond0 将连接名称设置为 bond0。直接这样做会有一个名为 bond-bond0 的连接。你还可以将连接名设置得更加人性化,例如 “Docking station bond” 或 “Ben”。

下一步是将接口添加到绑定接口:

sudo nmcli connection add type ethernet ifname enp12s0u1 master bond0 con-name bond-ethernet
sudo nmcli connection add type wifi ifname wlp2s0 master bond0 ssid Cotton con-name bond-wifi

如上所示,连接名称被设置为更具描述性#Terminology_concerns)。请务必使用系统上相应的接口名称替换 enp12s0u1wlp2s0。对于 WiFi 接口,请使用你自己的网络名称 (SSID)替换我的 “Cotton”。如果你的 WiFi 连接有密码(这当然会有!),你也需要将其添加到配置中。以下假设你使用 WPA2-PSK) 身份验证

sudo nmcli connection modify bond-wifi wifi-sec.key-mgmt wpa-psk
sudo nmcli connection edit bond-wif

第二条命令将进入交互式编辑器,你可以在其中输入密码,而无需将其记录在 shell 历史记录中。输入以下内容,将 password 替换为你的实际密码。

set wifi-sec.psk password
save
quit

现在,你可以启动你的绑定接口以及你创建的辅助接口。

sudo nmcli connection up bond0
sudo nmcli connection up bond-ethernet
sudo nmcli connection up bond-wifi

你现在应该能够在不丢失网络连接的情况下断开有线或无线连接。

警告:使用其他 WiFi 网络时

在指定的 WiFi 网络间移动时,此配置很有效,但是当远离此网络时,那么绑定中使用的 SSID 就不可用了。从理论上讲,可以为每个使用的 WiFi 连接添加一个接口,但这似乎并不合理。相反,你可以禁用绑定接口:

sudo nmcli connection down bond0

回到定义的 WiFi 网络时,只需按上述方式启动绑定接口即可。

微调你的绑定

默认情况下,绑定接口使用“ 轮询 round-robin ”模式。这会在接口上平均分配负载。但是,如果你有有线和无线连接,你可能希望更喜欢有线连接。 active-backup 模式能实现此功能。你可以在创建接口时指定模式和主接口,或者之后使用此命令(绑定接口应该关闭):

sudo nmcli connection modify bond0 +bond.options "mode=active-backup,primary=enp12s0u1"

内核文档提供了有关绑定选项的更多信息。


via: https://fedoramagazine.org/bond-wifi-and-ethernet-for-easier-networking-mobility/

作者:Ben Cotton 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

是否正在使用基于 Ubuntu 的系统,然后发现无法连接网络?你一定会很惊讶,很多的问题都可以简单地通过重启服务解决。

在这篇文章中,我会介绍在 Ubuntu 或者其他 Linux 发行版中重启网络的几种方法,你可以根据自身需要选择对应的方法。这些方法基本分为两类:

Ubuntu Restart Network

通过命令行方式重启网络

如果你使用的 Ubuntu 服务器版,那么你已经在使用命令行终端了。如果你使用的是桌面版,那么你可以通过快捷键 Ctrl+Alt+T Ubuntu 键盘快捷键 打开命令行终端。

在 Ubuntu 中,有多个命令可以重启网络。这些命令,一部分或者说大部分,也适用于在 Debian 或者其他的 Linux 发行版中重启网络。

1、network manager 服务

这是通过命令行方式重启网络最简单的方法。它相当于是通过图形化界面重启网络(重启 Network-Manager 服务)。

sudo service network-manager restart

此时,网络图标会消失一会儿然后重新显示。

2、systemd

service 命令仅仅是这个方式的一个封装(同样的也是 init.d 系列脚本和 Upstart 相关命令的封装)。systemctl 命令的功能远多于 service 命令。通常我更喜欢使用这个命令。

sudo systemctl restart NetworkManager.service

这时,网络图标又会消失一会儿。 如果你想了解 systemctl 的其他选项, 可以参考 man 帮助文档。

3、nmcli

这是 Linux 上可以管理网络的另一个工具。这是一个功能强大而且实用的工具。很多系统管理员都喜欢使用该工具,因为它非常容易使用。

这种方法有两个操作步骤:关闭网络,再开启网络。

sudo nmcli networking off

这样就会关闭网络,网络图标会消失。接下来,再开启网络:

sudo nmcli networking on

你可以通过 man 帮助文档了解 nmcli 的更多用法。

4、ifup & ifdown

这两个命令直接操作网口,切换网口是否可以收发包的状态。这是 Linux 中最应该了解的网络命令 之一。

使用 ifdown 关闭所有网口,再使用 ifup 重新启用网口。

通常推荐的做法是将这两个命令一起使用。

sudo ifdown -a && sudo ifup -a

注意:这种方法不会让网络图标从系统托盘中消失,另外,各种网络连接也会断。

补充工具: nmtui

这是系统管理员们常用的另外一种方法。它是在命令行终端中管理网络的文本菜单工具。

nmtui

打开如下菜单:

nmtui Menu

注意:在 nmtui 中,可以通过 updown 方向键选择选项。

选择 “Activate a connection”:

nmtui Menu Select "Activate a connection"

按下回车键,打开 “connections” 菜单。

nmtui Connections Menu

接下来,选择前面带星号(*)的网络。在这个例子中,就是 MGEO72。

Select your connection in the nmtui connections menu.

按下回车键。 这就将“停用”你的网络连接。

nmtui Connections Menu with no active connection

选择你要连接的网络:

Select the connection you want in the nmtui connections menu.

按下回车键。这样就重新激活了所选择的网络连接。

nmtui Connections Menu

按下 Tab 键两次,选择 “Back”:

Select "Back" in the nmtui connections menu.

按下回车键,回到 nmtui 的主菜单。

nmtui Main Menu

选择 “Quit” :

nmtui Quit Main Menu

退出该界面,返回到命令行终端。

就这样,你已经成功重启网络了。

通过图形化界面重启网络

显然,这是 Ubuntu 桌面版用户重启网络最简单的方法。如果这个方法不生效,你可以尝试使用前文提到的命令行方式重启网络。

NM 小程序是 NetworkManager 的系统托盘程序标志。我们将使用它来重启网络。

首先,查看顶部状态栏。你会在系统托盘找到一个网络图标 (因为我使用 Wi-Fi,所以这里是一个 Wi-Fi 图标)。

接下来,点击该图标(也可以点击音量图标或电池图标)。打开菜单。选择 “Turn Off” 关闭网络。

Restart network in Ubuntu

网络图标会在状态栏中消失,这表示你已经成功关闭网络了。

再次点击系统托盘重新打开菜单,选择 “Turn On”,重新开启网络。

Restarting network in Ubuntu

恭喜!你现在已经重启你的网络了。

其他提示:刷新可用网络列表

如果你已经连接上一个网络,但是你想连接到另外一个网络,你如何刷新 WiFi 列表,查找其他可用的网络呢?我来向你展示一下。

Ubuntu 没有可以直接 “刷新 WiFi 网络” 的选项,它有点隐蔽。

你需要再次打开配置菜单,然后点击 “Select Network” 。

Refresh wifi network list in Ubuntu

选择对应的网络修改你的 WiFi 连接。

你无法马上看到可用的无线网络列表。打开网络列表之后,大概需要 5 秒才会显示其它可用的无线网络。

Select another wifi network in Ubuntu

等待大概 5 秒钟,看到其他可用的网络。

现在,你就可以选择你想要连接的网络,点击连接。这样就完成了。

总结

重启网络连接是每个 Linux 用户在使用过程中必须经历的事情。

我们希望这些方法可以帮助你处理这样的问题!

你是如何重启或管理你的网络的?我们是否还有遗漏的?请在下方留言。


via: https://itsfoss.com/restart-network-ubuntu

作者:Sergiu 选题:lujun9972 译者:bodhix 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

netplan 是一个命令行工具,用于在某些 Linux 发行版上配置网络。

多年以来 Linux 管理员和用户们以相同的方式配置他们的网络接口。例如,如果你是 Ubuntu 用户,你能够用桌面 GUI 配置网络连接,也可以在 /etc/network/interfaces 文件里配置。配置相当简单且可以奏效。在文件中配置看起来就像这样:

auto enp10s0
iface enp10s0 inet static
address 192.168.1.162
netmask 255.255.255.0
gateway 192.168.1.100
dns-nameservers 1.0.0.1,1.1.1.1

保存并关闭文件。使用命令重启网络:

sudo systemctl restart networking

或者,如果你使用不带 systemd 的发行版,你可以通过老办法来重启网络:

sudo /etc/init.d/networking restart

你的网络将会重新启动,新的配置将会生效。

这就是多年以来的做法。但是现在,在某些发行版上(例如 Ubuntu Linux 18.04),网络的配置与控制发生了很大的变化。不需要那个 interfaces 文件和 /etc/init.d/networking 脚本,我们现在转向使用 Netplan。Netplan 是一个在某些 Linux 发行版上配置网络连接的命令行工具。Netplan 使用 YAML 描述文件来配置网络接口,然后,通过这些描述为任何给定的呈现工具生成必要的配置选项。

我将向你展示如何在 Linux 上使用 Netplan 配置静态 IP 地址和 DHCP 地址。我会在 Ubuntu Server 18.04 上演示。有句忠告,你创建的 .yaml 文件中的缩进必须保持一致,否则将会失败。你不用为每行使用特定的缩进间距,只需保持一致就行了。

新的配置文件

打开终端窗口(或者通过 SSH 登录进 Ubuntu 服务器)。你会在 /etc/netplan 文件夹下发现 Netplan 的新配置文件。使用 cd /etc/netplan 命令进入到那个文件夹下。一旦进到了那个文件夹,也许你就能够看到一个文件:

01-netcfg.yaml

你可以创建一个新的文件或者是编辑默认文件。如果你打算修改默认文件,我建议你先做一个备份:

sudo cp /etc/netplan/01-netcfg.yaml /etc/netplan/01-netcfg.yaml.bak

备份好后,就可以开始配置了。

网络设备名称

在你开始配置静态 IP 之前,你需要知道设备名称。要做到这一点,你可以使用命令 ip a,然后找出哪一个设备将会被用到(图 1)。

 title=

图 1:使用 ip a 命令找出设备名称

我将为 ens5 配置一个静态的 IP。

配置静态 IP 地址

使用命令打开原来的 .yaml 文件:

sudo nano /etc/netplan/01-netcfg.yaml

文件的布局看起来就像这样:

network:
    Version: 2
    Renderer: networkd
    ethernets:
       DEVICE_NAME:
          Dhcp4: yes/no
          Addresses: [IP/NETMASK]
          Gateway: GATEWAY
          Nameservers:
             Addresses: [NAMESERVER, NAMESERVER]

其中:

  • DEVICE_NAME 是需要配置设备的实际名称。
  • yes/no 代表是否启用 dhcp4。
  • IP 是设备的 IP 地址。
  • NETMASK 是 IP 地址的掩码。
  • GATEWAY 是网关的地址。
  • NAMESERVER 是由逗号分开的 DNS 服务器列表。

这是一份 .yaml 文件的样例:

network:
    version: 2
    renderer: networkd
    ethernets:
       ens5:
       dhcp4: no
       addresses: [192.168.1.230/24]
       gateway4: 192.168.1.254
       nameservers:
          addresses: [8.8.4.4,8.8.8.8]

编辑上面的文件以达到你想要的效果。保存并关闭文件。

注意,掩码已经不用再配置为 255.255.255.0 这种形式。取而代之的是,掩码已被添加进了 IP 地址中。

测试配置

在应用改变之前,让我们测试一下配置。为此,使用命令:

sudo netplan try

上面的命令会在应用配置之前验证其是否有效。如果成功,你就会看到配置被接受。换句话说,Netplan 会尝试将新的配置应用到运行的系统上。如果新的配置失败了,Netplan 会自动地恢复到之前使用的配置。成功后,新的配置就会被使用。

应用新的配置

如果你确信配置文件没有问题,你就可以跳过测试环节并且直接使用新的配置。它的命令是:

sudo netplan apply

此时,你可以使用 ip a 看看新的地址是否正确。

配置 DHCP

虽然你可能不会配置 DHCP 服务,但通常还是知道比较好。例如,你也许不知道网络上当前可用的静态 IP 地址是多少。你可以为设备配置 DHCP,获取到 IP 地址,然后将那个地址重新配置为静态地址。

在 Netplan 上使用 DHCP,配置文件看起来就像这样:

network:
    version: 2
    renderer: networkd
    ethernets:
       ens5:
       Addresses: []
       dhcp4: true
       optional: true

保存并退出。用下面命令来测试文件:

sudo netplan try

Netplan 应该会成功配置 DHCP 服务。这时你可以使用 ip a 命令得到动态分配的地址,然后重新配置静态地址。或者,你可以直接使用 DHCP 分配的地址(但看看这是一个服务器,你可能不想这样做)。

也许你有不只一个的网络接口,你可以命名第二个 .yaml 文件为 02-netcfg.yaml 。Netplan 会按照数字顺序应用配置文件,因此 01 会在 02 之前使用。根据你的需要创建多个配置文件。

就是这些了

不管怎样,那些就是所有关于使用 Netplan 的东西了。虽然它对于我们习惯性的配置网络地址来说是一个相当大的改变,但并不是所有人都用的惯。但这种配置方式值得一提……因此你会适应的。

在 Linux Foundation 和 edX 上通过 “Introduction to Linux” 课程学习更多关于 Linux 的内容。


via: https://www.linux.com/learn/intro-to-linux/2018/9/how-use-netplan-network-configuration-tool-linux

作者:Jack Wallen 选题:lujun9972 译者:LuuMing 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

最近我一直在研究 Kubernetes 网络。我注意到一件事情就是,虽然关于如何设置 Kubernetes 网络的文章很多,也写得很不错,但是却没有看到关于如何去运维 Kubernetes 网络的文章、以及如何完全确保它不会给你造成生产事故。

在本文中,我将尽力让你相信三件事情(我觉得这些都很合理 :)):

  • 避免生产系统网络中断非常重要
  • 运维联网软件是很难的
  • 有关你的网络基础设施的重要变化值得深思熟虑,以及这种变化对可靠性的影响。虽然非常“牛x”的谷歌人常说“这是我们在谷歌正在用的”(谷歌工程师在 Kubernetes 上正做着很重大的工作!但是我认为重要的仍然是研究架构,并确保它对你的组织有意义)。

我肯定不是 Kubernetes 网络方面的专家,但是我在配置 Kubernetes 网络时遇到了一些问题,并且比以前更加了解 Kubernetes 网络了。

运维联网软件是很难的

在这里,我并不讨论有关运维物理网络的话题(对于它我不懂),而是讨论关于如何让像 DNS 服务、负载均衡以及代理这样的软件正常工作方面的内容。

我在一个负责很多网络基础设施的团队工作过一年时间,并且因此学到了一些运维网络基础设施的知识!(显然我还有很多的知识需要继续学习)在我们开始之前有三个整体看法:

  • 联网软件经常重度依赖 Linux 内核。因此除了正确配置软件之外,你还需要确保许多不同的系统控制(sysctl)配置正确,而一个错误配置的系统控制就很容易让你处于“一切都很好”和“到处都出问题”的差别中。
  • 联网需求会随时间而发生变化(比如,你的 DNS 查询或许比上一年多了五倍!或者你的 DNS 服务器突然开始返回 TCP 协议的 DNS 响应而不是 UDP 的,它们是完全不同的内核负载!)。这意味着之前正常工作的软件突然开始出现问题。
  • 修复一个生产网络的问题,你必须有足够的经验。(例如,看这篇 由 Sophie Haskins 写的关于 kube-dns 问题调试的文章)我在网络调试方面比以前进步多了,但那也是我花费了大量时间研究 Linux 网络知识之后的事了。

我距离成为一名网络运维专家还差得很远,但是我认为以下几点很重要:

  1. 对生产网络的基础设施做重要的更改是很难得的(因为它会产生巨大的混乱)
  2. 当你对网络基础设施做重大更改时,真的应该仔细考虑如果新网络基础设施失败该如何处理
  3. 是否有很多人都能理解你的网络配置

切换到 Kubernetes 显然是个非常大的更改!因此,我们来讨论一下可能会导致错误的地方!

Kubernetes 网络组件

在本文中我们将要讨论的 Kubernetes 网络组件有:

  • 覆盖网络 overlay network 的后端(像 flannel/calico/weave 网络/romana)
  • kube-dns
  • kube-proxy
  • 入站控制器 / 负载均衡器
  • kubelet

如果你打算配置 HTTP 服务,或许这些你都会用到。这些组件中的大部分我都不会用到,但是我尽可能去理解它们,因此,本文将涉及它们有关的内容。

最简化的方式:为所有容器使用宿主机网络

让我们从你能做到的最简单的东西开始。这并不能让你在 Kubernetes 中运行 HTTP 服务。我认为它是非常安全的,因为在这里面可以让你动的东西很少。

如果你为所有容器使用宿主机网络,我认为需要你去做的全部事情仅有:

  1. 配置 kubelet,以便于容器内部正确配置 DNS
  2. 没了,就这些!

如果你为每个 pod 直接使用宿主机网络,那就不需要 kube-dns 或者 kube-proxy 了。你都不需要一个作为基础的覆盖网络。

这种配置方式中,你的 pod 们都可以连接到外部网络(同样的方式,你的宿主机上的任何进程都可以与外部网络对话),但外部网络不能连接到你的 pod 们。

这并不是最重要的(我认为大多数人想在 Kubernetes 中运行 HTTP 服务并与这些服务进行真实的通讯),但我认为有趣的是,从某种程度上来说,网络的复杂性并不是绝对需要的,并且有时候你不用这么复杂的网络就可以实现你的需要。如果可以的话,尽可能地避免让网络过于复杂。

运维一个覆盖网络

我们将要讨论的第一个网络组件是有关覆盖网络的。Kubernetes 假设每个 pod 都有一个 IP 地址,这样你就可以与那个 pod 中的服务进行通讯了。我在说到“覆盖网络”这个词时,指的就是这个意思(“让你通过它的 IP 地址指向到 pod 的系统)。

所有其它的 Kubernetes 网络的东西都依赖正确工作的覆盖网络。更多关于它的内容,你可以读 这里的 kubernetes 网络模型

Kelsey Hightower 在 kubernetes 艰难之路 中描述的方式看起来似乎很好,但是,事实上它的作法在超过 50 个节点的 AWS 上是行不通的,因此,我不打算讨论它了。

有许多覆盖网络后端(calico、flannel、weaveworks、romana)并且规划非常混乱。就我的观点来看,我认为一个覆盖网络有 2 个职责:

  1. 确保你的 pod 能够发送网络请求到外部的集群
  2. 保持一个到子网络的稳定的节点映射,并且保持集群中每个节点都可以使用那个映射得以更新。当添加和删除节点时,能够做出正确的反应。

Okay! 因此!你的覆盖网络可能会出现的问题是什么呢?

  • 覆盖网络负责设置 iptables 规则(最基本的是 iptables -A -t nat POSTROUTING -s $SUBNET -j MASQUERADE),以确保那个容器能够向 Kubernetes 之外发出网络请求。如果在这个规则上有错误,你的容器就不能连接到外部网络。这并不很难(它只是几条 iptables 规则而已),但是它非常重要。我发起了一个 拉取请求,因为我想确保它有很好的弹性。
  • 添加或者删除节点时可能会有错误。我们使用 flannel hostgw 后端,我们开始使用它的时候,节点删除功能 尚未开始工作
  • 你的覆盖网络或许依赖一个分布式数据库(etcd)。如果那个数据库发生什么问题,这将导致覆盖网络发生问题。例如,https://github.com/coreos/flannel/issues/610 上说,如果在你的 flannel etcd 集群上丢失了数据,最后的结果将是在容器中网络连接会丢失。(现在这个问题已经被修复了)
  • 你升级 Docker 以及其它东西导致的崩溃
  • 还有更多的其它的可能性!

我在这里主要讨论的是过去发生在 Flannel 中的问题,但是我并不是要承诺不去使用 Flannel —— 事实上我很喜欢 Flannel,因为我觉得它很简单(比如,类似 vxlan 在后端这一块的部分 只有 500 行代码),对我来说,通过代码来找出问题的根源成为了可能。并且很显然,它在不断地改进。他们在审查拉取请求方面做的很好。

到目前为止,我运维覆盖网络的方法是:

  • 学习它的工作原理的详细内容以及如何去调试它(比如,Flannel 用于创建路由的 hostgw 网络后端,因此,你只需要使用 sudo ip route list 命令去查看它是否正确即可)
  • 如果需要的话,维护一个内部构建版本,这样打补丁比较容易
  • 有问题时,向上游贡献补丁

我认为去遍历所有已合并的拉取请求以及过去已修复的 bug 清单真的是非常有帮助的 —— 这需要花费一些时间,但这是得到一个其它人遇到的各种问题的清单的好方法。

对其他人来说,他们的覆盖网络可能工作的很好,但是我并不能从中得到任何经验,并且我也曾听说过其他人报告类似的问题。如果你有一个类似配置的覆盖网络:a) 在 AWS 上并且 b) 在多于 50-100 节点上运行,我想知道你运维这样的一个网络有多大的把握。

运维 kube-proxy 和 kube-dns?

现在,我有一些关于运维覆盖网络的想法,我们来讨论一下。

这个标题的最后面有一个问号,那是因为我并没有真的去运维过。在这里我还有更多的问题要问答。

这里的 Kubernetes 服务是如何工作的!一个服务是一群 pod 们,它们中的每个都有自己的 IP 地址(像 10.1.0.3、10.2.3.5、10.3.5.6 这样)

  1. 每个 Kubernetes 服务有一个 IP 地址(像 10.23.1.2 这样)
  2. kube-dns 去解析 Kubernetes 服务 DNS 名字为 IP 地址(因此,my-svc.my-namespace.svc.cluster.local 可能映射到 10.23.1.2 上)
  3. kube-proxy 配置 iptables 规则是为了在它们之间随机进行均衡负载。Kube-proxy 也有一个用户空间的轮询负载均衡器,但是在我的印象中,他们并不推荐使用它。

因此,当你发出一个请求到 my-svc.my-namespace.svc.cluster.local 时,它将解析为 10.23.1.2,然后,在你本地主机上的 iptables 规则(由 kube-proxy 生成)将随机重定向到 10.1.0.3 或者 10.2.3.5 或者 10.3.5.6 中的一个上。

在这个过程中我能想像出的可能出问题的地方:

  • kube-dns 配置错误
  • kube-proxy 挂了,以致于你的 iptables 规则没有得以更新
  • 维护大量的 iptables 规则相关的一些问题

我们来讨论一下 iptables 规则,因为创建大量的 iptables 规则是我以前从没有听过的事情!

kube-proxy 像如下这样为每个目标主机创建一个 iptables 规则:这些规则来自 这里

-A KUBE-SVC-LI77LBOOMGYET5US -m comment --comment "default/showreadiness:showreadiness" -m statistic --mode random --probability 0.20000000019 -j KUBE-SEP-E4QKA7SLJRFZZ2DD[b][c]  
-A KUBE-SVC-LI77LBOOMGYET5US -m comment --comment "default/showreadiness:showreadiness" -m statistic --mode random --probability 0.25000000000 -j KUBE-SEP-LZ7EGMG4DRXMY26H  
-A KUBE-SVC-LI77LBOOMGYET5US -m comment --comment "default/showreadiness:showreadiness" -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-RKIFTWKKG3OHTTMI  
-A KUBE-SVC-LI77LBOOMGYET5US -m comment --comment "default/showreadiness:showreadiness" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-CGDKBCNM24SZWCMS 
-A KUBE-SVC-LI77LBOOMGYET5US -m comment --comment "default/showreadiness:showreadiness" -j KUBE-SEP-RI4SRNQQXWSTGE2Y 

因此,kube-proxy 创建了许多 iptables 规则。它们都是什么意思?它对我的网络有什么样的影响?这里有一个来自华为的非常好的演讲,它叫做 支持 50,000 个服务的可伸缩 Kubernetes,它说如果在你的 Kubernetes 集群中有 5,000 服务,增加一个新规则,将需要 11 分钟。如果这种事情发生在真实的集群中,我认为这将是一件非常糟糕的事情。

在我的集群中肯定不会有 5,000 个服务,但是 5,000 并不是那么大的一个数字。为解决这个问题,他们给出的解决方案是 kube-proxy 用 IPVS 来替换这个 iptables 后端,IPVS 是存在于 Linux 内核中的一个负载均衡器。

看起来,像 kube-proxy 正趋向于使用各种基于 Linux 内核的负载均衡器。我认为这只是一定程度上是这样,因为他们支持 UDP 负载均衡,而其它类型的负载均衡器(像 HAProxy)并不支持 UDP 负载均衡。

但是,我觉得使用 HAProxy 更舒服!它能够用于去替换 kube-proxy!我用谷歌搜索了一下,然后发现了这个 thread on kubernetes-sig-network,它说:

kube-proxy 是很难用的,我们在生产系统中使用它近一年了,它在大部分的时间都表现的很好,但是,随着我们集群中的服务越来越多,我们发现它的排错和维护工作越来越难。在我们的团队中没有 iptables 方面的专家,我们只有 HAProxy & LVS 方面的专家,由于我们已经使用它们好几年了,因此我们决定使用一个中心化的 HAProxy 去替换分布式的代理。我觉得这可能会对在 Kubernetes 中使用 HAProxy 的其他人有用,因此,我们更新了这个项目,并将它开源:https://github.com/AdoHe/kube2haproxy。如果你发现它有用,你可以去看一看、试一试。

因此,那是一个有趣的选择!我在这里确实没有答案,但是,有一些想法:

  • 负载均衡器是很复杂的
  • DNS 也很复杂
  • 如果你有运维某种类型的负载均衡器(比如 HAProxy)的经验,与其使用一个全新的负载均衡器(比如 kube-proxy),还不如做一些额外的工作去使用你熟悉的那个来替换,或许更有意义。
  • 我一直在考虑,我们希望在什么地方能够完全使用 kube-proxy 或者 kube-dns —— 我认为,最好是只在 Envoy 上投入,并且在负载均衡&服务发现上完全依赖 Envoy 来做。因此,你只需要将 Envoy 运维好就可以了。

正如你所看到的,我在关于如何运维 Kubernetes 中的内部代理方面的思路还是很混乱的,并且我也没有使用它们的太多经验。总体上来说,kube-proxy 和 kube-dns 还是很好的,也能够很好地工作,但是我仍然认为应该去考虑使用它们可能产生的一些问题(例如,”你不能有超出 5000 的 Kubernetes 服务“)。

入口

如果你正在运行着一个 Kubernetes 集群,那么到目前为止,很有可能的是,你事实上需要 HTTP 请求去进入到你的集群中。这篇博客已经太长了,并且关于入口我知道的也不多,因此,我们将不讨论关于入口的内容。

有用的链接

几个有用的链接,总结如下:

我认为网络运维很重要

我对 Kubernetes 的所有这些联网软件的感觉是,它们都仍然是非常新的,并且我并不能确定我们(作为一个社区)真的知道如何去把它们运维好。这让我作为一个操作者感到很焦虑,因为我真的想让我的网络运行的很好!:) 而且我觉得作为一个组织,运行你自己的 Kubernetes 集群需要相当大的投入,以确保你理解所有的代码片段,这样当它们出现问题时你可以去修复它们。这不是一件坏事,它只是一个事而已。

我现在的计划是,继续不断地学习关于它们都是如何工作的,以尽可能多地减少对我动过的那些部分的担忧。

一如继往,我希望这篇文章对你有帮助,并且如果我在这篇文章中有任何的错误,我非常喜欢你告诉我。


via: https://jvns.ca/blog/2017/10/10/operating-a-kubernetes-network/

作者:Julia Evans 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出