Back to Devops Exercises

README Zh CN

README-zh_CN.md

latest115.4 KB
Original Source
<p align="center"></p>

:information_source:  此存储库包含有关各种技术主题的问题和练习,有时与 DevOps 和 SRE 相关

:bar_chart:  当前有 2624 个问题

:warning:  您可以使用这些来准备面试,但大多数问题和练习并不代表实际的面试。请阅读常见问题了解更多详情

:page_facing_up:  不同的面试官专注于不同的事情。 有些人将重点放在你的简历上,而另一些人可能将重点放在方案问题或特定的技术问题上。 在这个仓库,我尽力覆盖各种类型的 DevOps 问题,供你练习和测试你的知识

:pencil:  你可以通过提交拉取请求来添加更多练习:) 在此处阅读贡献指南


<!-- ALL-TOPICS-LIST:START --> <!-- prettier-ignore-start --> <!-- markdownlint-disable --> <center> <table> <tr> <td align="center"><a href="topics/devops/README.md"> <b>DevOps</b></a></td> <td align="center"><a href="topics/git/README.md"> <b>Git</b></a></td> <td align="center"><a href="#network"> <b>Network</b></a></td> <td align="center"><a href="#hardware"> <b>Hardware</b></a></td> <td align="center"><a href="topics/kubernetes/README.md"> <b>Kubernetes</b></a></td> </tr> <tr> <td align="center"><a href="topics/software_development/README.md"> <b>Software Development</b></a></td> <td align="center"><a href="https://github.com/bregman-arie/python-exercises"> <b>Python</b></a></td> <td align="center"><a href="https://github.com/bregman-arie/go-exercises"> <b>Go</b></a></td> <td align="center"><a href="topics/perl/README.md"> <b>Perl</b></a></td> <td align="center"><a href="#regex"> <b>Regex</b></a></td> </tr> <tr> <td align="center"><a href="topics/cloud/README.md"> <b>Cloud</b></a></td> <td align="center"><a href="topics/aws/README.md"> <b>AWS</b></a></td> <td align="center"><a href="topics/azure/README.md"> <b>Azure</b></a></td> <td align="center"><a href="topics/gcp/README.md"> <b>Google Cloud Platform</b></a></td> <td align="center"><a href="#openstack/README.md"> <b>OpenStack</b></a></td> </tr> <tr> <td align="center"><a href="#operating-system"> <b>Operating System</b></a></td> <td align="center"><a href="topics/linux/README.md"> <b>Linux</b></a></td> <td align="center"><a href="#virtualization"> <b>Virtualization</b></a></td> <td align="center"><a href="topics/dns/README.md"> <b>DNS</b></a></td> <td align="center"><a href="topics/shell/README.md"> <b>Shell Scripting</b></a></td> </tr> <tr> <td align="center"><a href="topics/databases/README.md"> <b>Databases</b></a></td> <td align="center"><a href="#sql"> <b>SQL</b></a></td> <td align="center"><a href="#mongo"> <b>Mongo</b></a></td> <td align="center"><a href="#testing"> <b>Testing</b></a></td> <td align="center"><a href="#big-data"> <b>Big Data</b></a></td> </tr> <tr> <td align="center"><a href="topics/cicd/README.md"> <b>CI/CD</b></a></td> <td align="center"><a href="#certificates"> <b>Certificates</b></a></td> <td align="center"><a href="topics/containers/README.md"> <b>Containers</b></a></td> <td align="center"><a href="topics/openshift/README.md"> <b>OpenShift</b></a></td> <td align="center"><a href="#storage"> <b>Storage</b></a></td> </tr> <tr> <td align="center"><a href="topics/terraform/README.md"> <b>Terraform</b></a></td> <td align="center"><a href="#puppet"> <b>Puppet</b></a></td> <td align="center"><a href="#distributed"> <b>Distributed</b></a></td> <td align="center"><a href="#questions-you-ask"> <b>Questions you can ask</b></a></td> <td align="center"><a href="topics/ansible/README.md"> <b>Ansible</b></a></td> </tr> <tr> <td align="center"><a href="topics/observability/README.md"> <b>Observability</b></a></td> <td align="center"><a href="#prometheus"> <b>Prometheus</b></a></td> <td align="center"><a href="topics/circleci/README.md"> <b>Circle CI</b></a></td> <td align="center"><a href="topics/datadog/README.md"> <b></b></a></td> <td align="center"><a href="topics/grafana/README.md"> <b>Grafana</b></a></td> </tr> <tr> <td align="center"><a href="topics/argo/README.md"> <b>Argo</b></a></td> <td align="center"><a href="topics/soft_skills/README.md"> <b>Soft Skills</b></a></td> <td align="center"><a href="topics/security/README.md"> <b>Security</b></a></td> <td align="center"><a href="#system-design"> <b>System Design</b></a></td> </tr> <tr> <td align="center"><a href="topics/chaos_engineering/README.md"> <b>Chaos Engineering</b></a></td> <td align="center"><a href="#Misc"> <b>Misc</b></a></td> <td align="center"><a href="#elastic"> <b>Elastic</b></a></td> <td align="center"><a href="topics/kafka/README.md"> <b>Kafka</b></a></td> </tr> </table> </center> <!-- markdownlint-enable --> <!-- prettier-ignore-end --> <!-- ALL-TOPICS-LIST:END -->

网络

<details> <summary>一般来说,你需要什么才能进行交流?</summary> <b>
  • 一种共同的语言(供两端理解)
  • 与你想要沟通的人交流的方法
  • 一个连接(以便通信内容能够到达接收者)

</b></details>

<details> <summary>什么是 TCP/IP?</summary> <b>

一组协议,定义了两个或多个设备如何相互通信。

了解更多关于TCP/IP, 阅读 这里

</b></details>

<details> <summary>什么是以太网?</summary> <b>

以太网简单地指的是当今最常见的局域网(LAN)类型。与跨越较大地理区域的广域网(WAN)相对,LAN是一个连接在小范围内的计算机网络,比如你的办公室、大学校园或者家庭。

</b></details>

<details> <summary>什么是 MAC 地址?它有什么用途?</summary> <b>

MAC地址是用于识别网络上各个设备的唯一标识号码或代码。

通过以太网发送的数据包始终来自一个 MAC 地址并发送到一个 MAC 地址。如果网络适配器接收到一个数据包,它会将该数据包的目标 MAC 地址与适配器自身的 MAC 地址进行比较。

</b></details>

<details> <summary>这个 MAC 地址是在什么时候使用的?: ff:ff:ff:ff:ff:ff</summary> <b>

当设备向广播 MAC 地址(FF:FF:FF:FF:FF:FF)发送数据包时,它会传递给本地网络上的所有站点。以太网广播用于在数据链路层通过 ARP 解析 IP 地址到 MAC 地址。 </b></details>

<details> <summary>什么是 IP 地址?</summary> <b>

互联网协议地址(IP 地址)是分配给连接到使用互联网协议进行通信的计算机网络上的每个设备的数字标签。IP地址具有两个主要功能:主机或网络接口识别和位置寻址。 </b></details>

<details> <summary>解释子网掩码并举例说明</summary> <b>

子网掩码是一个32位的数字,用于屏蔽 IP 地址并将 IP 地址分为网络地址和主机地址。子网掩码通过将网络位设置为全部"1",将主机位设置为全部"0"来生成。在给定的网络中,总可用主机地址中始终保留两个用于特定目的,并且不能分配给任何主机。这些是第一个地址,被保留作为网络地址(也称为网络 ID),以及最后一个用于网络广播的地址。

例子

</b></details>

<details> <summary>私有 IP 地址是什么?在哪些场景/系统设计中应该使用它?</summary> <b> 私有IP地址被分配给同一网络中的主机,以便彼此通信。正如“私有”这个名字所暗示的那样,拥有私有IP地址的设备无法被来自任何外部网络的设备访问到。例如,如果我住在一个宿舍,并且我希望我的室友们加入我托管的游戏服务器,我会要求他们通过我的服务器的私有IP地址加入,因为该网络是局域网。 </b></details> <details> <summary>什么是公共 IP 地址?在哪些场景/系统设计中,应该使用它?</summary> <b> 公共IP地址是面向公众的 IP 地址。如果你正在托管一个游戏服务器,希望你的朋友加入,你会给他们提供你的公共IP地址,以便他们的计算机能够识别和定位到你的网络和服务器,从而进行连接。在与与您连接到同一网络的朋友玩耍时,并不需要使用面向公众的IP地址,在这种情况下,您将使用私有IP地址。为了使某人能够连接到内部位置的服务器上,您需要设置端口转发来告诉路由器允许来自公共域名和网络之间的流量通信。 </b></details> <details> <summary>解释 OSI 模型。有哪几层?每层负责什么?</summary> <b>
  • 应用程序:用户端( HTTP 在此)。
  • 演示:建立应用层实体之间的上下文(加密在这里)。
  • 会话:建立、管理和终止连接。
  • 传输:将可变长度的数据序列从源主机传输到目标主机( TCP 和 UDP 在此)。
  • 网络:将数据报从一个网络传输到另一个网络( IP 在此)。
  • 数据链路:提供两个直接连接的节点之间的链接(MAC在此)。
  • 物理特性:数据连接的电气和物理规格(位数在此)。

您可以在 penguintutor.com 阅读有关OSI模型的更多信息。 </b></details>

<details> <summary>对于以下每个确定其属于哪个 OSI 层:
  • 错误更正
  • 数据包路由
  • 电缆和电信号
  • MAC 地址
  • IP 地址
  • 终止连接
  • 3 次握手</summary> <b>
  • 错误纠正 - 数据链路
  • 数据包路由 - 网络
  • 电缆和电信号 - 物理
  • MAC 地址 - 数据链路
  • IP 地址 - 网络
  • 终止连接 - 会话
  • 3次握手 - 传输 </b></details>
<details> <summary>你熟悉哪些交付计划?</summary> <b>

单播:一对一的通信,其中有一个发送者和一个接收者。

广播:向网络中的所有人发送消息。地址 ff:ff:ff:ff:ff:ff 用于广播。 使用广播的两个常见协议是 ARP 和 DHCP。

多播:向一组订阅者发送消息。它可以是一对多或多对多的。 </b></details>

<details> <summary>什么是 CSMA/CD?它在现代以太网网络中使用吗?</summary> <b>

CSMA/CD 代表载波侦听多路访问冲突检测。 其主要目标是管理对共享介质/总线的访问,每次只有一个主机可以传输。

CSMA/CD 算法:

  1. 在发送帧之前,它会检查是否有另一个主机正在传输帧。
  2. 如果没有人在传输,它就开始传输帧。
  3. 如果两个主机同时传输,就会发生碰撞。
  4. 两个主机都停止发送帧,并向所有人发送一个“干扰信号”,通知大家发生了碰撞。
  5. 他们正在等待一个随机的时间再次发送它。
  6. 一旦每个主机等待了随机时间,它们会再次尝试发送帧,从而重新开始循环。 </b></details>
<details> <summary>描述以下网络设备及其之间的区别:
  • 路由器
  • 交换机
  • 集线器</summary> <b>

路由器、交换机和集线器都是用于连接局域网(LAN)中的设备的网络设备。然而,每个设备的操作方式不同,并且具有其特定的使用情况。以下是对每个设备及其之间区别的简要描述:

  1. 路由器:一种网络设备,用于连接多个网络段。它在OSI模型的网络层(第3层)上运行,并使用路由协议来指导网络之间的数据传输。路由器使用IP地址来识别设备并将数据包定向到正确的目标位置。
  2. 交换机:一种网络设备,用于连接局域网上的多个设备。它在OSI模型的数据链路层(第二层)工作,并使用MAC地址来识别设备并将数据包定向到正确的目标。交换机可以使同一网络上的设备更高效地相互通信,并且可以防止多个设备同时发送数据时可能发生的数据碰撞。
  3. 集线器:一种网络设备,通过单根电缆连接多个设备,并用于在不分割网络的情况下连接多个设备。然而,与交换机不同的是,它在OSI模型的物理层(第1层)上运行,并且只是将数据包广播到所有连接到它的设备,无论该设备是否为预期接收者。这意味着可能会发生数据碰撞,并且网络效率可能因此受到影响。由于交换机更高效并提供更好的网络性能,所以现代网络设置通常不使用集线器。 </b></details>
<details> <summary>什么是“冲突域”?</summary> <b> 冲突域是一个网络段,在这个网络段中,设备可能会因为试图同时传输数据而相互干扰。当两个设备同时传输数据时,可能会发生碰撞,导致数据丢失或损坏。在冲突域中,所有设备共享同样的带宽,并且任何设备都有可能干扰其他设备的数据传输。 </b></details> <details> <summary>什么是“广播域”?</summary> <b> 广播域是一个网络段,其中所有设备可以通过发送广播消息相互通信。广播消息是一条发送给网络中所有设备而不是特定设备的消息。在广播域中,所有设备都可以接收和处理广播消息,无论该消息是否针对它们。 </b></details> <details> <summary>连接到一个交换机的三台计算机。有多少个冲突域?有多少个广播域?</summary> <b>

三个冲突域和一个广播域 </b></details>

<details> <summary>路由器是如何工作的?</summary> <b>

路由器是一种物理或虚拟设备,用于在两个或多个分组交换的计算机网络之间传递信息。路由器检查给定数据包的目标互联网协议地址(IP地址),计算它到达目的地的最佳路径,然后相应地转发它。

</b></details>

<details> <summary>什么是NAT?</summary> <b>

网络地址转换(NAT)是一个过程,其中一个或多个本地IP地址被翻译成一个或多个全局IP地址,反之亦然,以便为本地主机提供互联网访问。

