分类 技术 下的文章

检查你的代码的质量,通过这些外部库使其更易维护。

可读性很重要。
Python 之禅 The Zen of Python ,Tim Peters

随着软件项目进入“维护模式”,对可读性和编码标准的要求很容易落空(甚至从一开始就没有建立过那些标准)。然而,在代码库中保持一致的代码风格和测试标准能够显著减轻维护的压力,也能确保新的开发者能够快速了解项目的情况,同时能更好地全程保持应用程序的质量。

使用外部库来检查代码的质量不失为保护项目未来可维护性的一个好方法。以下会推荐一些我们最喜爱的检查代码)(包括检查 PEP 8 和其它代码风格错误)的库,用它们来强制保持代码风格一致,并确保在项目成熟时有一个可接受的测试覆盖率。

检查你的代码风格

PEP 8 是 Python 代码风格规范,它规定了类似行长度、缩进、多行表达式、变量命名约定等内容。尽管你的团队自身可能也会有稍微不同于 PEP 8 的代码风格规范,但任何代码风格规范的目标都是在代码库中强制实施一致的标准,使代码的可读性更强、更易于维护。下面三个库就可以用来帮助你美化代码。

1、 Pylint

Pylint 是一个检查违反 PEP 8 规范和常见错误的库。它在一些流行的编辑器和 IDE 中都有集成,也可以单独从命令行运行。

执行 pip install pylint 安装 Pylint 。然后运行 pylint [options] path/to/dir 或者 pylint [options] path/to/module.py 就可以在命令行中使用 Pylint,它会向控制台输出代码中违反规范和出现错误的地方。

你还可以使用 pylintrc 配置文件来自定义 Pylint 对哪些代码错误进行检查。

2、 Flake8

Flake8 是“将 PEP 8、Pyflakes(类似 Pylint)、McCabe(代码复杂性检查器)和第三方插件整合到一起,以检查 Python 代码风格和质量的一个 Python 工具”。

执行 pip install flake8 安装 flake8 ,然后执行 flake8 [options] path/to/dir 或者 flake8 [options] path/to/module.py 可以查看报出的错误和警告。

和 Pylint 类似,Flake8 允许通过配置文件来自定义检查的内容。它有非常清晰的文档,包括一些有用的提交钩子,可以将自动检查代码纳入到开发工作流程之中。

Flake8 也可以集成到一些流行的编辑器和 IDE 当中,但在文档中并没有详细说明。要将 Flake8 集成到喜欢的编辑器或 IDE 中,可以搜索插件(例如 Sublime Text 的 Flake8 插件)。

3、 Isort

Isort 这个库能将你在项目中导入的库按字母顺序排序,并将其正确划分为不同部分(例如标准库、第三方库、自建的库等)。这样提高了代码的可读性,并且可以在导入的库较多的时候轻松找到各个库。

执行 pip install isort 安装 isort,然后执行 isort path/to/module.py 就可以运行了。文档中还提供了更多的配置项,例如通过配置 .isort.cfg 文件来决定 isort 如何处理一个库的多行导入。

和 Flake8、Pylint 一样,isort 也提供了将其与流行的编辑器和 IDE 集成的插件。

分享你的代码风格

每次文件发生变动之后都用命令行手动检查代码是一件痛苦的事,你可能也不太喜欢通过运行 IDE 中某个插件来实现这个功能。同样地,你的同事可能会用不同的代码检查方式,也许他们的编辑器中也没有那种插件,甚至你自己可能也不会严格检查代码和按照警告来更正代码。总之,你分享出来的代码库将会逐渐地变得混乱且难以阅读。

一个很好的解决方案是使用一个库,自动将代码按照 PEP 8 规范进行格式化。我们推荐的三个库都有不同的自定义级别来控制如何格式化代码。其中有一些设置较为特殊,例如 Pylint 和 Flake8 ,你需要先行测试,看看是否有你无法忍受但又不能修改的默认配置。

4、 Autopep8

Autopep8 可以自动格式化指定的模块中的代码,包括重新缩进行、修复缩进、删除多余的空格,并重构常见的比较错误(例如布尔值和 None 值)。你可以查看文档中完整的更正列表

运行 pip install --upgrade autopep8 安装 Autopep8。然后执行 autopep8 --in-place --aggressive --aggressive <filename> 就可以重新格式化你的代码。aggressive 选项的数量表示 Auotopep8 在代码风格控制上有多少控制权。在这里可以详细了解 aggressive 选项。

5、 Yapf

Yapf 是另一种有自己的配置项列表的重新格式化代码的工具。它与 Autopep8 的不同之处在于它不仅会指出代码中违反 PEP 8 规范的地方,还会对没有违反 PEP 8 但代码风格不一致的地方重新格式化,旨在令代码的可读性更强。

执行 pip install yapf 安装 Yapf,然后执行 yapf [options] path/to/diryapf [options] path/to/module.py 可以对代码重新格式化。定制选项的完整列表在这里。

6、 Black

Black 在代码检查工具当中算是比较新的一个。它与 Autopep8 和 Yapf 类似,但限制较多,没有太多的自定义选项。这样的好处是你不需要去决定使用怎么样的代码风格,让 Black 来给你做决定就好。你可以在这里查阅 Black 有限的自定义选项以及如何在配置文件中对其进行设置

