万花筒
作者万花筒·2023-02-06 09:57
系统架构师·红帽企业级开源解决方案中心

在OpenShift中实现网络观测和洞察

字数 8377阅读 3398评论 0赞 0

在 OpenShift 中实现网络观测和洞察

Red Hat OpenShift 容器平台( OCP )从一开始就具有监控功能。您可以查看监控仪表板,并管理指标和警报。随着 OCP4.10 的发布,网络可观察性被引入开发者预览模式。

开发者预览提供了对我们红帽公司正在研究的东西的早期访问,但尚未准备好进入生产可用时段。网络可观测性功能提供了将 NetFlow 数据导出、收集、丰富和存储为新遥测数据源的能力。还有一个前端与 OpenShift web 控制台集成,以可视化这些流,并对这些信息进行排序、过滤和导出。

NetFlows 是思科于 1996 年开发的一项技术,其中网络设备(如交换机、路由器或防火墙)跟踪进出接口的数据包。所有主要供应商都支持最新版本,称为 IP 流信息导出( IPFIX )。通过收集和存储这些数据,它为解决网络问题、确定带宽使用、规划容量、验证策略以及识别异常和安全问题提供了广泛的可能性。这些数据提供了以下方面的洞察能力:

  • 任意两个 Pods 之间有多少流量?
  • 网络流量占总流量的百分比是多少?
  • 流量最高的高峰时间是什么?
  • 每秒有多少字节进出一个 pod ?
  • 特定 Kubernetes 服务处理了多少流量?
  • 是否有任何流量使用不安全的协议,如 http 、 ftp 和 telnet ?

如何开始?

既然引起了你的兴趣,你需要从哪里开始?虽然可以在任何配置为导出 IPFIX 的 Kubernetes 集群上运行此功能,但本文只关注运行 OpenShift 4.10 的场景。

前提条件是:

  1. OpenShift 集群
    集群可以是自我管理的,也可以是任何受支持的 Red Hat 云服务。如果要创建集群,请确保将容器网络接口( CNI )提供程序设置为 OVN Kubernetes (请参阅下一项)。如果您没有集群, Red Hat 提供免费试用。 试用
  2. 使用 OVN Kubernetes 作为 CNI Provider
    CNI 提供者必须是 OVN Kubernetes ,因为它利用开放 vSwitch ( OVS )来提供流。如果您的 CNI 是 OpenShift SDN ,需要迁移到 OVN ,在迁移前,请确保您了解此迁移会对本集群造成的影响。
  3. 访问集群上具有集群管理员角色的帐户,例如 kubeadmin 。

安装**

安装过程将创建一个持久卷 PV 来存储 NetFlow 数据。它安装了 Grafana Loki ,方便了数据的保存和索引。安装过程部署了一个流收集器来收集 NetFlows ,并部署了一个用于可视化的用户界面插件。请注意,术语 NetFlow 在本文中是通用的,但它在网络可观察性中特指 IPFIX 。

这里显示的内容只需要 OpenShift web 控制台,这是一个基于 web 的应用程序,因此不需要在您的计算机上安装任何软件来进行测试。如果安装了 Red Hat 的 oc 客户端,则可以按照 NetObserv Operator 中的步骤在命令行上执行此操作。

这将创建各种 Kubernetes 对象,以兼容 OpenShift 。重要提示:这些步骤仅适用于此开发人员预览版,将来的版本可能会有所不同。

  1. 以 kubeadmin 或具有集群管理员角色的帐户登录 OpenShift web 控制台 .
  2. 创建一个新的 project
    a. 从导航面板中 , 点击 Home > Projects .
    b. 点击 Create Project 按钮 .
    c. 输入 network-observability 在 Name 字段并且点击 Create .
  3. 创建一个持久卷 persistent volume
    a. 从导航面板点击 Storage > PersistentVolumeClaims .
    b. 点击 Create PersistentVolumeClaim 按钮 .
    c. 输入 loki-store 在 PersistentVolumeClaim name 字段,修改 Size 为 1GiB 或者更大值 , 然后点击 Create .
  4. 安装 Loki
    a. 从导航面板,点击 Workloads > Pods .
    b. 点击 Create Pod 按钮 .
    c. 替换为以下文本 :