</b></details>

<details> <summary>什么是代理?它是如何工作的?我们为什么需要它?</summary> <b>

代理服务器充当您和互联网之间的网关。它是一个中介服务器,将最终用户与他们浏览的网站分离开来。

如果您使用代理服务器,互联网流量将通过代理服务器传输到您请求的地址。然后,该请求再次通过相同的代理服务器返回(有一些例外情况),然后代理服务器将从网站接收到的数据转发给您。

代理服务器根据您的使用情况、需求或公司政策提供不同级别的功能、安全性和隐私保护。 </b></details>

<details> <summary>TCP 是什么?它如何工作?三次握手是什么?</summary> <b>

TCP 三次握手,又称为三向握手,在 TCP/IP 网络中用于建立服务器和客户端之间的连接的过程。

三次握手主要用于创建 TCP 套接字连接。它在以下情况下起作用:

  • 一个客户节点通过IP网络向同一网络或外部网络上的服务器发送SYN数据包。该数据包的目标是询问/推断服务器是否对新连接开放。
  • 目标服务器必须具有可以接受和发起新连接的开放端口。当服务器从客户节点收到SYN数据包时,它会响应并返回确认收据 - ACK 数据包或 SYN/ACK 数据包。
  • 客户端节点接收到来自服务器的 SYN/ACK,并用一个 ACK数据包作出响应。 </b></details>
<details> <summary>什么是往返延迟或往返时间?</summary> <b>

摘自 维基百科:"发送信号所需的时间加上收到信号确认所需的时间"。

附加问题:局域网的 RTT 是多少? </b></details>

<details> <summary>SSL 握手是如何进行的?</summary> <b> SSL 握手是在客户端和服务器之间建立安全连接的过程。
  1. 客户端向服务器发送一个Client Hello消息,其中包括客户端的SSL/TLS协议版本、客户端支持的加密算法列表和一个随机值。
  2. 服务器响应一个Server Hello消息,其中包括服务器的SSL/TLS协议版本、一个随机值和会话ID。
  3. 服务器发送一个证书消息,其中包含了服务器的证书。
  4. 服务器发送 Server Hello Done 信息,表示服务器已完成服务器 Hello 阶段的信息发送。
  5. 客户发送包含客户公钥的客户密钥交换信息。
  6. 客户端发送 "更改密码规格 "报文,通知服务器客户端即将发送使用新密码规格加密的报文。
  7. 客户端发送一个加密的握手消息,其中包含使用服务器的公钥加密的预主密钥。
  8. 服务器发送 "更改密码规格 "信息,通知客户端服务器即将发送使用新密码规格加密的信息。
  9. 服务器发送加密握手信息,其中包含用客户机公钥加密的预主密钥。
  10. 客户端和服务器现在可以交换应用数据。 </b></details>
<details> <summary>TCP 和 UDP 有什么区别?</summary> <b>

TCP 在客户端和服务器之间建立连接,以保证数据包的顺序,而 UDP 不在客户端和服务器之间建立连接,也不处理数据包顺序。这使得 UDP 比 TCP 更轻便,是流媒体等服务的理想选择。

Penguintutor.com 提供了很好的解释。 </b></details>

<details> <summary>您熟悉哪些 TCP/IP 协议?</summary> <b> </b></details> <details> <summary>解释“默认网关”</summary> <b>

默认网关是一个接入点或 IP 路由器,联网计算机利用它将信息发送到另一个网络或互联网上的计算机。 </b></details>

<details> <summary>什么是 ARP?它是如何工作的?</summary> <b>

ARP 是地址解析协议(Address Resolution Protocol)的缩写。当您尝试 ping 本地网络上的一个 IP 地址(如 192.168.1.1)时,您的系统必须将 IP 地址 192.168.1.1 转换为 MAC 地址。这就需要使用 ARP 来解析该地址,ARP 也因此而得名。

系统会保存一个 ARP 查找表,其中存储了哪些 IP 地址与哪些 MAC 地址相关联的信息。当试图向某个 IP 地址发送数据包时,系统会首先查询该表,看是否已经知道该 MAC 地址。如果有缓存值,则不使用 ARP。 </b></details>

<details> <summary>什么是 TTL?它有助于防止什么?</summary> <b>
  • TTL(生存时间)是IP(Internet Protocol,互联网协议)数据包中的一个值,它决定了在被丢弃之前数据包可以经过多少跳或路由器。每次通过路由器转发数据包时,TTL值会减少一。当TTL值达到零时,数据包将被丢弃,并向发送方发送ICMP(Internet Control Message Protocol,互联网控制消息协议)消息以指示该数据包已过期。
  • TTL 用于防止数据包在网络中无限循环,否则会造成拥塞并降低网络性能。
  • 它还有助于防止数据包陷入路由环路,即数据包在同一组路由器之间不断往返而永远无法到达目的地。
  • 此外,TTL 还可用于帮助检测和防止 IP 欺骗攻击,在这种攻击中,攻击者试图通过使用虚假或伪造的 IP 地址来冒充网络上的其他设备。通过限制数据包的跳数,TTL 可以帮助防止数据包被路由到不合法的目的地。 </b></details>
<details> <summary>什么是 DHCP?它是如何工作的?</summary> <b>

它代表动态主机配置协议,为主机分配 IP 地址、子网掩码和网关。它是这样工作的:

  • 主机在进入网络时广播一条寻找 DHCP 服务器的信息(DHCP DISCOVER)。
  • DHCP 服务器会以数据包的形式发回要约信息,其中包含租用时间、子网掩码、IP 地址等信息(DHCP OFFER)。
  • 根据接受的提议,客户端会发送回复广播,让所有 DHCP 服务器都知道(DHCP 请求)。
  • 服务器发送确认(DHCP ACK)

更多信息 此处 </b></details>

<details> <summary>同一个网络中可以有两个 DHCP 服务器吗?它是如何工作的?</summary> <b>

可以在同一网络上安装两个 DHCP 服务器,但不建议这样做,而且必须仔细配置,以防止冲突和配置问题。

  • 在同一网络上配置两个 DHCP 服务器时,两个服务器都有可能为同一设备分配 IP 地址和其他网络配置设置,从而导致冲突和连接问题。此外,如果 DHCP 服务器配置了不同的网络设置或选项,网络上的设备可能会收到冲突或不一致的配置设置。
  • 不过,在某些情况下,可能有必要在同一网络中设置两个 DHCP 服务器,例如在大型网络中,一个 DHCP 服务器可能无法处理所有请求。在这种情况下,可以将 DHCP 服务器配置为不同的 IP 地址范围或不同的子网,这样它们就不会相互干扰。 </b></details>
<details> <summary>什么是 SSL 隧道?它是如何工作的?</summary> <b>
  • SSL(安全套接字层)隧道是一种技术,用于在互联网等不安全网络上的两个端点之间建立安全的加密连接。SSL 隧道是通过将流量封装在 SSL 连接中创建的,SSL 连接可提供保密性、完整性和身份验证。

下面介绍 SSL 隧道的工作原理:

  1. 客户端启动与服务器的 SSL 连接,其中包括建立 SSL 会话的握手过程。
  2. SSL 会话建立后,客户端和服务器会协商加密参数,如加密算法和密钥长度,然后交换数字证书,以验证彼此的身份。
  3. 客户端随后通过 SSL 隧道将流量发送到服务器,服务器解密流量并将其转发到目标位置。
  4. 服务器通过 SSL 隧道将流量发送回客户端,客户端对流量进行解密并将其转发给应用程序。 </b></details>
<details> <summary>什么是套接字?在哪里可以看到系统中的套接字列表?</summary> <b>
  • 套接字是一种软件端点,可使进程之间通过网络进行双向通信。套接字为网络通信提供了一个标准化接口,允许应用程序在网络上发送和接收数据。查看 Linux 系统上打开的套接字列表: netstat -an
  • 该命令显示所有打开套接字的列表,以及它们的协议、本地地址、外来地址和状态。 </b></details>
<details> <summary>什么是 IPv6?如果我们有 IPv4,为什么还要考虑使用它?</summary> <b>
  • IPv6(互联网协议版本 6)是互联网协议(IP)的最新版本,用于识别网络上的设备并与之通信。IPv6 地址是 128 位地址,用十六进制表示,如 2001:0db8:85a3:0000:0000:8a2e:0370:7334。

我们应该考虑使用 IPv6 而不是 IPv4 有几个原因:

  1. 地址空间:IPv4 的地址空间有限,在世界上许多地方已经耗尽。IPv6 提供了更大的地址空间,可提供数万亿个唯一的 IP 地址。
  2. 安全性:IPv6 包含对 IPsec 的内置支持,为网络流量提供端到端加密和身份验证。
  3. 性能:IPv6 包括一些有助于提高网络性能的功能,例如组播路由,它允许将一个数据包同时发送到多个目的地。
  4. 简化网络配置:IPv6 包含可简化网络配置的功能,例如无状态自动配置,它允许设备自动配置自己的 IPv6 地址,而无需 DHCP 服务器。
  5. 更好的移动性支持:IPv6 包含可改进移动性支持的功能,如移动 IPv6,它允许设备在不同网络之间移动时保持其 IPv6 地址。 </b></details>
<details> <summary>什么是 VLAN?</summary> <b>
  • VLAN(虚拟局域网)是一种逻辑网络,它将物理网络上的一组设备组合在一起,而不管它们的物理位置如何。创建 VLAN 的方法是配置网络交换机,为连接到交换机上特定端口或端口组的设备发送的帧分配特定的 VLAN ID。 </b></details>
<details> <summary>什么是 MTU?</summary> <b>

MTU 是最大传输单元(Maximum Transmission Unit)的缩写。它是指单个事务中可发送的最大 PDU(协议数据单元)的大小。 </b></details>

<details> <summary>如果发送的数据包大于 MTU,会发生什么情况?</summary> <b>

在 IPv4 协议中,路由器可以对 PDU 进行分片,然后通过事务发送所有已分片的 PDU。

使用 IPv6 协议时,它会向用户计算机发出错误信息。 </b></details>

<details> <summary>真还是假?Ping 使用 UDP 是因为它不在乎连接是否可靠</summary> <b>

错。Ping 实际上使用的是 ICMP(互联网控制报文协议),这是一种用于发送与网络通信有关的诊断信息和控制信息的网络协议。 </b></details>

<details> <summary>什么是 SDN?</summary> <b>
  • SDN 是软件定义网络(Software-Defined Networking)的缩写。它是一种网络管理方法,强调网络控制的集中化,使管理员能够通过软件抽象来管理网络行为。
  • 在传统网络中,路由器、交换机和防火墙等网络设备需要使用专用软件或命令行界面进行单独配置和管理。相比之下,SDN 将网络控制平面与数据平面分开,允许管理员通过集中式软件控制器管理网络行为。 </b></details>
<details> <summary>什么是 ICMP?它有什么用途?</summary> <b>
  • ICMP 是 Internet Control Message Protocol 的缩写。它是 IP 网络中用于诊断和控制的协议。它是互联网协议套件的一部分,在网络层运行。

ICMP消息被用于各种目的,包括:

  1. 错误报告:ICMP消息用于报告网络中发生的错误,例如无法将数据包传递到其目的地。
  2. Ping:ICMP 用于发送 ping 信息,该信息用于测试主机或网络是否可连接,并测量数据包的往返时间。
  3. 路径 MTU 发现:ICMP 用于发现路径的最大传输单元(MTU),即无需分片即可传输的最大数据包大小。
  4. 跟踪路由跟踪路由实用程序使用 ICMP 跟踪数据包通过网络的路径。
  5. 路由器发现ICMP 用于发现网络中的路由器。 </b></details>
<details> <summary>什么是 NAT?它是如何工作的?</summary> <b>

NAT 是网络地址转换的缩写。它是一种在传输信息前将多个本地专用地址映射到一个公共地址的方法。希望多个设备使用一个 IP 地址的组织和大多数家用路由器一样,都会使用 NAT。 例如,你电脑的私有 IP 可能是 192.168.1.100,但你的路由器会将流量映射到它的公共 IP(如 1.1.1.1)。互联网上的任何设备都会看到来自公共 IP(1.1.1.1)而不是私人 IP(192.168.1.100)的流量。 </b></details>

<details> <summary>下列协议中使用的端口号分别是?
  • SSH
  • SMTP
  • HTTP
  • DNS
  • HTTPS
  • FTP
  • SFTP
</summary> <b>
  • SSH - 22
  • SMTP - 25
  • HTTP - 80
  • DNS - 53
  • HTTPS - 443
  • FTP - 21
  • SFTP - 22 </b></details>
<details> <summary>哪些因素会影响网络性能?</summary> <b>

有几个因素会影响网络性能,包括:

  1. 带宽:网络连接的可用带宽会极大地影响其性能。带宽有限的网络可能会出现数据传输速率慢、延迟高和响应速度差等问题。
  2. 延迟:延迟是指数据从网络中的一个点传输到另一个点时发生的延迟。高延迟会导致网络性能缓慢,尤其是视频会议和在线游戏等实时应用。
  3. 网络拥塞:当太多设备同时使用网络时,就会出现网络拥塞,导致数据传输速率缓慢和网络性能低下。
  4. 数据包丢失:当数据包在传输过程中丢失时,就会出现丢包现象。这会导致网络速度变慢,整体网络性能降低。
  5. 网络拓扑:网络的物理布局,包括交换机、路由器和其他网络设备的位置,都会影响网络性能。
  6. 网络协议:不同的网络协议具有不同的性能特征,会影响网络性能。例如,TCP 是一种可靠的协议,可以保证数据的传输,但也会因错误检查和重传所需的开销而导致性能降低。
  7. 网络安全:防火墙和加密等安全措施会影响网络性能,尤其是在需要大量处理能力或引入额外延迟的情况下。
  8. 距离:网络设备之间的物理距离会影响网络性能,尤其是无线网络,信号强度和干扰会影响连接性和数据传输速率。 </b></details>