Black 依赖于 Python 3.6+,但它可以格式化用 Python 2 编写的代码。执行 pip install black 安装 Black,然后执行 black path/to/dirblack path/to/module.py 就可以使用 Black 优化你的代码。

检查你的测试覆盖率

如果你正在进行编写测试,你需要确保提交到代码库的新代码都已经测试通过,并且不会降低测试覆盖率。虽然测试覆盖率不是衡量测试有效性和充分性的唯一指标,但它是确保项目遵循基本测试标准的一种方法。对于计算测试覆盖率,我们推荐使用 Coverage 这个库。

7、 Coverage

Coverage 有数种显示测试覆盖率的方式,包括将结果输出到控制台或 HTML 页面,并指出哪些具体哪些地方没有被覆盖到。你可以通过配置文件自定义 Coverage 检查的内容,让你更方便使用。

执行 pip install coverage 安装 Converage 。然后执行 coverage [path/to/module.py] [args] 可以运行程序并查看输出结果。如果要查看哪些代码行没有被覆盖,执行 coverage report -m 即可。

持续集成工具

持续集成 Continuous integration (CI)是在合并和部署代码之前自动检查代码风格错误和测试覆盖率最小值的过程。很多免费或付费的工具都可以用于执行这项工作,具体的过程不在本文中赘述,但 CI 过程是令代码更易读和更易维护的重要步骤,关于这一部分可以参考 Travis CIJenkins

以上这些只是用于检查 Python 代码的各种工具中的其中几个。如果你有其它喜爱的工具,欢迎在评论中分享。


via: https://opensource.com/article/18/7/7-python-libraries-more-maintainable-code

作者:Jeff Triplett 选题:lujun9972 译者:HankChow 校对:wxy

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

APT, 是 Advanced Package Tool 的缩写,是基于 Debian 的系统的默认包管理器。我们可以使用 APT 安装、更新、升级和删除应用程序。最近,我一直遇到一个奇怪的错误。每当我尝试更新我的 Ubuntu 16.04 时,我都会收到此错误 - “0% [Connecting to in.archive.ubuntu.com (2001:67c:1560:8001::14)]” ,同时更新流程会卡住很长时间。我的网络连接没问题,我可以 ping 通所有网站,包括 Ubuntu 官方网站。在搜索了一番谷歌后,我意识到 Ubuntu 镜像站点有时无法通过 IPv6 访问。在我强制将 APT 包管理器在更新系统时使用 IPv4 代替 IPv6 访问 Ubuntu 镜像站点后,此问题得以解决。如果你遇到过此错误,可以按照以下说明解决。

强制 APT 包管理器在 Ubuntu 16.04 中使用 IPv4

要在更新和升级 Ubuntu 16.04 LTS 系统时强制 APT 使用 IPv4 代替 IPv6,只需使用以下命令:

$ sudo apt-get -o Acquire::ForceIPv4=true update
$ sudo apt-get -o Acquire::ForceIPv4=true upgrade

瞧!这次更新很快就完成了。

你还可以使用以下命令在 /etc/apt/apt.conf.d/99force-ipv4 中添加以下行,以便将来对所有 apt-get 事务保持持久性:

$ echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4

免责声明:

我不知道最近是否有人遇到这个问题,但我今天在我的 Ubuntu 16.04 LTS 虚拟机中遇到了至少四、五次这样的错误,我按照上面的说法解决了这个问题。我不确定这是推荐的解决方案。请浏览 Ubuntu 论坛来确保此方法合法。由于我只是一个 VM,我只将它用于测试和学习目的,我不介意这种方法的真实性。请自行承担使用风险。

希望这有帮助。还有更多的好东西。敬请关注!

干杯!


via: https://www.ostechnix.com/how-to-force-apt-package-manager-to-use-ipv4-in-ubuntu-16-04/

作者:SK 选题:lujun9972 译者:geekpi 校对:wxy

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

在这篇文章中,我将讨论为什么你需要尝试一下 Go 语言,以及应该从哪里学起。

Go 语言是可能是最近几年里你经常听人说起的编程语言。尽管它在 2009 年已经发布了,但它最近才开始流行起来。

根据 Google 趋势,Go 语言非常流行。

这篇文章不会讨论一些你经常看到的 Go 语言的主要特性。

相反,我想向您介绍一些相当小众但仍然很重要的功能。只有在您决定尝试 Go 语言后,您才会知道这些功能。

这些都是表面上没有体现出来的惊人特性,但它们可以为您节省数周或数月的工作量。而且这些特性还可以使软件开发更加愉快。

阅读本文不需要任何语言经验,所以不必担心你还不了解 Go 语言。如果你想了解更多,可以看看我在底部列出的一些额外的链接。

我们将讨论以下主题:

  • GoDoc
  • 静态代码分析
  • 内置的测试和分析框架
  • 竞争条件检测
  • 学习曲线
  • 反射
  • Opinionatedness
  • 文化

请注意,这个列表不遵循任何特定顺序来讨论。

GoDoc

Go 语言非常重视代码中的文档,所以也很简洁。

GoDoc 是一个静态代码分析工具,可以直接从代码中创建漂亮的文档页面。GoDoc 的一个显著特点是它不使用任何其他的语言,如 JavaDoc、PHPDoc 或 JSDoc 来注释代码中的结构,只需要用英语。