apiVersion: v1
kind: Pod
metadata:
  name: loki
  labels:
    app: loki
spec:
  volumes:
    - name: loki-store
      persistentVolumeClaim:
        claimName: loki-store
  containers:
    - name: loki
      image: grafana/loki
      volumeMounts:
        - mountPath: "/loki-store"
          name: loki-store

d. 点击 Create . 然后观察 Pod 的运行状态。直到变成 Running .
e. 从导航面板点击 Networking > Services .
f. 点击 Create Service 按钮
g. 在 YAML file 字段中 , 替换 nameapp 为 loki . 修改 port 为 3100 ,移除 targetPort . 最后看起来如下 :

apiVersion: v1
kind: Service
metadata:
  name: loki
  namespace: network-observability
spec:
  selector:
    app: loki
  ports:
    - protocol: TCP
      port: 3100

h. 点击 Create .

  1. 安装 Network Observability
    a. 从导航面板中 , 点击 Operators > OperatorHub .
    b. 在过滤字段中,通过 netobserv . 查找到并选择 NetObserv Operator . 这是一个社区 Operator ,因此您将收到警告,这可能不稳定,并且没有支持,因此不用说,不应在生产中部署。 .
    c. 点击 Install . 接受默认项并再次点击 Install . 经过几秒钟时间,会安装 flow collector 和相关插件 .
    d. 从导航面板中 , 点击 Operators > Installed Operators . 在 NetObserv Operator 行 , 点击 Flow Collector 链接 , 然后 Create FlowCollector .
    e. 点击 Ipfix 区域的 > 然后打开 . 修改采样字段 Sampling 为 1 . 然后点击 Create .
    f. 经过最多一分钟时间 , 弹出 Web console update is available 后点击 Refresh web console 按钮 .
    g. 刷新网页,并且确认 Observe > Network Traffic 导航出现 . 假如没有,再次确认之前的步骤,并查看是否有错误报告 .
    h. 点击 Observe > Network Traffic , 您应该会看到一个包含大量数据的 NetFlow 表!如果表为空,请等待几秒钟,然后重试。

采样或者不采样**

流采样意味着它处理一个小样本,而不是跟踪通过网络的每个数据包。

默认情况下, FlowCollector 将采样设置为 400 或 1:400 比率。这意味着每 400 个数据包只观察到一个数据包。虽然这似乎是一个低比率,但对于高带宽连接来说,它通常更低。

如果您只想全面了解网络流量,采样是一个可以接受的解决方案。事实上,在本文开始时提出的所有问题都可以通过打开采样来回答。但是,如果您正在查找用于故障排除的特定数据或出于审计目的需要这些数据,那么您可能会以更多的 CPU 、内存、存储和带宽为代价来关闭此功能。出于我们的目的,我们将采样配置为 1 ,这意味着没有采样(全部)。

准备观测**

Observe > Network Traffic , 即使没有任何开发项目, Kubernetes 的主节点和工作节点也会产生内部流量。这是一个很好的起点。图 1 显示了 NetFlow 表的样子。

图__1: NetFlow__表

NetFlow 表提供了流经集群的数据的几乎实时视图。 OVS 发送的 NetFlow 数据被丰富,包括 Kubernetes 相关信息,如命名空间和名称,其中包括 pod 和服务。滚动查看更多流或单击 Refresh 按钮 . 更好地了解一些更常见的服务,如 apiserver 、 router 、 etcd 以及与其他 pod 交互的 dns 。您可以定期自动刷新表。当你观察流量时,你可能会对你所看到的感到惊讶。

通过过滤,您可以观察进出单个 pod 的流量,也可以观察任意两个 pod 之间的流量。对于前者,如果您想查看谁正在访问 apiserver ,例如,在过滤器下拉列表中,选择 Name ,位于 Common 区域 , 然后输入 apiserver . 如果要精确匹配,请使用引号。要确保只有 HTTPS 流量,请在筛选器下拉列表中选择 Destination 以及 Port . 输入 443 或者 https 在过滤字段 . 过滤器是附加的,因此如果您想重新开始,请确保单击 Clear all filters .