<details> <summary>什么是 APIPA?</summary> <b>

APIPA 是分配给设备的一组 IP 地址 当主 DHCP 服务器无法访问时分配给设备的 IP 地址

</b></details>

<details> <summary>APIPA 使用哪个 IP 范围?</summary> <b>

APIPA 使用的 IP 范围是169.254.0.1 - 169.254.255.254.

</b></details>

控制平面和数据平面

<details> <summary>"控制平面"是指什么?</summary> <b>

控制平面是网络的一部分,它决定如何将数据包路由和转发到不同的位置。 </b></details>

<details> <summary>数据平面 "指的是什么?</summary> <b>

数据平面是网络中实际转发数据/数据包的部分。 </b></details>

<details> <summary>管理平面 "指的是什么?</summary> <b>

它指的是监测和管理功能。 </b></details>

<details> <summary>创建路由表属于哪个平面(数据、控制......)?</summary> <b>

控制平面。 </b></details>

<details> <summary>解释生成树协议(STP)。</summary> <b> </b></details> <details> <summary>什么是链路聚合?为什么要使用?</summary> <b> </b></details> <details> <summary>什么是非对称路由?如何处理?</summary> <b> </b></details> <details> <summary>您熟悉哪些覆盖(隧道)协议?</summary> <b> </b></details> <details> <summary>什么是 GRE?它是如何运作的?</summary> <b> </b></details> <details> <summary>什么是 VXLAN?它是如何工作的?</summary> <b> </b></details> <details> <summary>什么是 SNAT?</summary> <b> </b></details> <details> <summary>解释 OSPF。</summary> <b>

OSPF(开放式最短路径优先)是一种路由协议,可在各种类型的路由器上实施。一般来说,大多数现代路由器都支持 OSPF,包括思科、瞻博网络和华为等供应商的路由器。该协议设计用于基于 IP 的网络,包括 IPv4 和 IPv6。此外,它采用分层网络设计,将路由器分组为区域,每个区域都有自己的拓扑图和路由表。这种设计有助于减少路由器之间需要交换的路由信息量,提高网络的可扩展性。

OSPF 4 路由器类型有

  • Internal Router
  • Area Border Routers
  • Autonomous Systems Boundary Routers
  • Backbone Routers

了解有关 OSPF 路由器类型的更多信息: https://www.educba.com/ospf-router-types </b></details>

<details> <summary>什么是延迟?</summary> <b>

延迟是指信息从信息源到达目的地所需的时间。 </b></details>

<details> <summary>什么是带宽?</summary> <b>

带宽是通信信道的容量,用于衡量后者在特定时间段内可处理的数据量。带宽越大,意味着处理的流量越多,数据传输量也就越大。 </b></details>

<details> <summary>什么是吞吐量?</summary> <b>

吞吐量是指在一定时间内通过任何传输通道传输的实际数据量。 </b></details>

<details> <summary>在进行搜索查询时,延迟和吞吐量哪个更重要?如何确保我们对全球基础设施进行管理? </summary> <b>

延迟。要获得良好的延迟,搜索查询应转发到最近的数据中心。 </b></details>

<details> <summary>上传视频时,延迟和吞吐量哪个更重要?如何确保这一点?</summary> <b>

吞吐量。为获得良好的吞吐量,上传数据流应被路由到未充分利用的链路。 </b></details>

<details> <summary>转发请求时还需要考虑哪些因素(除了延迟和吞吐量)?</summary> <b>
  • 保持缓存更新(这意味着请求可能不会被转发到最近的数据中心) </b></details>
<details> <summary>解释 Spine & Leaf</summary> <b> </b></details> <details> <summary>什么是网络拥塞?什么原因会导致网络拥塞?</summary> <b>

当网络上需要传输的数据过多,而网络容量不足以满足需求时,就会出现网络拥塞。 </br> 这会导致延迟和数据包丢失增加。原因可能是多方面的,如网络使用率高、文件传输量大、恶意软件、硬件问题或网络设计问题。</br> 为防止网络拥塞,必须监控网络使用情况,并实施策略来限制或管理需求。 </b></details>

<details> <summary>关于 UDP 数据包格式,您能告诉我什么?TCP 数据包格式如何?有何不同?</summary> <b> </b></details> <details> <summary>什么是指数后退算法?在哪里使用?</summary> <b> </b></details> <details> <summary>使用汉明码,以下数据字 100111010001101 的码字是什么?</summary> <b>

00110011110100011101 </b></details>

<details> <summary>举例说明应用层中的协议</summary> <b>
  • 超文本传输协议(HTTP)--用于互联网上的网页
  • 简单邮件传输协议(SMTP)--用于电子邮件传输
  • 电信网络(TELNET)--终端模拟,允许客户端访问 telnet 服务器
  • 文件传输协议(FTP)--便于在任何两台机器之间传输文件
  • 域名系统 (DNS) - 域名转换
  • 动态主机配置协议(DHCP)--为主机分配 IP 地址、子网掩码和网关
  • 简单网络管理协议(SNMP)--收集网络设备数据 </b></details>
<details> <summary>举例说明网络层中的协议</summary> <b>
  • 互联网协议 (IP) - 协助将数据包从一台机器路由到另一台机器
  • 互联网控制消息协议(ICMP)--让人知道发生了什么,如错误信息和调试信息 </b></details>
<details> <summary>什么是 HSTS?</summary> <b> HTTP 严格传输安全(HTTP Strict Transport Security)是一种网络服务器指令,它通过在开始时发送并返回给浏览器的响应标头,告知用户代理和网络浏览器如何处理其连接。这将强制通过 HTTPS 加密连接,忽略任何脚本通过 HTTP 加载该域中任何资源的调用。