它使用从代码中获取的尽可能多的信息来概述、构造和格式化文档。它有多而全的功能,比如:交叉引用、代码示例,并直接链接到你的版本控制系统仓库。

而你需要做的只有添加一些像 // MyFunc transforms Foo into Bar 这样子的老牌注释,而这些注释也会反映在的文档中。你甚至可以添加一些通过网络界面或者在本地可以实际运行的 代码示例

GoDoc 是 Go 的唯一文档引擎,整个社区都在使用。这意味着用 Go 编写的每个库或应用程序都具有相同的文档格式。从长远来看,它可以帮你在浏览这些文档时节省大量时间。

例如,这是我最近一个小项目的 GoDoc 页面:pullkee — GoDoc

静态代码分析

Go 严重依赖于静态代码分析。例如用于文档的 godoc,用于代码格式化的 gofmt,用于代码风格的 golint,等等。

它们是如此之多,甚至有一个总揽了它们的项目 gometalinter ,将它们组合成了单一的实用程序。

这些工具通常作为独立的命令行应用程序实现,并可轻松与任何编码环境集成。

静态代码分析实际上并不是现代编程的新概念,但是 Go 将其带入了绝对的范畴。我无法估量它为我节省了多少时间。此外,它给你一种安全感,就像有人在你背后支持你一样。

创建自己的分析器非常简单,因为 Go 有专门的内置包来解析和加工 Go 源码。

你可以从这个链接中了解到更多相关内容: GothamGo Kickoff Meetup: Alan Donovan 的 Go 静态分析工具

内置的测试和分析框架

您是否曾尝试为一个从头开始的 JavaScript 项目选择测试框架?如果是这样,你或许会理解经历这种 过度分析 analysis paralysis 的痛苦。您可能也意识到您没有使用其中 80% 的框架。

一旦您需要进行一些可靠的分析,问题就会重复出现。

Go 附带内置测试工具,旨在简化和提高效率。它为您提供了最简单的 API,并做出最小的假设。您可以将它用于不同类型的测试、分析,甚至可以提供可执行代码示例。

它可以开箱即用地生成便于持续集成的输出,而且它的用法很简单,只需运行 go test。当然,它还支持高级功能,如并行运行测试,跳过标记代码,以及其他更多功能。

竞争条件检测

您可能已经听说了 Goroutine,它们在 Go 中用于实现并发代码执行。如果你未曾了解过,这里有一个非常简短的解释。

无论具体技术如何,复杂应用中的并发编程都不容易,部分原因在于竞争条件的可能性。

简单地说,当几个并发操作以不可预测的顺序完成时,竞争条件就会发生。它可能会导致大量的错误,特别难以追查。如果你曾经花了一天时间调试集成测试,该测试仅在大约 80% 的执行中起作用?这可能是竞争条件引起的。

总而言之,在 Go 中非常重视并发编程,幸运的是,我们有一个强大的工具来捕捉这些竞争条件。它完全集成到 Go 的工具链中。

您可以在这里阅读更多相关信息并了解如何使用它:介绍 Go 中的竞争条件检测 - Go Blog

学习曲线

您可以在一个晚上学习所有的 Go 语言功能。我是认真的。当然,还有标准库,以及不同的,更具体领域的最佳实践。但是两个小时就足以让你自信地编写一个简单的 HTTP 服务器或命令行应用程序。

Go 语言拥有出色的文档,大部分高级主题已经在他们的博客上进行了介绍:Go 编程语言博客

比起 Java(以及 Java 家族的语言)、Javascript、Ruby、Python 甚至 PHP,你可以更轻松地把 Go 语言带到你的团队中。由于环境易于设置,您的团队在完成第一个生产代码之前需要进行的投资要小得多。

反射

代码反射本质上是一种隐藏在编译器下并访问有关语言结构的各种元信息的能力,例如变量或函数。

鉴于 Go 是一种静态类型语言,当涉及更松散类型的抽象编程时,它会受到许多各种限制。特别是与 Javascript 或 Python 等语言相比。

此外,Go 没有实现一个名为泛型的概念,这使得以抽象方式处理多种类型更具挑战性。然而,由于泛型带来的复杂程度,许多人认为不实现泛型对语言实际上是有益的。我完全同意。

根据 Go 的理念(这是一个单独的主题),您应该努力不要过度设计您的解决方案。这也适用于动态类型编程。尽可能坚持使用静态类型,并在确切知道要处理的类型时使用 接口 interface 。接口在 Go 中非常强大且无处不在。

但是,仍然存在一些情况,你无法知道你处理的数据类型。一个很好的例子是 JSON。您可以在应用程序中来回转换所有类型的数据。字符串、缓冲区、各种数字、嵌套结构等。

为了解决这个问题,您需要一个工具来检查运行时的数据并根据其类型和结构采取不同行为。 反射 Reflect 可以帮到你。Go 拥有一流的反射包,使您的代码能够像 Javascript 这样的语言一样动态。

一个重要的警告是知道你使用它所带来的代价 —— 并且只有知道在没有更简单的方法时才使用它。

你可以在这里阅读更多相关信息: 反射的法则 — Go 博客.