请理解,这显示的是流量,因此,如果您从一个 pod 向另一个 pod 上的 web 服务器发出 HTTP 请求,则会有两个方向的流量,因为请求会从客户端到服务器,但响应通常是大量数据,会在端口翻转的情况下从服务器到客户端。这意味着,如果你想检查你的服务器没有启动与其他 pod 的连接,那么忽略源端口为 443 的流量或它正在监听的任何端口。

NetFlow 表具有更多选项和功能。在查询选项下拉菜单中,可以显示源流(即进入接口的入口流)、目标流(即离开接口的出口流)(默认值)或两者。在同一下拉菜单中,有一个选项可以匹配所有过滤器或匹配任何过滤器。您还可以选择在 UI 中显示多少个流。

过滤器字段旁边还有三个其他选项。第一个选项管理要显示的列,因为还有很多列要显示,例如协议、 IP 和方向。还有一些超级列,如“ IP 和端口”,在一列中显示源 IP 、源端口、目标 IP 和目标端口。

下一个选项是显示格式,包括每行显示一个流的紧凑视图。最后一个选项以 CSV 格式导出数据,该格式与任何类似 Excel 的电子表格兼容。您可以对任意列进行排序,然后单击任意行以查看有关流的更多详细信息。最后,还有一个时间范围选择来进一步限制和过滤数据。

部署一个应用**

我们将创建一个文件和媒体 web 服务器项目,允许您将文件上载到服务器,根据文件类型,浏览器将正确处理文件。也就是说,如果是声音文件,它将播放音乐。如果是视频文件,它将播放视频。如果是图像文件,它将显示图片。任何知道该 URL 的人都可以访问。我们将在执行这些操作时检查 NetFlow 表。

  1. 在导航面板中,单击 Administrator ,然后选择 Developer 以切换到 Developer 视图。单击“跳过教程”以跳过教程。
  2. 单击项目下拉菜单,然后单击创建项目。输入 mywebapp ,然后单击创建。
  3. 在 +Add 面板中,单击 Samples 部分。
  4. 向下滚动并选择 PHP 。
  5. 在名称字段中,输入 mywebapp ,然后单击创建。 .

这将转到“ Topology ”面板。大约一分钟后,您应该有一个正在运行的 web 服务器。

在 PHP 图标上,单击工具提示中显示“打开 URL ”的箭头链接。如果页面显示应用程序不可用,请等待,然后刷新页面。当 CakePHP 完成时,它会说“ Welcome to your CakePHP ”。

返回 Topology 面板,单击 PHP 图标,然后单击 pod 名称链接。单击 Terminal 选项卡。将以下文本粘贴到 shell 中。此代码创建一个网页,允许您上载文件。

cat > webroot/upload.php << 'EOF'
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $target_dir = "img/";
    $target_file = $target_dir . basename($_FILES["upload_file"]["name"]);
    $ext = pathinfo($target_file, PATHINFO_EXTENSION);

    if (move_uploaded_file($_FILES["upload_file"]["tmp_name"], $target_file)) {
        $msg = basename( $_FILES["upload_file"]["name"]) . ' was uploaded successfully.';
        $status = 'success';
    } else {
        $msg = 'There was an error uploading your file.';
        $status = 'error';
    }
    if (isset($_POST['text']) && $_POST['text']) {
        echo "$msg\\\\n";
        return;
    }
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Upload File</title>
</head>
<body>
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    echo "<p>$msg</p>";
}
?>
<form method="post" enctype="multipart/form-data">
<h3>Choose the file to upload and then click the Upload button.</h3>
<p><input type="file" name="upload_file" id="upload-file"></p>
<p><input type="submit" value="Upload" name="submit"></p>
</form>
</body>
</html>
EOF

返回包含应用程序主页的浏览器选项卡。将 /upload.php 添加到地址。在上载文件之前,请在 NetFlow 表中设置筛选器以查看此服务器上的流量。

  1. 在显示“ Developer ”的下拉菜单中,选择 Administrator .
  2. 从导航面板中,单击 Observe > Network Traffic .
  3. 筛选器字段中 Common Namespace , 输入 mywebapp 并按 Enter .
  4. Refresh 下拉菜单中 , 选择 15 seconds .
  5. 在“ Refresh ”旁边的时间范围下拉菜单中 , 选择 Last 15 minutes .