阅读更多 [此处](https://www.globalsign.com/en/blog/what-is-hsts-and-how-do-i-use-it#:~:text=HTTP%20Strict%20Transport%20Security%20(HSTS,and%20back%20to%20the%20browser.) </b></details>

网络 - 其他

<details> <summary>什么是互联网?它和万维网一样吗?</summary> <b>

互联网是一个由网络组成的网络,在全球范围内传输大量数据。

万维网是一个运行在数百万服务器上的应用程序,它位于互联网之上,可通过所谓的网络浏览器访问 </b></details>

<details> <summary>什么是ISP?</summary> <b>

ISP(互联网服务提供商)是当地的互联网公司。 </b></details>

DevOps

<a name="devops-beginner"></a>

初级

<details> <summary>什么是 DevOps? DevOps 帮助我们完成什么?</summary> <b> </b></details> <details> <summary>DevOps 的反模式是什么?</summary> <b> </b></details> <details> <summary>什么是持续集成?</summary> <b>

开发人员经常将代码集成到共享仓库中的一种开发实践。 它的范围可以从每天或每周进行几次更改,到大规模在一个小时内进行几次更改。

验证每段代码(更改/补丁),以使更改可以安全地合并。 如今,使用自动构建来确保代码可以集成的测试更改是一种常见的做法。 它可以是一个运行在不同级别(单元,功能等)的多个测试的构建,也可以是所有或某些必须通过以将更改合并到存储库中的多个单独的构建。 </b></details>

<details> <summary>什么是持续部署?</summary> <b> </b></details> <details> <summary>什么是持续交付?</summary> <b> </b></details> <details> <summary>你认为CI / CD的最佳做法是什么?</summary> <b> </b></details> <details> <summary>你将用于以下哪些系统和/或工具?:
  • CI/CD
  • 基础架构
  • 配置管理
  • 监控 & 报警
  • 日志
  • 代码审查
  • 代码覆盖率
  • 测试集</summary> <b>
  • CI/CD - Jenkins, Circle CI, Travis
  • 基础架构 - Terraform, CloudFormation
  • 配置管理 - Ansible, Puppet, Chef
  • 监控 & 报警 - Prometheus, Nagios
  • 日志 - Logstash, Graylog, Fluentd
  • 代码审查 - Gerrit, Review Board
  • 代码覆盖率 - Cobertura, Clover, JaCoCo
  • 测试集 - Robot, Serenity, Gauge </b></details>
<details> <summary>你在选择工具/技术时是怎么考虑的?</summary> <b>

你可以使用以下一项或全部:    * 成熟与尖端    * 社区规模    * 体系结构方面-代理与无代理,主控与无主控等 </b></details>

<details> <summary>解释可变基础架构与不变基础架构</summary> <b>

在可变的基础架构原则中,更改将应用到现有基础架构之上并随着时间的推移而变化 基础架构建立了变化的历史。 Ansible,Puppet和Chef这些工具 遵循可变的基础架构原则。

在不变的基础架构原则中,每项更改实际上都是新的基础架构。 所以改变 到服务器将导致新服务器而不是更新服务器。 Terraform是 遵循不变的基础架构原则的一个例子。 </b></details>

<details> <summary>你熟悉什么方式来交付软件?</summary> <b> * 存档 - 将你所有的应用文件收集到一个存档中(例如tar),并将其交付给用户。   * 打包 - 取决于操作系统,你可以使用OS软件包格式(例如,在RHEL / Fefodra中为RPM)来交付软件,并使用标准打包程序命令来安装,卸载和更新它   * 映像 - VM或容器映像,其中包已包含在其中,以便成功运行。 </b></details> <details> <summary>什么是缓存? 缓存是怎么工作的? 为什么缓存很重要?</summary> <b> </b></details> <details> <summary>解释一下无状态和有状态</summary> <b> </b></details> <details> <summary>什么是HTTP及其工作方式?</summary> <b> </b></details> <details> <summary>描述一下设置某些类型的Web服务器的工作流程 (Apache, IIS, Tomact, ...)</summary> <b> </b></details> <details> <summary>解释一下监控. 它是什么? 为什么监控是重要的?</summary> <b> </b></details> <details> <summary>你熟悉那些监控方法?</summary> <b> </b></details>

<a name="devops-advanced"></a>

高级

<details> <summary>告诉我你是如何执行CI / CD资源的计划容量 (如服务器, 存储, 等等.)</summary> <b> </b></details> <details> <summary>你将如何为依赖于其他多个应用程序的应用程序构建/实现CD?</summary> <b> </b></details> <details> <summary>你如何衡量CI / CD的质量? 有那些你正在使用的指标吗?</summary> <b> </b></details> <details> <summary>什么是配置漂移? 它引起什么问题?</summary> <b>

当配置和软件完全相同的服务器环境中的某个服务器上发生配置漂移 或服务器正在应用其他服务器无法获得的更新或配置,并且随着时间的推移,这些服务器将变为 略有不同。

这种情形可能会导致难以识别和重现的错误。 </b></details>

<details> <summary>怎样处理配置漂移?</summary> <b> </b></details> <details> <summary>你是否有跨项目变更测试的经验? (又名交叉依赖)</summary> <b>

注意:交叉依赖是指你对单独的项目进行了两个或多个更改,并且你希望在相互构建中对其进行测试,而不是分别测试每个更改。 </b></details>

<details> <summary>在哪种情况下,你希望使用SQL?</summary> <b> * 同类数据,预计不会发生变化   * ACID合规性很重要 </b></details>

Jenkins

<a name="jenkins-beginner"></a>

初级

<details> <summary>什么是 Jenkins? 你用它来做什么?</summary> <b> </b></details> <details> <summary>相比其他的竞争者 jenkins 有什么优势? 你能把jenkins 和下面的系统做一个比较吗?:
  • Travis
  • Bamboo
  • Teamcity
  • CircleCI</summary> <b>

</b></details>

<details> <summary>解释以下:
  • Job
  • Build
  • Plugin
  • Slave
  • Executor</summary> <b>

</b></details>

<details> <summary> 你在 Jenkins 用过什么插件?</summary> <b> </b></details> <details> <summary>解释一下 CI/CD 你在 Jenkins 是怎么实现他们的 </summary> <b> </b></details> <details> <summary>有什么类型的工作? 你使用了哪些类型,为什么?</summary> <b> </b></details> <details> <summary>你如何向用户报告构建结果? 你熟悉什么那些方式?</summary> <b> </b></details> <details> <summary>每次有更改提交,你都需要运行单元测试。 详细描述管道的环境以及每个阶段将执行的操作</summary> <b> </b></details> <details> <summary>怎样保护 Jenkins?</summary> <b> </b></details> <details> <summary>你能描述一些 Jenkins 最佳实践吗?</summary> <b> </b></details>

<a name="jenkins-advanced"></a>

高级

<details> <summary>如何为一个特定的构建获取多个从属?</summary> <b> </b></details> <details> <summary>你的组织中有四个团队。 如何优先考虑每个团队的建设? 例如,x团队的工作将始终在y团队之前运行</summary> <b> </b></details> <details> <summary>你有部署 Jenkins 插件的经验吗? 你能描述一下吗?</summary> <b> </b></details> <details> <summary>如果你要管理许多工作,你可能使用Jenkins UI。 你如何每周/每月管理数百个作业的创建和删除?</summary> <b> </b></details> <details> <summary>Jenkins 有那些限制?</summary> <b>
  • 测试交叉依赖关系(来自多个项目的变更)   * 从任何阶段开始构建(尽管cloudbees实现了称为检查点的东西) </b></details>
<details> <summary>你是如何实施从某个阶段而不是从最开始构建的选项?</summary> <b> </b></details> <details> <summary>你曾经写过 Jenkins 脚本吗? 如果有,有哪些? 分别是怎么样工作的?</summary> <b> </b></details>

Cloud

<a name="cloud-beginner"></a>

初级

<details> <summary>云计算的优势是什么? 至少列出3个优势</summary> <b> </b></details> <details> <summary>他们分别是那种类型的云计算?</summary> <b>

IAAS PAAS SAAS </b></details>

<details> <summary>解释一下以下云计算部署:
  • Public
  • Hybrid
  • Private</summary> <b>

</b></details>

AWS

<a name="aws-beginner"></a>

初级

全局基础设施
<details> <summary>解释以下
  • 可用区
  • 区域
  • 边缘位置</summary> <b>
</b> <b> AWS区域是遍布全球不同地理位置的数据中心,每个区域彼此完全独立。 在每个区域内,有多个隔离的位置,称为可用区。 多个可用区可确保其中之一发生故障时具有高可用性。

边缘位置基本上是内容传递网络,它缓存数据并确保较低的延迟和更快地传递给任何位置的用户。 他们位于世界主要城市。 </b>

</details>
S3
<details> <summary>解释一下什么是S3,以及它用来干嘛</summary> <b> S3代表3 S(Simple Storage Service)。 S3是一种对象存储服务,它是快速,可伸缩和持久的。 S3使客户能够上传,下载或存储最大5 TB的文件或对象。 同时每个文件的最大大小为5 GB(如果大小超过5 GB,则分段上传)。 </b> </details> <details> <summary>什么是存储桶?</summary> <b> S3存储桶是一种资源,类似于文件系统中的文件夹,并且允许存储由数据及其元数据组成的对象。 </b></details> <details> <summary>对还是错? 存储桶必须全局唯一</summary> <b> True </b></details> <details> <summary>S3 中 包含哪些对象 ? * 另一种问法: 在对象上下文中解释键,值,版本ID和元数据</summary> <b> </b></details> <details> <summary>解释一下数据一致性</summary> <b> </b></details> <details> <summary>你可以在s3上托管动态网站吗? 静态网站呢?</summary> <b> </b></details> <details> <summary>你在S3上下文中采取了哪些安全措施?</summary> <b> </b></details>
CloudFront
<details> <summary>解释一下什么是CloudFront及其用途</summary> <b> </b></details> <details> <summary>解释以下 * 域 * 边缘位置 * 分布</summary> <b> </b></details> <details> <summary>CDN用户可以使用哪些交付方式?</summary> <b> </b></details> <details> <summary>对还是错? 在TTL的生命周期内缓存对象</summary> <b> </b></details>
EC2
<details> <summary>你创建了哪种类型的实例?</summary> <b> </b></details> <details> <summary>如何为给定的EC2实例增加RAM?</summary> <b>

停止实例,使其实例类型与所需的RAM匹配,然后启动实例。 </b></details>

<details> <summary>什么是 AMI?</summary> <b> </b></details> <details> <summary>EC2实例有多少个存储选项?</summary> <b> </b></details> <details> <summary>EC2实例停止或终止时会发生什么?</summary> <b> </b></details> <details> <summary>什么是安全组?</summary> <b> </b></details> <details> <summary>如何将实例迁移到另一个可用性区域?</summary> <b> </b></details> <details> <summary>什么是安全组?</summary> <b> </b></details> <details> <summary>什么是竞价型实例?</summary> <b> </b></details>

网络

<a name="network-beginner"></a>

初级

<details> <summary>什么是以太网?</summary> <b> </b></details> <details> <summary>什么是一个 MAC 地址? 它用来干嘛?</summary> <b> </b></details> <details> <summary>什么时候这个 MAC 地址会被用来使用?: ff:ff:ff:ff:ff:ff</summary> <b> </b></details> <details> <summary>什么是一个 IP 地址? 什么是子网?</summary> <b> </b></details> <details> <summary>解释一下 OSI 模型. 有那些层? 每层负责什么?</summary> <b>

应用层:用户端(HTTP在这一层) 表示层:在应用程序层实体之间建立上下文(加密在这一层) 会话层:建立,管理和终止连接 传输层:将可变长度的数据序列从源传输到目标主机(TCP和UDP在这一层) 网络层:将数据报从一个网络传输到另一个网络(IP 层在这里) 数据链接层:提供两个直接连接的节点之间的链接(MAC在这一层) 物理层:数据连接的电气和物理规格(比特在这一一层) </b></details>

<details> <summary>你熟悉哪些传送方案?</summary> <b> 单位广播:一对一通信,其中有一个发送方和一个接收方。

广播:向网络中的所有人发送消息。 地址ff:ff:ff:ff:ff:ff:ff用于广播。             使用广播的两个常见协议是ARP和DHCP。

组播:向一组订户发送消息。 它可以是一对多或多对多。 </b></details>

<details> <summary>什么是 CSMA/CD? 在现代以太网中有使用吗?</summary> <b>

CSMA / CD代表载波侦听多路访问/冲突检测。 它的主要重点是管理对共享媒体/总线的访问,在该共享媒体/总线上,在给定的时间点只能传输一个主机。

CSMA / CD算法:

  1. 在发送帧之前,它会检查其他主机是否已经在发送帧。
  2. 如果没有人发送,它将开始发送帧。
  3. 如果两个主机同时传输,则发生冲突。
  4. 双方主机均停止发送帧,并向每个人发送“干扰信号”,通知每个人发生冲突
  5. 他们正在等待随机时间,然后再次发送
  6. 一旦每个主机等待一段随机时间,他们就会尝试再次发送帧 </b></details>
<details> <summary>描述以下网络设备及其之间的区别:
  • 路由器
  • 交换机
  • 集线器</summary> <b>

</b></details>

<details> <summary>什么是 NAT?</summary> <b> </b></details> <details> <summary>TCP 和 UDP 两者之间有那些区别?</summary> <b> </b></details> <details> <summary>TCP 是怎样工作的? 什么是 3 次握手?</summary> <b> </b></details> <details> <summary>什么是 ARP? 它是怎么工作的?</summary> <b> </b></details> <details> <summary>什么是 TTL?</summary> <b> </b></details> <details> <summary>什么是DHCP? 它是怎么工作的?</summary> <b> </b></details> <details> <summary>什么是SSL 隧道? 它是怎么工作的?</summary> <b> </b></details> <details> <summary>什么是套接字? 在哪里可以看到系统中的套接字列表?</summary> <b> </b></details> <details> <summary>什么是IPv6? 如果我们拥有IPv4,为什么要考虑使用它?</summary> <b> </b></details> <details> <summary>什么是VLAN?</summary> <b> </b></details> <details> <summary>什么是MTU?</summary> <b> </b></details> <details> <summary>什么是SDN?</summary> <b> </b></details> <details> <summary>什么是ICMP? 它有什么用途?</summary> <b> </b></details> <details> <summary>什么是NAT? 它是怎么工作的?</summary> <b> </b></details>

<a name="network-advanced"></a>

高级

<details> <summary>解释一下生成树协议 (STP)</summary> <b> </b></details> <details> <summary>什么是链路聚合? 为什么使用它?</summary> <b> </b></details> <details> <summary>什么是非对称路由? 怎样处理它?</summary> <b> </b></details> <details> <summary>你熟悉哪些叠加(隧道)协议?</summary> <b> </b></details> <details> <summary>什么是GRE? 它是怎么工作的?</summary> <b> </b></details> <details> <summary>什么是VXLAN? 它是怎么工作的?</summary> <b> </b></details> <details> <summary>什么是SNAT?</summary> <b> </b></details> <details> <summary>解释一下 OSPF</summary> <b> </b></details> <details> <summary>解释一下 Spine & Leaf</summary> <b> </b></details> <details> <summary>使用海明码, 100111010001101 会编码成什么码?</summary> <b>

00110011110100011101 </b></details>

Linux

<a name="linux-beginner"></a>

初级

<details> <summary>你有那些 Linux 经验? 当你可以在多个操作系统上设置应用程序时,你希望在哪个操作系统上进行设置以及为什么?</summary> <b> </b></details> <details> <summary>解释以下每个命令的作用,并举例说明如何使用它
  • ls
  • rm
  • rmdir (你能使用 <code>rm</code>完成同样的结果吗?)
  • grep
  • wc
  • curl
  • touch
  • man
  • nslookup or dig
  • df</summary> <b>

</b></details>

<details> <summary>运行命令 <code>df</code> 你会得到 "找不到命令". 可能出现什么问题以及如何修复它?</summary> <b> </b></details> <details> <summary>如何确保服务将在你选择的操作系统上启动?</summary> <b> </b></details> <details> <summary>你如何定期安排任务?</summary> <b>

你能使用命令 <code>cron</code><code>at</code>. 对于cron,使用以下格式安排任务:

<minute> <hour> <day of month> <month> <day of week> <command to execute>

任务存储在cron文件中。 </b></details>

<details> <summary>你过去是否安排了任务? 什么样的任务?</summary> <b>

通常,你将安排批处理作业。

</b></details>

权限
<details> <summary>怎样改变一个文件的权限?</summary> <b>

使用 chmod 命令.

</b></details>

<details> <summary>下面的权限意味着什么?:
  • 777
  • 644
  • 750</summary> <b>

777 - 所有人有读和写和可执行权限(意味着你很懒) 644 - 拥有者有读和写的权限、其他人只有读权限 750 - 拥有者有所有权限, 组成员可以读和执行权限、其他人没有权限 </b></details>

<details> <summary>解释一下什么是setgid, setuid 和 sticky bit</summary> <b> </b></details> <details> <summary>如何在不向其提供登录系统功能的情况下将新用户添加到系统?</summary> <b>
  • adduser user_name --shell=/bin/false --no-create-home

</b></details>

<details> <summary>在使用systemd的系统上,如何显示日志?</summary>
  • journalctl

</b></details>

调试
<details> <summary>你正在使用什么进行故障排除和调试 <b>网络</b> 问题?</summary> <b>

<code>dstat -t</code> 非常适合辨别网络和磁盘问题。 <code>netstat -tnlaup</code> 可用于查看哪些进程在哪些端口上运行。 <code>lsof -i -P</code> 可以用于与netstat相同的目的。 <code>ngrep -d any metafilter</code> 用于将正则表达式与数据包的载荷相匹配。 <code>tcpdump</code> 用于捕获数据包 <code>wireshark</code> 与tcpdump相同的概念,但带有GUI(可选)。 </b></details>

<details> <summary>你正在使用什么进行故障排除和调试 <b>磁盘 & 文件系统</b> 问题?</summary> <b>

<code>dstat -t</code> 非常适合辨别网络和磁盘问题。 <code>opensnoop</code> 可以用来查看正在系统上打开哪些文件(实时)。 </b></details>

<details> <summary>你正在使用什么进行故障排除和调试 <b>进程</b> 问题?</summary> <b>

<code>strace</code> 非常适合了解你的程序的功能。 它打印你的程序执行的每个系统调用。 </b></details>

<details> <summary>你正在使用什么来调试CPU相关问题?</summary> <b>

<code>top</code> 显示每个进程消耗多少CPU占比 <code>perf</code> 是采样分析器的理想选择,通常来说,找出哪些CPU周期被“浪费”了 <code>flamegraphs</code> 非常适合CPU消耗可视化(http://www.brendangregg.com/flamegraphs.html) </b></details>

<details> <summary>你收到一个电话,说“我的系统运行缓慢” - 你将如何处理?</summary> <b>
  1. 使用<code>top</code>检查是否有任何资源消耗你的CPU或RAM。
  2. 运行<code>dstat -t</code>来检查它是否与磁盘或网络有关。
  3. 使用<code>iostat</code>检查 I/O 统计信息 </b></details>
<details> <summary>什么是Linux内核模块以及如何加载新模块?</summary> <b> </b></details> <details> <summary>什么是KVM?</summary> <b> </b></details> <details> <summary>SSH和SSL之间的区别是什么?</summary> <b> </b></details> <details> <summary>SSH端口转发是什么?</summary> <b> </b></details> <details> <summary>解释重定向</summary> <b> </b></details> <details> <summary>什么是通配符? 你能举一个使用它们的例子吗?</summary> <b> </b></details> <details> <summary>我们在以下每个命令中使用grep做什么?
  • <code>grep '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' some_file</code>
  • <code>grep -E "error|failure" some_file</code>
  • <code>grep '[0-9]$' some_file</code>
</summary> <b>
  1. 一个 IP 地址
  2. 单词 "error" 或 "failure"
  3. 以数字结尾的行 </b></details>
<details> <summary>告诉我你了解所有有关Linux启动过程的知识</summary> <b> </b></details> <details> <summary>什么是退出码? 你熟悉那些退出码?</summary> <b>

退出码(或返回码)表示子进程返回其父进程的码。

0是退出码,表示成功,而大于1的码表示错误。 每个数字都有不同的含义,具体取决于应用程序的开发方式。

我认为这是一篇可以了解更多的好博客:https://shapeshed.com/unix-exit-codes </b></details>

<details> <summary>软链接和硬链接之间的区别是什么?</summary> <b>

硬链接是使用相同inode的相同文件。 软链接是使用不同inode的另一个文件的快捷方式。

可以在不同的文件系统之间创建软链接,而硬链接只能在同一文件系统内创建。 </b></details>

<details> <summary>什么是交换分区? 它用来做什么的?</summary> <b> </b></details> <details> <summary>你试图创建一个新文件,但显示“文件系统已满”。 你使用df检查是否有可用空间,你看到还有20%的空间。 可能是什么问题?</summary> <b> </b></details> <details> <summary>你对LVM有什么了解?</summary> <b> </b></details> <details> <summary>解释以下关于LVM:
  • PV
  • VG
  • LV</summary> <b>

</b></details>

<details> <summary>RAID用于什么用途? 你能否解释RAID 0、1、5和10之间的区别?</summary> <b> </b></details> <details> <summary>什么是懒卸载?</summary> <b> </b></details> <details> <summary>修复以下命令:
  • sed "s/1/2/g' /tmp/myFile
  • find . -iname *.yaml -exec sed -i "s/1/2/g" {} ;</summary> <b>

</b></details>

<details> <summary>解释以下每个路径中存储的内容以及是否有一些独特之处</summary> <b>
  • /tmp
  • /var/log
  • /bin
  • /proc
  • /usr/local </b></details>
<details> <summary>你能在 /etc/services 找到什么 </summary> <b> </b></details> <details> <summary>什么是 chroot?</summary> <b> </b></details>
进程
<details> <summary>如何在后台运行进程以及为什么要优先运行?</summary> <b>

你可以通过在命令末尾指定&来实现。至于为什么,因为一些命令/过程会占用大量的时间来完成执行或永远运行 </b></details>

<details> <summary>你如何查找特定进程占用的内存量?</summary> <b> </b></details> <details> <summary>运行“ kill”时使用什么信号 <process id>'?</summary> <b>

默认信号为SIGTERM(15)。 该信号可以优雅地终止进程,这意味着它可以保存当前状态配置。 </b></details>

<details> <summary>你熟悉哪些信号?</summary> <b>

SIGTERM - 终止进程的默认信号 SIGHUP - 常用用法是重新加载配置 SIGKILL - 不能捕获或忽略的信号

运行 kill -l 查看所有可用的信号 </b></details>

<details> <summary>什么是 trap?</summary> <b> </b></details> <details> <summary>当你按下Ctrl + C会发生什么?</summary> <b> </b></details> <details> <summary>什么是守护程序?</summary> <b> </b></details> <details> <summary>Linux中进程的可能状态是什么?</summary> <b>

Running(运行态) Waiting (等待态)) Stopped(暂停态) Terminated(终止态) Zombie(假死态) </b></details>

<details> <summary>什么是僵尸进程? 你是如何避免的?</summary> </b></details> <details> <summary>什么是初始进程?</summary> <b> </b></details> <details> <summary>如何更改进程的优先级? 你为什么想这么做?</summary> <b> </b></details> <details> <summary>你能解释一下网络进程/连接如何建立以及如何终止?</summary> </b> </b></details> <details> <summary>什么是系统调用? 你熟悉哪些系统调用?</summary> <b> </b></details> <details> <summary><code>strace</code> 做什么的?</summary> <b> </b></details> <details> <summary>查找所有以“ .yml”结尾的文件,并替换每个文件中的2分之一的数字</summary> <b>

ind /some_dir -iname *.yml -print0 | xargs -0 -r sed -i "s/1/2/g" </b></details>

<details> <summary>如何查看系统有多少可用内存? 如何检查每个进程的内存消耗?</summary> <b>

你可以使用命令<code>top</code><code>free</code> </b></details>

<details> <summary>你如何将一个50行的文件拆分为两个25行的文件?</summary> <b>

你可以使用 <code>split</code> 命令就像这样<code>split -l 25 some_file</code> </b></details>

<details> <summary>什么是文件描述符? 你熟悉那些文件描述符?</summary> <b> Kerberos 文件描述符,也称为文件处理程序,是一个唯一的编号,用于标识操作系统中的打开文件。

在 Linux (和 Unix) 前三个描述符是:

  • 0 - 输入的默认数据流
  • 1 - 输出的默认数据流
  • 2 - 与错误相关的输出的默认数据流

这有一篇好的文章关于这个主题的: https://www.computerhope.com/jargon/f/file-descriptor.htm </b></details>

<details> <summary>什么是 inode?</summary> <b>

Linux中的每个文件(和目录)都有一个索引节点,即与文件相关的存储元数据信息的数据结构 ,例如文件的大小,所有者,权限等。 </b></details>

<details> <summary>如何列出活动的网络连接?</summary> <b> </b></details> <details> <summary>什么是NTP? 它是用来干什么的?</summary> <b> </b></details> <details> <summary>什么是SELiunx?</summary> <b> </b></details> <details> <summary>什么是Kerberos?</summary> <b> </b></details> <details> <summary>什么是nftables?</summary> <b> </b></details> <details> <summary>firewalld守护程序负责什么?</summary> <b> </b></details>
Network
<details> <summary>什么是网络名称空间? 它用来干什么的?</summary> <b> </b></details> <details> <summary>你如何将Linux服务器变成路由器?</summary> <b> </b></details> <details> <summary>什么是路由表? 你是怎样查看它的?</summary> <b> </b></details> <details> <summary>什么是数据包嗅探器? 你过去曾经使用过吗? 如果是,你使用了哪些数据包嗅探器以及用于什么目的?</summary> <b> </b></details>
DNS
<details> <summary>文件 <code>/etc/resolv.conf</code> 用来做什么的? 它包含那些内容?</summary> <b> </b></details> <details> <summary>什么是 "A record"?</summary> <b> </b></details> <details> <summary>什么是 PTR 记录?</summary> <b>

A记录将域名指向IP地址,而PTR记录则相反,并将IP地址解析为域名。 </b></details>

<details> <summary>什么是 MX 记录?</summary> <b> </b></details> <details> <summary>DNS是使用TCP还是UDP?</summary> <b> </b></details>
Packaging
<details> <summary>你有打包经验吗? 你能解释一下它是怎么工作的</summary> <b> </b></details> <details> <summary>RPM: 解释特定格式(应包括什么内容)</summary> <b> </b></details> <details> <summary>你如何列出包内容?</summary> <b> </b></details>

<a name="linux-advanced"></a>

高级

<details> <summary>当你执行 <code>ls</code>发生了什么? 提供一个详细的答案</summary> <b> </b></details> <details> <summary>你能描述流程的创建方式吗?</summary> <b> </b></details> <details> <summary>以下块做什么?:
open("/my/file") = 5
read(5, "file content")
</summary> <b>

系统调用正在读 <code>/my/file</code>文件 以及 5 是文件描述符数字. </b></details>

<details> <summary>进程和线程的区别是什么?</summary> <b> </b></details>
Network
<details> <summary>当你运行 <code>ip a</code> 你看到一个设备叫做 'lo'. 它是什么以及为什么我们需要它?</summary> <b> </b></details> <details> <summary><code>traceroute</code> 命令做什么的? 它是怎么工作的?</summary> <b> </b></details> <details> <summary>什么是网络绑定? 你熟悉什么类型?</summary> <b> </b></details> <details> <summary>如何链接两个单独的网络名称空间,以便你可以从另一个命名空间ping一个命名空间上的接口?</summary> <b> </b></details> <details> <summary>什么是cgroup? 在什么情况下你会使用它们?</summary> <b> </b></details> <details> <summary>如何创建一定大小的文件?</summary> <b>

这有一些方式去做:

  • dd if=/dev/urandom of=new_file.txt bs=2MB count=1
  • truncate -s 2M new_file.txt
  • fallocate -l 2097152 new_file.txt </b></details>
<details> <summary>以下系统调用之间有什么区别?: exec(), fork(), vfork() and clone()?</summary> <b> </b></details> <details> <summary>解释流程描述符和任务结构</summary> <b> </b></details> <details> <summary>线程和进程之间有什么区别?</summary> <b> </b></details> <details> <summary>解释内核线程</summary> <b> </b></details> <details> <summary>使用套接字系统调用时会发生什么?</summary> <b>

这有一篇好的文章关于这个主题的: https://ops.tips/blog/how-linux-creates-sockets </b></details>

Ansible

<a name="ansible-beginner"></a>

初级

<details> <summary>在Ansible中描述以下每个组件,包括它们之间的关系:
  • Task
  • Module
  • Play
  • Playbook
  • Role</summary> <b>

任务 – 调用特定的Ansible模块 模块 – Ansible在你自己的主机或远程主机上执行的实际代码单元。 模块按类别(数据库,文件,网络等)编制索引,也称为任务插件。

Play – 在给定主机上执行的一个或多个任务

Playbook – 一个或多个Play。 每个Play可以在相同或不同的主机上执行

角色 – Ansible角色使你可以基于某些功能/服务对资源进行分组,以便可以轻松地重用它们。 在角色中,你具有变量,默认值,文件,模板,处理程序,任务和元数据的目录。 然后,你只需在剧本中指定角色即可使用该角色。 </b></details>

<details> <summary>你熟悉哪些Ansible最佳做法? 至少列出 3 条</summary> <b> </b></details> <details> <summary>什么是清单文件以及如何定义一个?</summary> <b>

清单文件定义了在其上执行Ansible任务的主机和/或主机组。

一个清单文件的例子

192.168.1.2 192.168.1.3 192.168.1.4

[web_servers] 190.40.2.20 190.40.2.21 190.40.2.22 </b></details>

<details> <summary>什么是动态清单文件? 什么时候使用?</summary>

动态清单文件可跟踪来自一个或多个来源(例如云提供商和CMDB系统)的主机。

应该使用当使用外部源时,尤其是在环境中的主机正在自动启动和关闭,而无需跟踪这些源中的所有更改。 </b></details>

<details> <summary>你只想在特定的次要操作系统上运行Ansible Play,你将如何实现?</summary> <b> </b></details> <details> <summary>写任务创建目录 ‘/tmp/new_directory’</summary> <b>
- name: Create a new directory
  file:
      path: "/tmp/new_directory"
      state: directory

</b></details>

<details> <summary>接下来的Play会有什么结果?</summary> <b>
---
- name: Print information about my host
  hosts: localhost
  gather_facts: 'no'

  tasks:
      - name: Print hostname
        debug:
            msg: "It's me, {{ ansible_hostname }}"

提供完成的代码后,请始终进行彻底检查。 如果你的回答是“这将失败”,那么你是对的。 我们正在使用一个事实(ansible_hostname), 这是我们正在运行的主机上收集到的信息。 但是在这种情况下,我们禁用了事实收集(gather_facts:no),因此该变量将是未定义的,这将导致失败。 </b></details>

<details> <summary>如果系统上存在文件 "/tmp/mario",则编写 playbook 以在所有主机上安装 "zlib" 和 "vim" .</summary> <b>
---
- hosts: all
  vars:
      mario_file: /tmp/mario
      package_list:
          - 'zlib'
          - 'vim'
  tasks:
      - name: Check for mario file
        stat:
            path: "{{ mario_file }}"
        register: mario_f

      - name: Install zlib and vim if mario file exists
        become: "yes"
        package:
            name: "{{ item }}"
            state: present
        with_items: "{{ package_list }}"
        when: mario_f.stat.exists

</b></details>

<details> <summary>编写一个 playbook ,将文件 "/tmp/system_info" 部署到除控制器组之外的所有主机上,并具有以下内容:</summary> <b>
我是 <HOSTNAME> 我的操作系统是 <OS>

替换 <HOSTNAME><OS> 以及正在运行的特定主机的实际数据 The playbook 部署system_info文件

---
- name: Deploy /tmp/system_info file
  hosts: all:!controllers
  tasks:
      - name: Deploy /tmp/system_info
        template:
            src: system_info.j2 
            dest: /tmp/system_info

The content of the system_info.j2 template

# {{ ansible_managed }}
I'm {{ ansible_hostname }} and my operating system is {{ ansible_distribution }}

</b></details>

<details> <summary>变量 "whoami" 在以下位置定义:
  • 角色默认设置 -> whoami: mario   * 额外的变量(使用 -e 传递给Ansible CLI的变量)-> whoami: toad   * 托管事实 -> whoami: luigi   * 广告资源变量(与哪种类型无关)-> whoami: browser

根据可变优先级,将使用哪个?

</summary> <b>

正确的答案是 ‘toad’。

变量优先级是关于变量在不同位置设置时如何相互覆盖的。 如果你到目前为止还没有体验过,我相信你会在某个时候确定的,这使它成为一个有用的话题。

在我们的问题上下文中,顺序将是额外的var(始终覆盖任何其他变量)-> 主机事实 -> 库存变量 -> 角色默认值(最弱)。

完整的列表可以在上面的链接中找到。 另外,请注意Ansible 1.x和2.x之间存在显着差异。 </b></details>

<details> <summary>对于以下每个语句,确定对还是错:
  • 模块是任务的集合   * 最好使用shell或命令而不是特定的模块   * 主机事实会覆盖 play 变量   * 角色可能包括以下内容:var,meta 和 handler   * 通过从外部来源提取信息来生成动态清单   * 最佳做法是使用2个空格而不是4个缩进   * 用来触发处理程序的“通知”   * "hosts:all:!controllers"表示 "仅在控制器组主机上运行
</summary> <b> </b></details> <details> <summary>什么是ansible-pull? 与ansible-playbook相比有何不同?</summary> <b> </b></details>

<a name="ansible-advanced"></a>

高级

<details> <summary>什么是过滤器? 你有写过滤器的经验吗?</summary> <b> </b></details> <details> <summary>编写过滤器来转化字符串大写</summary> <b> <code> def cap(self, string): return string.capitalize() </code> </b></details> <details> <summary>你如何测试基于Ansible的项目?</summary> <b> </b></details> <details> <summary>什么是回调插件? 使用回调插件可以实现什么?</summary> <b> </b></details>

Terraform

<a name="terraform-beginner"></a>

初级

<details> <summary>你能解释一下什么是Terraform? 它是怎么工作的?</summary> <b>

这里 </b></details>

<details> <summary>什么使基础架构代码受益?</summary> <b>
  • 供应,修改和删除基础架构的全自动过程
  • 基础结构的版本控制,可让你快速回滚到以前的版本
  • 通过自动化测试和代码审查来验证基础架构的质量和稳定性
  • 减少基础架构任务的重复性 </b></details>
<details> <summary>为什么选择Terraform,而不选择其他技术? (例如,Ansible,Puppet,CloufFormation)</summary> <b>

常见的错误答案是说 Ansible 和 Puppet 是配置管理工具而 Terraform 是置备工具。 尽管从技术上讲是正确的,但这并不意味着 Ansible 和 Puppet 不能 用于配置基础结构。 另外,这根本没有解释为什么应该在 CloudFormation上 使用 Terraform。

Terraform与其他工具相比的优势:

  • 它遵循不变的基础架构方法,该方法具有避免配置随时间变化的优势   * Ansible和Puppet具有更多的过程性(你提到了每个步骤要执行的操作),而Terraform是声明性的,因为你描述的是总体所需的状态,而不是每个资源或任务的状态。 你可以举一个在每个工具中从1台服务器转到2台服务器的示例。 在terrform中,你指定2,在Ansible和puppet中,你仅需配置1个其他服务器,因此你需要明确确保仅配置另一台服务器。 </b></details>
<details> <summary>解释什么是"Terraform configuration"</summary> <b> </b></details> <details> <summary>解释以下每个:
  • Provider
  • Resource
  • Provisioner
</summary> </b></details> <details> <summary><code>terraform.tfstate</code> 文件用来做什么?</summary> <b>

它跟踪创建的资源的ID,以便Terraform知道它正在管理什么。 </b></details>

<details> <summary>解释以下命令的作用:
  • <code>terraform init</code>
  • <code>terraform plan</code>
  • <code>terraform validate</code>
  • <code>terraform apply</code>
</summary> <b>

<code>terraform init</code> 扫描你的代码以查明你正在使用哪些提供程序并下载它们。 <code>terraform plan</code> 可以让你在实际执行操作之前先查看terraform即将执行的操作。 <code>terraform apply</code> 将提供指定的.tf文件资源。 </b></details>

<details> <summary>如何记下一个由外部源或者通过 <code>terraform apply</code>改变的变量?</summary> <b>

你用这种方式: <code>variable “my_var” {}</code> </b></details>

<details> <summary>举例说明几种Terraform最佳实践</summary> <b> </b></details> <details> <summary>解释一下隐式和显式依赖项在Terraform中如何工作</summary> <b> </b></details> <details> <summary>什么是<code>local-exec</code> and <code>remote-exec</code> in the context of provisioners?</summary> <b> </b></details> <details> <summary>什么是"tainted 资源"?</summary> <b>

这是成功创建的资源,但在配置期间失败。 Terraform将失败,并将该资源标记为“tainted”。 </b></details>

<details> <summary><code>terraform taint</code> 做了什么?</summary> <b> </b></details> <details> <summary>Terraform支持哪些类型的变量?</summary> <b>

Strimg Integer Map List </b></details>

<details> <summary>什么是输出变量以及 <code>terraform output</code> 做了什么?</summary> <b> </b></details> <details> <summary>解释 Modules</summary> </b></details> <details> <summary>什么是 Terraform Registry?</summary> <b> </b></details>

<a name="terraform-advanced"></a>

高级

<details> <summary>解释 "Remote State". 什么时候使用它以及如何使用它?</summary> <b> </b></details> <details> <summary>解释 "State Locking"</summary> <b> </b></details>

Docker

<a name="docker-beginner"></a>

初级

<details> <summary>什么是Docker? 你用它做什么?</summary> <b> </b></details> <details> <summary>容器与VM有何不同?</summary> <b>

容器和虚拟机之间的主要区别是容器使你可以虚拟化 操作系统上有多个工作负载,而对于VM,则将硬件虚拟化为 在多台计算机上运行各自的操作系统。 </b></details>

<details> <summary>在哪种情况下,你将使用容器,而在哪种情况下,则更喜欢使用虚拟机?</summary> <b>

在以下情况下,你应该选择虚拟机:    * 你需要运行一个需要操作系统所有资源和功能的应用程序    * 你需要完全隔离和安全

在以下情况下,你应该选择容器:    * 你需要快速启动的轻量级解决方案    * 运行单个应用程序的多个版本或实例 </b></details>

<details> <summary>解释一下 Docker 架构</summary> <b> </b></details> <details> <summary>详细描述一下当运行`docker run hello-world`时背后发生了什么?</summary> <b>

Docker CLI 将你的请求传递给Docker守护程序。 Docker 守护程序从 Docker Hub 下载映像 Docker 守护程序使用下载的映像创建一个新容器 Docker 守护程序将输出从容器重定向到 Docker CLI,后者将其重定向到标准输出 </b></details>

<details> <summary>你怎样运行容器?</summary> <b> </b></details> <details> <summary>你熟悉那些与容器相关的最佳实践?</summary> <b> </b></details> <details> <summary>`docker commit` 干什么的? 什么时候需要使用它?</summary> <b> </b></details> <details> <summary>你如何将数据从一个容器转移到另一个容器?</summary> <b> </b></details> <details> <summary>容器存在时容器的数据会发生什么?</summary> <b> </b></details> <details> <summary>解释以下每个命令的作用
  • docker run
  • docker rm
  • docker ps
  • docker build
  • docker commit</summary> <b>

</b></details>

<details> <summary>如何删除未运行的旧容器?</summary> <b> </b></details>
Dockerfile
<details> <summary>什么是 Dockerfile</summary> <b> </b></details> <details> <summary>Dockerfile中 ADD 和 COPY 之间的区别是什么?</summary> <b> </b></details> <details> <summary>Dockerfile中 CMD 和 RUN 之间的区别是什么?</summary> <b> </b></details> <details> <summary>解释一下什么是 Docker compose 以及它用来做什么</summary> <b> </b></details> <details> <summary>Docker compose,Docker swarm 和 Kubernetes 有什么区别?</summary> <b> </b></details> <details> <summary>解释 Docker interlock</summary> <b> </b></details> <details> <summary>Docker Hub 和 Docker Cloud 之间的区别是什么?</summary> <b>

Docker Hub是一个本地 Docker 注册表服务,可让你运行 pull 和 push 命令以从 Docker Hub 安装和部署 Docker映像。

Docker Cloud构建在Docker Hub之上,因此Docker Cloud提供了 与Docker Hub相比,你拥有更多的可选/功能。 一个例子是 群管理,这意味着你可以在Docker Cloud中创建新的群。 </b></details>

<details> <summary>存储 Docker 镜像的位置在哪里?</summary> <b> </b></details> <details> <summary>解释一下镜像层</summary> <b> </b></details>

<a name="docker-advanced"></a>

高级

<details> <summary>你如何在Docker中管理持久性存储?</summary> <b> </b></details> <details> <summary>如何从容器内部连接到容器运行所在的主机的本地主机? </summary> <b> </b></details> <details> <summary>如何将文件从Docker容器复制到主机,反之亦然?</summary> <b> </b></details>

Kubernetes

<a name="kubernetes-beginner"></a>

初级

<details> <summary>什么是Kubernetes?</summary> <b> </b></details> <details> <summary>为什么Docker还不够? 为什么我们需要Kubernetes?</summary> <b> </b></details> <details> <summary>描述一下 Kuberenets 的架构</summary> <b> </b></details> <details> <summary>你是怎样监控你的 Kuberenets?</summary> <b> </b></details> <details> <summary>什么是kubectl? 你如何使用它?</summary> <b> </b></details> <details> <summary>什么是kubconfig? 你用它来做什么?</summary> <b> </b></details>
Users
<details> <summary>你如何创建用户? 用户信息的存储位置?</summary> <b> </b></details> <details> <summary>你知道如何不使用 adduser/useradd 命令创建新用户吗?</summary> <b> </b></details>

Coding

<a name="coding-beginner"></a>

初级

<details> <summary>你更喜欢将哪种编程语言用于与DevOps相关的任务? 为什么要专门这个?</summary> <b> </b></details> <details> <summary>什么是面向对象编程? 它为什么如此重要?</summary> <b> </b></details> <details> <summary>解释一下递归</summary> <b> </b></details> <details> <summary>解释一下什么是设计模式,并详细描述其中的三个</summary> <b> </b></details> <details> <summary>解释 big O 符号</summary> <b> </b></details>
Strings
<details> <summary>用你想要的任何语言,编写一个函数来确定给定的字符串是否是回文串</summary> <b> </b></details>

<a name="coding-advanced"></a>

高级

<details> <summary>给定3种设计模式。 你知道如何以你选择的任何语言实现(提供示例)这些设计模式?</summary> <b> </b></details>

Python

<a name="python-beginner"></a>

初级

<details> <summary>Python编程语言的一些特点是什么?</summary> <b>
1. 这是一种由 Guido Van Rosum 于1991年创建的高级通用编程语言。
2. 语言被解释为CPython(用C语言编写)最常用/维护的实现。
3. 它是强类型的。 类型系统是鸭子类型和渐进式的。
4. Python注重可读性,并使用空格/缩进代替括号{}
5. python 包管理器称为PIP“ pip install packages”,具有超过200.000可用的软件包。
6. Python 附带安装了pip和一个大的标准库,为程序员提供了许多预置的解决方案。
7. 在python中,“一切”都是一个对象。

还有许多其他特性,但这是每个python程序员都应该知道的主要特性。

</b></details>

<details> <summary>Python支持哪些数据类型,哪些是可变的? 如何显示某个数据类型是可变的?</summary> <b>

可变数据类型是:

List
Dictionary
Set

不可变数据类型是:

Numbers (int, float, ...)
String
Bool
Tuple
Frozenset

通常,你可以使用函数hash()来检查对象的可变性,如果它是可哈希的,则是不可变的,尽管由于用户定义的对象可能是可变的且可哈希的,所以它并不总是按预期工作 </b></details>

<details> <summary>什么是PEP8? 举例说明3种风格指南</summary> <b>

PEP8是Python的编码约定和样式指南的列表

5 种样式指南:

  1. 将所有行限制为最多79个字符。
  2. 用两个空行包围顶级函数和类定义。
  3. 制作一个元素的元组时使用逗号
  4. 使用空格(而不是制表符)进行缩进
  5. 每个缩进级别使用4个空格 </b></details>
<details> <summary>解释一下继承以及如何在Python中使用它</summary> <b>
根据定义,继承是一种机制,其中一个对象充当另一个对象的基础,并保留其所有对象属性。

因此,如果B类继承自A类,那么A类的每个特征也将在B类中提供。A类将是“基类”,B类将是“派生类”。
当你有几个共享相同功能的类时,这很方便。

基本语法:

class Base: pass

class Derived(Base): pass

A more forged example:

class Animal:
    def __init__(self):
        print("and I'm alive!")

    def eat(self, food):
        print("ñom ñom ñom", food)

class Human(Animal):
    def __init__(self, name):
        print('My name is ', name)
        super().__init__()

    def write_poem(self):
        print('Foo bar bar foo foo bar!')

class Dog(Animal):
    def __init__(self, name):
        print('My name is', name)
        super().__init__()

    def bark(self):
        print('woof woof')


michael = Human('Michael')
michael.eat('Spam')
michael.write_poem()

bruno = Dog('Bruno')
bruno.eat('bone')
bruno.bark()

>>> My name is  Michael
>>> and I'm alive!
>>> ñom ñom ñom Spam
>>> Foo bar bar foo foo bar!
>>> My name is Bruno
>>> and I'm alive!
>>> ñom ñom ñom bone
>>> woof woof

调用super()会调用Base方法,因此,调用super().__init__() 就是调用 Animal__init__。

有一个称为 MetaClasses 的更高级的python功能,可帮助程序员直接控制类的创建。

</b></details>

<details> <summary> 什么是一个错误? 什么是一个异常? 你熟悉哪些异常类型?</summary> <b>

# 请注意,你通常不需要了解编译过程,而只需知道一切都来自哪里
# 并给出完整的答案表明你真正知道你在说什么。

通常,每个编译过程都有两个步骤。
    - 分析
    - 产生代码.
    
    Analysis can be broken into:
        1. 词法分析   (标记源代码)
        2. 语法分析 (如果语法正确,请检查标记是否合法,tldr)
           
               for i in 'foo'
                          ^
             SyntaxError: invalid syntax
        
        We missed ':'
        
        
        3. 语义分析  (上下文分析,合法语法仍然会触发错误,你是否尝试过除以0,哈希可变对象或使用未声明的函数?)
          
                 1/0
                ZeroDivisionError: division by zero
        
    这三个分析步骤负责错误处理。
    
    第二步将负责错误,主要是语法错误,这是最常见的错误。
    第三步将负责异常。
    
    如我们所见,异常是语义错误,有许多内置的异常:

        ImportError
        ValueError
        KeyError
        FileNotFoundError
        IndentationError
        IndexError
        ...
    
    你还可以具有用户定义的异常,这些异常必须直接或间接地从Exception类继承。

    常见例子:
        
    class DividedBy2Error(Exception):
        def __init__(self, message):
            self.message = message
    
    
    def division(dividend,divisor):
        if divisor == 2:
            raise DividedBy2Error('I dont want you to divide by 2!')
        return dividend / divisor
    
    division(100, 2)
    
    >>> __main__.DividedBy2Error: I dont want you to divide by 2!

</b></details>

<details> <summary>解释 异常处理以及如何在Python中使用它</summary> <b> </b></details> <details> <summary>编写一个可以恢复字符串的程序(例如,pizza -> azzip)</summary> <b>
最简单的是 str[::-1] 但不是效率最高的.

"经典" 方式:

foo = ''

for char in 'pizza':
    foo = char + foo

>> 'azzip'   

</b></details>

<details> <summary>编写一个函数以返回一个或多个数字的和。 用户将决定要使用多少个数字</summary> <b>

首先,你询问用户要使用的数字量。 使用while循环,每个循环将amount_of_numbers减1,直到amount_of_numbers变为0。 在while循环中,你想询问用户一个数字,该数字将在每次循环运行时添加一个变量。

def return_sum():
	amount_of_numbers = int(input("How many numbers? "))
	total_sum = 0
	while amount_of_numbers != 0:
		num = int(input("Input a number. "))
		total_sum += num
		amount_of_numbers -= 1
	return total_sum

</b></details>

<details> <summary>如何将两个排序列表合并为一个排序列表?</summary> <b> </b></details> <details> <summary> _ 在 Python 中用于什么?</summary> <b>
  1. i18n中的翻译查询
  2. 将最后执行的表达式或语句的结果保存在交互式解释器中。
  3. 作为通用“可丢弃”变量名。 例如:x,y,_ = get_data()(使用了x和y,但是由于我们不关心第三个变量,因此我们将其“扔掉了”)。 </b></details>
Algorithms Implementation
<details> <summary>你可以在Python中实现“二分法搜索”吗?</summary> <b> </b></details>
Files
<details> <summary>如何写文件?</summary> <b>
with open('file.txt', 'w') as file:
    file.write("My insightful comment")

</b></details>

<details> <summary>如何反转文件?</summary> <b> </b></details>

Regex

<details> <summary>如何在Python中执行与正则表达式相关的操作? (匹配模式,替代字符串等)</summary> <b>

使用 re 模式 </b></details>

<details> <summary>如何用 "blue" 替换字符串 "green"?</summary> <b> </b></details> <details> <summary>如何找到一个变量中的所有IP地址? 如何在文件中找到它们?</summary> <b> </b></details> <details> <summary>按每个嵌套列表的第二项对列表列表进行排序</summary> <b>
li = [[1, 4], [2, 1], [3, 9], [4, 2], [4, 5]]

sorted(x, key=lambda l: l[1])

</b></details>

<details> <summary>你可以编写一个函数来打印给定目录中的所有文件吗? 包括子目录</summary> <b> </b></details> <details> <summary>你有下面的列表: <code>[{'name': 'Mario', 'food': ['mushrooms', 'goombas']}, {'name': 'Luigi', 'food': ['mushrooms', 'turtles']}]</code> 获取所有的食物类型,最后输出: {'mushrooms', 'goombas', 'turtles'}</summary> <b>
brothers_menu =  \
[{'name': 'Mario', 'food': ['mushrooms', 'goombas']}, {'name': 'Luigi', 'food': ['mushrooms', 'turtles']}]

# "经典" 方式
def get_food(brothers_menu) -> set:
    temp = []

    for brother in brothers_menu:
        for food in brother['food']:
            temp.append(food)

    return set(temp)

# 一直先行方式 (Using list comprehension)
set([food for bro in x for food in bro['food']])

</b></details>

<details> <summary>什么是List 加强? 它比典型的循环更好吗? 为什么? 你能示范如何使用它吗?</summary> <b> </b></details> <details> <summary>怎样反转 string?</summary> <b>

最简短的方式是: <code>my_string[::-1]</code> 但是这不是效率最高的.

经典方式是:

def reverse_string(string):
    temp = ""
    for char in string:
        temp =  char + temp
    return temp

</b></details>

<details> <summary>如何按值对字典排序?</summary> <b> </b></details> <details> <summary>如何按键对字典排序?</summary> <b> </b></details> <details> <summary>解释数据序列化以及如何使用Python执行</summary> <b> </b></details> <details> <summary>你如何在Python中处理参数解析?</summary> <b> </b></details> <details> <summary>解释什么是GIL</summary> <b> </b></details> <details> <summary>什么是迭代器? 为什么使用迭代器?</summary> <b> </b></details> <details> <summary>解释以下方法的类型以及如何使用它们:
  • Static method
  • Class method
  • instance method</summary> <b>

</b></details>

<details> <summary>怎样反转 list?</summary> <b> </b></details> <details> <summary>空的 <code>return</code> 返回什么?</summary> <b> </b></details>
Time Complexity
<details> <summary>描述操作的时间复杂度<code>access</code>, <code>search</code> <code>insert</code> and <code>remove</code> 下面的数据结构:</summary> <b>
  • Stack
  • Queue
  • Linked List
  • Binary Search Tree </b></details>
<details> <summary>以下算法的最好,最差和平均情况的复杂度是什么?:
  • Quicksort
  • Mergesort
  • Bucket Sort
  • Radix Sort
</summary> </b></details>

<a name="python-advanced"></a>

高级

<details> <summary>解释什么是装饰器</summary> <b> </b></details> <details> <summary>你能展示如何编写和使用装饰器吗?</summary> <b> </b></details> <details> <summary>编写脚本来确定给定端口上是否可以访问给定主机</summary> <b> </b></details> <details> <summary>这个查询熟悉数据类吗? 你能解释一下他们是干什么用的吗?</summary> <b> </b></details> <details> <summary>解释一下上下文管理</summary> <b> </b></details> <details> <summary>解释一下缓��协议</summary> <b> </b></details> <details> <summary>解释一下描述符</summary> <b> </b></details> <details> <summary>你有抓取网络(爬虫)的经验吗? 你能描述一下你用过什么以及用什么?</summary> <b> </b></details> <details> <summary>你可以在Python中实现链接链表吗?</summary> <b> </b></details> <details> <summary>你已经创建了一个网页,用户可以在其中上传文档。 但是,根据文档大小,读取上传文件的功能会运行很长时间,并且用户必须等待读取操作完成才能继续使用该网站。 你怎么能解决这个问题?</summary> <b> </b></details>

Prometheus

<a name="prometheus-beginner"></a>

初级

<details> <summary>什么是Prometheus? Prometheus的主要特点是什么?</summary> <b> </b></details> <details> <summary>描述 Prometheus 架构和组件</summary> <b> </b></details> <details> <summary>你能否将 Prometheus 与其他解决方案(例如InfluxDB)进行比较?</summary> <b> </b></details> <details> <summary>什么是an Alert?</summary> <b> </b></details> <details> <summary>描述以下Prometheus组件:
  • Prometheus server
  • Push Gateway
  • Alert Manager</summary> <b>

负责抓取存储数据的Prometheus服务器推送网关用于短期作业警报管理负责警报 ;) </b></details>