您还可以在此处阅读 JSON 包源码中的一些实际代码: src/encoding/json/encode.go — Source Code

Opinionatedness(专制独裁的 Go)

顺便问一下,有这样一个单词吗?

来自 Javascript 世界,我面临的最艰巨的困难之一是决定我需要使用哪些约定和工具。我应该如何设计代码?我应该使用什么测试库?我该怎么设计结构?我应该依赖哪些编程范例和方法?

这有时候基本上让我卡住了。我需要花时间思考这些事情而不是编写代码并满足用户。

首先,我应该注意到我完全知道这些惯例的来源,它总是来源于你或者你的团队。无论如何,即使是一群经验丰富的 Javascript 开发人员也很容易发现他们在实现相同的结果时,而大部分的经验却是在完全不同的工具和范例上。

这导致整个团队中出现过度分析,并且使得个体之间更难以相互协作。

嗯,Go 是不同的。即使您对如何构建和维护代码有很多强烈的意见,例如:如何命名,要遵循哪些结构模式,如何更好地实现并发。但你只有一个每个人都遵循的风格指南。你只有一个内置在基本工具链中的测试框架。

虽然这似乎过于严格,但它为您和您的团队节省了大量时间。当你写代码时,受一点限制实际上是一件好事。在构建新代码时,它为您提供了一种更直接的方法,并且可以更容易地调试现有代码。

因此,大多数 Go 项目在代码方面看起来非常相似。

文化

人们说,每当你学习一门新的口语时,你也会沉浸在说这种语言的人的某些文化中。因此,您学习的语言越多,您可能会有更多的变化。

编程语言也是如此。无论您将来如何应用新的编程语言,它总能给你带来新的编程视角或某些特别的技术。

无论是函数式编程, 模式匹配 pattern matching 还是 原型继承 prototypal inheritance 。一旦你学会了它们,你就可以随身携带这些编程思想,这扩展了你作为软件开发人员所拥有的问题解决工具集。它们也改变了你阅读高质量代码的方式。

而 Go 在这方面有一项了不起的财富。Go 文化的主要支柱是保持简单,脚踏实地的代码,而不会产生许多冗余的抽象概念,并将可维护性放在首位。大部分时间花费在代码的编写工作上,而不是在修补工具和环境或者选择不同的实现方式上,这也是 Go 文化的一部分。

Go 文化也可以总结为:“应当只用一种方法去做一件事”。

一点注意事项。当你需要构建相对复杂的抽象代码时,Go 通常会妨碍你。好吧,我会说这是简单的权衡。

如果你真的需要编写大量具有复杂关系的抽象代码,那么最好使用 Java 或 Python 等语言。然而,这种情况却很少。

在工作时始终使用最好的工具!

总结

你或许之前听说过 Go,或者它暂时在你圈子以外的地方。但无论怎样,在开始新项目或改进现有项目时,Go 可能是您或您团队的一个非常不错的选择。

这不是 Go 的所有惊人的优点的完整列表,只是一些被人低估的特性。

请尝试一下从 Go 之旅 来开始学习 Go,这将是一个令人惊叹的开始。

如果您想了解有关 Go 的优点的更多信息,可以查看以下链接:

并在评论中分享您的阅读感悟!

即使您不是为了专门寻找新的编程语言语言,也值得花一两个小时来感受它。也许它对你来说可能会变得非常有用。

不断为您的工作寻找最好的工具!

题图来自 https://github.com/ashleymcnamara/gophers 的图稿


via: https://medium.freecodecamp.org/here-are-some-amazing-advantages-of-go-that-you-dont-hear-much-about-1af99de3b23a

作者:Kirill Rogovoy 译者:imquanquan 校对:wxy

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

Linux DNS 查询剖析(第一部分)Linux DNS 查询剖析(第二部分)Linux DNS 查询剖析(第三部分) 中,我们已经介绍了以下内容:

  • nsswitch
  • /etc/hosts
  • /etc/resolv.conf
  • pinghost 查询方式的对比
  • systemd 和对应的 networking 服务
  • ifupifdown
  • dhclient
  • resolvconf
  • NetworkManager
  • dnsmasq

在第四部分中,我将介绍容器如何完成 DNS 查询。你想的没错,也不是那么简单。

1) Docker 和 DNS

Linux DNS 查询剖析(第三部分) 中,我们介绍了 dnsmasq,其工作方式如下:将 DNS 查询指向到 localhost 地址 127.0.0.1,同时启动一个进程监听 53 端口并处理查询请求。

在按上述方式配置 DNS 的主机上,如果运行了一个 Docker 容器,容器内的 /etc/resolv.conf 文件会是怎样的呢?

我们来动手试验一下吧。

按照默认 Docker 创建流程,可以看到如下的默认输出:

$  docker run  ubuntu cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# 127.0.0.53 is the systemd-resolved stub resolver.
# run "systemd-resolve --status" to see details about the actual nameservers.

search home
nameserver 8.8.8.8
nameserver 8.8.4.4

奇怪!

地址 8.8.8.88.8.4.4 从何而来呢?

当我思考容器内的 /etc/resolv.conf 配置时,我的第一反应是继承主机的 /etc/resolv.conf。但只要稍微进一步分析,就会发现这样并不总是有效的。