现在返回应用程序页面并将文件上载到服务器。上传 mp3 声音文件或 mp4 视频剪辑。根据您的网络连接,上传可能需要一些时间。此时,您应该在表中看到一些流。单击“日期和时间”列对该列进行排序。要播放声音文件或查看视频,请将 /img/ 添加到主页 URL 。您现在拥有了一个公共文件和媒体服务器!

在执行这些操作时,继续查看 NetFlow 表。你能看到交易流量往哪走吗? web 服务器在端口 8080 上运行,而另一个端口是临时端口。您可以删除所有筛选器并按字节排序,以查看最高的交易流。探索以了解您可以从这些数据中获得哪些其他信息。

拓扑**

要获得流的可视化表示,请单击右上角的拓扑以切换到网络图视图。单击 mywebapp pod 以查看如图 2 所示的视图 __

图__2:__拓扑图__

这提供了按名称空间分组的集群的概览。当切换到拓扑视图时,过滤器会持续存在,因此它只显示 mywebapp 名称空间和与之交互的其他名称空间。在页面底部,它显示了该视图的流量和流量。

您可以拖动任何项目来移动它。如果拖动图形区域,它将移动整个图形。左下角的前四个图标用于缩放和调整视图。第五个图标将导出视图并将拓扑保存为图像文件。

有许多选项可以减少数据并缩小到您所需的范围。单击设置图标(左下角的最后一个图标)以打开“选项”对话框。在这里,您可以选择不同的显示、项目的分组方式,以及在拓扑中显示内容的一些切换。在此对话框之外,在时间范围的左侧(例如,最后 15 分钟),您可以选择要在图形边缘显示的内容以及是以字节还是数据包显示。

仪表盘图形**

NetFlow 表和拓扑是查看当前情况快照的好方法,但除非您确切了解所要查找的内容,否则数据量可能会非常巨大。数据可以使用折线图以时间序列表示。图 3 显示了通过执行以下操作可以基于相同的 NetFlow 数据使用 Grafana 创建的图形:

  1. 如果在“管理员”视图中,请单击 Administrator ,然后选择 Developer 以切换到 Developer 视图
  2. 单击 Project 下拉菜单并选择 network-observability
  3. 点击 +Add 然后点击 Container images 区域 .
  4. 输入 grafana/grafana:8.5.1 镜像名,并点击 Create .

这将转到 Topology 面板。单击 grafana 图标中的箭头链接以启动 grafana 的网页。您可能需要等待应用程序启动。输入用户名和密码 admin 登录。系统将提示您更改密码。之后,我们将设置并导入仪表板

  1. 在左侧菜单上,单击齿轮图标(顶部图标集中倒数第二个),然后选择数据源 Data sources .
  2. 点击 Add data source .
  3. 点击 Loki . 在 URL 字段, 输入 http://loki:3100 .
  4. 点击 Save & test 按钮 .
  5. 在这里 https://raw.githubusercontent.com/netobserv/network-observability-operator/release-4.11/config/samples/dashboards/Network%20Observability.json 下载仪表盘 JSON 文件样例
  6. 在左边菜单点击 + 按钮然后选择 Import .
  7. 点击 Upload JSON file 按钮 , 选择刚才下载的文件,然后可以看到如下视图 .

    图__3 Grafana__仪表盘

当我们计划在 OpenShift web 控制台中添加图形时,您可以随时使用 Grafana 来创建您需要的任何特定图形。

下一步?

这只是冰山一角,因为团队正在努力在未来几个月提供一些更漂亮的可视化和创新。请记住,这是一个开发者预览功能,所以希望事情有所改变。如果你想让我们所做的事情具有“可观察性”,请访问我们的 GitHub https://github.com/netobserv 。这是一个开放社区项目!

译自: https://cloud.redhat.com/blog/a-guide-to-providing-insight-with-network-observability

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广