<details> <summary>什么是一个实例? 什么是一个作业?</summary> <b> </b></details> <details> <summary>Prometheus支持哪些核心指标类型?</summary> <b> </b></details> <details> <summary>什么是一个 exporter? 它用来做什么?</summary> <b> </b></details> <details> <summary>你熟悉哪些Prometheus最佳做法? 至少命名三个</summary> <b> </b></details> <details> <summary>如何在给定时间内获得总请求?</summary> <b> </b></details>

<a name="prometheus-advanced"></a>

高级

<details> <summary>你如何加入两个指标?</summary> <b> </b></details> <details> <summary>如何编写返回标签值的查询?</summary> <b> </b></details> <details> <summary>如何将cpu_user_seconds转换为cpu使用率(百分比)?</summary> <b> </b></details>

Git

<a name="git-beginner"></a>

初级

<details> <summary><code>git pull</code> 和 <code>git fetch</code>的区别是什么?</summary> <b>

简单来说, git pull = git fetch + git merge

当你运行git pull时,它会从远程或中央获取所有更改 存储库,并将其附加到本地存储库中的相应分支。

git fetch从远程存储库获取所有更改,将更改存储在 本地存储库中的单独分支 </b></details>

<details> <summary>解释以下: <code>git 目录</code>, <code>工作目录</code> 和 <code>暂存区</code></summary> <b>