如果在主机上配置了 dnsmasq,那么 /etc/resolv.conf 文件总会指向 127.0.0.1 这个 回环地址 loopback address 。如果这个地址被容器继承,容器会在其本身的 网络上下文 networking context 中使用;由于容器内并没有运行(在 127.0.0.1 地址的)DNS 服务器,因此 DNS 查询都会失败。

“有了!”你可能有了新主意:将 主机的 的 IP 地址用作 DNS 服务器地址,其中这个 IP 地址可以从容器的 默认路由 default route 中获取:

root@79a95170e679:/# ip route
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2

使用主机 IP 地址真的可行吗?

从默认路由中,我们可以找到主机的 IP 地址 172.17.0.1,进而可以通过手动指定 DNS 服务器的方式进行测试(你也可以更新 /etc/resolv.conf 文件并使用 ping 进行测试;但我觉得这里很适合介绍新的 dig 工具及其 @ 参数,后者用于指定需要查询的 DNS 服务器地址):

root@79a95170e679:/# dig @172.17.0.1 google.com | grep -A1 ANSWER.SECTION
;; ANSWER SECTION:
google.com.             112     IN      A       172.217.23.14

但是还有一个问题,这种方式仅适用于主机配置了 dnsmasq 的情况;如果主机没有配置 dnsmasq,主机上并不存在用于查询的 DNS 服务器。

在这个问题上,Docker 的解决方案是忽略所有可能的复杂情况,即无论主机中使用什么 DNS 服务器,容器内都使用 Google 的 DNS 服务器 8.8.8.88.8.4.4 完成 DNS 查询。

我的经历:在 2013 年,我遇到了使用 Docker 以来的第一个问题,与 Docker 的这种 DNS 解决方案密切相关。我们公司的网络屏蔽了 8.8.8.88.8.4.4,导致容器无法解析域名。

这就是 Docker 容器的情况,但对于包括 Kubernetes 在内的容器 编排引擎 orchestrators ,情况又有些不同。

2) Kubernetes 和 DNS

在 Kubernetes 中,最小部署单元是 pod;它是一组相互协作的容器,共享 IP 地址(和其它资源)。

Kubernetes 面临的一个额外的挑战是,将 Kubernetes 服务请求(例如,myservice.kubernetes.io)通过对应的 解析器 resolver ,转发到具体服务地址对应的 内网地址 private network 。这里提到的服务地址被称为归属于“ 集群域 cluster domain ”。集群域可由管理员配置,根据配置可以是 cluster.localmyorg.badger 等。

在 Kubernetes 中,你可以为 pod 指定如下四种 pod 内 DNS 查询的方式。

Default

在这种(名称容易让人误解)的方式中,pod 与其所在的主机采用相同的 DNS 查询路径,与前面介绍的主机 DNS 查询一致。我们说这种方式的名称容易让人误解,因为该方式并不是默认选项!ClusterFirst 才是默认选项。

如果你希望覆盖 /etc/resolv.conf 中的条目,你可以添加到 kubelet 的配置中。

ClusterFirst

ClusterFirst 方式中,遇到 DNS 查询请求会做有选择的转发。根据配置的不同,有以下两种方式:

第一种方式配置相对古老但更简明,即采用一个规则:如果请求的域名不是集群域的子域,那么将其转发到 pod 所在的主机。

第二种方式相对新一些,你可以在内部 DNS 中配置选择性转发。

下面给出示例配置并从 Kubernetes 文档中选取一张图说明流程:

apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-dns
  namespace: kube-system
data:
  stubDomains: |
    {"acme.local": ["1.2.3.4"]}
  upstreamNameservers: |
    ["8.8.8.8", "8.8.4.4"]

stubDomains 条目中,可以为特定域名指定特定的 DNS 服务器;而 upstreamNameservers 条目则给出,待查询域名不是集群域子域情况下用到的 DNS 服务器。

这是通过在一个 pod 中运行我们熟知的 dnsmasq 实现的。

kubedns

剩下两种选项都比较小众:

ClusterFirstWithHostNet

适用于 pod 使用主机网络的情况,例如绕开 Docker 网络配置,直接使用与 pod 对应主机相同的网络。

None

None 意味着不改变 DNS,但强制要求你在 pod 规范文件 specification dnsConfig 条目中指定 DNS 配置。

CoreDNS 即将到来

除了上面提到的那些,一旦 CoreDNS 取代 Kubernetes 中的 kube-dns,情况还会发生变化。CoreDNS 相比 kube-dns 具有可配置性更高、效率更高等优势。

如果想了解更多,参考这里

如果你对 OpenShift 的网络感兴趣,我曾写过一篇文章可供你参考。但文章中 OpenShift 的版本是 3.6,可能有些过时。

第四部分总结

第四部分到此结束,其中我们介绍了:

  • Docker DNS 查询
  • Kubernetes DNS 查询
  • 选择性转发(子域不转发)
  • kube-dns

via: https://zwischenzugs.com/2018/08/06/anatomy-of-a-linux-dns-lookup-part-iv/

作者:zwischenzugs 译者:pinewall 校对:wxy

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

了解快捷键能够提升您的生产力。这里有一些实用的 Ubuntu 快捷键助您像专业人士一样使用 Ubuntu。

您可以用键盘和鼠标组合来使用操作系统。

注意:本文中提到的键盘快捷键适用于 Ubuntu 18.04 GNOME 版。 通常,它们中的大多数(或者全部)也适用于其他的 Ubuntu 版本,但我不能够保证。

Ubuntu keyboard shortcuts

实用的 Ubuntu 快捷键

让我们来看一看 Ubuntu GNOME 必备的快捷键吧!通用的快捷键如 Ctrl+C(复制)、Ctrl+V(粘贴)或者 Ctrl+S(保存)不再赘述。

注意:Linux 中的 Super 键即键盘上带有 Windows 图标的键,本文中我使用了大写字母,但这不代表你需要按下 shift 键,比如,T 代表键盘上的 ‘t’ 键,而不代表 Shift+t

1、 Super 键:打开活动搜索界面

使用 Super 键可以打开活动菜单。如果你只能在 Ubuntu 上使用一个快捷键,那只能是 Super 键。

想要打开一个应用程序?按下 Super 键然后搜索应用程序。如果搜索的应用程序未安装,它会推荐来自应用中心的应用程序。

想要看看有哪些正在运行的程序?按下 Super 键,屏幕上就会显示所有正在运行的 GUI 应用程序。

想要使用工作区吗?只需按下 Super 键,您就可以在屏幕右侧看到工作区选项。

2、 Ctrl+Alt+T:打开 Ubuntu 终端窗口

Ubuntu Terminal Shortcut

使用 Ctrl+alt+T 来打开终端窗口

想要打开一个新的终端,您只需使用快捷键 Ctrl+Alt+T。这是我在 Ubuntu 中最喜欢的键盘快捷键。 甚至在我的许多 FOSS 教程中,当需要打开终端窗口是,我都会提到这个快捷键。

3、 Super+L 或 Ctrl+Alt+L:锁屏

当您离开电脑时锁定屏幕,是最基本的安全习惯之一。您可以使用 Super+L 快捷键,而不是繁琐地点击屏幕右上角然后选择锁定屏幕选项。

有些系统也会使用 Ctrl+Alt+L 键锁定屏幕。

4、 Super+D or Ctrl+Alt+D:显示桌面

按下 Super+D 可以最小化所有正在运行的应用程序窗口并显示桌面。

再次按 Super+D 将重新打开所有正在运行的应用程序窗口,像之前一样。

您也可以使用 Ctrl+Alt+D 来实现此目的。

5、 Super+A:显示应用程序菜单

您可以通过单击屏幕左下角的 9 个点打开 Ubuntu 18.04 GNOME 中的应用程序菜单。 但是一个更快捷的方法是使用 Super+A 快捷键。

它将显示应用程序菜单,您可以在其中查看或搜索系统上已安装的应用程序。

您可以使用 Esc 键退出应用程序菜单界面。

6、 Super+Tab 或 Alt+Tab:在运行中的应用程序间切换

如果您运行的应用程序不止一个,则可以使用 Super+TabAlt+Tab 快捷键在应用程序之间切换。

按住 Super 键同时按下 Tab 键,即可显示应用程序切换器。 按住 Super 的同时,继续按下 Tab 键在应用程序之间进行选择。 当光标在所需的应用程序上时,松开 SuperTab 键。

默认情况下,应用程序切换器从左向右移动。 如果要从右向左移动,可使用 Super+Shift+Tab 快捷键。

在这里您也可以用 Alt 键代替 Super 键。