Git目录是Git存储项目的元数据和对象数据库的地方。 这是Git最重要的部分,当你从另一台计算机克隆存储库时,它就是复制的。

工作目录是项目一个版本的单个签出。 这些文件将从Git目录中的压缩数据库中拉出,并放置在磁盘上供你使用或修改。

暂存区是一个简单文件,通常包含在你的Git目录中,用于存储有关下一次提交的内容的信息。 有时称为索引,但将其称为暂存区已成为标准。

答案来自 git-scm.com </b></details>

<details> <summary>怎么解决 git merge 冲突?</summary> <b> <p> 首先,打开有冲突的文件,然后确定有什么冲突。 接下来,根据你的公司或团队接受的是什么,你可以与自己的 同事解决冲突或自行解决 解决冲突后,使用 git add <file_name> 添加文件。 最后,运行`git rebase --continue`。 </p> </b></details> <details> <summary><code>git reset</code> 和 <code>git revert</code>区别是什么?</summary> <b> <p>

git revert 创建一个新的提交,撤消上一次提交的更改。

git reset 根据使用情况,可以修改索引或更改分支头当前指向的提交。

</p> </b></details> <details> <summary>你想将提交移至顶部。 你将如何实现?</summary> <b>

使用 <code>git rebase></code> 命令 </b></details>

<details> <summary>那种情形你会使用 <code>git rebase</code>?</summary> <b> </b></details> <details> <summary>你熟悉哪些合并策略?</summary> <b>

提及两个或三个就足够了,最好提到“递归”作为默认值。

recursive resolve ours theirs

这篇文章解释是最好的: https://git-scm.com/docs/merge-strategies </b></details>

<details> <summary>在提交更改之前,如何查看已完成的更改?</summary> <b>

<code>git diff</code> </b></details>

<details> <summary>如何将特定文件还原为先前的提交?</summary> <b>
git checkout HEAD~1 -- /path/of/the/file

</b></details>

<a name="git-advanced"></a>

高级

<details> <summary>解释 Git octopus merge</summary> <b>

也许不错,它是:

  • 对于合并多个分支的情况(以及此类用例的默认情况)非常有用   * 主要用于将主题分支捆绑在一起

有一篇文章关于 Octopus merge: http://www.freblogg.com/2016/12/git-octopus-merge.html </b></details>

Go

<a name="go-beginner"></a>

初级

<details> <summary>Go编程语言有哪些特点?</summary> <b>
  • 强类型和静态类型 - 变量的类型不能随时间更改,必须在编译时进行定义   * 简单   * 快速编译时间   * 内置并发   * 垃圾回收   * 平台无关   * 编译为独立的二进制文件 - 你运行应用程序所需的所有内容都将被编译为一个二进制文件。 对于运行时的版本管理非常有用。

Go 而且有一个很好的社区. </b></details>

<details> <summary><code>var x int = 2</code> 和 <code>x := 2</code>区别是什么?</summary> <b>

结果相同,变量值为2。

with <code>var x int = 2</code> we are setting the variable type to integer while with <code>x := 2</code> we are letting Go figure out by itself the type. </b></details>

<details> <summary>对还是错? 在Go中,我们可以重新声明变量,并且一旦声明就必须使用它.</summary>

错. 我们不能重新声明变量,必须使用声明的变量。 </b></details>

<details> <summary>你使用了哪些Go库?</summary> <b>

应该根据你的使用情况回答此问题,一些示例是:

  • fmt - formatted I/O </b></details>
<details> <summary>下面代码块有什么问题? 怎么解决?
go
func main() {
    var x float32 = 13.5
    var y int
    y = x
}
</summary> <b> </b></details> <details> <summary>下面的代码块尝试将整数101转换为字符串,但相反,我们得到“ e”。 这是为什么? 怎么解决?
go
package main

import "fmt"

func main() {
    var x int = 101
    var y string
    y = string(x)
    fmt.Println(y)
}
</summary> <b>

它看起来在101处设置了什么unicode值,并将其用于将整数转换为字符串。 如果要获取“ 101”,则应使用“ strconv” 软件包,然后替换 <code>y = string(x)</code> with <code>y = strconv.Itoa(x)</code> </b></details>

<details> <summary>以下代码块什么是错的?:
package main

func main() {
    var x = 2
    var y = 3
    const someConst = x + y
}
</summary> <b> </b></details> <details> <summary>以下代码块的输出是什么?:
go
package main

import "fmt"

const (
	x = iota
	y = iota
)
const z = iota

func main() {
	fmt.Printf("%v\n", x)
	fmt.Printf("%v\n", y)
	fmt.Printf("%v\n", z)
}
</summary> <b> </b></details> <details> <summary> _ 在 Go 中的用途是什么?</summary> <b> </b></details> <details> <summary>以下代码块的输出是什么?:
go
package main

import "fmt"

const (
	_ = iota + 3
	x
)

func main() {
	fmt.Printf("%v\n", x)
}
</summary> <b> </b></details>

Mongo

<a name="mongo-beginner"></a>

初级

<details> <summary>MongoDB有什么优势? 换句话说,为什么选择 MongoDB 而不选择 NoSQL 的其他实现?</summary> <b> </b></details> <details> <summary>SQL和NoSQL之间的区别是什么?</summary> <b>

主要区别在于SQL数据库是结构化的(数据以带有行和列的表格-像是Excel电子表格表格),而NoSQL是 非结构化的,并且数据存储会根据NoSQL DB的设置方式而有所不同,例如 作为键值对,面向文档等 </b></details>

<details> <summary>在哪种情况下,这个查询希望使用 NoSQL/Mongo 而不是SQL?</summary> <b>
  • 经常变化的异构数据   * 数据一致性和完整性不是重中之重   * 最好,如果数据库需要快速扩展 </b></details>