提示:如果有多个应用程序实例,您可以使用 Super+` 快捷键在这些实例之间切换。

7、 Super+箭头:移动窗口位置

https://player.vimeo.com/video/289091549

这个快捷键也适用于 Windows 系统。 使用应用程序时,按下 Super+左箭头,应用程序将贴合屏幕的左边缘,占用屏幕的左半边。

同样,按下 Super+右箭头会使应用程序贴合右边缘。

按下 Super+上箭头将最大化应用程序窗口,Super+下箭头将使应用程序恢复到其正常的大小。

8、 Super+M:切换到通知栏

GNOME 中有一个通知栏,您可以在其中查看系统和应用程序活动的通知,这里也有一个日历。

Notification Tray Ubuntu 18.04 GNOME

通知栏

使用 Super+M 快捷键,您可以打开此通知栏。 如果再次按这些键,将关闭打开的通知托盘。

使用 Super+V 也可实现相同的功能。

9、 Super+空格:切换输入法(用于多语言设置)

如果您使用多种语言,可能您的系统上安装了多个输入法。 例如,我需要在 Ubuntu 上同时使用印地语和英语,所以我安装了印地语(梵文)输入法以及默认的英语输入法。

如果您也使用多语言设置,则可以使用 Super+空格 快捷键快速更改输入法。

10、 Alt+F2:运行控制台

这适用于高级用户。 如果要运行快速命令,而不是打开终端并在其中运行命令,则可以使用 Alt+F2 运行控制台。

Alt+F2 to run commands in Ubuntu

控制台

当您使用只能在终端运行的应用程序时,这尤其有用。

11、 Ctrl+Q:关闭应用程序窗口

如果您有正在运行的应用程序,可以使用 Ctrl+Q 快捷键关闭应用程序窗口。您也可以使用 Ctrl+W 来实现此目的。

Alt+F4 是关闭应用程序窗口更“通用”的快捷方式。

它不适用于一些应用程序,如 Ubuntu 中的默认终端。

12、 Ctrl+Alt+箭头:切换工作区

Workspace switching

切换工作区

如果您是使用工作区的重度用户,可以使用 Ctrl+Alt+上箭头Ctrl+Alt+下箭头在工作区之间切换。

13、 Ctrl+Alt+Del:注销

不!在 Linux 中使用著名的快捷键 Ctrl+Alt+Del 并不会像在 Windows 中一样打开任务管理器(除非您使用自定义快捷键)。

Log Out Ubuntu

注销

在普通的 GNOME 桌面环境中,您可以使用 Ctrl+Alt+Del 键打开关机菜单,但 Ubuntu 并不总是遵循此规范,因此当您在 Ubuntu 中使用 Ctrl+Alt+Del 键时,它会打开注销菜单。

在 Ubuntu 中使用自定义键盘快捷键

您不是只能使用默认的键盘快捷键,您可以根据需要创建自己的自定义键盘快捷键。

转到“设置->设备->键盘”,您将在这里看到系统的所有键盘快捷键。向下滚动到底部,您将看到“自定义快捷方式”选项。

Add custom keyboard shortcut in Ubuntu

您需要提供易于识别的快捷键名称、使用快捷键时运行的命令,以及您自定义的按键组合。

Ubuntu 中你最喜欢的键盘快捷键是什么?

快捷键无穷无尽。如果需要,你可以看一看所有可能的 GNOME 快捷键,看其中有没有你需要用到的快捷键。

您可以学习使用您经常使用应用程序的快捷键,这是很有必要的。例如,我使用 Kazam 进行屏幕录制,键盘快捷键帮助我方便地暂停和开始录像。

您最喜欢、最离不开的 Ubuntu 快捷键是什么?


via: https://itsfoss.com/ubuntu-shortcuts/

作者:Abhishek Prakash 选题:lujun9972 译者:XiatianSummer 校对:wxy

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

日志聚合系统可以帮助我们进行故障排除和其它任务。以下是三个主要工具介绍。

指标聚合 metrics aggregation 日志聚合 log aggregation 有何不同?日志不能包括指标吗?日志聚合系统不能做与指标聚合系统相同的事情吗?

这些是我经常听到的问题。我还看到供应商推销他们的日志聚合系统作为所有可观察问题的解决方案。日志聚合是一个有价值的工具,但它通常对时间序列数据的支持不够好。

时间序列的指标聚合系统中几个有价值的功能是专门为时间序列数据定制的 固定间隔 regular interval 和存储系统。固定间隔允许用户不断地收集实时的数据结果。如果要求日志聚合系统以固定间隔收集指标数据,它也可以。但是,它的存储系统没有针对指标聚合系统中典型的查询类型进行优化。使用日志聚合工具中的存储系统处理这些查询将花费更多的资源和时间。

所以,我们知道日志聚合系统可能不适合时间序列数据,但是它有什么好处呢?日志聚合系统是收集事件数据的好地方。这些无规律的活动是非常重要的。最好的例子为 web 服务的访问日志,这些很重要,因为我们想知道什么正在访问我们的系统,什么时候访问的。另一个例子是应用程序错误记录 —— 因为它不是正常的操作记录,所以在故障排除过程中可能很有价值的。

日志记录的一些规则:

  • 包含时间戳
  • 格式化为 JSON
  • 记录无关紧要的事件
  • 记录所有应用程序的错误
  • 记录警告错误
  • 开关的日志记录
  • 以可读的形式记录信息
  • 在生产环境中记录信息
  • 记录任何无法阅读或反馈的内容

云的成本

当研究日志聚合工具时,云服务可能看起来是一个有吸引力的选择。然而,这可能会带来巨大的成本。当跨数百或数千台主机和应用程序聚合时,日志数据是大量的。在基于云的系统中,数据的接收、存储和检索是昂贵的。

以一个真实的系统来参考,大约 500 个节点和几百个应用程序的集合每天产生 200GB 的日志数据。这个系统可能还有改进的空间,但是在许多 SaaS 产品中,即使将它减少一半,每月也要花费将近 10000 美元。而这通常仅保留 30 天,如果你想查看一年一年的趋势数据,就不可能了。

并不是要不使用这些基于云的系统,尤其是对于较小的组织它们可能非常有价值的。这里的目的是指出可能会有很大的成本,当这些成本很高时,就可能令人非常的沮丧。本文的其余部分将集中讨论自托管的开源和商业解决方案。

工具选择

ELK

ELK,即 Elasticsearch、Logstash 和 Kibana 简称,是最流行的开源日志聚合工具。它被 Netflix、Facebook、微软、LinkedIn 和思科使用。这三个组件都是由 Elastic 开发和维护的。Elasticsearch 本质上是一个 NoSQL 数据库,以 Lucene 搜索引擎实现的。Logstash 是一个日志管道系统,可以接收数据,转换数据,并将其加载到像 Elasticsearch 这样的应用中。Kibana 是 Elasticsearch 之上的可视化层。

几年前,引入了 Beats 。Beats 是数据采集器。它们简化了将数据运送到 Logstash 的过程。用户不需要了解每种日志的正确语法,而是可以安装一个 Beats 来正确导出 NGINX 日志或 Envoy 代理日志,以便在 Elasticsearch 中有效地使用它们。

安装生产环境级 ELK 套件时,可能会包括其他几个部分,如 KafkaRedisNGINX。此外,用 Fluentd 替换 Logstash 也很常见,我们将在后面讨论。这个系统操作起来很复杂,这在早期导致了很多问题和抱怨。目前,这些问题基本上已经被修复,不过它仍然是一个复杂的系统,如果你使用少部分的功能,建议不要使用它了。

也就是说,有其它可用的服务,所以你不必苦恼于此。可以使用 Logz.io,但是如果你有很多数据,它的标价有点高。当然,你可能规模比较小,没有很多数据。如果你买不起 Logz.io,你可以看看 AWS Elasticsearch Service (ES) 。ES 是 Amazon Web Services (AWS) 提供的一项服务,它很容易就可以让 Elasticsearch 马上工作起来。它还拥有使用 Lambda 和 S3 将所有AWS 日志记录到 ES 的工具。这是一个更便宜的选择,但是需要一些管理操作,并有一些功能限制。

ELK 套件的母公司 Elastic 提供 一款更强大的产品,它使用 开源核心 open core 模式,为分析工具和报告提供了额外的选项。它也可以在谷歌云平台或 AWS 上托管。由于这种工具和托管平台的组合提供了比大多数 SaaS 选项更加便宜,这也许是最好的选择,并且很有用。该系统可以有效地取代或提供 安全信息和事件管理(SIEM)系统的功能。

ELK 套件通过 Kibana 提供了很好的可视化工具,但是它缺少警报功能。Elastic 在付费的 X-Pack 插件中提供了警报功能,但是在开源系统没有内置任何功能。Yelp 已经开发了一种解决这个问题的方法,ElastAlert,不过还有其他方式。这个额外的软件相当健壮,但是它增加了已经复杂的系统的复杂性。

Graylog

Graylog 最近越来越受欢迎,但它是在 2010 年由 Lennart Koopmann 创建并开发的。两年后,一家公司以同样的名字诞生了。尽管它的使用者越来越多,但仍然远远落后于 ELK 套件。这也意味着它具有较少的社区开发特征,但是它可以使用与 ELK 套件相同的 Beats 。由于 Graylog Collector Sidecar 使用 Go 编写,所以 Graylog 在 Go 社区赢得了赞誉。

Graylog 使用 Elasticsearch、MongoDB 和底层的 Graylog Server 。这使得它像 ELK 套件一样复杂,也许还要复杂一些。然而,Graylog 附带了内置于开源版本中的报警功能,以及其他一些值得注意的功能,如流、消息重写和地理定位。

流功能可以允许数据在被处理时被实时路由到特定的 Stream。使用此功能,用户可以在单个 Stream 中看到所有数据库错误,在另外的 Stream 中看到 web 服务器错误。当添加新项目或超过阈值时,甚至可以基于这些 Stream 提供警报。延迟可能是日志聚合系统中最大的问题之一,Stream 消除了 Graylog 中的这一问题。一旦日志进入,它就可以通过 Stream 路由到其他系统,而无需完全处理好。

消息重写功能使用开源规则引擎 Drools 。允许根据用户定义的规则文件评估所有传入的消息,从而可以删除消息(称为黑名单)、添加或删除字段或修改消息。

Graylog 最酷的功能或许是它的地理定位功能,它支持在地图上绘制 IP 地址。这是一个相当常见的功能,在 Kibana 也可以这样使用,但是它增加了很多价值 —— 特别是如果你想将它用作 SIEM 系统。地理定位功能在系统的开源版本中提供。

如果你需要的话,Graylog 公司会提供对开源版本的收费支持。它还为其企业版提供了一个开源核心模式,提供存档、审计日志记录和其他支持。其它提供支持或托管服务的不太多,如果你不需要 Graylog 公司的,你可以托管。

Fluentd

FluentdTreasure Data 开发的,CNCF 已经将它作为一个孵化项目。它是用 C 和 Ruby 编写的,并被 AWSGoogle Cloud 所推荐。Fluentd 已经成为许多系统中 logstach 的常用替代品。它可以作为一个本地聚合器,收集所有节点日志并将其发送到中央存储系统。它不是日志聚合系统。

它使用一个强大的插件系统,提供不同数据源和数据输出的快速和简单的集成功能。因为有超过 500 个插件可用,所以你的大多数用例都应该包括在内。如果没有,这听起来是一个为开源社区做出贡献的机会。

Fluentd 由于占用内存少(只有几十兆字节)和高吞吐量特性,是 Kubernetes 环境中的常见选择。在像 Kubernetes 这样的环境中,每个 pod 都有一个 Fluentd 附属件 ,内存消耗会随着每个新 pod 的创建而线性增加。在这种情况下,使用 Fluentd 将大大降低你的系统利用率。这对于 Java 开发的工具来说是一个常见的问题,这些工具旨在为每个节点运行一个工具,而内存开销并不是主要问题。


via: https://opensource.com/article/18/9/open-source-log-aggregation-tools

作者:Dan Barker 选题:lujun9972 译者:heguangzhi 校对:wxy

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