<details> <summary>什么是一个文档? 什么是一个集合?</summary> <b> </b></details> <details> <summary>什么是一个聚合?</summary> <b> </b></details> <details> <summary>那个更好? 嵌入文档还是引用?</summary> <b> </b></details>
Queries
<details> <summary>解释这个查询: <code>db.books.find({"name": /abc/})</code></summary> <b> </b></details> <details> <summary>解释这个查询: <code>db.books.find().sort({x:1})</code></summary> <b> </b></details>

OpenShift

<a name="openshift-beginner"></a>

初级

<details> <summary>什么是OpenShift? 你用过吗? 如果有,是怎样使用的?</summary> <b> </b></details> <details> <summary>你能解释一下 OpenShift 和 Kubernetes 之间的区别吗?</summary> <b> </b></details> <details> <summary>定义 Pods 以及解释什么是有状态的 pods</summary> <b> </b></details> <details> <summary>你熟悉哪些类型的构建策略?</summary> <b> </b></details> <details> <summary>解释标签是什么以及它们的用途</summary> <b> </b></details> <details> <summary>解释什么是注释以及它们与标签的区别</summary> <b> </b></details> <details> <summary>解释什么是Downward API</summary> <b> </b></details>

Shell 脚本

<a name="shell-scripting-beginner"></a>

初级

<details> <summary>告诉我你使用Shell脚本的经验</summary> <b> </b></details> <details> <summary>脚本中的这一行是什么意思?: <code>#!/bin/bash</code></summary> <b> </b></details> <details> <summary>你倾向于在编写的每个脚本中包含什么?</summary> <b> </b></details> <details> <summary>对还是错?: 当某个命令行失败时,默认情况下,该脚本将退出并且不会继续运行</summary> <b>

取决于所使用的语言和设置,例如在Bash中,默认情况下,脚本将继续运行。 </b></details>

<details> <summary>今天,我们拥有Ansible之类的工具和技术。 为什么还会有人使用Shell脚本?</summary> <b> </b></details> <details> <summary>说出下面每个命令的结果是什么:
  • <code>echo $0</code>
  • <code>echo $?</code>
  • <code>echo $$</code>
  • <code>echo $@</code>
  • <code>echo $#</code></summary> <b>

</b></details>

<details> <summary>你如何调试Shell脚本?</summary> <b> </b></details> <details> <summary>如何在Shell脚本中从用户获得输入?</summary> <b> </b></details> <details> <summary>解释一下条件语句以及如何使用它们</summary> <b> </b></details> <details> <summary>什么是循环? 你熟悉哪些类型的循环?</summary> <b> </b></details> <details> <summary>解释 <code>continue</code> 和 <code>break</code>. 你什么时候使用它们?</summary> <b> </b></details> <details> <summary>如何将命令的输出存储在变量中?</summary> <b> </b></details> <details> <summary>你如何检查可变长度?</summary> <b> </b></details> <details> <summary>单引号和双引号之间的区别是什么?</summary> <b> </b></details>

<a name="shell-scripting-advanced"></a>

高级

<details> <summary>解释以下代码:

<code>:(){ :|:& };:</code>

</summary> <b> </b></details> <details> <summary>你能举一些Bash最佳实践的例子吗?</summary> <b> </b></details> <details> <summary>什么是三元运算符? 你如何在bash中使用它?</summary> <b>

使用 if/else 的一种简短方法。 一个例子:

[[ $a = 1 ]] && b="yes, equal" || b="nope" </b></details>

SQL

<a name="sql-beginner"></a>

初级

<details> <summary>SQL 代表什么?</summary> <b>

Structured Query Language(结构化查询语言)

</b></details>

<details> <summary>SQL 和 NoSQL 有那些不同</summary> <b>

主要区别在于SQL数据库是结构化的(数据以 带有行和列的表格-像是Excel电子表格表格),而NoSQL是 非结构化的,并且数据存储会根据NoSQL DB的设置方式而有所不同,例如 作为键值对,面向文档等 </b></details>

<details> <summary>数据库符合ACID的含义是什么?</summary>

ACID代表原子性,一致性,隔离性,耐久性。为了符合ACID,数据库必须满足四个标准中的每个标准

原子性 - 数据库发生更改时,它整体上应该成功或失败。

例如,如果你要更新表,则更新应完全执行。如果仅部分执行,则 更新被视为整体失败,并且不会通过-数据库将恢复为原始状态 更新发生之前的状态。还应该提到的是,原子性确保每个 事务以其自身的独立“单元”完成 - 如果任何部分失败,则整个语句都会失败。

一致性 - 对数据库所做的任何更改都应将其从一种有效状态转变为另一种有效状态。

例如,如果你对数据库进行了更改,则不应破坏它。通过检查和约束来保持一致性 在数据库中预定义。例如,如果你尝试将列的值从字符串更改为int 应该是数据类型字符串,一致的数据库将不允许该事务通过,并且该操作将 不执行

隔离 - 确保数据库不会被“更新中”-因为多个事务正在运行 同时,它仍应保持数据库处于与按顺序运行事务相同的状态。

例如,假设有20个人同时对数据库进行了更改。在 当你执行查询时,已完成20项更改中的15项,但仍有5项正在进行中。你应该 仅看到已完成的15个更改 - 随着更改的进行,你将看不到数据库的更新中。

耐用性 - 更改一旦提交,无论发生什么情况都将保持提交状态 (电源故障,系统崩溃等)。这意味着所有已完成的交易 必须记录在非挥发性内存中。

请注意,SQL本质上符合ACID。某些NoSQL DB可能符合ACID,具体取决于 它们的工作方式,但是根据一般经验,NoSQL DB不被视为符合ACID

</details> <details> <summary>什么时候最好使用SQL/NoSQL?</summary> <b>

SQL - 当数据完整性至关重要时,最适合使用。 由于符合ACID,SQL通常由许多业务实现特别是金融领域。

NoSQL - 非常适合你需要快速扩展的情况。 请记住NoSQL是为Web应用程序设计的 ,如果你需要快速将相同信息散布到多台服务器,它将会很好的用 此外,由于 NoSQL 不遵守具有列和行结构的严格表 关系数据库所要求的,你可以将不同的数据类型存储在一起。 </b></details>

<details> <summary>什么是笛卡尔积?</summary>

笛卡尔积是指第一个表中的所有行都与第二个表中的所有行连接在一起时的结果 表。 这可以通过不定义要联接的键来隐式完成,也可以通过以下方式显式地完成: 在两个表上调用CROSS JOIN,如下所示:

Select * from customers CROSS JOIN orders;

请注意,笛卡尔积也可能是一件坏事 - 执行联接时 在两个都没有唯一键的表上,这可能会导致返回信息 是不正确的。

</details>
SQL Specific Questions

对于这些问题,我们将使用下面显示的“客户和订单”表:

Customers

Customer_IDCustomer_NameItems_in_cartCash_spent_to_Date
100204John Smith020.00
100205Jane Smith340.00
100206Bobby Frank1100.20

ORDERS

Customer_IDOrder_IDItemPriceDate_sold
100206A123Rubber Ducky2.202019-09-18
100206A123Bubble Bath8.002019-09-18
100206Q98780-Pack TP90.002019-09-20
100205Z001Cat Food - Tuna Fish10.002019-08-05
100205Z001Cat Food - Chicken10.002019-08-05
100205Z001Cat Food - Beef10.002019-08-05
100205Z001Cat Food - Kitty quesadilla10.002019-08-05
100204X202Coffee20.002019-04-29
<details> <summary>我如何从该表中选择所有字段?</summary> <b>

Select *

From Customers; </b></details>

<details> <summary>约翰的购物车中有几件?</summary> <b>

Select Items_in_cart

From Customers

Where Customer_Name = "John Smith"; </b></details>

<details> <summary>所有客户花费的所有现金的总和是多少?</summary> <b>

Select SUM(Cash_spent_to_Date) as SUM_CASH

From Customers; </b></details>

<details> <summary>在购物车有商品的有多少人?</summary> <b>

Select count(1) as Number_of_People_w_items

From Customers

where Items_in_cart > 0; </b></details>

<details> <summary>你如何将客户表加入订单表?</summary> <b>

你可以加入他们的唯一键。 在这种情况下,唯一键为中的Customer_ID 客户表和订单表 </b></details>

<details> <summary>你如何显示哪些客户订购了哪些物品?</summary> <b>

Select c.Customer_Name, o.Item

From Customers c

Left Join Orders o

On c.Customer_ID = o.Customer_ID;

</b></details>

<a name="sql-advanced"></a>

高级

<details> <summary>使用with语句,你将如何显示谁订购了猫粮以及花费的总金额?</summary> <b>

with cat_food as (

Select Customer_ID, SUM(Price) as TOTAL_PRICE

From Orders

Where Item like "%Cat Food%"

Group by Customer_ID

)

Select Customer_name, TOTAL_PRICE

From Customers c

Inner JOIN cat_food f

ON c.Customer_ID = f.Customer_ID

where c.Customer_ID in (Select Customer_ID from cat_food);

尽管这是一个简单的声明,但“ with”子句在 在连接到另一个表之前,需要在一个表上运行一个复杂的查询。 用语句很好, 因为你在运行查询时会创建一个伪临时文件,而不是创建一个新表。

目前尚无法获得所有猫粮的总和,因此我们使用了with语句来创建 伪表检索每个客户花费的价格总和,然后正常加入该表。

</b></details>

Azure

<a name="azure-beginner"></a>

初级

<details> <summary>解释一下可用性集和可用性区域</summary> <b> </b></details> <details> <summary>什么是Azure资源管理器? 你可以描述ARM模板的格式吗?</summary> <b> </b></details> <details> <summary>解释一下Azure托管磁盘</summary> <b> </b></details>

GCP

<a name="gcp-beginner"></a>

初级

<details> <summary>GCP的主要组件和服务是什么?</summary> <b> </b></details> <details> <summary>你熟悉哪些GCP管理工具?</summary> <b> </b></details> <details> <summary>告诉我对GCP联网了解多少</summary> <b> </b></details>

OpenStack

<a name="openstack-beginner"></a>

初级

<details> <summary>告诉我你使用OpenStack的经验。 你认为OpenStack的优缺点是什么?</summary> <b> </b></details> <details> <summary>你熟悉OpenStack的哪些组件/项目?</summary> <b> </b></details> <details> <summary>你能告诉我以下每个组件/项目负责什么吗?:
  • Nova
  • Neutron
  • Cinder
  • Glance
  • Keystone</summary> <b>

</b></details>

<details> <summary>详细描述如何使用可以从云外部访问的IP来启动实例</summary> <b> </b></details> <details> <summary>你收到客户打来的电话,说:“我可以ping我的实例,但不能连接(ssh)它”。 可能是什么问题?</summary> <b> </b></details> <details> <summary>OpenStack支持哪些类型的网络?</summary> <b> </b></details> <details> <summary>你如何调试OpenStack存储问题? (工具,日志等)</summary> <b> </b></details> <details> <summary>你如何调试OpenStack计算问题? (工具,日志等)</summary> <b> </b></details> <details> <summary>你熟悉 TripleO吗? 它有那些优点?</summary> <b> </b></details>
网络
<details> <summary>什么是供应商网络?</summary> <b> </b></details> <details> <summary>L2和L3中存在哪些组件和服务?</summary> <b> </b></details> <details> <summary>什么是ML2 plug-in? 解释一下它的架构</summary> <b> </b></details> <details> <summary>什么是L2 代理? 它是怎么工作的以及它主要负责什么?</summary> <b> </b></details> <details> <summary>什么是L3 代理? 它是怎么工作的以及它主要负责什么?</summary> <b> </b></details> <details> <summary>解释元数据代理是怎么工作的以及它主要负责什么</summary> <b> </b></details> <details> <summary>你如何调试OpenStack网络问题? (工具,日志等)</summary> <b> </b></details>

<a name="openstack-advanced"></a>

中级

网络
<details> <summary>解释 BGP 动态路由</summary> </b></details>

安全

<a name="security-beginner"></a>

初级

<details> <summary>你能描述一下DevSecOps的核心原理吗?</summary> <b> </b></details> <details> <summary>你熟悉哪些DevOps安全最佳实践?</summary> <b> </b></details> <details> <summary>你熟悉哪些安全技术?</summary> <b> </b></details> <details> <summary>如何在不同的工具和平台中管理密码?</summary> <b> </b></details> <details> <summary>你如何识别和管理漏洞?</summary> <b> </b></details> <details> <summary>什么是权限限制?</summary> <b> </b></details>

Puppet

<a name="puppet-beginner"></a>

初级

<details> <summary>什么是Puppet? 它是怎么工作的?</summary> <b> </b></details> <details> <summary>解释一下 Puppet 结构</summary> <b> </b></details> <details> <summary>你可以将Puppet与其他配置管理工具进行比较吗? 你为什么选择使用Puppet?</summary> <b> </b></details> <details> <summary>解释以下:
  • Module
  • Manifest
  • Node</summary> <b>

</b></details>

<details> <summary>解释一下Facter</summary> <b> </b></details> <details> <summary>什么是MCollective?</summary> <b> </b></details>

<a name="puppet-advanced"></a>

中级

<details> <summary>你有编写模块的经验吗? 你创建了哪个模块以及用于什么?</summary> <b> </b></details> <details> <summary>解释一下什么是Hiera</summary> <b> </b></details>

场景

方案是没有口头回答的问题,需要你满足以下条件之一:

  • 设置环境
  • 编写脚本
  • 设计和/或开发基础设施项目

这些问题通常作为应聘者的一项家庭任务作为候选,可以将多个主题结合在一起。 在下面,你可以找到一些场景问题: