Openshift Container Platform 4.10 Networking ZH CN
Openshift Container Platform 4.10 Networking ZH CN
Openshift Container Platform 4.10 Networking ZH CN
10
网络
配置和管理集群网络
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons
Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is
available at
http://creativecommons.org/licenses/by-sa/3.0/
. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must
provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert,
Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift,
Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States
and other countries.
Linux ® is the registered trademark of Linus Torvalds in the United States and other countries.
XFS ® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States
and/or other countries.
MySQL ® is a registered trademark of MySQL AB in the United States, the European Union and
other countries.
Node.js ® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the
official Joyent Node.js open source or commercial project.
The OpenStack ® Word Mark and OpenStack logo are either registered trademarks/service marks
or trademarks/service marks of the OpenStack Foundation, in the United States and other
countries and are used with the OpenStack Foundation's permission. We are not affiliated with,
endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
摘要
本文档提供有关配置和管理 OpenShift Container Platform 集群网络的说明,其中包括 DNS、
Ingress 和 Pod 网络。
目录
目录
. . . 1. 章
第 . . .了解网
. . . . . .络
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7. . . . . . . . . . . . .
1.1. OPENSHIFT CONTAINER PLATFORM DNS 7
1.2. OPENSHIFT CONTAINER PLATFORM INGRESS OPERATOR 7
1.3. OPENSHIFT CONTAINER PLATFORM 网络的常见术语表 8
. . . 2. .章
第 . . 访问
. . . . .主机
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11. . . . . . . . . . . . .
2.1. 访问安装程序置备的基础架构集群中 AMAZON WEB SERVICES 上的主机 11
. . . 3. .章
第 ..网
. . .络
. . OPERATOR
. . . . . . . . . . . . .概述
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
..............
3.1. CLUSTER NETWORK OPERATOR 12
3.2. DNS OPERATOR 12
3.3. INGRESS OPERATOR 12
3.4. 外部 DNS OPERATOR 12
. . . 4. .章
第 . . .OPENSHIFT
. . . . . . . . . . . . CONTAINER
. . . . . . . . . . . . . .PLATFORM
. . . . . . . . . . . . 中的
. . . . .CLUSTER
. . . . . . . . . . NETWORK
. . . . . . . . . . . .OPERATOR
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
..............
4.1. CLUSTER NETWORK OPERATOR 13
4.2. 查看集群网络配置 13
4.3. 查看 CLUSTER NETWORK OPERATOR 状态 14
4.4. 查看 CLUSTER NETWORK OPERATOR 日志 14
4.5. CLUSTER NETWORK OPERATOR 配置 14
4.6. 其他资源 20
. . . 5. .章
第 . . OPENSHIFT
. . . . . . . . . . . . . CONTAINER
. . . . . . . . . . . . . .PLATFORM
. . . . . . . . . . . . 中的
. . . . .DNS
. . . . .OPERATOR
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
..............
5.1. DNS OPERATOR 21
5.2. 更改 DNS OPERATOR MANAGEMENTSTATE 21
5.3. 控制 DNS POD 放置 22
5.4. 查看默认 DNS 23
5.5. 使用 DNS 转发 23
5.6. DNS OPERATOR 状态 26
5.7. DNS OPERATOR 日志 26
5.8. 设置 COREDNS 日志级别 26
5.9. 设置 COREDNS OPERATOR 的日志级别 27
. . . 6. .章
第 . . .OPENSHIFT
. . . . . . . . . . . . CONTAINER
. . . . . . . . . . . . . .PLATFORM
. . . . . . . . . . . . 中的
. . . . .INGRESS
. . . . . . . . . .OPERATOR
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28
..............
6.1. OPENSHIFT CONTAINER PLATFORM INGRESS OPERATOR 28
6.2. INGRESS 配置资产 28
6.3. INGRESS CONTROLLER 配置参数 28
6.4. 查看默认的 INGRESS CONTROLLER 41
6.5. 查看 INGRESS OPERATOR 状态 41
6.6. 查看 INGRESS CONTROLLER 日志 41
6.7. 查看 INGRESS CONTROLLER 状态 42
6.8. 配置 INGRESS CONTROLLER 42
6.9. 其他资源 64
. . . 7. .章
第 . . 配置
. . . . . INGRESS
. . . . . . . . . . CONTROLLER
. . . . . . . . . . . . . . . 端点
. . . . .发
. .布策略
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .65
..............
7.1. INGRESS CONTROLLER 端点发布策略 65
7.2. 其他资源 67
. . . 8. .章
第 . . .验证
. . . .到端点的
. . . . . . . .连
..接
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .68
..............
8.1. 执行连接健康检查 68
8.2. 连接健康检查实现 68
8.3. PODNETWORKCONNECTIVITYCHECK 对象字段 68
8.4. 验证端点的网络连接 71
1
OpenShift Container Platform 4.10 网络
. . . 9. .章
第 . . .更改集群网
. . . . . . . . . .络
. .的
. . .MTU
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .76
..............
9.1. 关于集群 MTU 76
9.2. 更改集群 MTU 77
9.3. 其他资源 83
. . . 10
第 . . .章
. . 配置
. . . . .节
. .点端口服
. . . . . . . .务
..范
. . .围
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84
..............
10.1. 先决条件 84
10.2. 扩展节点端口范围 84
10.3. 其他资源 85
. . . 11. .章
第 . . .配置
. . . . IP
. . .故障
. . . .转
. .移
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .86
..............
11.1. IP 故障转移环境变量 87
11.2. 配置 IP 故障转移 88
11.3. 关于虚拟 IP 地址 91
11.4. 配置检查和通知脚本 91
11.5. 配置 VRRP 抢占 93
11.6. 关于 VRRP ID 偏移 94
11.7. 为超过 254 地址配置 IP 故障转移 94
11.8. INGRESSIP 的高可用性 95
11.9. 删除 IP 故障切换 95
. . . 12
第 . . .章
. . 在裸机集群中使用流控制
. . . . . . . . . . . . . . . . . . . . . . . .传输协议
. . . . . . . . .(SCTP)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .98
..............
12.1. 支持 OPENSHIFT CONTAINER PLATFORM 上的流控制传输协议 (SCTP) 98
12.2. 启用流控制传输协议 (SCTP) 99
12.3. 验证流控制传输协议 (SCTP) 已启用 100
. . . 13
第 . . .章
. . 使用
. . . . .PTP
. . . . .硬件
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .103
...............
13.1. 关于 PTP 硬件 103
13.2. 关于 PTP 103
13.3. 使用 CLI 安装 PTP OPERATOR 104
13.4. 使用 WEB 控制台安装 PTP OPERATOR 106
13.5. 配置 PTP 设备 106
13.6. 常见 PTP OPERATOR 故障排除 121
13.7. PTP 硬件快速事件通知框架 123
. . . 14
第 . . .章
. . 外部
. . . . .DNS
. . . . . OPERATOR
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
...............
14.1. OPENSHIFT CONTAINER PLATFORM 中的外部 DNS OPERATOR 132
14.2. 在云供应商上安装外部 DNS OPERATOR 133
14.3. 外部 DNS OPERATOR 配置参数 133
14.4. 在 AWS 上创建 DNS 记录 136
14.5. 在 AZURE 上创建 DNS 记录 137
14.6. 在 GCP 上创建 DNS 记录 139
14.7. 在外部 DNS OPERATOR 上配置集群范围代理 141
. . . 15
第 . . .章
. .网
. .络
. . 策略
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .143
...............
15.1. 关于网络策略 143
15.2. 记录网络策略事件 146
15.3. 创建网络策略 153
15.4. 查看网络策略 156
15.5. 编辑网络策略 157
15.6. 删除网络策略 160
15.7. 为项目定义默认网络策略 160
15.8. 使用网络策略配置多租户隔离 163
. . . 16
第 . . .章
. . 多网
. . . . .络
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .167
...............
2
目录
. . . 17
第 . . .章
. . 硬件网
. . . . . . .络
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .196
...............
17.1. 关于单根 I/O 虚拟化(SR-IOV)硬件网络 196
17.2. 安装 SR-IOV NETWORK OPERATOR 202
17.3. 配置 SR-IOV NETWORK OPERATOR 204
17.4. 配置 SR-IOV 网络设备 209
17.5. 配置 SR-IOV 以太网网络附加 217
17.6. 配置 SR-IOV INFINIBAND 网络附加 223
17.7. 将 POD 添加到额外网络 228
17.8. 配置高性能多播 233
17.9. 使用 DPDK 和 RDMA 235
17.10. 使用 POD 级别绑定 244
17.11. 配置硬件卸载 (OFFLOADING) 247
17.12. 卸载 SR-IOV NETWORK OPERATOR 251
. . . 18
第 . . .章
. . OPENSHIFT
. . . . . . . . . . . . . SDN
. . . . .默
. .认
. . .CNI
. . . .网
. .络
..供
. . .应
. .商
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .253
...............
18.1. 关于 OPENSHIFT SDN 默认 CNI 网络供应商 253
18.2. 为项目配置出口 IP 254
18.3. 为项目配置出口防火墙 260
18.4. 为项目编辑出口防火墙 264
18.5. 为项目编辑出口防火墙 265
18.6. 从项目中删除出口防火墙 266
18.7. 使用出口路由器 POD 的注意事项 266
18.8. 以重定向模式部署出口路由器 POD 269
18.9. 以 HTTP 代理模式部署出口路由器 POD 271
18.10. 以 DNS 代理模式部署出口路由器 POD 274
18.11. 从配置映射配置出口路由器 POD 目的地列表 277
18.12. 为项目启用多播 278
18.13. 为项目禁用多播 281
18.14. 使用 OPENSHIFT SDN 配置网络隔离 281
18.15. 配置 KUBE-PROXY 283
. . . 19
第 . . .章
. . OVN-KUBERNETES
. . . . . . . . . . . . . . . . . . . . .默
. .认
. . .CNI
. . . .网
. .络
. .供
. .应
..商
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .286
...............
19.1. 关于 OVN-KUBERNETES 默认 CONTAINER NETWORK INTERFACE (CNI) 网络供应商 286
19.2. 从 OPENSHIFT SDN 集群网络供应商迁移 288
19.3. 回滚到 OPENSHIFT SDN 网络供应商 296
19.4. 转换为 IPV4/IPV6 双栈网络 300
19.5. IPSEC 加密配置 302
19.6. 为项目配置出口防火墙 304
19.7. 查看项目的出口防火墙 309
19.8. 为项目编辑出口防火墙 309
19.9. 从项目中删除出口防火墙 310
19.10. 配置出口 IP 地址 310
19.11. 分配出口 IP 地址 317
19.12. 使用出口路由器 POD 的注意事项 318
3
OpenShift Container Platform 4.10 网络
. . . 20
第 . . .章
. . .配置路由
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
................
20.1. 路由配置 334
20.2. 安全路由 354
. . . 21
第 . . .章
. . 配置集群入口流量
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .359
...............
21.1. 集群入口流量配置概述 359
21.2. 为服务配置 EXTERNALIP 359
21.3. 使用 INGRESS CONTROLLER 配置集群入口流量 365
21.4. 使用负载均衡器配置集群入口流量 370
21.5. 使用网络负载平衡器在 AWS 上配置集群入口流量 374
21.6. 为服务外部 IP 配置 INGRESS 集群流量 377
21.7. 使用 NODEPORT 配置集群入口流量 378
. . . 22
第 . . .章
. . .KUBERNETES
. . . . . . . . . . . . . . NMSTATE
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .382
...............
22.1. 关于 KUBERNETES NMSTATE OPERATOR 382
22.2. 观察节点网络状态 384
22.3. 更新节点网络配置 386
22.4. 对节点网络配置进行故障排除 397
. . . 23
第 . . .章
. . .配置集群范
. . . . . . . . . .围
. . .代理
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
................
23.1. 先决条件 402
23.2. 启用集群范围代理 402
23.3. 删除集群范围代理服务器 404
. . . 24
第 . . .章
. . .配置自定
. . . . . . . .义
. . .PKI
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
................
24.1. 在安装过程中配置集群范围的代理 405
24.2. 启用集群范围代理 406
24.3. 使用 OPERATOR 进行证书注入 408
. . . 25
第 . . .章
. . .RHOSP
. . . . . . . .负载
. . . .均衡
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .411
..............
25.1. 使用带有 KURYR SDN 的 OCTAVIA OVN 负载均衡器供应商驱动 411
25.2. 使用 OCTAVIA 为应用程序流量扩展集群 412
25.3. 使用 RHOSP OCTAVIA 为入站流量扩展 414
25.4. 配置外部负载均衡器 416
. . . 26
第 . . .章
. . .使用
. . . . .METALLB
. . . . . . . . . .进
..行
. . .负载
. . . .平衡
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .419
...............
26.1. 关于 METALLB 和 METALLB OPERATOR 419
26.2. 安装 METALLB OPERATOR 426
26.3. 配置 METALLB 地址池 431
26.4. 配置 METALLB BGP PEER 435
26.5. 配置 METALLB BFD 配置集 439
26.6. 将服务配置为使用 METALLB 441
26.7. METALLB 日志记录、故障排除和支持 445
. . . 27
第 . . .章
. . .将二
. . . .级
. .接口指
......标
. . .与网
. . . .络
. .附加关
......联
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .455
...............
27.1. 为监控扩展二级网络指标 455
. . . 28
第 . . .章
. . .NETWORK
. . . . . . . . . . . OBSERVABILITY(网
. . . . . . . . . . . . . . . . . . . . . .络
. .可
. .观
. .察性)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .457
...............
28.1. NETWORK OBSERVABILITY OPERATOR 发行注记 457
28.2. 关于网络可观察性 458
4
目录
5
OpenShift Container Platform 4.10 网络
6
第 1 章 了解网络
第 1 章 了解网络
集群管理员有几个选项用于公开集群内的应用程序到外部流量并确保网络连接:
服务类型,如节点端口或负载均衡器
注意
入口流量通过路由访问集群中的服务。路由和入口是处理入口流量的主要资源。Ingress 提供类似于路由
的功能,如接受外部请求并根据路由委派它们。但是,对于 Ingress,您只能允许某些类型的连接:
7
OpenShift Container Platform 4.10 网络
身份验证
为了控制对 OpenShift Container Platform 集群的访问,集群管理员可以配置用户身份验证,并确保
只有批准的用户访问集群。要与 OpenShift Container Platform 集群交互,您必须对 OpenShift
Container Platform API 进行身份验证。您可以通过在您对 OpenShift Container Platform API 的请求
中提供 OAuth 访问令牌或 X.509 客户端证书来进行身份验证。
AWS Load Balancer Operator
AWS Load Balancer (ALB) Operator 部署和管理 aws-load-balancer-controller 的实例。
Cluster Network Operator
Cluster Network Operator(CNO)在 OpenShift Container Platform 集群中部署和管理集群网络组件。
这包括在安装过程中为集群选择的 Container Network Interface(CNI)默认网络供应商插件部署。
配置映射
配置映射提供将配置数据注入 pod 的方法。您可以在类型为 ConfigMap 的卷中引用存储在配置映射
中的数据。在 pod 中运行的应用程序可以使用这个数据。
自定义资源 (CR)
CR 是 Kubernetes API 的扩展。您可以创建自定义资源。
DNS
集群 DNS 是一个 DNS 服务器,它为 Kubernetes 服务提供 DNS 记录。由 Kubernetes 启动的容器会
在其 DNS 搜索中自动包含此 DNS 服务器。
DNS Operator
DNS Operator 部署并管理 CoreDNS,以便为 pod 提供名称解析服务。这会在 OpenShift Container
Platform 中启用基于 DNS 的 Kubernetes 服务发现。
部署
维护应用程序生命周期的 Kubernetes 资源对象。
domain
Domain(域)是 Ingress Controller 提供的 DNS 名称。
egress
通过来自 pod 的网络出站流量进行外部数据共享的过程。
外部 DNS Operator
External DNS Operator 部署并管理 ExternalDNS,以便为从外部 DNS 供应商到 OpenShift
Container Platform 的服务和路由提供名称解析。
基于 HTTP 的路由
基于 HTTP 的路由是一个不受保护的路由,它使用基本的 HTTP 路由协议,并在未安全的应用程序端
口上公开服务。
入口
OpenShift Container Platform 中的 Kubernetes Ingress 资源通过作为集群内 pod 运行的共享路由器
服务来实现 Ingress Controller。
Ingress Controller
Ingress Operator 管理 Ingress Controller。使用 Ingress Controller 是允许从外部访问 OpenShift
Container Platform 集群的最常用方法。
8
第 1 章 了解网络
安装程序置备的基础架构
安装程序部署并配置运行集群的基础架构。
kubelet
在集群的每个节点上运行的一个主节点代理,以确保容器在 pod 中运行。
Kubernetes NMState Operator
Kubernetes NMState Operator 提供了一个 Kubernetes API,用于使用 NMState 在 OpenShift
Container Platform 集群的节点上执行状态驱动的网络配置。
kube-proxy
kube-proxy 是一个代理服务,在每个节点上运行,有助于为外部主机提供服务。它有助于将请求转发
到正确的容器,并且能够执行原语负载平衡。
负载均衡器
OpenShift Container Platform 使用负载均衡器从集群外部与集群中运行的服务进行通信。
MetalLB Operator
作为集群管理员,您可以将 MetalLB Operator 添加到集群中,以便在将 LoadBalancer 类型服务添
加到集群中时,MetalLB 可为该服务添加外部 IP 地址。
multicast
通过使用 IP 多播,数据可同时广播到许多 IP 地址。
命名空间
命名空间隔离所有进程可见的特定系统资源。在一个命名空间中,只有属于该命名空间的进程才能看
到这些资源。
networking
OpenShift Container Platform 集群的网络信息。
node
OpenShift Container Platform 集群中的 worker 机器。节点是虚拟机 (VM) 或物理计算机。
OpenShift Container Platform Ingress Operator
Ingress Operator 实现 IngressController API,是负责启用对 OpenShift Container Platform 服务的
外部访问的组件。
pod
一个或多个带有共享资源(如卷和 IP 地址)的容器,在 OpenShift Container Platform 集群中运行。
pod 是定义、部署和管理的最小计算单元。
PTP Operator
PTP Operator 会创建和管理 linuxptp 服务。
route
OpenShift Container Platform 路由为集群中的服务提供入口流量。路由提供了标准 Kubernetes
Ingress Controller 可能不支持的高级功能,如 TLS 重新加密、TLS 直通和为蓝绿部署分割流量。
扩展
增加或减少资源容量。
service
在一组 pod 上公开正在运行的应用程序。
单根 I/O 虚拟化 (SR-IOV) Network Operator
Single Root I/O Virtualization(SR-IOV)Network Operator 管理集群中的 SR-IOV 网络设备和网络
附加。
软件定义型网络 (SDN)
9
OpenShift Container Platform 4.10 网络
10
第 2 章 访问主机
第 2 章 访问主机
了解如何创建堡垒主机来访问 OpenShift Container Platform 实例,以及使用安全 shell (SSH) 访问
control plane 节点。
流程
注意
6. 从您手动部署到 Amazon EC2 的堡垒 SSH 主机中,SSH 部署到该 control plane 主机。确定您使
用了在安装过程中指定的相同的 SSH 密钥:
11
OpenShift Container Platform 4.10 网络
第 3 章 网络 OPERATOR 概述
OpenShift Container Platform 支持多种类型的网络 Operator。您可以使用这些网络 Operator 管理集群
网络。
12
第 4 章 OPENSHIFT CONTAINER PLATFORM 中的 CLUSTER NETWORK OPERATOR
流程
Cluster Network Operator 在安装过程中被部署为一个 Kubernetes 部署。
1. 运行以下命令,以查看部署状态:
输出示例
$ oc get clusteroperator/network
输出示例
4.2. 查看集群网络配置
每个 OpenShift Container Platform 新安装都有一个名为 cluster 的 network.config 对象。
流程
使用 oc describe 命令查看集群网络配置:
$ oc describe network.config/cluster
输出示例
Name: cluster
Namespace:
13
OpenShift Container Platform 4.10 网络
Labels: <none>
Annotations: <none>
API Version: config.openshift.io/v1
Kind: Network
Metadata:
Self Link: /apis/config.openshift.io/v1/networks/cluster
Spec: 1
Cluster Network:
Cidr: 10.128.0.0/14
Host Prefix: 23
Network Type: OpenShiftSDN
Service Network:
172.30.0.0/16
Status: 2
Cluster Network:
Cidr: 10.128.0.0/14
Host Prefix: 23
Cluster Network MTU: 8951
Network Type: OpenShiftSDN
Service Network:
172.30.0.0/16
Events: <none>
1 Spec 字段显示集群网络的已配置状态。
2 Status 字段显示集群网络配置的当前状态。
流程
$ oc describe clusteroperators/network
流程
14
第 4 章 OPENSHIFT CONTAINER PLATFORM 中的 CLUSTER NETWORK OPERATOR
clusterNetwork
从中分配 Pod IP 地址的 IP 地址池。
serviceNetwork
服务的 IP 地址池.
defaultNetwork.type
集群网络供应商,如 OpenShift SDN 或 OVN-Kubernetes。
注意
在集群安装后,您无法修改上一节中列出的字段。
字段 类型 描述
spec:
clusterNetwork:
- cidr: 10.128.0.0/19
hostPrefix: 23
- cidr: 10.128.32.0/19
hostPrefix: 23
此值是只读的,在集群安装过程中从名为 cluster 的
Network.config.openshift.io 对象继承。
spec:
serviceNetwork:
- 172.30.0.0/14
此值是只读的,在集群安装过程中从名为 cluster 的
Network.config.openshift.io 对象继承。
15
OpenShift Container Platform 4.10 网络
字段 类型 描述
defaultNetwork 对象配置
下表列出了 defaultNetwork 对象的值:
表 4.2. defaultNetwork 对象
字段 类型 描述
注意
字段 类型 描述
注意
您只能在集群安装过程中更改集群网络供应商的配置。
16
第 4 章 OPENSHIFT CONTAINER PLATFORM 中的 CLUSTER NETWORK OPERATOR
defaultNetwork:
type: OpenShiftSDN
openshiftSDNConfig:
mode: NetworkPolicy
mtu: 1450
vxlanPort: 4789
字段 类型 描述
注意
字段 类型 描述
rateLimit 整数 每个节点每秒生成一次的消息数量上限。默认值为每秒 20 条消
息。
17
OpenShift Container Platform 4.10 网络
字段 类型 描述
libc
主机上的 journald 进程的 libc syslog() 函数。
UDP:<host>:<port>
一个 syslog 服务器。将 <host>:<port> 替换为 syslog 服
务器的主机 和端口。
Unix:<file>
由 <file> 指定的 Unix 域套接字文件。
null
不要将审计日志发送到任何其他目标。
字段 类型 描述
注意
defaultNetwork:
type: OVNKubernetes
ovnKubernetesConfig:
mtu: 1400
genevePort: 6081
ipsecConfig: {}
18
第 4 章 OPENSHIFT CONTAINER PLATFORM 中的 CLUSTER NETWORK OPERATOR
字段 类型 描述
注意
kubeProxyConfig:
proxyArguments:
iptables-min-sync-period:
- 0s
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
clusterNetwork: 1
- cidr: 10.128.0.0/14
hostPrefix: 23
serviceNetwork: 2
- 172.30.0.0/16
defaultNetwork: 3
type: OpenShiftSDN
openshiftSDNConfig:
mode: NetworkPolicy
mtu: 1450
vxlanPort: 4789
kubeProxyConfig:
iptablesSyncPeriod: 30s
proxyArguments:
iptables-min-sync-period:
- 0s
1 2 3 仅在集群安装过程中配置。
19
OpenShift Container Platform 4.10 网络
4.6. 其他资源
operator.openshift.io API 组中的 Network API
20
第 5 章 OPENSHIFT CONTAINER PLATFORM 中的 DNS OPERATOR
流程
在安装过程中使用 Deployment 对象部署 DNS Operator。
1. 使用 oc get 命令查看部署状态:
输出示例
$ oc get clusteroperator/dns
输出示例
21
OpenShift Container Platform 4.10 网络
流程
先决条件
已安装 oc CLI。
流程
$ oc edit dns.operator/default
spec:
nodePlacement:
nodeSelector:
node-role.kubernetes.io/worker: ""
$ oc edit dns.operator/default
2. 为污点指定污点键和一个容忍度:
spec:
nodePlacement:
tolerations:
- effect: NoExecute
key: "dns-only"
operators: Equal
value: abc
tolerationSeconds: 3600 1
22
第 5 章 OPENSHIFT CONTAINER PLATFORM 中的 DNS OPERATOR
流程
$ oc describe dns.operator/default
输出示例
Name: default
Namespace:
Labels: <none>
Annotations: <none>
API Version: operator.openshift.io/v1
Kind: DNS
...
Status:
Cluster Domain: cluster.local 1
Cluster IP: 172.30.0.10 2
...
输出示例
[172.30.0.0/16]
5.5. 使用 DNS 转发
您可以使用以下方法使用 DNS 转发来覆盖 /etc/resolv.conf 文件中的默认转发配置:
更改默认转发策略。
注意
23
OpenShift Container Platform 4.10 网络
注意
流程
$ oc edit dns.operator/default
DNS 示例
apiVersion: operator.openshift.io/v1
kind: DNS
metadata:
name: default
spec:
servers:
- name: foo-server 1
zones: 2
- example.com
forwardPlugin:
policy: Random 3
upstreams: 4
- 1.1.1.1
- 2.2.2.2:5353
- name: bar-server
zones:
- bar.com
- example.com
forwardPlugin:
policy: Random
upstreams:
- 3.3.3.3
- 4.4.4.4:5454
upstreamResolvers: 5
policy: Random 6
upstreams: 7
- type: SystemResolvConf 8
- type: Network
address: 1.2.3.4 9
port: 53 10
24
第 5 章 OPENSHIFT CONTAINER PLATFORM 中的 DNS OPERATOR
6 决定选择上游服务器进行查询的顺序。您可以指定这些值之一: Random、RoundRobin
或 Sequential。默认值为 Sequential。
7 可选。您可以使用它提供上游解析器。
注意
2. 查看 ConfigMap:
apiVersion: v1
data:
Corefile: |
example.com:5353 {
forward . 1.1.1.1 2.2.2.2:5353
}
bar.com:5353 example.com:5353 {
forward . 3.3.3.3 4.4.4.4:5454 1
}
.:5353 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
upstream
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
forward . /etc/resolv.conf 1.2.3.4:53 {
policy Random
}
cache 30
reload
}
25
OpenShift Container Platform 4.10 网络
kind: ConfigMap
metadata:
labels:
dns.operator.openshift.io/owning-dns: default
name: dns-default
namespace: openshift-dns
其他资源
流程
查看 DNS Operator 的状态:
$ oc describe clusteroperators/dns
流程
查看 DNS Operator 的日志:
注意
流程
26
第 5 章 OPENSHIFT CONTAINER PLATFORM 中的 DNS OPERATOR
验证
要确保设置了所需的日志级别,请检查配置映射:
流程
27
OpenShift Container Platform 4.10 网络
apiVersion: config.openshift.io/v1
kind: Ingress
metadata:
name: cluster
spec:
domain: apps.openshiftdemos.com
参数 描述
28
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
参数 描述
当使用生成的默认证书时,该证书对域及其子域有效。请参阅
defaultCertificate。
如果没有设置,则默认值基于 infrastructure.config.openshift.io/cluster
.status.platform:
裸机: NodePortService
其它: HostNetwork
注意
loadBalancer.scope
loadbalancer.providerParameters.gcp.clientAccess
hostNetwork.protocol
nodePort.protocol
29
OpenShift Container Platform 4.10 网络
参数 描述
内部证书(无论是生成的证书还是用户指定的证书)自动与 OpenShift
Container Platform 内置的 OAuth 服务器集成。
如果没有设置,则使用默认值。
注意
nodePlacement:
nodeSelector:
matchLabels:
kubernetes.io/os: linux
tolerations:
- effect: NoSchedule
operator: Exists
30
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
参数 描述
如果没有设置,则默认值基于 apiservers.config.openshift.io/cluster 资
源。
注意
重要
ClientCertificatePolicy 子字段接受以下两个值之一:Required 或
Optional 。ClientCA 子字段指定 openshift-config 命名空间中的配置映射。配
置映射应包含 CA 证书捆绑包。 AllowedSubjectPatterns 是一个可选值,用
于指定正则表达式列表,该列表与有效客户端证书上的可分辨名称匹配以过滤请
求。正则表达式必须使用 PCRE 语法。至少一种模式必须与客户端证书的可分辨
名称匹配;否则,入口控制器拒绝证书,并拒绝连接。如果没有指定,ingress
控制器不会根据可分辨的名称拒绝证书。
31
OpenShift Container Platform 4.10 网络
参数 描述
namespaceOwnership 描述了如何处理跨命名空间的主机名声明。默认为
Strict。
Strict:不允许路由在命名空间间声明相同的主机名。
InterNamespaceAllowed :允许路由在命名空间间声明相同主机名
的不同路径。
32
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
参数 描述
access 描述了客户端请求的日志记录方式。如果此字段为空,则禁用
访问日志。
destination 描述日志消息的目的地。
type 是日志的目的地类型:
Container 指定日志应该进入 sidecar 容器。Ingress
Operator 在 Ingress Controller pod 上配置名为 logs 的容
器,并配置 Ingress Controller 以将日志写入容器。管理员
应该配置一个自定义日志记录解决方案,从该容器读取日
志。使用容器日志意味着,如果日志速率超过容器运行时
或自定义日志解决方案的容量,则可能会出现日志丢失的
问题。
33
OpenShift Container Platform 4.10 网络
参数 描述
默认情况下,策略设置为 Append。
这些调整仅应用于明文、边缘终止和重新加密路由,且仅在使用 HTTP/1 时有
效。
对于请求标头,这些调整仅适用于具有 haproxy.router.openshift.io/h1-
adjust-case=true 注解的路由。对于响应标头,这些调整适用于所有 HTTP 响
应。如果此字段为空,则不会调整任何请求标头。
34
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
参数 描述
例如:
httpCaptureCookies:
- matchType: Exact
maxLength: 128
name: MYCOOKIE
httpCaptureHeaders 包含两个要在访问日志中捕获的标头列表。这两个标题
字段列表是 request 和 response。在这两个列表中,name 字段必须指定标
头名称和 maxlength 字段,必须指定标头的最大长度。例如:
httpCaptureHeaders:
request:
- maxLength: 256
name: Connection
- maxLength: 128
name: User-Agent
response:
- maxLength: 256
name: Content-Type
- maxLength: 256
name: Content-Length
35
OpenShift Container Platform 4.10 网络
参数 描述
clientTimeout 指定连接在等待客户端响应时保持打开的时长。如果未
设置,则默认超时为 30s。
serverFinTimeout 指定连接在等待服务器响应关闭连接时保持打开
的时长。如果未设置,则默认超时为 1s。
serverTimeout 指定连接在等待服务器响应时保持打开的时长。如果
未设置,则默认超时为 30s。
clientFinTimeout 指定连接在等待客户端响应关闭连接时保持打开的
时长。如果未设置,则默认超时为 1s。
tlsInspectDelay 指定路由器可以保存数据以查找匹配的路由的时长。
如果把这个值设置得太短,对于 edge-terminated, reencrypted, 或
passthrough 的路由,则可能会导致路由器回退到使用默认证书,即使
正在使用一个更加匹配的证书时也是如此。如果未设置,则默认检查延
迟为 5s。
tunnelTimeout 指定隧道连接在隧道闲置期间保持打开的时长,包括
websockets。如果未设置,则默认超时为 1h。
36
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
参数 描述
LoggingPolicy 类型接受以下两个值之一:
HTTPEmptyRequestsPolicy 类型接受以下两个值之一:
注意
所有参数都是可选的。
profile 描述
37
OpenShift Container Platform 4.10 网络
profile 描述
Old 此配置集用于旧的客户端或库。该配置集基于旧的向后兼容性建议配置。
注意
Modern 此配置集主要用于不需要向后兼容的现代客户端。这个配置集基于
Modern 兼容性推荐的配置。
警告
使用 Custom 配置集时要谨慎,因为无效的配置
可能会导致问题。
注意
当使用预定义的配置集类型时,有效的配置集配置可能会在发行版本之间有所改变。例
如,使用在版本 X.Y.Z 中部署的 Intermediate 配置集指定了一个规格,升级到版本 X.Y.Z+1
可能会导致应用新的配置集配置,从而导致推出部署。
apiVersion: operator.openshift.io/v1
kind: IngressController
...
spec:
tlsSecurityProfile:
38
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
old: {}
type: Old
...
TLS 安全配置集定义 Ingress Controller 的 TLS 连接的最低 TLS 版本和 TLS 密码。
注意
Ingress Operator 还会将 Old 或 Custom 配置集的 TLS 1.0 转换为 1.1。
先决条件
流程
2. 添加 spec.tlsSecurityProfile 字段:
apiVersion: operator.openshift.io/v1
kind: IngressController
...
spec:
tlsSecurityProfile:
type: Custom 1
custom: 2
ciphers: 3
- ECDHE-ECDSA-CHACHA20-POLY1305
- ECDHE-RSA-CHACHA20-POLY1305
- ECDHE-RSA-AES128-GCM-SHA256
- ECDHE-ECDSA-AES128-GCM-SHA256
minTLSVersion: VersionTLS11
...
2 为所选类型指定适当的字段:
old: {}
intermediate: {}
custom:
39
OpenShift Container Platform 4.10 网络
3. 保存文件以使改变生效。
验证
验证 IngressController CR 中是否设置了配置集:
输出示例
Name: default
Namespace: openshift-ingress-operator
Labels: <none>
Annotations: <none>
API Version: operator.openshift.io/v1
Kind: IngressController
...
Spec:
...
Tls Security Profile:
Custom:
Ciphers:
ECDHE-ECDSA-CHACHA20-POLY1305
ECDHE-RSA-CHACHA20-POLY1305
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES128-GCM-SHA256
Min TLS Version: VersionTLS11
Type: Custom
...
您可以通过设置 spec.clientTLS 值,将 Ingress Controller 配置为启用 mutual TLS (mTLS) 身份验
证。clientTLS 值将 Ingress Controller 配置为验证客户端证书。此配置包括设置 clientCA 值,这是对配
置映射的引用。配置映射包含 PEM 编码的 CA 证书捆绑包,用于验证客户端的证书。另外,您还可以配
置证书主题过滤器列表。
如果 clientCA 值指定 X509v3 证书撤销列表 (CRL) 分发点,Ingress Operator 会下载 CRL 并配置
Ingress Controller 来确认它。不提供有效证书的请求将被拒绝。
先决条件
流程
1. 创建 openshift-config 命名空间中的配置映射:
注意
40
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
注意
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: default
namespace: openshift-ingress-operator
spec:
clientTLS:
clientCertificatePolicy: Required
clientCA:
name: router-ca-certs-default
allowedSubjectPatterns:
- "^/CN=example.com/ST=NC/C=US/O=Security/OU=OpenShift$"
流程
流程
$ oc describe clusteroperators/ingress
41
OpenShift Container Platform 4.10 网络
流程
流程
6.8.1. 设置自定义默认证书
作为管理员,您可以通过创建 Secret 资源并编辑 IngressController 自定义资源 (CR),将 Ingress
Controller 配置为使用自定义证书。
先决条件
您的证书满足以下要求:
该证书对入口域有效。
输出示例
NAME AGE
default 10m
注意
流程
42
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
注意
3. 验证更新是否已生效:
$ echo Q |\
openssl s_client -connect console-openshift-console.apps.<domain>:443 -showcerts
2>/dev/null |\
openssl x509 -noout -subject -issuer -enddate
其中:
<domain>
指定集群的基域名。
输出示例
提示
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: default
namespace: openshift-ingress-operator
spec:
defaultCertificate:
name: custom-certs-default
43
OpenShift Container Platform 4.10 网络
6.8.2. 删除自定义默认证书
作为管理员,您可以删除配置了 Ingress Controller 的自定义证书。
先决条件
流程
集群协调新证书配置时可能会有延迟。
验证
要确认原始集群证书已被恢复,请输入以下命令:
$ echo Q | \
openssl s_client -connect console-openshift-console.apps.<domain>:443 -showcerts
2>/dev/null | \
openssl x509 -noout -subject -issuer -enddate
其中:
<domain>
指定集群的基域名。
输出示例
subject=CN = *.apps.<domain>
issuer=CN = ingress-operator@1620633373
notAfter=May 10 10:44:36 2023 GMT
注意
扩展不是立刻就可以完成的操作,因为它需要时间来创建所需的副本数。
流程
44
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
输出示例
输出示例
ingresscontroller.operator.openshift.io/default patched
输出示例
提示
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: default
namespace: openshift-ingress-operator
spec:
replicas: 3 1
1 如果需要不同数量的副本,请更改 replicas 值。
45
OpenShift Container Platform 4.10 网络
先决条件
流程
配置 Ingress 访问日志到 sidecar。
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: default
namespace: openshift-ingress-operator
spec:
replicas: 2
logging:
access:
destination:
type: Container
输出示例
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
46
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
name: default
namespace: openshift-ingress-operator
spec:
replicas: 2
logging:
access:
destination:
type: Syslog
syslog:
address: 1.2.3.4
port: 10514
注意
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: default
namespace: openshift-ingress-operator
spec:
replicas: 2
logging:
access:
destination:
type: Syslog
syslog:
address: 1.2.3.4
port: 10514
httpLogFormat: '%ci:%cp [%t] %ft %b/%s %B %bq %HM %HU %HV'
禁用 Ingress 访问日志。
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: default
namespace: openshift-ingress-operator
spec:
replicas: 2
logging:
access: null
47
OpenShift Container Platform 4.10 网络
先决条件
流程
注意
如果您的节点有能力运行大量资源,您可以使用与预期节点容量匹配的标签配置
spec.nodePlacement.nodeSelector,并将 spec.tuningOptions.threadCount
配置为一个适当的高值。
分配特定的路由,使其具有不同于其它路由的可靠性保证。
只允许特定的路由使用其他功能。
在不同的地址上公开不同的路由,例如使内部和外部用户能够看到不同的路由。
流程
1. 编辑 router-internal.yaml 文件:
# cat router-internal.yaml
apiVersion: v1
items:
- apiVersion: operator.openshift.io/v1
kind: IngressController
48
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
metadata:
name: sharded
namespace: openshift-ingress-operator
spec:
domain: <apps-sharded.basedomain.example.net> 1
nodePlacement:
nodeSelector:
matchLabels:
node-role.kubernetes.io/worker: ""
routeSelector:
matchLabels:
type: sharded
status: {}
kind: List
metadata:
resourceVersion: ""
selfLink: ""
# oc apply -f router-internal.yaml
3. 使用 router-internal.yaml 中配置的域创建新路由:
警告
流程
1. 编辑 router-internal.yaml 文件:
49
OpenShift Container Platform 4.10 网络
# cat router-internal.yaml
输出示例
apiVersion: v1
items:
- apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: sharded
namespace: openshift-ingress-operator
spec:
domain: <apps-sharded.basedomain.example.net> 1
nodePlacement:
nodeSelector:
matchLabels:
node-role.kubernetes.io/worker: ""
namespaceSelector:
matchLabels:
type: sharded
status: {}
kind: List
metadata:
resourceVersion: ""
selfLink: ""
# oc apply -f router-internal.yaml
3. 使用 router-internal.yaml 中配置的域创建新路由:
50
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
警告
重要
图 6.1. LoadBalancer 图表
51
OpenShift Container Platform 4.10 网络
来自外部负载均衡器的流量定向到 pod,并由负载均衡器管理,如下节点的实例中所述。有关实
现详情请查看 Kubernetes 服务文档 。
先决条件
安装 OpenShift CLI(oc)。
流程
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
namespace: openshift-ingress-operator
name: <name> 1
spec:
domain: <domain> 2
endpointPublishingStrategy:
type: LoadBalancerService
loadBalancer:
scope: Internal 3
2 指定控制器发布的应用程序的 domain。
$ oc create -f <name>-ingress-controller.yaml 1
先决条件
52
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
流程
注意
b. 编辑 YAML 文件:
spec:
endpointPublishingStrategy:
loadBalancer:
providerParameters:
gcp:
clientAccess: Global 1
type: GCP
scope: Internal
type: LoadBalancerService
c. 保存文件以使改变生效。
2. 运行以下命令,以验证该服务是否允许全局访问:
输出显示,全局访问已为带有注解 networking.gke.io/internal-load-balancer-allow-global-
access 的 GCP 启用。
53
OpenShift Container Platform 4.10 网络
警告
重要
先决条件
安装 OpenShift CLI(oc)。
流程
6.8.10. 配置路由准入策略
管理员和应用程序开发人员可在多个命名空间中运行具有相同域名的应用程序。这是针对多个团队开发
的、在同一个主机名上公开的微服务的机构。
警告
只有在命名空间间有信任的集群才会启用跨命名空间之间的声明,否则恶意用户可能
会接管主机名。因此,默认的准入策略不允许在命名空间间声明主机名。
先决条件
54
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
必须具有集群管理员权限。
流程
Ingress 控制器配置参数
spec:
routeAdmission:
namespaceOwnership: InterNamespaceAllowed
...
提示
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: default
namespace: openshift-ingress-operator
spec:
routeAdmission:
namespaceOwnership: InterNamespaceAllowed
6.8.11. 使用通配符路由
HAProxy Ingress Controller 支持通配符路由。Ingress Operator 使用 wildcardPolicy 来配置 Ingress
Controller 的 ROUTER_ALLOW_WILDCARD_ROUTES 环境变量。
流程
1. 配置通配符策略。
$ oc edit IngressController
spec:
routeAdmission:
wildcardPolicy: WildcardsDisallowed # or WildcardsAllowed
55
OpenShift Container Platform 4.10 网络
6.8.12. 使用 X-Forwarded 标头
您可以将 HAProxy Ingress Controller 配置为指定如何处理 HTTP 标头的策略,其中包括 Forwarded 和
X-Forwarded-For。Ingress Operator 使用 HTTPHeaders 字段配置 Ingress Controller 的
ROUTER_SET_FORWARDED_HEADERS 环境变量。
流程
$ oc edit IngressController
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: default
namespace: openshift-ingress-operator
spec:
httpHeaders:
forwardedHeaderPolicy: Append
使用案例示例
作为集群管理员,您可以:
作为应用程序开发人员,您可以:
注意
您可以根据每个路由设置 haproxy.router.openshift.io/set-forwarded-headers
注解,独立于 Ingress Controller 的全局设置值。
56
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
警告
重要
流程
在单一 Ingress Controller 上启用 HTTP/2。
在整个集群中启用 HTTP/2。
提示
57
OpenShift Container Platform 4.10 网络
提示
apiVersion: config.openshift.io/v1
kind: Ingress
metadata:
name: cluster
annotations:
ingress.operator.openshift.io/default-enable-http2: "true"
重要
警告
先决条件
流程
2. 设置 PROXY 配置:
58
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
spec:
endpointPublishingStrategy:
hostNetwork:
protocol: PROXY
type: HostNetwork
spec:
endpointPublishingStrategy:
nodePort:
protocol: PROXY
type: NodePortService
先决条件
已安装 oc 命令行界面。
流程
a. 编辑 ingress 集群资源 :
b. 编辑 YAML 文件:
apiVersion: config.openshift.io/v1
kind: Ingress
metadata:
name: cluster
spec:
domain: apps.example.com 1
appsDomain: <test.example.com> 2
1 指定默认域。您不能在安装后修改默认域。
注意
a. 公开路由:
输出示例:
$ oc get routes
NAME HOST/PORT PATH SERVICES PORT
TERMINATION WILDCARD
hello-openshift hello_openshift-<my_project>.test.example.com
hello-openshift 8080-tcp None
重要
先决条件
流程
作为集群管理员,您可以使用 oc patch 命令,或设置 Ingress Controller YAML 文件中的
HeaderNameCaseAdjustments 字段来转换 HTTP 标头的大小写。
2. 注解应用程序的路由:
60
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: default
namespace: openshift-ingress-operator
spec:
httpHeaders:
headerNameCaseAdjustments:
- Host
路由 YAML 示例
apiVersion: route.openshift.io/v1
kind: Route
metadata:
annotations:
haproxy.router.openshift.io/h1-adjust-case: true 1
name: my-application
namespace: my-application
spec:
to:
kind: Service
name: my-application
6.8.17. 使用路由器压缩
您可以将 HAProxy Ingress Controller 配置为为特定 MIME 类型全局指定路由器压缩。您可以使用
mimeTypes 变量定义压缩应用到的 MIME 类型的格式。类型包括:application, image, message,
multipart, text, video, 或带有一个 "X-" 前缀的自定义类型。要查看 MIME 类型和子类型的完整表示法,请
参阅 RFC1341。
注意
61
OpenShift Container Platform 4.10 网络
注意
为压缩分配的内存可能会影响最大连接。此外,对大型缓冲区的压缩可能导致延迟,如非
常复杂的正则表达式或较长的正则表达式列表。
流程
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: default
namespace: openshift-ingress-operator
spec:
httpCompression:
mimeTypes:
- "text/html"
- "text/css; charset=utf-8"
- "application/json"
...
注意
62
第 6 章 OPENSHIFT CONTAINER PLATFORM 中的 INGRESS OPERATOR
注意
流程
重要
如果没有为自定义错误代码响应页面指定正确的格式,则会出现路由器 pod 中
断。要解决此中断,您必须删除或更正配置映射并删除受影响的路由器 pod,以便
使用正确的信息重新创建它们。
3. 显示副本:
输出示例
4. 确认包含自定义错误响应页面的配置映射挂载到路由器卷中,其中配置映射键是具有自定义
HTTP 错误代码响应的文件名:
63
OpenShift Container Platform 4.10 网络
验证
验证自定义错误代码 HTTP 响应:
1. 创建测试项目和应用程序:
$ oc new-project test-ingress
$ oc new-app django-psql-example
a. 停止应用的所有容器集。
a. 访问不存在的路由或路由不正确。
6.9. 其他资源
配置自定义 PKI
64
第 7 章 配置 INGRESS CONTROLLER 端点发布策略
图 7.1. NodePortService 图表
集群中的所有可用节点均有自己的外部可访问 IP 地址。集群中运行的服务绑定到所有节点的唯一
NodePort。
注意
65
OpenShift Container Platform 4.10 网络
注意
默认情况下,端口会自动分配,您可以访问集成的端口分配。但是,有时需要静态分配端
口来与现有基础架构集成,这些基础架构可能无法根据动态端口进行重新配置。要实现与
静态节点端口的集成,您可以直接更新受管服务资源。
HostNetwork 端点发布策略
先决条件
已安装 oc CLI。
流程
Progressing 状态条件指示您必须执行进一步的操作。例如,状态条件可以通过输入以下命
令来指示需要删除该服务:
重要
66
第 7 章 配置 INGRESS CONTROLLER 端点发布策略
重要
在某些平台上,需要删除并重新创建服务。
先决条件
已安装 oc CLI。
流程
Progressing 状态条件指示您必须执行进一步的操作。例如,状态条件可以通过输入以下命
令来指示需要删除该服务:
7.2. 其他资源
如需更多信息,请参阅 Ingress Controller 配置参数 。
67
OpenShift Container Platform 4.10 网络
第 8 章 验证到端点的连接
Cluster Network Operator(CNO)运行一个控制器(连接检查控制器),用于在集群的资源间执行连接
健康检查。通过查看健康检查的结果,您可以诊断连接问题或解决网络连接问题,将其作为您要调查的问
题的原因。
8.1. 执行连接健康检查
要验证集群资源是否可以访问,请向以下集群 API 服务的每个服务都有一个 TCP 连接:
负载均衡器
健康检查目标服务
健康检查目标端点
8.2. 连接健康检查实现
在集群中,连接检查控制器或编配连接验证检查。连接测试的结果存储在 openshift-network-
diagnostics 命名空间中的 PodNetworkConnectivity 对象中。连接测试会每分钟以并行方式执行。
健康检查源
此程序部署在一个由 Deployment 对象管理的单个 pod 副本集中。程序会消耗
PodNetworkConnectivity 对象,并连接到每个对象中指定的 spec.targetEndpoint。
健康检查目标
pod 作为集群中每个节点上的守护进程集的一部分部署。pod 侦听入站健康检查。在每个节点上存在
这个 pod 可以测试到每个节点的连接。
字段 类型 描述
68
第 8 章 验证到端点的连接
字段 类型 描述
load-balancer-api-external
load-balancer-api-internal
kubernetes-apiserver-endpoint
kubernetes-apiserver-service-cluster
network-check-target
openshift-apiserver-endpoint
openshift-apiserver-service-cluster
status 对象 代表连接测试条件和最近连接发生和失败的日志的对
象。
status.conditions 数组 连接检查以及任何之前的状态的最新状态。
status.failures 数组 连接测试日志不会失败。
status.outages 数组 涵盖任何中断的时间连接测试日志。
status.successes 数组 成功尝试的连接测试日志。
表 8.2. status.conditions
69
OpenShift Container Platform 4.10 网络
字段 类型 描述
表 8.3. status.outages
字段 类型 描述
endLogs 数组 连接日志条目,包括与成功关闭相关的日志条目。
开始 字符串 第一次检测到连接失败时的时间戳。
startLogs 数组 连接日志条目,包括原始失败。
连接日志字段
下表中描述了连接日志条目的字段。该对象用于以下字段:
status.failures[]
status.successes[]
status.outages[].startLogs[]
status.outages[].endLogs[]
表 8.4. 连接日志对象
字段 类型 描述
70
第 8 章 验证到端点的连接
字段 类型 描述
8.4. 验证端点的网络连接
作为集群管理员,您可以验证端点的连接性,如 API 服务器、负载均衡器、服务或 Pod。
先决条件
安装 OpenShift CLI(oc)。
流程
输出示例
NAME AGE
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-
endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0 75m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-
endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-1 73m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-
endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-2 75m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-apiserver-
service-cluster 75m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-default-
service-cluster 75m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-load-balancer-api-
external 75m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-load-balancer-api-
internal 75m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-
ln-x5sv9rb-f76d1-4rzrp-master-0 75m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-
ln-x5sv9rb-f76d1-4rzrp-master-1 75m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-
ln-x5sv9rb-f76d1-4rzrp-master-2 75m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-
71
OpenShift Container Platform 4.10 网络
ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh 74m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-
ln-x5sv9rb-f76d1-4rzrp-worker-c-n8mbf 74m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-ci-
ln-x5sv9rb-f76d1-4rzrp-worker-d-4hnrz 74m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-network-check-target-
service-cluster 75m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-openshift-apiserver-
endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0 75m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-openshift-apiserver-
endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-1 75m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-openshift-apiserver-
endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-2 74m
network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-openshift-apiserver-
service-cluster 75m
2. 查看连接测试日志:
a. 在上一命令的输出中,标识您要查看连接日志的端点。
b. 要查看对象,请输入以下命令:
输出示例
apiVersion: controlplane.operator.openshift.io/v1alpha1
kind: PodNetworkConnectivityCheck
metadata:
name: network-check-source-ci-ln-x5sv9rb-f76d1-4rzrp-worker-b-6xdmh-to-kubernetes-
apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0
namespace: openshift-network-diagnostics
...
spec:
sourcePod: network-check-source-7c88f6d9f-hmg2f
targetEndpoint: 10.0.0.4:6443
tlsClientCert:
name: ""
status:
conditions:
- lastTransitionTime: "2021-01-13T20:11:34Z"
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
connection to 10.0.0.4:6443 succeeded'
reason: TCPConnectSuccess
status: "True"
type: Reachable
failures:
- latency: 2.241775ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: failed
to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443: connect:
connection refused'
reason: TCPConnectError
success: false
72
第 8 章 验证到端点的连接
time: "2021-01-13T20:10:34Z"
- latency: 2.582129ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: failed
to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443: connect:
connection refused'
reason: TCPConnectError
success: false
time: "2021-01-13T20:09:34Z"
- latency: 3.483578ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: failed
to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443: connect:
connection refused'
reason: TCPConnectError
success: false
time: "2021-01-13T20:08:34Z"
outages:
- end: "2021-01-13T20:11:34Z"
endLogs:
- latency: 2.032018ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
tcp connection to 10.0.0.4:6443 succeeded'
reason: TCPConnect
success: true
time: "2021-01-13T20:11:34Z"
- latency: 2.241775ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
failed to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443:
connect: connection refused'
reason: TCPConnectError
success: false
time: "2021-01-13T20:10:34Z"
- latency: 2.582129ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
failed to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443:
connect: connection refused'
reason: TCPConnectError
success: false
time: "2021-01-13T20:09:34Z"
- latency: 3.483578ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
failed to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443:
connect: connection refused'
reason: TCPConnectError
success: false
time: "2021-01-13T20:08:34Z"
message: Connectivity restored after 2m59.999789186s
start: "2021-01-13T20:08:34Z"
startLogs:
- latency: 3.483578ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0:
failed to establish a TCP connection to 10.0.0.4:6443: dial tcp 10.0.0.4:6443:
connect: connection refused'
reason: TCPConnectError
success: false
time: "2021-01-13T20:08:34Z"
successes:
73
OpenShift Container Platform 4.10 网络
- latency: 2.845865ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
connection to 10.0.0.4:6443 succeeded'
reason: TCPConnect
success: true
time: "2021-01-13T21:14:34Z"
- latency: 2.926345ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
connection to 10.0.0.4:6443 succeeded'
reason: TCPConnect
success: true
time: "2021-01-13T21:13:34Z"
- latency: 2.895796ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
connection to 10.0.0.4:6443 succeeded'
reason: TCPConnect
success: true
time: "2021-01-13T21:12:34Z"
- latency: 2.696844ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
connection to 10.0.0.4:6443 succeeded'
reason: TCPConnect
success: true
time: "2021-01-13T21:11:34Z"
- latency: 1.502064ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
connection to 10.0.0.4:6443 succeeded'
reason: TCPConnect
success: true
time: "2021-01-13T21:10:34Z"
- latency: 1.388857ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
connection to 10.0.0.4:6443 succeeded'
reason: TCPConnect
success: true
time: "2021-01-13T21:09:34Z"
- latency: 1.906383ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
connection to 10.0.0.4:6443 succeeded'
reason: TCPConnect
success: true
time: "2021-01-13T21:08:34Z"
- latency: 2.089073ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
connection to 10.0.0.4:6443 succeeded'
reason: TCPConnect
success: true
time: "2021-01-13T21:07:34Z"
- latency: 2.156994ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
connection to 10.0.0.4:6443 succeeded'
reason: TCPConnect
success: true
time: "2021-01-13T21:06:34Z"
- latency: 1.777043ms
message: 'kubernetes-apiserver-endpoint-ci-ln-x5sv9rb-f76d1-4rzrp-master-0: tcp
74
第 8 章 验证到端点的连接
75
OpenShift Container Platform 4.10 网络
第 9 章 更改集群网络的 MTU
作为集群管理员,您可以在集群安装后更改集群网络的 MTU。这一更改具有破坏性,因为必须重启集群
节点才能完成 MTU 更改。您只能为使用 OVN-Kubernetes 或 OpenShift SDN 集群网络供应商的集群更
改 MTU。
您可能希望因为以下原因更改集群网络的 MTU:
9.1.1. 服务中断注意事项
当您为集群启动 MTU 更改时,以下效果可能会影响服务可用性:
至少需要两个滚动重启才能完成迁移到新的 MTU。在此过程中,一些节点在重启时不可用。
OVN-Kubernetes:100 字节
OpenShift SDN: 50 字节
9.1.3. 迁移过程如何工作
下表对迁移过程进行了概述,它分为操作中的用户发起的步骤,以及在响应过程中迁移过程要执行的操
作。
76
第 9 章 更改集群网络的 MTU
mtu.network.from 字段必须等于
network.status.clusterNetworkMTU 字
段,这是集群网络的当前 MTU。
mtu.network.to 字段必须设置为目标集群
网络 MTU,且必须小于硬件 MTU,以允许
集群网络供应商的覆盖开销。对于 OVN-
Kubernetes,开销为 100 字节,OpenShift
SDN 的开销为 50 字节。
如果提供的值有效,CNO 会生成一个新的临时配置,
它将集群网络集的 MTU 设置为 mtu.network.to 字
段的值。
通过引导参数更改 MTU
在集群网络供应商的 CNO 配置中设置 mtu 值,并将 Machine Config Operator(MCO) :使用新的 MTU
spec.migration 设置为 null 。 配置执行集群中每个节点的滚动重启。
先决条件
77
OpenShift Container Platform 4.10 网络
流程
要增加或减少集群网络的 MTU,请完成以下步骤。
1. 要获得集群网络的当前 MTU,请输入以下命令:
输出示例
...
Status:
Cluster Network:
Cidr: 10.217.0.0/22
Host Prefix: 23
Cluster Network MTU: 1400
Network Type: OpenShiftSDN
Service Network:
10.217.4.0/23
...
dhcp-option-force=26,<mtu>
其中:
<mtu>
指定要公告的 DHCP 服务器的硬件 MTU。
i. 查找主网络接口:
其中:
<node_name>
78
第 9 章 更改集群网络的 MTU
指定集群中的节点的名称。
其中:
<node_name>
指定集群中的节点的名称。
NetworkManager 连接配置示例
[connection-<interface>-mtu]
match-device=interface-name:<interface>
ethernet.mtu=<mtu>
其中:
<mtu>
指定新的硬件 MTU 值。
<interface>
指定主网络接口名称。
variant: openshift
version: 4.10.0
metadata:
name: 01-control-plane-interface
labels:
machineconfiguration.openshift.io/role: master
storage:
files:
- path: /etc/NetworkManager/conf.d/99-<interface>-mtu.conf 1
contents:
local: <interface>-mtu.conf 2
mode: 0600
variant: openshift
version: 4.10.0
79
OpenShift Container Platform 4.10 网络
metadata:
name: 01-worker-interface
labels:
machineconfiguration.openshift.io/role: worker
storage:
files:
- path: /etc/NetworkManager/conf.d/99-<interface>-mtu.conf 1
contents:
local: <interface>-mtu.conf 2
mode: 0600
其中:
<overlay_from>
指定当前的集群网络 MTU 值。
<overlay_to>
指定集群网络的目标 MTU。这个值相对于 <machine_to>,对于 OVN-Kubernetes,值必须
小 100,OpenShift SDN 必须小 50。
<machine_to>
指定底层主机网络上的主网络接口的 MTU。
4. 当 MCO 更新每个机器配置池中的机器时,它会逐一重启每个节点。您必须等到所有节点都已更
新。输入以下命令检查机器配置池状态:
$ oc get mcp
成功更新的节点具有以下状态: UPDATED=true、UPDATING=false、DEGRADED=false。
注意
80
第 9 章 更改集群网络的 MTU
注意
默认情况下,MCO 会一次在一个池中更新一个机器,从而导致迁移总时间随着集
群大小的增加而增加。
5. 确认主机上新机器配置的状态:
a. 要列出机器配置状态和应用的机器配置名称,请输入以下命令:
输出示例
kubernetes.io/hostname=master-0
machineconfiguration.openshift.io/currentConfig: rendered-master-
c53e221d9d24e1c8bb6ee89dd3d8ad7b
machineconfiguration.openshift.io/desiredConfig: rendered-master-
c53e221d9d24e1c8bb6ee89dd3d8ad7b
machineconfiguration.openshift.io/reason:
machineconfiguration.openshift.io/state: Done
验证以下语句是否正确:
machineconfiguration.openshift.io/currentConfig 字段的值等于
machineconfiguration.openshift.io/desiredConfig 字段的值。
b. 要确认机器配置正确,请输入以下命令:
ExecStart=/usr/local/bin/mtu-migration.sh
6. 更新底层网络接口 MTU 值:
7. 当 MCO 更新每个机器配置池中的机器时,它会逐一重启每个节点。您必须等到所有节点都已更
新。输入以下命令检查机器配置池状态:
81
OpenShift Container Platform 4.10 网络
$ oc get mcp
成功更新的节点具有以下状态: UPDATED=true、UPDATING=false、DEGRADED=false。
注意
默认情况下,MCO 会一次在一个池中更新一个机器,从而导致迁移总时间随着集
群大小的增加而增加。
8. 确认主机上新机器配置的状态:
a. 要列出机器配置状态和应用的机器配置名称,请输入以下命令:
输出示例
kubernetes.io/hostname=master-0
machineconfiguration.openshift.io/currentConfig: rendered-master-
c53e221d9d24e1c8bb6ee89dd3d8ad7b
machineconfiguration.openshift.io/desiredConfig: rendered-master-
c53e221d9d24e1c8bb6ee89dd3d8ad7b
machineconfiguration.openshift.io/reason:
machineconfiguration.openshift.io/state: Done
验证以下语句是否正确:
machineconfiguration.openshift.io/currentConfig 字段的值等于
machineconfiguration.openshift.io/desiredConfig 字段的值。
b. 要确认机器配置正确,请输入以下命令:
如果成功部署机器配置,则前面的输出包含 /etc/NetworkManager/system-
connections/<connection_name> 文件路径。
机器配置不得包含 ExecStart=/usr/local/bin/mtu-migration.sh 行。
其中:
82
第 9 章 更改集群网络的 MTU
<mtu>
指定您使用 <overlay_to> 指定的新集群网络 MTU。
其中:
<mtu>
指定您使用 <overlay_to> 指定的新集群网络 MTU。
验证
您可以验证集群中的节点是否使用上一步中指定的 MTU。
1. 要获得集群网络的当前 MTU,请输入以下命令:
2. 获取节点的主网络接口的当前 MTU。
a. 要列出集群中的节点,请输入以下命令:
$ oc get nodes
其中:
<node>
指定上一步中的输出节点。
<interface>
指定节点的主网络接口名称。
输出示例
9.3. 其他资源
使用高级网络选项进行 PXE 和 ISO 安装
使用 nmcli 配置动态以太网连接
83
OpenShift Container Platform 4.10 网络
第 10 章 配置节点端口服务范围
作为集群管理员,您可以扩展可用的节点端口范围。如果您的集群使用大量节点端口,可能需要增加可用
端口的数量。
默认端口范围为 30000-32767。您永远不会缩小端口范围,即使您首先将其扩展超过默认范围。
10.1. 先决条件
集群基础架构必须允许访问您在扩展范围内指定的端口。例如,如果您将节点端口范围扩展到
30000-32900,防火墙或数据包过滤配置必须允许 32768-32900 端口范围。
10.2. 扩展节点端口范围
您可以扩展集群的节点端口范围。
先决条件
安装 OpenShift CLI(oc)。
流程
提示
apiVersion: config.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
serviceNodePortRange: "30000-<port>"
输出示例
network.config.openshift.io/cluster patched
2. 要确认配置是活跃的,请输入以下命令。应用更新可能需要几分钟。
84
第 10 章 配置节点端口服务范围
输出示例
"service-node-port-range":["30000-33000"]
10.3. 其他资源
使用 NodePort 配置集群入口流量
Network [config.openshift.io/v1]
Service [core/v1]
85
OpenShift Container Platform 4.10 网络
第 11 章 配置 IP 故障转移
本节论述了为 OpenShift Container Platform 集群上的 pod 和服务配置 IP 故障转移。
注意
VIP 必须可以从集群外部路由。
重要
设置 NodePort 是一个特权操作。
重要
86
第 11 章 配置 IP 故障转移
重要
11.1. IP 故障转移环境变量
下表包含用于配置 IP 故障转移的变量。
表 11.1. IP 故障转移环境变量
变量名称 默认值 描述
OPENSHIFT_HA_CHECK_INTER 2 检查脚本运行的期间(以秒为单位)。
VAL
87
OpenShift Container Platform 4.10 网络
变量名称 默认值 描述
11.2. 配置 IP 故障转移
作为集群管理员,您可以在整个集群中或在其中的一部分节点(由标签选项器定义)中配置 IP 故障转
移。您还可以在集群中配置多个 IP 故障转移部署配置,每个配置都独立于其他配置。
对于生产环境,设置一个选择器(selector),用于选择至少两个节点,并设置与所选节点数量相等的副
本。
先决条件
流程
1. 创建 IP 故障转移服务帐户:
$ oc create sa ipfailover
2. 为 hostNetwork 更新安全性上下文约束(SCC):
IP 故障转移配置的部署 YAML 示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: ipfailover-keepalived 1
labels:
ipfailover: hello-openshift
spec:
strategy:
type: Recreate
replicas: 2
selector:
matchLabels:
88
第 11 章 配置 IP 故障转移
ipfailover: hello-openshift
template:
metadata:
labels:
ipfailover: hello-openshift
spec:
serviceAccountName: ipfailover
privileged: true
hostNetwork: true
nodeSelector:
node-role.kubernetes.io/worker: ""
containers:
- name: openshift-ipfailover
image: quay.io/openshift/origin-keepalived-ipfailover
ports:
- containerPort: 63000
hostPort: 63000
imagePullPolicy: IfNotPresent
securityContext:
privileged: true
volumeMounts:
- name: lib-modules
mountPath: /lib/modules
readOnly: true
- name: host-slash
mountPath: /host
readOnly: true
mountPropagation: HostToContainer
- name: etc-sysconfig
mountPath: /etc/sysconfig
readOnly: true
- name: config-volume
mountPath: /etc/keepalive
env:
- name: OPENSHIFT_HA_CONFIG_NAME
value: "ipfailover"
- name: OPENSHIFT_HA_VIRTUAL_IPS 2
value: "1.1.1.1-2"
- name: OPENSHIFT_HA_VIP_GROUPS 3
value: "10"
- name: OPENSHIFT_HA_NETWORK_INTERFACE 4
value: "ens3" #The host interface to assign the VIPs
- name: OPENSHIFT_HA_MONITOR_PORT 5
value: "30060"
- name: OPENSHIFT_HA_VRRP_ID_OFFSET 6
value: "0"
- name: OPENSHIFT_HA_REPLICA_COUNT 7
value: "2" #Must match the number of replicas in the deployment
- name: OPENSHIFT_HA_USE_UNICAST
value: "false"
#- name: OPENSHIFT_HA_UNICAST_PEERS
#value: "10.0.148.40,10.0.160.234,10.0.199.110"
- name: OPENSHIFT_HA_IPTABLES_CHAIN 8
value: "INPUT"
#- name: OPENSHIFT_HA_NOTIFY_SCRIPT 9
89
OpenShift Container Platform 4.10 网络
# value: /etc/keepalive/mynotifyscript.sh
- name: OPENSHIFT_HA_CHECK_SCRIPT 10
value: "/etc/keepalive/mycheckscript.sh"
- name: OPENSHIFT_HA_PREEMPTION 11
value: "preempt_delay 300"
- name: OPENSHIFT_HA_CHECK_INTERVAL 12
value: "2"
livenessProbe:
initialDelaySeconds: 10
exec:
command:
- pgrep
- keepalived
volumes:
- name: lib-modules
hostPath:
path: /lib/modules
- name: host-slash
hostPath:
path: /
- name: etc-sysconfig
hostPath:
path: /etc/sysconfig
# config-volume contains the check script
# created with `oc create configmap keepalived-checkscript --from-file=mycheckscript.sh`
- configMap:
defaultMode: 0755
name: keepalived-checkscript
name: config-volume
imagePullSecrets:
- name: openshift-pull-secret 13
1 IP 故障转移部署的名称。
2 要复制的 IP 地址范围列表。必须提供.例如,1.2.3.4-6,1.2.3.9。
90
第 11 章 配置 IP 故障转移
12 检查脚本运行的期间(以秒为单位)。默认值为 2。
11.3. 关于虚拟 IP 地址
keepalived 管理一组虚拟 IP 地址(VIP)。管理员必须确保所有这些地址:
可在集群外部配置的主机上访问。
不可用于集群中的任何其他目的。
注意
11.4. 配置检查和通知脚本
keepalived 通过定期运行可选用户提供的检查脚本来监控应用的健康状况。例如,该脚本可以通过发出请
求并验证响应来测试 Web 服务器。
$1 - group 或 instance
检查和通知在 IP 故障转移容器集中运行的脚本,并使用容器集文件系统,而不是主机文件系统。但
是,IP 故障转移 pod 使主机文件系统在 /hosts 挂载路径下可用。在配置检查或通知脚本时,您必须提供
脚本的完整路径。提供脚本的建议方法是使用配置映射。
91
OpenShift Container Platform 4.10 网络
先决条件
流程
1. 创建所需脚本并创建一个配置映射来容纳它。脚本没有输入参数,并且必须返回 0( OK)和 1(
fail)。
检查脚本,mycheckscript.sh:
#!/bin/bash
# Whatever tests are needed
# E.g., send request and verify response
exit 0
2. 创建配置映射:
注意
提示
92
第 11 章 配置 IP 故障转移
提示
spec:
containers:
- env:
- name: OPENSHIFT_HA_CHECK_SCRIPT 1
value: /etc/keepalive/mycheckscript.sh
...
volumeMounts: 2
- mountPath: /etc/keepalive
name: config-volume
dnsPolicy: ClusterFirst
...
volumes: 3
- configMap:
defaultMode: 0755 4
name: customrouter
name: config-volume
...
保存更改并退出编辑器。这会重启 ipfailover-keepalived。
11.5. 配置 VRRP 抢占
当一个节点上的虚拟 IP(VIP)因为通过了检查脚本的检查而脱离 fault 状态时,如果其优先级低于当前
处于 master 状态的节点上的 VIP,则节点上的 VIP 将进入 backup 状态。但是,如果脱离 fault 状态的
节点上的 VIP 具有更高的优先级,则抢占策略会决定其在集群中的角色。
先决条件
流程
...
93
OpenShift Container Platform 4.10 网络
spec:
containers:
- env:
- name: OPENSHIFT_HA_PREEMPTION 1
value: preempt_delay 300
...
1 设置 OPENSHIFT_HA_PREEMPTION 值:
11.6. 关于 VRRP ID 偏移
每个 IP 转移 pod 由 IP 故障转移部署配置管理,每个节点 1 个 pod,以一个 Keepalived 守护进程运行。
配置更多 IP 故障转移部署配置后,会创建更多 pod,更多的守护进程加入常见的虚拟路由器冗余协议
(VRRP)协商。此协商由所有 Keepalived 守护进程完成,它决定了哪些节点服务是哪个虚拟
IP(VIP)。
注意
使用故障转移的一个规则是,请勿将路由等服务限制到一个特定的主机。相反,服务应复
制到每一主机上,以便在 IP 故障转移时,不必在新主机上重新创建服务。
注意
先决条件
94
第 11 章 配置 IP 故障转移
流程
...
spec:
env:
- name: OPENSHIFT_HA_VIP_GROUPS 1
value: "3"
...
注意
11.9. 删除 IP 故障切换
在初始配置 IP 故障切换时,集群中的 worker 节点会使用 iptables 规则修改,该规则明确允许
Keepalived 在 224.0.0.18 上多播数据包。由于对节点的更改,移除 IP 故障切换需要运行一个作业来删除
iptables 规则并删除 Keepalived 使用的虚拟 IP 地址。
流程
1. 可选:识别并删除存储为配置映射的任何检查和通知脚本:
95
OpenShift Container Platform 4.10 网络
输出示例
Namespace: default
Pod: keepalived-worker-59df45db9c-2x9mn
Volumes that use config maps:
volume: config-volume
configMap: mycustomcheck
b. 如果上一步提供了用作卷的配置映射的名称,请删除配置映射:
2. 为 IP 故障切换识别现有部署:
输出示例
3. 删除部署:
4. 删除 ipfailover 服务帐户:
$ oc delete sa ipfailover
a. 创建一个文件,如 remove-ipfailover-job.yaml,其内容类似以下示例:
apiVersion: batch/v1
kind: Job
metadata:
generateName: remove-ipfailover-
labels:
app: remove-ipfailover
spec:
template:
metadata:
name: remove-ipfailover
spec:
containers:
- name: remove-ipfailover
image: quay.io/openshift/origin-keepalived-ipfailover:4.10
command: ["/var/lib/ipfailover/keepalived/remove-failover.sh"]
96
第 11 章 配置 IP 故障转移
nodeSelector:
kubernetes.io/hostname: <host_name> <.>
restartPolicy: Never
b. 运行作业:
$ oc create -f remove-ipfailover-job.yaml
输出示例
job.batch/remove-ipfailover-2h8dm created
验证
确认作业删除了 IP 故障切换的初始配置。
$ oc logs job/remove-ipfailover-2h8dm
输出示例
97
OpenShift Container Platform 4.10 网络
第 12 章 在裸机集群中使用流控制传输协议 (SCTP)
作为集群管理员,您可以使用集群中的流控制传输协议 (SCTP)。
apiVersion: v1
kind: Pod
metadata:
namespace: project1
name: example-pod
spec:
containers:
- name: example-pod
...
ports:
- containerPort: 30100
name: sctpserver
protocol: SCTP
在以下示例中,服务被配置为使用 SCTP:
apiVersion: v1
kind: Service
metadata:
namespace: project1
name: sctpserver
spec:
...
ports:
- name: sctpserver
protocol: SCTP
port: 30100
targetPort: 30100
type: ClusterIP
98
第 12 章 在裸机集群中使用流控制传输协议 (SCTP)
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-sctp-on-http
spec:
podSelector:
matchLabels:
role: web
ingress:
- ports:
- protocol: SCTP
port: 80
先决条件
安装 OpenShift CLI(oc)。
流程
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
name: load-sctp-module
labels:
machineconfiguration.openshift.io/role: worker
spec:
config:
ignition:
version: 3.2.0
storage:
files:
- path: /etc/modprobe.d/sctp-blacklist.conf
mode: 0644
overwrite: true
contents:
source: data:,
- path: /etc/modules-load.d/sctp-load.conf
mode: 0644
overwrite: true
contents:
source: data:,sctp
$ oc create -f load-sctp-module.yaml
$ oc get nodes
先决条件
从集群访问互联网来安装 nc 软件包。
流程
apiVersion: v1
kind: Pod
metadata:
name: sctpserver
labels:
app: sctpserver
spec:
containers:
- name: sctpserver
image: registry.access.redhat.com/ubi8/ubi
command: ["/bin/sh", "-c"]
args:
["dnf install -y nc && sleep inf"]
ports:
- containerPort: 30102
name: sctpserver
protocol: SCTP
b. 运行以下命令来创建 pod:
$ oc create -f sctp-server.yaml
apiVersion: v1
kind: Service
metadata:
name: sctpservice
100
第 12 章 在裸机集群中使用流控制传输协议 (SCTP)
labels:
app: sctpserver
spec:
type: NodePort
selector:
app: sctpserver
ports:
- name: sctpserver
protocol: SCTP
port: 30102
targetPort: 30102
b. 要创建服务,请输入以下命令:
$ oc create -f sctp-service.yaml
apiVersion: v1
kind: Pod
metadata:
name: sctpclient
labels:
app: sctpclient
spec:
containers:
- name: sctpclient
image: registry.access.redhat.com/ubi8/ubi
command: ["/bin/sh", "-c"]
args:
["dnf install -y nc && sleep inf"]
$ oc apply -f sctp-client.yaml
a. 要连接到服务器 pod,请输入以下命令:
$ oc rsh sctpserver
$ nc -l 30102 --sctp
a. 在终端程序里打开一个新的终端窗口或标签页。
101
OpenShift Container Platform 4.10 网络
c. 要连接到客户端 pod,请输入以下命令:
$ oc rsh sctpclient
102
第 13 章 使用 PTP 硬件
第 13 章 使用 PTP 硬件
重要
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
13.1. 关于 PTP 硬件
您可以配置 linuxptp 服务,并在 OpenShift Container Platform 集群节点中使用具有 PTP 功能的硬件。
注意
管理 linuxptp 服务的配置。
13.2. 关于 PTP
精度时间协议(PTP)用于同步网络中的时钟。与硬件支持一起使用时,PTP 能够达到微秒级的准确性,比
网络时间协议 (NTP) 更加准确。
Grandmaster 时钟
grandmaster 时钟向网络上的其他时钟提供标准时间信息并确保准确和稳定的同步。它写入时间戳并
响应来自其他时钟的时间间隔。Grandmaster 时钟可同步到全球位置系统(GPS)时间源。
Ordinary 时钟
Ordinary(普通)时钟具有一个端口连接,可根据其在网络中的位置扮演源或目标时钟的角色。普通
时钟可以读取和写入时间戳。
Boundary 时钟
Boundary(边界)时钟在两个或更多个通信路径中具有端口,并且可以是指向其他目标时钟的源和目
103
OpenShift Container Platform 4.10 网络
标。边界时钟作为上游目标时钟工作。目标时钟接收计时消息,针对延迟进行调整,然后创建一个新
的源时间信号来传递网络。边界时钟生成一个新的计时数据包,它仍然与源时钟正确同步,并可减少
直接报告到源时钟的连接设备数量。
重要
先决条件
安装 OpenShift CLI(oc)。
流程
apiVersion: v1
kind: Namespace
metadata:
name: openshift-ptp
annotations:
workload.openshift.io/allowed: management
104
第 13 章 使用 PTP 硬件
labels:
name: openshift-ptp
openshift.io/cluster-monitoring: "true"
b. 创建 Namespace CR:
$ oc create -f ptp-namespace.yaml
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
name: ptp-operators
namespace: openshift-ptp
spec:
targetNamespaces:
- openshift-ptp
b. 创建 OperatorGroup CR:
$ oc create -f ptp-operatorgroup.yaml
3. 订阅 PTP Operator。
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: ptp-operator-subscription
namespace: openshift-ptp
spec:
channel: "stable"
name: ptp-operator
source: redhat-operators
sourceNamespace: openshift-marketplace
b. 创建 Subscription CR:
$ oc create -f ptp-sub.yaml
4. 要验证是否已安装 Operator,请输入以下命令:
输出示例
Name Phase
4.10.0-202201261535 Succeeded
105
OpenShift Container Platform 4.10 网络
注意
如上一节所述,您必须创建命名空间和 operator 组。
流程
注意
如果 Operator 没有被成功安装,请按照以下步骤进行故障排除:
13.5. 配置 PTP 设备
PTP Operator 将 NodePtpDevice.ptp.openshift.io 自定义资源定义(CRD)添加到 OpenShift
Container Platform。
输出示例
apiVersion: v1
106
第 13 章 使用 PTP 硬件
items:
- apiVersion: ptp.openshift.io/v1
kind: NodePtpDevice
metadata:
creationTimestamp: "2022-01-27T15:16:28Z"
generation: 1
name: dev-worker-0 1
namespace: openshift-ptp
resourceVersion: "6538103"
uid: d42fc9ad-bcbf-4590-b6d8-b676c642781a
spec: {}
status:
devices: 2
- name: eno1
- name: eno2
- name: eno3
- name: eno4
- name: enp5s0f0
- name: enp5s0f1
...
1 name 参数的值与父节点的名称相同。
注意
先决条件
安装 OpenShift CLI(oc)。
安装 PTP Operator。
流程
apiVersion: ptp.openshift.io/v1
kind: PtpConfig
107
OpenShift Container Platform 4.10 网络
metadata:
name: ordinary-clock-ptp-config
namespace: openshift-ptp
spec:
profile:
- name: ordinary-clock
interface: "<interface_name>"
phc2sysOpts: "-a -r -n 24"
ptp4lOpts: "-2 -s"
ptpSchedulingPolicy: SCHED_FIFO
ptpSchedulingPriority: 10
ptp4lConf: |
[global]
#
# Default Data Set
#
twoStepFlag 1
slaveOnly 1
priority1 128
priority2 128
domainNumber 24
clockClass 255
clockAccuracy 0xFE
offsetScaledLogVariance 0xFFFF
free_running 0
freq_est_interval 1
dscp_event 0
dscp_general 0
dataset_comparison G.8275.x
G.8275.defaultDS.localPriority 128
#
# Port Data Set
#
logAnnounceInterval -3
logSyncInterval -4
logMinDelayReqInterval -4
logMinPdelayReqInterval -4
announceReceiptTimeout 3
syncReceiptTimeout 0
delayAsymmetry 0
fault_reset_interval 4
neighborPropDelayThresh 20000000
masterOnly 0
G.8275.portDS.localPriority 128
#
# Run time options
#
assume_two_step 0
logging_level 6
path_trace_enabled 0
follow_up_info 0
hybrid_e2e 0
inhibit_multicast_service 0
net_sync_monitor 0
tc_spanning_tree 0
tx_timestamp_timeout 50
108
第 13 章 使用 PTP 硬件
unicast_listen 0
unicast_master_table 0
unicast_req_duration 3600
use_syslog 1
verbose 0
summary_interval 0
kernel_leap 1
check_fup_sync 0
#
# Servo Options
#
pi_proportional_const 0.0
pi_integral_const 0.0
pi_proportional_scale 0.0
pi_proportional_exponent -0.3
pi_proportional_norm_max 0.7
pi_integral_scale 0.0
pi_integral_exponent 0.4
pi_integral_norm_max 0.3
step_threshold 2.0
first_step_threshold 0.00002
max_frequency 900000000
clock_servo pi
sanity_freq_limit 200000000
ntpshm_segment 0
#
# Transport options
#
transportSpecific 0x0
ptp_dst_mac 01:1B:19:00:00:00
p2p_dst_mac 01:80:C2:00:00:0E
udp_ttl 1
udp6_scope 0x0E
uds_address /var/run/ptp4l
#
# Default interface options
#
clock_type OC
network_transport L2
delay_mechanism E2E
time_stamping hardware
tsproc_mode filter
delay_filter moving_median
delay_filter_length 10
egressLatency 0
ingressLatency 0
boundary_clock_jbod 0
#
# Clock description
#
productDescription ;;
revisionData ;;
manufacturerIdentity 00:00:00
userDescription ;
timeSource 0xA0
recommend:
109
OpenShift Container Platform 4.10 网络
- profile: ordinary-clock
priority: 4
match:
- nodeLabel: "node-role.kubernetes.io/worker"
nodeName: "<node_name>"
自定义资源字段 描述
110
第 13 章 使用 PTP 硬件
自定义资源字段 描述
$ oc create -f ordinary-clock-ptp-config.yaml
验证
1. 检查 PtpConfig 配置集是否已应用到节点。
输出示例
111
OpenShift Container Platform 4.10 网络
1.example.com
ptp-operator-657bbb64c8-2f8sj 1/1 Running 0 43m 10.129.0.61 control-
plane-1.example.com
输出示例
其他资源
注意
先决条件
安装 OpenShift CLI(oc)。
安装 PTP Operator。
流程
112
第 13 章 使用 PTP 硬件
---
apiVersion: ptp.openshift.io/v1
kind: PtpConfig
metadata:
name: boundary-clock-ptp-config
namespace: openshift-ptp
spec:
profile:
- name: boundary-clock
phc2sysOpts: "-a -r -n 24"
ptp4lOpts: "-2"
ptpSchedulingPolicy: SCHED_FIFO
ptpSchedulingPriority: 10
ptp4lConf: |
[<interface_1>]
masterOnly 0
[<interface_2>]
masterOnly 1
[<interface_3>]
masterOnly 1
[<interface_4>]
masterOnly 1
[global]
#
# Default Data Set
#
twoStepFlag 1
slaveOnly 0
priority1 128
priority2 128
domainNumber 24
clockClass 248
clockAccuracy 0xFE
offsetScaledLogVariance 0xFFFF
free_running 0
freq_est_interval 1
dscp_event 0
dscp_general 0
dataset_comparison G.8275.x
G.8275.defaultDS.localPriority 128
#
# Port Data Set
#
logAnnounceInterval -3
logSyncInterval -4
logMinDelayReqInterval -4
logMinPdelayReqInterval -4
announceReceiptTimeout 3
syncReceiptTimeout 0
delayAsymmetry 0
fault_reset_interval 4
neighborPropDelayThresh 20000000
masterOnly 0
G.8275.portDS.localPriority 128
#
# Run time options
113
OpenShift Container Platform 4.10 网络
#
assume_two_step 0
logging_level 6
path_trace_enabled 0
follow_up_info 0
hybrid_e2e 0
inhibit_multicast_service 0
net_sync_monitor 0
tc_spanning_tree 0
tx_timestamp_timeout 50
unicast_listen 0
unicast_master_table 0
unicast_req_duration 3600
use_syslog 1
verbose 0
summary_interval 0
kernel_leap 1
check_fup_sync 0
#
# Servo Options
#
pi_proportional_const 0.0
pi_integral_const 0.0
pi_proportional_scale 0.0
pi_proportional_exponent -0.3
pi_proportional_norm_max 0.7
pi_integral_scale 0.0
pi_integral_exponent 0.4
pi_integral_norm_max 0.3
step_threshold 2.0
first_step_threshold 0.00002
max_frequency 900000000
clock_servo pi
sanity_freq_limit 200000000
ntpshm_segment 0
#
# Transport options
#
transportSpecific 0x0
ptp_dst_mac 01:1B:19:00:00:00
p2p_dst_mac 01:80:C2:00:00:0E
udp_ttl 1
udp6_scope 0x0E
uds_address /var/run/ptp4l
#
# Default interface options
#
clock_type BC
network_transport L2
delay_mechanism E2E
time_stamping hardware
tsproc_mode filter
delay_filter moving_median
delay_filter_length 10
egressLatency 0
ingressLatency 0
114
第 13 章 使用 PTP 硬件
boundary_clock_jbod 0
#
# Clock description
#
productDescription ;;
revisionData ;;
manufacturerIdentity 00:00:00
userDescription ;
timeSource 0xA0
recommend:
- profile: boundary-clock
priority: 4
match:
- nodeLabel: node-role.kubernetes.io/master
nodeName: <nodename>
自定义资源字段 描述
name 指定唯一标识配置集对象的配置集对象的名称。
<interface_1> 接收同步时钟的接口。
<interface_2> 发送同步时钟的接口。
115
OpenShift Container Platform 4.10 网络
自定义资源字段 描述
2. 运行以下命令来创建 CR:
$ oc create -f boundary-clock-ptp-config.yaml
验证
1. 检查 PtpConfig 配置集是否已应用到节点。
116
第 13 章 使用 PTP 硬件
输出示例
输出示例
其他资源
先决条件
安装 OpenShift CLI(oc)。
安装 PTP Operator。
流程
117
OpenShift Container Platform 4.10 网络
apiVersion: ptp.openshift.io/v1
kind: PtpConfig
metadata:
name: boundary-clock-ptp-config-nic1
namespace: openshift-ptp
spec:
profile:
- name: "profile1"
ptp4lOpts: "-2 --summary_interval -4"
ptp4lConf: | 1
[ens5f1]
masterOnly 1
[ens5f0]
masterOnly 0
...
phc2sysOpts: "-a -r -m -n 24 -N 8 -R 16" 2
apiVersion: ptp.openshift.io/v1
kind: PtpConfig
metadata:
name: boundary-clock-ptp-config-nic2
namespace: openshift-ptp
spec:
profile:
- name: "profile2"
ptp4lOpts: "-2 --summary_interval -4"
ptp4lConf: | 1
[ens7f1]
masterOnly 1
[ens7f0]
masterOnly 0
...
注意
118
第 13 章 使用 PTP 硬件
$ oc create -f boundary-clock-ptp-config-nic1.yaml
$ oc create -f boundary-clock-ptp-config-nic2.yaml
验证
输出示例
PTP 配置 推荐的设置
phc2sysOpts -a -r -m -n 24 -N 8 -R 16
tx_timestamp_timeout 50
boundary_clock_jbod 0
注意
其他资源
119
OpenShift Container Platform 4.10 网络
注意
设置 ptpSchedulingPolicy 是可选的,只有在遇到延迟错误时才需要。
流程
1. 编辑 PtpConfig CR 配置集:
apiVersion: ptp.openshift.io/v1
kind: PtpConfig
metadata:
name: <ptp_config_name>
namespace: openshift-ptp
...
spec:
profile:
- name: "profile1"
...
ptpSchedulingPolicy: SCHED_FIFO 1
ptpSchedulingPriority: 10 2
验证
输出示例
120
第 13 章 使用 PTP 硬件
1.example.com
ptp-operator-3r4dcvf7f4-zndk7 1/1 Running 0 1d7h 10.129.0.61 control-plane-
1.example.com
输出示例
先决条件
流程
输出示例
注意
2. 检查集群中是否已找到支持的硬件。
输出示例
121
OpenShift Container Platform 4.10 网络
NAME AGE
control-plane-0.example.com 10d
control-plane-1.example.com 10d
compute-0.example.com 10d
compute-1.example.com 10d
compute-2.example.com 10d
其中:
<node_name>
指定您要查询的节点,例如 compute-0.example.com。
输出示例
apiVersion: ptp.openshift.io/v1
kind: NodePtpDevice
metadata:
creationTimestamp: "2021-09-14T16:52:33Z"
generation: 1
name: compute-0.example.com
namespace: openshift-ptp
resourceVersion: "177400"
uid: 30413db0-4d8d-46da-9bef-737bacd548fd
spec: {}
status:
devices:
- name: eno1
- name: eno2
- name: eno3
- name: eno4
- name: enp5s0f0
- name: enp5s0f1
输出示例
122
第 13 章 使用 PTP 硬件
其中:
<linux_daemon_container>
您要诊断的容器,如 linuxptp-daemon-lmvgn。
当节点成功同步到主时钟时的输出示例
重要
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
注意
124
第 13 章 使用 PTP 硬件
先决条件
流程
验证
输出示例
输出示例
125
OpenShift Container Platform 4.10 网络
先决条件
流程
apiVersion: ptp.openshift.io/v1
kind: PtpOperatorConfig
metadata:
name: default
namespace: openshift-ptp
spec:
daemonNodeSelector:
node-role.kubernetes.io/worker: ""
ptpEventConfig:
enableEventPublisher: true 1
transportHost: amqp://<instance_name>.<namespace>.svc.cluster.local 2
b. 更新 PtpOperatorConfig CR:
$ oc apply -f ptp-operatorconfig.yaml
spec:
profile:
- name: "profile1"
interface: "enp5s0f0"
ptp4lOpts: "-2 -s --summary_interval -4" 1
phc2sysOpts: "-a -r -m -n 24 -N 8 -R 16" 2
ptp4lConf: "" 3
ptpClockThreshold: 4
holdOverTimeout: 5
maxOffsetThreshold: 100
minOffsetThreshold: -100
126
第 13 章 使用 PTP 硬件
其他资源
/api/ocloudNotifications/v1/subscriptions
POST :创建新订阅
GET :删除订阅列表
/api/ocloudNotifications/v1/subscriptions/<subscription_id>
api/ocloudNotifications/v1/subscriptions/status/<subscription_id>
/api/ocloudNotifications/v1/health
注意
127
OpenShift Container Platform 4.10 网络
注意
13.7.5.1. api/ocloudNotifications/v1/subscriptions
13.7.5.1.1. HTTP 方法
GET api/ocloudNotifications/v1/subscriptions
13.7.5.1.1.1. 描述
API 响应示例
[
{
"id": "75b1ad8f-c807-4c23-acf5-56f4b7ee3826",
"endpointUri": "http://localhost:9089/event",
"uriLocation": "http://localhost:8089/api/ocloudNotifications/v1/subscriptions/75b1ad8f-c807-4c23-
acf5-56f4b7ee3826",
"resource": "/cluster/node/compute-1.example.com/ptp"
}
]
13.7.5.1.2. HTTP 方法
POST api/ocloudNotifications/v1/subscriptions
13.7.5.1.2.1. 描述
表 13.4. 查询参数
参数 类型
subscription data
有效负载示例
{
"uriLocation": "http://localhost:8089/api/ocloudNotifications/v1/subscriptions",
"resource": "/cluster/node/compute-1.example.com/ptp"
}
13.7.5.2. api/ocloudNotifications/v1/subscriptions/<subscription_id>
13.7.5.2.1. HTTP 方法
128
第 13 章 使用 PTP 硬件
GET api/ocloudNotifications/v1/subscriptions/<subscription_id>
13.7.5.2.1.1. 描述
返回 ID 为 <subscription_id> 的订阅详情
表 13.5. 查询参数
参数 类型
<subscription_id> 字符串
API 响应示例
{
"id":"48210fb3-45be-4ce0-aa9b-41a0e58730ab",
"endpointUri": "http://localhost:9089/event",
"uriLocation":"http://localhost:8089/api/ocloudNotifications/v1/subscriptions/48210fb3-45be-4ce0-
aa9b-41a0e58730ab",
"resource":"/cluster/node/compute-1.example.com/ptp"
}
13.7.5.3. api/ocloudNotifications/v1/subscriptions/status/<subscription_id>
13.7.5.3.1. HTTP 方法
PUT api/ocloudNotifications/v1/subscriptions/status/<subscription_id>
13.7.5.3.1.1. 描述
表 13.6. 查询参数
参数 类型
<subscription_id> 字符串
API 响应示例
{"status":"ping sent"}
13.7.5.4. api/ocloudNotifications/v1/health/
13.7.5.4.1. HTTP 方法
GET api/ocloudNotifications/v1/health/
13.7.5.4.1.1. 描述
129
OpenShift Container Platform 4.10 网络
API 响应示例
OK
注意
先决条件
流程
输出示例
其中:
<linuxptp-daemon>
指定您要查询的 pod,例如 linuxptp-daemon-2t78p。
输出示例
130
第 13 章 使用 PTP 硬件
先决条件
流程
其中:
<linuxptp_daemon_pod>
指定您要查询的 pod,例如 linuxptp-daemon-2t78p。
其他资源
管理指标
131
OpenShift Container Platform 4.10 网络
第 14 章 外部 DNS OPERATOR
流程
您可以根据 OperatorHub 的要求部署 ExternalDNS Operator,这会创建一个 Subscription 对象。
1. 检查安装计划的名称:
输出示例
install-zcvlr
2. 检查安装计划的状态,安装计划的状态必须为 Complete :
输出示例
Complete
3. 使用 oc get 命令来查看部署状态 :
输出示例
流程
132
第 14 章 外部 DNS OPERATOR
流程
3. 选择 external-dns-operator 命名空间。
a. 将频道更新为 stable-v1.0。
e. 点 Install。
验证
验证 External DNS Operator 是否在 Installed Operators 仪表板上显示 Status 为 Succeeded。
133
OpenShift Container Platform 4.10 网络
参数 描述
spec 启用云供应商的类型。
spec:
provider:
type: AWS 1
aws:
credentials:
name: aws-access-key 2
zones:
- "myzoneid" 1
1 指定 DNS 区 ID。
domains:
- filterType: Include 1
matchType: Exact 2
name: "myzonedomain1.com" 3
- filterType: Include
matchType: Pattern 4
pattern: ".*\\.otherzonedomain\\.com" 5
1 指示 ExternalDNS 包含指定的域。
2 指示 ExtrnalDNS 指示域匹配必须完全匹配,而不是正则表达式匹配。
3 定义 ExternalDNS 过滤器的确切域名。
134
第 14 章 外部 DNS OPERATOR
参数 描述
source: 1
type: Service 2
service:
serviceType: 3
- LoadBalancer
- ClusterIP
labelFilter: 4
matchLabels:
external-dns.mydomain.org/publish: "yes"
hostnameAnnotation: "Allow" 5
fqdnTemplate:
- "{{.Name}}.myzonedomain.com" 6
1 定义 DNS 记录源的设置。
默认:LoadBalancer
预期:ClusterIP
NodePort
LoadBalancer
ExternalName
4 确保控制器只考虑与标签过滤器匹配的资源。
source:
type: OpenShiftRoute 1
openshiftRouteOptions:
routerName: default 2
labelFilter:
matchLabels:
external-dns.mydomain.org/publish: "yes"
135
OpenShift Container Platform 4.10 网络
参数 描述
流程
$ oc whoami
输出示例
system:admin
3. 获取路由来检查域:
输出示例
输出示例
136
第 14 章 外部 DNS OPERATOR
2 默认情况下,所有托管区都被选为潜在的目标。您可以包括需要的托管区。
3 目标区的域匹配必须是完全准确的(与正则表达式匹配不同)。
4 指定您要更新的区域的确切域。路由的主机名必须是指定域的子域。
6 定义 DNS 记录源的选项。
14.5.1. 使用 Red Hat External DNS Operator 在 Azure 公共 DNS 区上创建 DNS 记录
您可以使用 Red Hat External DNS Operator 为 Azure 的公共 DNS 区域创建 DNS 记录。
流程
137
OpenShift Container Platform 4.10 网络
$ oc whoami
输出示例
system:admin
4. 获取路由来检查域:
输出示例
apiVersion: externaldns.olm.openshift.io/v1alpha1
kind: ExternalDNS
metadata:
name: sample-azure 1
spec:
zones:
- "/subscriptions/1234567890/resourceGroups/test-azure-xxxxx-
138
第 14 章 外部 DNS OPERATOR
rg/providers/Microsoft.Network/dnszones/test.azure.example.com" 2
provider:
type: Azure 3
source:
openshiftRouteOptions: 4
routerName: default 5
type: OpenShiftRoute 6
EOF
2 定义区域 ID。
注意
流程
$ oc whoami
输出示例
system:admin
139
OpenShift Container Platform 4.10 网络
3. 导出 Google 凭证:
$ export GOOGLE_CREDENTIALS=decoded-gcloud.json
4. 使用以下命令激活您的帐户:
5. 设置项目:
6. 获取路由来检查域:
输出示例
7. 获取受管区列表以查找与之前找到的路由域对应的区:
apiVersion: externaldns.olm.openshift.io/v1alpha1
kind: ExternalDNS
metadata:
name: sample-gcp 1
spec:
domains:
- filterType: Include 2
matchType: Exact 3
name: test.gcp.example.com 4
provider:
type: GCP 5
source:
openshiftRouteOptions: 6
140
第 14 章 外部 DNS OPERATOR
routerName: default 7
type: OpenShiftRoute 8
EOF
2 默认情况下,所有托管区都被选为潜在的目标。您可以包括需要的托管区。
3 目标区的域匹配必须是完全准确的(与正则表达式匹配不同)。
4 指定您要更新的区域的确切域。路由的主机名必须是指定域的子域。
流程
141
OpenShift Container Platform 4.10 网络
验证
输出示例
trusted-ca
142
第 15 章 网络策略
第 15 章 网络策略
15.1. 关于网络策略
作为集群管理员,您可以定义网络策略以限制到集群中的 pod 的网络通讯。
15.1.1. 关于网络策略
在使用支持 Kubernetes 网络策略的 Kubernetes Container Network Interface(CNI)插件的集群中,网
络隔离完全由 NetworkPolicy 对象控制。
警告
拒绝所有流量:
要使项目默认为拒绝流量,请添加一个匹配所有 pod 但不接受任何流量的 NetworkPolicy 对
象:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-by-default
spec:
podSelector: {}
ingress: []
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-openshift-ingress
143
OpenShift Container Platform 4.10 网络
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
network.openshift.io/policy-group: ingress
podSelector: {}
policyTypes:
- Ingress
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-same-namespace
spec:
podSelector: {}
ingress:
- from:
- podSelector: {}
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-http-and-https
spec:
podSelector:
matchLabels:
role: frontend
ingress:
- ports:
- protocol: TCP
port: 80
- protocol: TCP
port: 443
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-pod-and-namespace-both
spec:
podSelector:
matchLabels:
144
第 15 章 网络策略
name: test-pods
ingress:
- from:
- namespaceSelector:
matchLabels:
project: project_name
podSelector:
matchLabels:
name: test-pods
15.1.2. 网络策略优化
使用一个网络策略来通过 pod 上的不同标签来在命名空间中将不同 pod 进行隔离。
注意
在设计您的网络策略时,请参考以下指南:
15.1.3. 后续步骤
创建网络策略
可选:定义默认网络策略
15.1.4. 其他资源
项目和命名空间
配置多租户网络策略
145
OpenShift Container Platform 4.10 网络
网络策略 API
15.2. 记录网络策略事件
作为集群管理员,您可以为集群配置网络策略审计日志记录,并为一个或多个命名空间启用日志记录。
注意
15.2.1. 网络策略审计日志记录
OVN-Kubernetes 集群网络供应商使用 Open Virtual Network(OVN)ACL 管理网络策略。审计日志记
录会公开允许和拒绝 ACL 事件。
命名空间注解示例
kind: Namespace
apiVersion: v1
metadata:
name: example1
annotations:
k8s.ovn.org/acl-logging: |-
{
"deny": "info",
"allow": "info"
}
ACL 拒绝日志条目示例
2021-06-13T19:33:11.590Z|00005|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-logging_deny-all",
verdict=drop, severity=alert:
icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:39,dl_dst=0a:58:0a:80:02:37,nw_src=10.128.2.57,nw_dst=
10.128.2.55,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0
下表描述了命名空间注解值:
表 15.1. 网络策略审计日志记录命名空间注解
注解 值
146
第 15 章 网络策略
注解 值
deny
可选:指定 alert、warning、notice、info 或 debug。
allow
可选:指定 alert、warning、notice、info 或 debug。
15.2.2. 网络策略审计配置
审计日志记录的配置作为 OVN-Kubernetes 集群网络配置的一部分指定。以下 YAML 演示了网络策略审
计日志记录功能的默认值。
审计日志记录配置
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
defaultNetwork:
ovnKubernetesConfig:
policyAuditConfig:
destination: "null"
maxFileSize: 50
rateLimit: 20
syslogFacility: local0
下表描述了网络策略审计日志记录的配置字段。
表 15.2. policyAuditConfig 对象
字段 类型 描述
rateLimit 整数 每个节点每秒生成一次的消息数量上限。默认值为每秒 20 条消
息。
147
OpenShift Container Platform 4.10 网络
字段 类型 描述
libc
主机上的 journald 进程的 libc syslog() 函数。
UDP:<host>:<port>
一个 syslog 服务器。将 <host>:<port> 替换为 syslog 服
务器的主机 和端口。
Unix:<file>
由 <file> 指定的 Unix 域套接字文件。
null
不要将审计日志发送到任何其他目标。
15.2.3. 为集群配置网络策略审计
作为集群管理员,您可以自定义集群的网络策略审计日志记录。
先决条件
安装 OpenShift CLI(oc)。
流程
要自定义网络策略审计日志记录配置,请输入以下命令:
$ oc edit network.operator.openshift.io/cluster
提示
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
defaultNetwork:
ovnKubernetesConfig:
policyAuditConfig:
destination: "null"
maxFileSize: 50
rateLimit: 20
syslogFacility: local0
148
第 15 章 网络策略
验证
1. 要创建带有网络策略的命名空间,请完成以下步骤:
a. 创建命名空间进行验证:
输出示例
namespace/verify-audit-logging created
b. 启用审计日志记录:
namespace/verify-audit-logging annotated
c. 为命名空间创建网络策略:
149
OpenShift Container Platform 4.10 网络
- namespaceSelector:
matchLabels:
namespace: verify-audit-logging
EOF
输出示例
networkpolicy.networking.k8s.io/deny-all created
networkpolicy.networking.k8s.io/allow-from-same-namespace created
输出示例
pod/client created
pod/server created
4. 要生成流量并生成网络策略审计日志条目,请完成以下步骤:
150
第 15 章 网络策略
输出示例
输出示例
5. 显示网络策略审计日志中的最新条目:
输出示例
151
OpenShift Container Platform 4.10 网络
15.2.4. 为命名空间启用网络策略审计日志记录
作为集群管理员,您可以为命名空间启用网络策略审计日志记录。
先决条件
安装 OpenShift CLI(oc)。
流程
要为命名空间启用网络策略审计日志记录,请输入以下命令:
其中:
<namespace>
指定命名空间的名称。
提示
kind: Namespace
apiVersion: v1
metadata:
name: <namespace>
annotations:
k8s.ovn.org/acl-logging: |-
{
"deny": "alert",
"allow": "notice"
}
输出示例
namespace/verify-audit-logging annotated
验证
显示网络策略审计日志中的最新条目:
152
第 15 章 网络策略
done
输出示例
2021-06-13T19:33:11.590Z|00005|acl_log(ovn_pinctrl0)|INFO|name="verify-audit-
logging_deny-all", verdict=drop, severity=alert:
icmp,vlan_tci=0x0000,dl_src=0a:58:0a:80:02:39,dl_dst=0a:58:0a:80:02:37,nw_src=10.128.2.57,
nw_dst=10.128.2.55,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=8,icmp_code=0
15.2.5. 禁用命名空间的网络策略审计日志记录
作为集群管理员,您可以为命名空间禁用网络策略审计日志记录。
先决条件
安装 OpenShift CLI(oc)。
流程
要禁用命名空间的网络策略审计日志记录,请输入以下命令:
其中:
<namespace>
指定命名空间的名称。
提示
kind: Namespace
apiVersion: v1
metadata:
name: <namespace>
annotations:
k8s.ovn.org/acl-logging: null
输出示例
namespace/verify-audit-logging annotated
15.2.6. 其他资源
关于网络策略
15.3. 创建网络策略
153
OpenShift Container Platform 4.10 网络
15.3.1. 创建网络策略
要定义细致的规则来描述集群中命名空间允许的入口或出口网络流量,您可以创建一个网络策略。
注意
先决条件
您在网络策略要应用到的命名空间中。
流程
1. 创建策略规则:
$ touch <policy_name>.yaml
其中:
<policy_name>
指定网络策略文件名。
b. 在您刚才创建的文件中定义网络策略,如下例所示:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-by-default
spec:
podSelector:
ingress: []
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-same-namespace
spec:
154
第 15 章 网络策略
podSelector:
ingress:
- from:
- podSelector: {}
2. 运行以下命令来创建网络策略对象:
其中:
<policy_name>
指定网络策略文件名。
<namespace>
可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
输出示例
networkpolicy.networking.k8s.io/default-deny created
注意
15.3.2. 示例 NetworkPolicy 对象
下文解释了示例 NetworkPolicy 对象:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-27107 1
spec:
podSelector: 2
matchLabels:
app: mongodb
ingress:
- from:
- podSelector: 3
matchLabels:
app: app
ports: 4
- protocol: TCP
port: 27017
1 NetworkPolicy 对象的名称。
155
OpenShift Container Platform 4.10 网络
4 接受流量的一个或多个目标端口的列表。
15.3.3. 其他资源
访问Web控制台
15.4. 查看网络策略
以具有 admin 角色的用户,您可以查看命名空间的网络策略。
15.4.1. 查看网络策略
您可以检查命名空间中的网络策略。
注意
前提条件
您在网络策略所在的命名空间中。
流程
列出命名空间中的网络策略:
要查看命名空间中定义的网络策略对象,请输入以下命令:
$ oc get networkpolicy
可选: 要检查特定的网络策略,请输入以下命令:
其中:
<policy_name>
指定要检查的网络策略的名称。
<namespace>
可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
例如:
oc describe 命令的输出
156
第 15 章 网络策略
Name: allow-same-namespace
Namespace: ns1
Created on: 2021-05-24 22:28:56 -0400 EDT
Labels: <none>
Annotations: <none>
Spec:
PodSelector: <none> (Allowing the specific traffic to all pods in this namespace)
Allowing ingress traffic:
To Port: <any> (traffic allowed to all ports)
From:
PodSelector: <none>
Not affecting egress traffic
Policy Types: Ingress
注意
15.4.2. 示例 NetworkPolicy 对象
下文解释了示例 NetworkPolicy 对象:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-27107 1
spec:
podSelector: 2
matchLabels:
app: mongodb
ingress:
- from:
- podSelector: 3
matchLabels:
app: app
ports: 4
- protocol: TCP
port: 27017
1 NetworkPolicy 对象的名称。
4 接受流量的一个或多个目标端口的列表。
15.5. 编辑网络策略
作为具有 admin 角色的用户,您可以编辑命名空间的现有网络策略。
157
OpenShift Container Platform 4.10 网络
15.5.1. 编辑网络策略
您可以编辑命名空间中的网络策略。
注意
先决条件
您在网络策略所在的命名空间中。
流程
1. 可选: 要列出一个命名空间中的网络策略对象,请输入以下命令:
$ oc get networkpolicy
其中:
<namespace>
可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
2. 编辑网络策略对象。
如果您在文件中保存了网络策略定义,请编辑该文件并进行必要的更改,然后输入以下命
令。
其中:
<namespace>
可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
<policy_file>
指定包含网络策略的文件的名称。
如果您需要直接更新网络策略对象,请输入以下命令:
其中:
<policy_name>
指定网络策略的名称。
158
第 15 章 网络策略
<namespace>
可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
3. 确认网络策略对象已更新。
其中:
<policy_name>
指定网络策略的名称。
<namespace>
可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
注意
15.5.2. 示例 NetworkPolicy 对象
下文解释了示例 NetworkPolicy 对象:
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-27107 1
spec:
podSelector: 2
matchLabels:
app: mongodb
ingress:
- from:
- podSelector: 3
matchLabels:
app: app
ports: 4
- protocol: TCP
port: 27017
1 NetworkPolicy 对象的名称。
4 接受流量的一个或多个目标端口的列表。
15.5.3. 其他资源
创建网络策略
159
OpenShift Container Platform 4.10 网络
15.6. 删除网络策略
以具有 admin 角色的用户,您可以从命名空间中删除网络策略。
15.6.1. 删除网络策略
您可以删除命名空间中的网络策略。
注意
先决条件
您在网络策略所在的命名空间中。
流程
要删除网络策略对象,请输入以下命令:
其中:
<policy_name>
指定网络策略的名称。
<namespace>
可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
输出示例
networkpolicy.networking.k8s.io/default-deny deleted
注意
15.7. 为项目定义默认网络策略
作为集群管理员,您可以在创建新项目时修改新项目模板,使其自动包含网络策略。如果您还没有新项目
的自定义模板,则需要首先创建一个。
15.7.1. 为新项目修改模板
160
第 15 章 网络策略
作为集群管理员,您可以修改默认项目模板,以便使用自定义要求创建新项目。
创建自己的自定义项目模板:
流程
2. 生成默认项目模板:
使用 Web 控制台:
使用 CLI:
i. 编辑 project.config.openshift.io/cluster 资源:
$ oc edit project.config.openshift.io/cluster
带有自定义项目模板的项目配置资源
apiVersion: config.openshift.io/v1
kind: Project
metadata:
...
spec:
projectRequestTemplate:
name: <template_name>
7. 保存更改后,创建一个新项目来验证是否成功应用了您的更改。
15.7.2. 在新项目模板中添加网络策略
作为集群管理员,您可以在新项目的默认模板中添加网络策略。OpenShift Container Platform 将自动创
建项目中模板中指定的所有 NetworkPolicy 对象。
161
OpenShift Container Platform 4.10 网络
先决条件
您必须已为新项目创建了自定义的默认项目模板。
流程
1. 运行以下命令来编辑新项目的默认模板:
objects:
- apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-same-namespace
spec:
podSelector: {}
ingress:
- from:
- podSelector: {}
- apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-openshift-ingress
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
network.openshift.io/policy-group: ingress
podSelector: {}
policyTypes:
- Ingress
- apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-kube-apiserver-operator
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
162
第 15 章 网络策略
kubernetes.io/metadata.name: openshift-kube-apiserver-operator
podSelector:
matchLabels:
app: kube-apiserver-operator
policyTypes:
- Ingress
...
3. 可选:通过运行以下命令创建一个新项目,来确认您的网络策略对象已被成功创建:
a. 创建一个新项目:
$ oc new-project <project> 1
1 将 <project> 替换为您要创建的项目的名称。
b. 确认新项目模板中的网络策略对象存在于新项目中:
$ oc get networkpolicy
NAME POD-SELECTOR AGE
allow-from-openshift-ingress <none> 7s
allow-from-same-namespace <none> 7s
15.8. 使用网络策略配置多租户隔离
作为集群管理员,您可以配置网络策略以为多租户网络提供隔离功能。
注意
15.8.1. 使用网络策略配置多租户隔离
您可以配置项目,使其与其他项目命名空间中的 pod 和服务分离。
先决条件
流程
a. 名为 allow-from-openshift-ingress 的策略。
163
OpenShift Container Platform 4.10 网络
kind: NetworkPolicy
metadata:
name: allow-from-openshift-ingress
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
policy-group.network.openshift.io/ingress: ""
podSelector: {}
policyTypes:
- Ingress
EOF
注意
b. 名为 allow-from-openshift-monitoring 的策略:
c. 名为 allow-same-namespace 的策略:
d. 名为 allow-from-kube-apiserver-operator 的策略:
164
第 15 章 网络策略
2. 可选: 要确认当前项目中存在网络策略,请输入以下命令:
$ oc describe networkpolicy
输出示例
Name: allow-from-openshift-ingress
Namespace: example1
Created on: 2020-06-09 00:28:17 -0400 EDT
Labels: <none>
Annotations: <none>
Spec:
PodSelector: <none> (Allowing the specific traffic to all pods in this namespace)
Allowing ingress traffic:
To Port: <any> (traffic allowed to all ports)
From:
NamespaceSelector: network.openshift.io/policy-group: ingress
Not affecting egress traffic
Policy Types: Ingress
Name: allow-from-openshift-monitoring
Namespace: example1
Created on: 2020-06-09 00:29:57 -0400 EDT
Labels: <none>
Annotations: <none>
Spec:
PodSelector: <none> (Allowing the specific traffic to all pods in this namespace)
Allowing ingress traffic:
To Port: <any> (traffic allowed to all ports)
From:
NamespaceSelector: network.openshift.io/policy-group: monitoring
Not affecting egress traffic
Policy Types: Ingress
165
OpenShift Container Platform 4.10 网络
15.8.2. 后续步骤
定义默认网络策略
15.8.3. 其他资源
OpenShift SDN 网络隔离模式
166
第 16 章 多网络
第 16 章 多网络
16.1. 了解多网络
在 Kubernetes 中,容器网络被委派给实现 Container Network Interface (CNI) 的网络插件。
16.1.1. 额外网络使用场景
您可以在需要网络隔离的情况下使用额外网络,包括分离数据平面与控制平面。隔离网络流量对以下性能
和安全性原因很有用:
性能
您可以在两个不同的平面上发送流量,以管理每个平面上流量的多少。
安全性
您可以将敏感的流量发送到专为安全考虑而管理的网络平面,也可隔离不能在租户或客户间共享的私
密数据。
要将额外网络接口附加到 pod,您必须创建配置来定义接口的附加方式。您可以使用
NetworkAttachmentDefinition 自定义资源(CR)来指定各个接口。各个 CR 中的 CNI 配置定义如何创
建该接口。
16.2. 配置额外网络
作为集群管理员,您可以为集群配置额外网络。支持以下网络类型:
167
OpenShift Container Platform 4.10 网络
Bridge
主机设备
IPVLAN
MACVLAN
16.2.1. 管理额外网络的方法
您可以通过两种方法来管理额外网络的生命周期。每种方法都是相互排斥的,您一次只能使用一种方法来
管理额外网络。对于任一方法,额外网络由您配置的 Container Network Interface(CNI)插件管理。
16.2.2. 配置额外网络附加
额外网络通过 k8s.cni.cncf.io API 组中的 NetworkAttachmentDefinition API 来配置。
重要
字段 类型 描述
apiVersion: operator.openshift.io/v1
168
第 16 章 多网络
kind: Network
metadata:
name: cluster
spec:
# ...
additionalNetworks: 1
- name: <name> 2
namespace: <namespace> 3
rawCNIConfig: |- 4
{
...
}
type: Raw
1 由一个或多个附加网络配置组成的数组。
2 您要创建的额外网络附加的名称。名称在指定的命名空间中必须是唯一的。
从 YAML 配置文件指定额外网络的配置,如下例所示:
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
name: <name> 1
spec:
config: |- 2
{
...
}
1 您要创建的额外网络附加的名称。
16.2.3. 额外网络类型的配置
以下部分介绍了额外网络的具体配置字段。
16.2.3.1. 配置桥接额外网络
169
OpenShift Container Platform 4.10 网络
字段 类型 描述
type 字符串
16.2.3.1.1. 网桥配置示例
{
"cniVersion": "0.3.1",
"name": "work-network",
"type": "bridge",
"isGateway": true,
"vlan": 2,
"ipam": {
170
第 16 章 多网络
"type": "dhcp"
}
}
16.2.3.2. 主机设备额外网络配置
注意
仅设置以下参数之一来指定您的网络设备:device、HWaddr、kernelpath 或
pciBusID。
字段 类型 描述
{
"cniVersion": "0.3.1",
"name": "work-network",
"type": "host-device",
"device": "eth1"
}
171
OpenShift Container Platform 4.10 网络
字段 类型 描述
{
"cniVersion": "0.3.1",
"name": "work-network",
"type": "ipvlan",
"master": "eth1",
"mode": "l3",
"ipam": {
"type": "static",
"addresses": [
{
"address": "192.168.10.10/24"
}
]
}
}
172
第 16 章 多网络
字段 类型 描述
模式 字符串 配置虚拟网络上的流量可见性。必须是
bridge 、passthru、private或 Vepa。如果没有提供值,则默
认值为 bridge 。
注意
{
"cniVersion": "0.3.1",
"name": "macvlan-net",
"type": "macvlan",
"master": "eth1",
"mode": "bridge",
"ipam": {
"type": "dhcp"
}
}
您可以使用以下 IP 地址分配类型:
静态分配。
173
OpenShift Container Platform 4.10 网络
16.2.4.1. 静态 IP 地址分配配置
下表描述了静态 IP 地址分配的配置:
字段 类型 描述
address 数组需要带有以下字段的对象:
字段 类型 描述
字段 类型 描述
gw 字符串 网络流量路由的网关。
字段 类型 描述
174
第 16 章 多网络
字段 类型 描述
domain 数组 要附加到主机名的默认域。例如,如果将域设置为
example.com ,对 example-host 的 DNS 查找查询将被改写
为 example-host.example.com。
静态 IP 地址分配配置示例
{
"ipam": {
"type": "static",
"addresses": [
{
"address": "191.168.1.7/24"
}
]
}
}
16.2.4.2. 动态 IP 地址(DHCP)分配配置
DHCP 租期续订
175
OpenShift Container Platform 4.10 网络
DHCP 租期续订
shim 网络附加定义示例
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
additionalNetworks:
- name: dhcp-shim
namespace: default
type: Raw
rawCNIConfig: |-
{
"name": "dhcp-shim",
"cniVersion": "0.3.1",
"type": "bridge",
"ipam": {
"type": "dhcp"
}
}
# ...
字段 类型 描述
动态 IP 地址(DHCP)分配配置示例
{
"ipam": {
"type": "dhcp"
}
}
176
第 16 章 多网络
字段 类型 描述
{
"ipam": {
"type": "whereabouts",
"range": "192.0.2.192/27",
"exclude": [
"192.0.2.192/30",
"192.0.2.196/32"
]
}
}
重要
先决条件
安装 OpenShift CLI(oc)。
流程
1. 可选:为额外网络创建命名空间:
3. 通过为您要创建的额外网络添加配置来修改您要创建的 CR,如下例所示。
177
OpenShift Container Platform 4.10 网络
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
# ...
additionalNetworks:
- name: tertiary-net
namespace: namespace2
type: Raw
rawCNIConfig: |-
{
"cniVersion": "0.3.1",
"name": "tertiary-net",
"type": "ipvlan",
"master": "eth1",
"mode": "l2",
"ipam": {
"type": "static",
"addresses": [
{
"address": "192.168.1.23/24"
}
]
}
}
4. 保存您的更改,再退出文本编辑器以提交更改。
验证
其中:
<namespace>
指定添加到 CNO 配置中的网络附加的命名空间。
输出示例
NAME AGE
test-network-1 14m
先决条件
安装 OpenShift CLI(oc)。
178
第 16 章 多网络
流程
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
name: next-net
spec:
config: |-
{
"cniVersion": "0.3.1",
"name": "work-network",
"type": "host-device",
"device": "eth1",
"ipam": {
"type": "dhcp"
}
}
2. 运行以下命令来创建额外网络:
$ oc apply -f <file>.yaml
其中:
<file>
指定包含 YAML 清单的文件名。
16.3. 关于虚拟路由和转发
16.3.1. 关于虚拟路由和转发
虚拟路由和转发(VRF)设备与 IP 规则相结合,提供了创建虚拟路由和转发域的能力。VRF 减少了 CNF
所需的权限数量,并可提高二级网络网络拓扑的可见性。VRF 用于提供多租户功能,例如,每个租户都有
自己的唯一的路由表且需要不同的默认网关。
16.4. 配置多网络策略
作为集群管理员,您可以为额外网络配置网络策略。
注意
179
OpenShift Container Platform 4.10 网络
注意
16.4.1. 多网络策略和网络策略之间的区别
虽然 MultiNetworkPolicy API 实现 NetworkPolicy API,但有几个重要的区别:
apiVersion: k8s.cni.cncf.io/v1beta1
kind: MultiNetworkPolicy
apiVersion: k8s.cni.cncf.io/v1beta1
kind: MultiNetworkPolicy
metadata:
annotations:
k8s.v1.cni.cncf.io/policy-for: <network_name>
其中:
<network_name>
指定网络附加定义的名称。
16.4.2. 为集群启用多网络策略
作为集群管理员,您可以在集群中启用多网络策略支持。
先决条件
安装 OpenShift CLI(oc)。
流程
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
useMultiNetworkPolicy: true
2. 配置集群以启用多网络策略:
180
第 16 章 多网络
输出示例
network.operator.openshift.io/cluster patched
16.4.3. 使用多网络策略
作为集群管理员,您可以创建、编辑、查看和删除多网络策略。
16.4.3.1. 先决条件
您已为集群启用了多网络策略支持。
16.4.3.2. 创建多网络策略
要定义细致的规则来描述集群中命名空间允许的入口或出口网络流量,您可以创建一个多网络策略。
先决条件
您在多网络策略应用到的命名空间中工作。
流程
1. 创建策略规则:
$ touch <policy_name>.yaml
其中:
<policy_name>
指定多网络策略文件名。
b. 在您刚才创建的文件中定义多网络策略,如下例所示:
apiVersion: k8s.cni.cncf.io/v1beta1
kind: MultiNetworkPolicy
metadata:
name: deny-by-default
annotations:
k8s.v1.cni.cncf.io/policy-for: <network_name>
181
OpenShift Container Platform 4.10 网络
spec:
podSelector:
ingress: []
其中
<network_name>
指定网络附加定义的名称。
apiVersion: k8s.cni.cncf.io/v1beta1
kind: MultiNetworkPolicy
metadata:
name: allow-same-namespace
annotations:
k8s.v1.cni.cncf.io/policy-for: <network_name>
spec:
podSelector:
ingress:
- from:
- podSelector: {}
其中
<network_name>
指定网络附加定义的名称。
2. 运行以下命令来创建多网络策略对象:
其中:
<policy_name>
指定多网络策略文件名。
<namespace>
可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
输出示例
multinetworkpolicy.k8s.cni.cncf.io/default-deny created
注意
16.4.3.3. 编辑多网络策略
您可以编辑命名空间中的多网络策略。
182
第 16 章 多网络
先决条件
您在存在多网络策略的命名空间中工作。
流程
1. 可选: 要列出命名空间中的多网络策略对象,请输入以下命令:
$ oc get multi-networkpolicy
其中:
<namespace>
可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
2. 编辑多网络策略对象。
如果您在文件中保存了多网络策略定义,请编辑该文件并进行必要的更改,然后输入以下命
令。
其中:
<namespace>
可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
<policy_file>
指定包含网络策略的文件的名称。
如果您需要直接更新多网络策略对象,请输入以下命令:
其中:
<policy_name>
指定网络策略的名称。
<namespace>
可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
3. 确认已更新多网络策略对象。
其中:
183
OpenShift Container Platform 4.10 网络
<policy_name>
指定多网络策略的名称。
<namespace>
可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
注意
16.4.3.4. 查看多网络策略
您可以检查命名空间中的多网络策略。
先决条件
您在存在多网络策略的命名空间中工作。
流程
列出命名空间中的多网络策略:
要查看命名空间中定义的多网络策略对象,请输入以下命令:
$ oc get multi-networkpolicy
可选: 要检查特定的多网络策略,请输入以下命令:
其中:
<policy_name>
指定要检查的多网络策略的名称。
<namespace>
可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
注意
16.4.3.5. 删除多网络策略
您可以删除命名空间中的多网络策略。
先决条件
184
第 16 章 多网络
您在存在多网络策略的命名空间中工作。
流程
要删除多网络策略对象,请输入以下命令:
其中:
<policy_name>
指定多网络策略的名称。
<namespace>
可选: 如果对象在与当前命名空间不同的命名空间中定义,使用它来指定命名空间。
输出示例
multinetworkpolicy.k8s.cni.cncf.io/default-deny deleted
注意
16.4.4. 其他资源
关于网络策略
了解多网络
配置 macvlan 网络
pod 必须与额外网络处于相同的命名空间。
先决条件
185
OpenShift Container Platform 4.10 网络
安装 OpenShift CLI(oc)。
登录到集群。
流程
1. 为 Pod 对象添加注解。只能使用以下注解格式之一:
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: <network>[,<network>,...] 1
1 要指定多个额外网络,请使用逗号分隔各个网络。逗号之间不可包括空格。如果您多次
指定同一额外网络,则该 pod 会将多个网络接口附加到该网络。
b. 要通过自定义来附加额外网络,请添加具有以下格式的注解:
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: |-
[
{
"name": "<network>", 1
"namespace": "<namespace>", 2
"default-route": ["<default-route>"] 3
}
]
1 指定 NetworkAttachmentDefinition 对象定义的额外网络的名称。
3 可选:为默认路由指定覆盖,如 192.168.17.1。
$ oc create -f <name>.yaml
186
第 16 章 多网络
k8s.v1.cni.cncf.io/networks: macvlan-bridge
k8s.v1.cni.cncf.io/networks-status: |- 1
[{
"name": "openshift-sdn",
"interface": "eth0",
"ips": [
"10.128.2.14"
],
"default": true,
"dns": {}
},{
"name": "macvlan-bridge",
"interface": "net1",
"ips": [
"20.2.2.100"
],
"mac": "22:2f:60:a5:f8:00",
"dns": {}
}]
name: example-pod
namespace: default
spec:
...
status:
...
先决条件
pod 必须与额外网络处于相同的命名空间。
您必须登录集群。
流程
要在指定地址和/或路由选项的同时将 pod 添加到额外网络,请完成以下步骤:
187
OpenShift Container Platform 4.10 网络
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: '[<network>[,<network>,...]]' 1
apiVersion: v1
kind: Pod
metadata:
name: example-pod
annotations:
k8s.v1.cni.cncf.io/networks: '
{
"name": "net1"
},
{
"name": "net2", 1
"default-route": ["192.0.2.1"] 2
}'
spec:
containers:
- name: example-pod
command: ["/bin/bash", "-c", "sleep 2000000000000"]
image: centos/tools
2 default-route 指定了一个网关,当在路由表中没有其它路由条目时使用这个网关。如果指定
了多个 default-route 键,这将导致 pod 无法成为活跃状态。
默认路由将导致任何没有在其它路由中指定的流量被路由到网关。
重要
注意
188
第 16 章 多网络
name: <name> 1
namespace: <namespace> 2
rawCNIConfig: '{ 3
...
}'
type: Raw
1 为您要创建的额外网络附加指定名称。名称在指定的命名空间中必须是唯一的。
{
"cniVersion": "0.3.1",
"name": "<name>", 1
"plugins": [{ 2
"type": "macvlan",
"capabilities": { "ips": true }, 3
"master": "eth0", 4
"mode": "bridge",
"ipam": {
"type": "static"
}
}, {
"capabilities": { "mac": true }, 5
"type": "tuning"
}]
}
1 指定要创建的额外网络附加的名称。名称在指定的命名空间中必须是唯一的。
4 指定 macvlan 插件使用的接口。
189
OpenShift Container Platform 4.10 网络
使用以下内容编辑 pod:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
annotations:
k8s.v1.cni.cncf.io/networks: '[
{
"name": "<name>", 1
"ips": [ "192.0.2.205/24" ], 2
"mac": "CA:FE:C0:FF:EE:00" 3
}
]'
2 提供包括子网掩码的 IP 地址。
3 提供 MAC 地址。
注意
先决条件
一个额外网络被附加到 pod。
安装 OpenShift CLI(oc)。
登录到集群。
流程
190
第 16 章 多网络
流程
要删除 pod,输入以下命令:
16.7. 编辑额外网络
作为集群管理员,您可以修改现有额外网络的配置。
16.7.1. 修改额外网络附加定义
作为集群管理员,您可以对现有额外网络进行更改。任何附加到额外网络的现有 pod 都不会被更新。
先决条件
已为集群配置了额外网络。
安装 OpenShift CLI(oc)。
流程
要为集群编辑额外网络,请完成以下步骤:
2. 在 additionalNetworks 集合中,用您的更改更新额外网络。
3. 保存您的更改,再退出文本编辑器以提交更改。
191
OpenShift Container Platform 4.10 网络
16.8. 删除额外网络
作为集群管理员,您可以删除额外网络附加。
16.8.1. 删除额外网络附加定义
作为集群管理员,您可以从 OpenShift Container Platform 集群中删除额外网络。额外网络不会从它所附
加的任何 pod 中删除。
先决条件
安装 OpenShift CLI(oc)。
流程
要从集群中删除额外网络,请完成以下步骤:
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
additionalNetworks: [] 1
3. 保存您的更改,再退出文本编辑器以提交更改。
4. 可选:通过运行以下命令确认删除了额外网络 CR:
注意
192
第 16 章 多网络
注意
使用 VRF 的应用程序需要绑定到特定设备。通常的用法是在套接字中使用
SO_BINDTODEVICE 选项。SO_BINDTODEVICE 将套接字绑定到在传递接口名称中指定
的设备,如 eth1。要使用 SO_BINDTODEVICE,应用程序必须具有 CAP_NET_RAW 功
能。
OpenShift Container Platform pod 不支持通过 ip vrf exec 命令使用 VRF。要使用 VRF,
将应用程序直接绑定到 VRF 接口。
注意
先决条件
流程
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
additionalNetworks:
- name: test-network-1
namespace: additional-network-1
type: Raw
rawCNIConfig: '{
"cniVersion": "0.3.1",
"name": "macvlan-vrf",
"plugins": [ 1
{
"type": "macvlan", 2
"master": "eth1",
"ipam": {
"type": "static",
"addresses": [
{
"address": "191.168.1.23/24"
193
OpenShift Container Platform 4.10 网络
}
]
}
},
{
"type": "vrf",
"vrfname": "example-vrf-name", 3
"table": 1001 4
}]
}'
注意
2. 创建 Network 资源:
$ oc create -f additional-network-attachment.yaml
输出示例
NAME AGE
additional-network-1 14m
注意
CNO 创建 CR 之前可能会有延迟。
2. 将网络分配给 pod。
194
第 16 章 多网络
$ ip vrf show
输出示例
Name Table
-----------------------
red 10
4. 确认 VRF 接口是从属接口的主接口:
$ ip link
输出示例
195
OpenShift Container Platform 4.10 网络
第 17 章 硬件网络
您可以使用以下命令在节点上启用 SR-IOV:
编配 SR-IOV 网络设备的发现和管理
Operator 置备以下组件:
SR-IOV 网络配置守护进程
SR-IOV Network Operator 启动时部署在 worker 节点上的守护进程集。守护进程负责在集群中发现和
初始化 SR-IOV 网络设备。
SR-IOV Network Operator Webhook
这是动态准入控制器 Webhook,用于验证 Operator 自定义资源,并为未设置的字段设置适当的默认
值。
SR-IOV Network Resources Injector(网络资源注入器)
这是一个动态准入控制器 Webhook,它提供通过请求和限制为自定义网络资源(如 SR-IOV VF)应用
Kubernetes pod 规格的功能。SR-IOV 网络资源注入器只会将 resource 字段添加到 pod 中的第一个
容器。
网络SR-IOV 网络设备插件
这个设备插件用于发现、公告并分配 SR-IOV 网络虚拟功能 (VF) 资源。在 Kubernetes 中使用设备插
件能够利用有限的资源,这些资源通常为于物理设备中。设备插件可以使 Kubernetes 调度程序了解资
源可用性,因此调度程序可以在具有足够资源的节点上调度 pod。
SR-IOV CNI 插件
196
第 17 章 硬件网络
注意
17.1.1.1. 支持的平台
裸机
17.1.1.2. 支持的设备
表 17.1. 支持的网络接口控制器
197
OpenShift Container Platform 4.10 网络
注意
重要
一 个 SriovNetworkNodeState 对象
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodeState
metadata:
name: node-25 1
namespace: openshift-sriov-network-operator
ownerReferences:
- apiVersion: sriovnetwork.openshift.io/v1
blockOwnerDeletion: true
controller: true
kind: SriovNetworkNodePolicy
name: default
spec:
dpConfigVersion: "39824"
status:
interfaces: 2
- deviceID: "1017"
driver: mlx5_core
mtu: 1500
name: ens785f0
198
第 17 章 硬件网络
pciAddress: "0000:18:00.0"
totalvfs: 8
vendor: 15b3
- deviceID: "1017"
driver: mlx5_core
mtu: 1500
name: ens785f1
pciAddress: "0000:18:00.1"
totalvfs: 8
vendor: 15b3
- deviceID: 158b
driver: i40e
mtu: 1500
name: ens817f0
pciAddress: 0000:81:00.0
totalvfs: 64
vendor: "8086"
- deviceID: 158b
driver: i40e
mtu: 1500
name: ens817f1
pciAddress: 0000:81:00.1
totalvfs: 64
vendor: "8086"
- deviceID: 158b
driver: i40e
mtu: 1500
name: ens803f0
pciAddress: 0000:86:00.0
totalvfs: 64
vendor: "8086"
syncStatus: Succeeded
apiVersion: v1
kind: Pod
metadata:
name: rdma-app
annotations:
k8s.v1.cni.cncf.io/networks: sriov-rdma-mlnx
spec:
containers:
199
OpenShift Container Platform 4.10 网络
- name: testpmd
image: <RDMA_image>
imagePullPolicy: IfNotPresent
securityContext:
runAsUser: 0
capabilities:
add: ["IPC_LOCK","SYS_RESOURCE","NET_RAW"]
command: ["sleep", "infinity"]
apiVersion: v1
kind: Pod
metadata:
name: dpdk-app
annotations:
k8s.v1.cni.cncf.io/networks: sriov-dpdk-net
spec:
containers:
- name: testpmd
image: <DPDK_image>
securityContext:
runAsUser: 0
capabilities:
add: ["IPC_LOCK","SYS_RESOURCE","NET_RAW"]
volumeMounts:
- mountPath: /dev/hugepages
name: hugepage
resources:
limits:
memory: "1Gi"
cpu: "2"
hugepages-1Gi: "4Gi"
requests:
memory: "1Gi"
cpu: "2"
hugepages-1Gi: "4Gi"
command: ["sleep", "infinity"]
volumes:
- name: hugepage
emptyDir:
medium: HugePages
GetCPUInfo()
200
第 17 章 硬件网络
/etc/podnetinfo/hugepages_1G_request_<container-name>
/etc/podnetinfo/hugepages_1G_limit_<container-name>
/etc/podnetinfo/hugepages_2M_request_<container-name>
/etc/podnetinfo/hugepages_2M_limit_<container-name>
/etc/podnetinfo/hugepages_request
/etc/podnetinfo/hugepages_limit
/etc/podnetinfo/hugepages_1G_request
/etc/podnetinfo/hugepages_1G_limit
/etc/podnetinfo/hugepages_2M_request
/etc/podnetinfo/hugepages_2M_limit
17.1.2. 后续步骤
安装 SR-IOV Network Operator
配置 SR-IOV 网络设备
201
OpenShift Container Platform 4.10 网络
配置 SR-IOV 网络附加
将 pod 添加到额外网络
先决条件
安装 OpenShift CLI(oc)。
具有 cluster-admin 权限的帐户。
流程
4. 要验证是否已安装 Operator,请输入以下命令:
输出示例
Name Phase
sriov-network-operator.4.10.0-202110121402 Succeeded
先决条件
安装 OpenShift CLI(oc)。
具有 cluster-admin 权限的帐户。
流程
203
OpenShift Container Platform 4.10 网络
d. 点 Install。
注意
如果 Operator 没有被成功安装,请按照以下步骤进行故障排除:
检查 YAML 文件的命名空间。如果缺少注解,您可以使用以下命令将注解
workload.openshift.io/allowed=management 添加到 Operator 命名空间中:
$ oc annotate ns/openshift-sriov-network-operator
workload.openshift.io/allowed=management
注意
17.2.2. 后续步骤
可选:配置 SR-IOV Network Operator
重要
注意
204
第 17 章 硬件网络
注意
sriovoperatorconfig 自定义资源的字段在下表中描述:
字段 类型 描述
205
OpenShift Container Platform 4.10 网络
输出示例
SR-IOV Network Operator Admission Controller Webhook 是一个 Kubernetes Dynamic Admission
Controller 应用程序。它提供以下功能:
注意
输出示例
17.3.1.4. 关于自定义节点选择器
17.3.1.5. 禁用或启用网络资源注入器
要禁用或启用默认启用的网络资源注入器,请完成以下步骤。
先决条件
安装 OpenShift CLI(oc)。
206
第 17 章 硬件网络
流程
提示
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovOperatorConfig
metadata:
name: default
namespace: openshift-sriov-network-operator
spec:
enableInjector: <value>
要禁用或启用默认启用的准入控制器 Webhook,请完成以下步骤。
先决条件
安装 OpenShift CLI(oc)。
流程
提示
207
OpenShift Container Platform 4.10 网络
提示
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovOperatorConfig
metadata:
name: default
namespace: openshift-sriov-network-operator
spec:
enableOperatorWebhook: <value>
重要
流程
要为 Operator 更新节点选择器,请输入以下命令:
提示
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovOperatorConfig
metadata:
name: default
namespace: openshift-sriov-network-operator
spec:
configDaemonNodeSelector:
<node_label>
208
第 17 章 硬件网络
对于在单一节点上安装,没有其他节点来接收工作负载。因此,Operator 不得配置为从单一节点排空工
作负载。
重要
先决条件
安装 OpenShift CLI(oc)。
流程
提示
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovOperatorConfig
metadata:
name: default
namespace: openshift-sriov-network-operator
spec:
disableDrain: true
17.3.2. 后续步骤
配置 SR-IOV 网络设备
209
OpenShift Container Platform 4.10 网络
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: <name> 1
namespace: openshift-sriov-network-operator 2
spec:
resourceName: <sriov_resource_name> 3
nodeSelector:
feature.node.kubernetes.io/network-sriov.capable: "true" 4
priority: <priority> 5
mtu: <mtu> 6
needVhostNet: false 7
numVfs: <num> 8
nicSelector: 9
vendor: "<vendor_code>" 10
deviceID: "<device_id>" 11
pfNames: ["<pf_name>", ...] 12
rootDevices: ["<pci_bus_id>", ...] 13
netFilter: "<filter_string>" 14
deviceType: <device_type> 15
isRdma: false 16
linkType: <link_type> 17
eSwitchMode: "switchdev" 18
1 自定义资源对象的名称。
210
第 17 章 硬件网络
12 可选:该设备的一个或多个物理功能(PF)名称的数组。
将 isRdma 设置为 true,并将 needVhostNet 设置为 true 以配置 Mellanox NIC 以用于 Fast
Datapath DPDK 应用程序。
当将 linkType 设置为 ib 时,SR-IOV Network Operator Webhook 会自动将 isRdma 设置为 true。
当将 linkType 设置为 ib 时,deviceType 不应该设置为 vfio-pci。
InfiniBand 设备的配置示例
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: policy-ib-net-1
namespace: openshift-sriov-network-operator
spec:
resourceName: ibnic1
nodeSelector:
feature.node.kubernetes.io/network-sriov.capable: "true"
numVfs: 4
nicSelector:
vendor: "15b3"
211
OpenShift Container Platform 4.10 网络
deviceID: "101b"
rootDevices:
- "0000:19:00.0"
linkType: ib
isRdma: true
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: policy-sriov-net-openstack-1
namespace: openshift-sriov-network-operator
spec:
resourceName: sriovnic1
nodeSelector:
feature.node.kubernetes.io/network-sriov.capable: "true"
numVfs: 1 1
nicSelector:
vendor: "15b3"
deviceID: "101b"
netFilter: "openstack/NetworkID:ea24bd04-8674-4f69-b0ee-fa0b3bd20509" 2
1 在为虚拟机配置节点网络策略时,numVfs 字段始终设置为 1。
pfNames: ["netpf0#2-7"]
netpf0 是 PF 接口名称。
212
第 17 章 硬件网络
不同策略中的 VF 范围不得互相重叠。
策略 policy-net-1 :
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: policy-net-1
namespace: openshift-sriov-network-operator
spec:
resourceName: net1
nodeSelector:
feature.node.kubernetes.io/network-sriov.capable: "true"
numVfs: 16
nicSelector:
pfNames: ["netpf0#0-0"]
deviceType: netdevice
策略 policy-net-1-dpdk:
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: policy-net-1-dpdk
namespace: openshift-sriov-network-operator
spec:
resourceName: net1dpdk
nodeSelector:
feature.node.kubernetes.io/network-sriov.capable: "true"
numVfs: 16
nicSelector:
pfNames: ["netpf0#8-15"]
deviceType: vfio-pci
验证接口是否已成功分区
运行以下命令,确认 SR-IOV 设备的接口分区到虚拟功能(VF)。
输出示例
213
OpenShift Container Platform 4.10 网络
vf 0 link/ether 5a:e7:88:25:ea:a0 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
vf 1 link/ether 3e:1d:36:d7:3d:49 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
vf 2 link/ether ce:09:56:97:df:f9 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
vf 3 link/ether 5e:91:cf:88:d1:38 brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
vf 4 link/ether e6:06:a1:96:2f:de brd ff:ff:ff:ff:ff:ff, spoof checking on, link-state auto, trust off
注意
它可能需要几分钟时间来应用配置更改。
先决条件
集群中有足够的可用节点,用于处理从排空节点中驱除的工作负载。
流程
3. 创建 SriovNetworkNodePolicy 对象:
$ oc create -f <name>-sriov-node-network.yaml
其中 <name> 指定此配置的名称。
214
第 17 章 硬件网络
其他资源
了解如何更新节点上的标签。
要显示节点状态,请运行以下命令:
错误输出: 无法分配内存
当节点表示无法分配内存时,检查以下项目:
注意
使用 VRF 的应用程序需要绑定到特定设备。通常的用法是在套接字中使用
SO_BINDTODEVICE 选项。SO_BINDTODEVICE 将套接字绑定到在传递接口名称中指定
的设备,如 eth1。要使用 SO_BINDTODEVICE,应用程序必须具有 CAP_NET_RAW 功
能。
OpenShift Container Platform pod 不支持通过 ip vrf exec 命令使用 VRF。要使用 VRF,
将应用程序直接绑定到 VRF 接口。
注意
先决条件
215
OpenShift Container Platform 4.10 网络
流程
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
metadata:
name: example-network
namespace: additional-sriov-network-1
spec:
ipam: |
{
"type": "host-local",
"subnet": "10.56.217.0/24",
"rangeStart": "10.56.217.171",
"rangeEnd": "10.56.217.181",
"routes": [{
"dst": "0.0.0.0/0"
}],
"gateway": "10.56.217.1"
}
vlan: 0
resourceName: intelnics
metaPlugins : |
{
"type": "vrf", 1
"vrfname": "example-vrf-name" 2
}
2. 创建 SriovNetwork 资源:
$ oc create -f sriov-network-attachment.yaml
验证 NetworkAttachmentDefinition CR 是否已成功创建
输出示例
216
第 17 章 硬件网络
NAME AGE
additional-sriov-network-1 14m
注意
2. 将网络分配给 pod。
$ ip vrf show
输出示例
Name Table
-----------------------
red 10
4. 确认 VRF 接口是从属接口的主接口:
$ ip link
输出示例
...
5: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master red
state UP mode
...
17.4.5. 后续步骤
配置 SR-IOV 网络附加
17.5.1. 以太网设备配置对象
您可以通过定义 SriovNetwork 对象来配置以太网网络设备。
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
217
OpenShift Container Platform 4.10 网络
metadata:
name: <name> 1
namespace: openshift-sriov-network-operator 2
spec:
resourceName: <sriov_resource_name> 3
networkNamespace: <target_namespace> 4
vlan: <vlan> 5
spoofChk: "<spoof_check>" 6
ipam: |- 7
{}
linkState: <link_state> 8
maxTxRate: <max_tx_rate> 9
minTxRate: <min_tx_rate> 10
vlanQoS: <vlan_qos> 11
trust: "<trust_vf>" 12
capabilities: <capabilities> 13
重要
注意
重要
218
第 17 章 硬件网络
重要
IP 地址管理 (IPAM) Container Network Interface (CNI) 插件为其他 CNI 插件提供 IP 地址。
您可以使用以下 IP 地址分配类型:
静态分配。
17.5.1.1.1. 静态 IP 地址分配配置
下表描述了静态 IP 地址分配的配置:
字段 类型 描述
address 数组需要带有以下字段的对象:
字段 类型 描述
219
OpenShift Container Platform 4.10 网络
字段 类型 描述
gw 字符串 网络流量路由的网关。
字段 类型 描述
domain 数组 要附加到主机名的默认域。例如,如果将域设置为
example.com ,对 example-host 的 DNS 查找查询将被改写
为 example-host.example.com。
静态 IP 地址分配配置示例
{
"ipam": {
"type": "static",
"addresses": [
{
"address": "191.168.1.7/24"
}
]
}
}
17.5.1.1.2. 动态 IP 地址(DHCP)分配配置
DHCP 租期续订
220
第 17 章 硬件网络
DHCP 租期续订
shim 网络附加定义示例
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
additionalNetworks:
- name: dhcp-shim
namespace: default
type: Raw
rawCNIConfig: |-
{
"name": "dhcp-shim",
"cniVersion": "0.3.1",
"type": "bridge",
"ipam": {
"type": "dhcp"
}
}
# ...
字段 类型 描述
动态 IP 地址(DHCP)分配配置示例
{
"ipam": {
"type": "dhcp"
}
}
221
OpenShift Container Platform 4.10 网络
字段 类型 描述
{
"ipam": {
"type": "whereabouts",
"range": "192.0.2.192/27",
"exclude": [
"192.0.2.192/30",
"192.0.2.196/32"
]
}
}
注意
先决条件
安装 OpenShift CLI(oc)。
流程
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
metadata:
name: attach1
namespace: openshift-sriov-network-operator
spec:
resourceName: net1
222
第 17 章 硬件网络
networkNamespace: project2
ipam: |-
{
"type": "host-local",
"subnet": "10.56.217.0/24",
"rangeStart": "10.56.217.171",
"rangeEnd": "10.56.217.181",
"gateway": "10.56.217.1"
}
2. 运行以下命令来创建对象:
$ oc create -f <name>.yaml
17.5.3. 后续步骤
将 pod 添加到额外网络
17.5.4. 其他资源
配置 SR-IOV 网络设备
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovIBNetwork
metadata:
name: <name> 1
namespace: openshift-sriov-network-operator 2
spec:
resourceName: <sriov_resource_name> 3
networkNamespace: <target_namespace> 4
ipam: |- 5
{}
linkState: <link_state> 6
capabilities: <capabilities> 7
223
OpenShift Container Platform 4.10 网络
IP 地址管理 (IPAM) Container Network Interface (CNI) 插件为其他 CNI 插件提供 IP 地址。
您可以使用以下 IP 地址分配类型:
静态分配。
17.6.1.1.1. 静态 IP 地址分配配置
下表描述了静态 IP 地址分配的配置:
字段 类型 描述
address 数组需要带有以下字段的对象:
224
第 17 章 硬件网络
字段 类型 描述
字段 类型 描述
gw 字符串 网络流量路由的网关。
字段 类型 描述
domain 数组 要附加到主机名的默认域。例如,如果将域设置为
example.com ,对 example-host 的 DNS 查找查询将被改写
为 example-host.example.com。
静态 IP 地址分配配置示例
{
"ipam": {
"type": "static",
"addresses": [
{
"address": "191.168.1.7/24"
}
]
}
}
17.6.1.1.2. 动态 IP 地址(DHCP)分配配置
DHCP 租期续订
225
OpenShift Container Platform 4.10 网络
DHCP 租期续订
shim 网络附加定义示例
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
additionalNetworks:
- name: dhcp-shim
namespace: default
type: Raw
rawCNIConfig: |-
{
"name": "dhcp-shim",
"cniVersion": "0.3.1",
"type": "bridge",
"ipam": {
"type": "dhcp"
}
}
# ...
字段 类型 描述
动态 IP 地址(DHCP)分配配置示例
{
"ipam": {
"type": "dhcp"
}
}
226
第 17 章 硬件网络
字段 类型 描述
{
"ipam": {
"type": "whereabouts",
"range": "192.0.2.192/27",
"exclude": [
"192.0.2.192/30",
"192.0.2.196/32"
]
}
}
注意
先决条件
安装 OpenShift CLI(oc)。
流程
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovIBNetwork
metadata:
name: attach1
namespace: openshift-sriov-network-operator
spec:
resourceName: net1
networkNamespace: project2
227
OpenShift Container Platform 4.10 网络
ipam: |-
{
"type": "host-local",
"subnet": "10.56.217.0/24",
"rangeStart": "10.56.217.171",
"rangeEnd": "10.56.217.181",
"gateway": "10.56.217.1"
}
2. 运行以下命令来创建对象:
$ oc create -f <name>.yaml
17.6.3. 后续步骤
将 pod 添加到额外网络
17.6.4. 其他资源
配置 SR-IOV 网络设备
17.7.1. 网络附加的运行时配置
将 pod 附加到额外网络时,您可以指定运行时配置来为 pod 进行特定的自定义。例如,,您可以请求特定的
MAC 硬件地址。
[
{
"name": "<name>", 1
"mac": "<mac_address>", 2
"ips": ["<cidr_range>"] 3
}
]
228
第 17 章 硬件网络
运行时配置示例
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
annotations:
k8s.v1.cni.cncf.io/networks: |-
[
{
"name": "net1",
"mac": "20:04:0f:f1:88:01",
"ips": ["192.168.10.1/24", "2001::1/64"]
}
]
spec:
containers:
- name: sample-container
image: <image>
imagePullPolicy: IfNotPresent
command: ["sleep", "infinity"]
[
{
"name": "<network_attachment>", 1
"infiniband-guid": "<guid>", 2
"ips": ["<cidr_range>"] 3
}
]
运行时配置示例
229
OpenShift Container Platform 4.10 网络
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
annotations:
k8s.v1.cni.cncf.io/networks: |-
[
{
"name": "ib1",
"infiniband-guid": "c2:11:22:33:44:55:66:77",
"ips": ["192.168.10.1/24", "2001::1/64"]
}
]
spec:
containers:
- name: sample-container
image: <image>
imagePullPolicy: IfNotPresent
command: ["sleep", "infinity"]
pod 必须与额外网络处于相同的命名空间。
注意
先决条件
安装 OpenShift CLI(oc)。
登录到集群。
安装 SR-IOV Operator。
流程
1. 为 Pod 对象添加注解。只能使用以下注解格式之一:
230
第 17 章 硬件网络
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: <network>[,<network>,...] 1
1 要指定多个额外网络,请使用逗号分隔各个网络。逗号之间不可包括空格。如果您多次
指定同一额外网络,则该 pod 会将多个网络接口附加到该网络。
b. 要通过自定义来附加额外网络,请添加具有以下格式的注解:
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: |-
[
{
"name": "<network>", 1
"namespace": "<namespace>", 2
"default-route": ["<default-route>"] 3
}
]
1 指定 NetworkAttachmentDefinition 对象定义的额外网络的名称。
3 可选:为默认路由指定覆盖,如 192.168.17.1。
$ oc create -f <name>.yaml
231
OpenShift Container Platform 4.10 网络
"dns": {}
},{
"name": "macvlan-bridge",
"interface": "net1",
"ips": [
"20.2.2.100"
],
"mac": "22:2f:60:a5:f8:00",
"dns": {}
}]
name: example-pod
namespace: default
spec:
...
status:
...
先决条件
注意
当 single-numa-node 无法满足请求时,您可以将拓扑管理器策略配置为
restricted。
流程
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
annotations:
k8s.v1.cni.cncf.io/networks: <name> 1
spec:
containers:
- name: sample-container
232
第 17 章 硬件网络
image: <image> 2
command: ["sleep", "infinity"]
resources:
limits:
memory: "1Gi" 3
cpu: "2" 4
requests:
memory: "1Gi"
cpu: "2"
4 要创建带有保证 QoS 的 SR-IOV pod,将 cpu limits 设置为与 cpu requests 相同。
$ oc create -f <filename> 1
1 将 <filename> 替换为您在上一步中创建的文件的名称。
17.7.4. 其他资源
配置 SR-IOV 以太网网络附加
使用 CPU Manager
17.8. 配置高性能多播
您可以在您的单根 I/O 虚拟化(SR-IOV)硬件网络中使用多播。
17.8.1. 高性能多播
233
OpenShift Container Platform 4.10 网络
先决条件
安装 OpenShift CLI(oc)。
流程
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: policy-example
namespace: openshift-sriov-network-operator
spec:
resourceName: example
nodeSelector:
feature.node.kubernetes.io/network-sriov.capable: "true"
numVfs: 4
nicSelector:
vendor: "8086"
pfNames: ['ens803f0']
rootDevices: ['0000:86:00.0']
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
metadata:
name: net-example
namespace: openshift-sriov-network-operator
spec:
networkNamespace: default
ipam: | 1
{
"type": "host-local", 2
"subnet": "10.56.217.0/24",
"rangeStart": "10.56.217.171",
234
第 17 章 硬件网络
"rangeEnd": "10.56.217.181",
"routes": [
{"dst": "224.0.0.0/5"},
{"dst": "232.0.0.0/5"}
],
"gateway": "10.56.217.1"
}
resourceName: example
3. 创建带有多播应用程序的 pod:
apiVersion: v1
kind: Pod
metadata:
name: testpmd
namespace: default
annotations:
k8s.v1.cni.cncf.io/networks: nic1
spec:
containers:
- name: example
image: rhel7:latest
securityContext:
capabilities:
add: ["NET_ADMIN"] 1
command: [ "sleep", "infinity"]
有关支持的设备的详情,请参考支持的设备。
先决条件
安装 OpenShift CLI(oc)。
流程
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: intel-dpdk-node-policy
namespace: openshift-sriov-network-operator
spec:
resourceName: intelnics
nodeSelector:
feature.node.kubernetes.io/network-sriov.capable: "true"
priority: <priority>
numVfs: <num>
nicSelector:
vendor: "8086"
deviceID: "158b"
pfNames: ["<pf_name>", ...]
rootDevices: ["<pci_bus_id>", "..."]
deviceType: vfio-pci 1
1 将虚拟功能(VF)的驱动器类型指定为 vfio-pci。
注意
$ oc create -f intel-dpdk-node-policy.yaml
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
metadata:
name: intel-dpdk-network
namespace: openshift-sriov-network-operator
spec:
networkNamespace: <target_namespace>
ipam: |-
# ... 1
vlan: <vlan>
resourceName: intelnics
236
第 17 章 硬件网络
注意
$ oc create -f intel-dpdk-network.yaml
apiVersion: v1
kind: Pod
metadata:
name: dpdk-app
namespace: <target_namespace> 1
annotations:
k8s.v1.cni.cncf.io/networks: intel-dpdk-network
spec:
containers:
- name: testpmd
image: <DPDK_image> 2
securityContext:
runAsUser: 0
capabilities:
add: ["IPC_LOCK","SYS_RESOURCE","NET_RAW"] 3
volumeMounts:
- mountPath: /dev/hugepages 4
name: hugepage
resources:
limits:
openshift.io/intelnics: "1" 5
memory: "1Gi"
cpu: "4" 6
hugepages-1Gi: "4Gi" 7
requests:
openshift.io/intelnics: "1"
memory: "1Gi"
cpu: "4"
hugepages-1Gi: "4Gi"
command: ["sleep", "infinity"]
volumes:
- name: hugepage
emptyDir:
medium: HugePages
237
OpenShift Container Platform 4.10 网络
3 指定容器内的应用程序进行大页分配、系统资源分配和网络接口访问所需的额外功能。
$ oc create -f intel-dpdk-pod.yaml
先决条件
安装 OpenShift CLI(oc)。
流程
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: mlx-dpdk-node-policy
namespace: openshift-sriov-network-operator
spec:
resourceName: mlxnics
nodeSelector:
feature.node.kubernetes.io/network-sriov.capable: "true"
priority: <priority>
numVfs: <num>
nicSelector:
238
第 17 章 硬件网络
vendor: "15b3"
deviceID: "1015" 1
pfNames: ["<pf_name>", ...]
rootDevices: ["<pci_bus_id>", "..."]
deviceType: netdevice 2
isRdma: true 3
注意
$ oc create -f mlx-dpdk-node-policy.yaml
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
metadata:
name: mlx-dpdk-network
namespace: openshift-sriov-network-operator
spec:
networkNamespace: <target_namespace>
ipam: |- 1
# ...
vlan: <vlan>
resourceName: mlxnics
注意
239
OpenShift Container Platform 4.10 网络
$ oc create -f mlx-dpdk-network.yaml
apiVersion: v1
kind: Pod
metadata:
name: dpdk-app
namespace: <target_namespace> 1
annotations:
k8s.v1.cni.cncf.io/networks: mlx-dpdk-network
spec:
containers:
- name: testpmd
image: <DPDK_image> 2
securityContext:
runAsUser: 0
capabilities:
add: ["IPC_LOCK","SYS_RESOURCE","NET_RAW"] 3
volumeMounts:
- mountPath: /dev/hugepages 4
name: hugepage
resources:
limits:
openshift.io/mlxnics: "1" 5
memory: "1Gi"
cpu: "4" 6
hugepages-1Gi: "4Gi" 7
requests:
openshift.io/mlxnics: "1"
memory: "1Gi"
cpu: "4"
hugepages-1Gi: "4Gi"
command: ["sleep", "infinity"]
volumes:
- name: hugepage
emptyDir:
medium: HugePages
3 指定容器内的应用程序进行大页分配、系统资源分配和网络接口访问所需的额外功能。
240
第 17 章 硬件网络
$ oc create -f mlx-dpdk-pod.yaml
重要
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
在 OpenShift Container Platform 上使用 RDMA 时,RDMA over Converged Ethernet (RoCE) 是唯一支
持的模式。
先决条件
安装 OpenShift CLI(oc)。
流程
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: mlx-rdma-node-policy
namespace: openshift-sriov-network-operator
spec:
resourceName: mlxnics
nodeSelector:
feature.node.kubernetes.io/network-sriov.capable: "true"
priority: <priority>
numVfs: <num>
nicSelector:
vendor: "15b3"
deviceID: "1015" 1
pfNames: ["<pf_name>", ...]
241
OpenShift Container Platform 4.10 网络
3 启用 RDMA 模式。
注意
$ oc create -f mlx-rdma-node-policy.yaml
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
metadata:
name: mlx-rdma-network
namespace: openshift-sriov-network-operator
spec:
networkNamespace: <target_namespace>
ipam: |- 1
# ...
vlan: <vlan>
resourceName: mlxnics
注意
242
第 17 章 硬件网络
$ oc create -f mlx-rdma-network.yaml
apiVersion: v1
kind: Pod
metadata:
name: rdma-app
namespace: <target_namespace> 1
annotations:
k8s.v1.cni.cncf.io/networks: mlx-rdma-network
spec:
containers:
- name: testpmd
image: <RDMA_image> 2
securityContext:
runAsUser: 0
capabilities:
add: ["IPC_LOCK","SYS_RESOURCE","NET_RAW"] 3
volumeMounts:
- mountPath: /dev/hugepages 4
name: hugepage
resources:
limits:
memory: "1Gi"
cpu: "4" 5
hugepages-1Gi: "4Gi" 6
requests:
memory: "1Gi"
cpu: "4"
hugepages-1Gi: "4Gi"
command: ["sleep", "infinity"]
volumes:
- name: hugepage
emptyDir:
medium: HugePages
3 指定容器内的应用程序进行大页分配、系统资源分配和网络接口访问所需的额外功能。
243
OpenShift Container Platform 4.10 网络
$ oc create -f mlx-rdma-pod.yaml
17.9.4. 其他资源
配置 SR-IOV 以太网网络附加。
先决条件
17.10.1.1. 创建绑定网络附加定义
现在,SR-IOV 虚拟功能可用,您可以创建一个绑定网络附加定义。
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: bond-net1
namespace: demo
spec:
config: '{
"type": "bond", 1
244
第 17 章 硬件网络
"cniVersion": "0.3.1",
"name": "bond-net1",
"mode": "active-backup", 2
"failOverMac": 1, 3
"linksInContainer": true, 4
"miimon": "100",
"mtu": 1500,
"links": [ 5
{"name": "net1"},
{"name": "net2"}
],
"ipam": {
"type": "host-local",
"subnet": "10.56.217.0/24",
"routes": [{
"dst": "0.0.0.0/0"
}],
"gateway": "10.56.217.1"
}
}'
2 mode 属性指定绑定模式。
注意
支持的绑定模式有:
balance-rr - 0
active-backup - 1
balance-xor - 2
apiVersion: v1
kind: Pod
metadata:
245
OpenShift Container Platform 4.10 网络
name: bondpod1
namespace: demo
annotations:
k8s.v1.cni.cncf.io/networks: demo/sriovnet1, demo/sriovnet2, demo/bond-net1 1
spec:
containers:
- name: podexample
image: quay.io/openshift/origin-network-interface-bond-cni:4.11.0
command: ["/bin/bash", "-c", "sleep INF"]
2. 运行以下命令来应用 yaml:
$ oc apply -f podbonding.yaml
注意
246
第 17 章 硬件网络
注意
annotations:
k8s.v1.cni.cncf.io/networks: demo/sriovnet1, demo/sriovnet2, demo/bond-net1@bond0
17.11.1. 关于硬件卸载
Open vSwitch 硬件卸载是一种处理网络任务的方法,方法是将它们从 CPU 中分离出来,并将它们卸载到
网络接口控制器上的专用处理器。因此,集群可从更快的数据传输速度、CPU 工作负载减少并降低计算
成本中受益。
硬件卸载并不适用于所有工作负载或应用程序类型。只支持以下两种通信类型:
pod 到 pod
17.11.2. 支持的设备
在以下网络接口控制器上支持硬件卸载:
表 17.15. 支持的网络接口控制器
247
OpenShift Container Platform 4.10 网络
17.11.3. 先决条件
集群至少有一个裸机带有网络接口控制器,支持进行硬件卸载。
17.11.4. 为硬件卸载配置机器配置池
要启用硬件卸载,您必须首先创建一个专用的机器配置池,并将其配置为使用 SR-IOV Network
Operator。
先决条件
流程
1. 为您要使用硬件卸载的机器创建机器配置池。
a. 创建一个文件,如 mcp-offloading.yaml,其内容类似以下示例:
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfigPool
metadata:
name: mcp-offloading 1
spec:
machineConfigSelector:
matchExpressions:
- {key: machineconfiguration.openshift.io/role, operator: In, values: [worker,mcp-
offloading]} 2
nodeSelector:
matchLabels:
node-role.kubernetes.io/mcp-offloading: "" 3
1 2 用于硬件卸载的机器配置池的名称。
3 此节点角色标签用于添加节点到机器配置池。
b. 应用机器配置池的配置:
$ oc create -f mcp-offloading.yaml
2. 将节点添加到机器配置池。使用池的节点角色标签标记每个节点:
3. 可选: 要验证是否创建了新池,请运行以下命令:
248
第 17 章 硬件网络
$ oc get nodes
输出示例
a. 创建一个文件,如 sriov-pool-config.yaml,其内容类似以下示例:
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkPoolConfig
metadata:
name: sriovnetworkpoolconfig-offload
namespace: openshift-sriov-network-operator
spec:
ovsHardwareOffloadConfig:
name: mcp-offloading 1
1 用于硬件卸载的机器配置池的名称。
b. 应用配置:
$ oc create -f <SriovNetworkPoolConfig_name>.yaml
注意
它可能需要几分钟时间来应用配置更改。
先决条件
流程
249
OpenShift Container Platform 4.10 网络
流程
1. 创建一个文件,如 sriov-node-policy.yaml,其内容类似以下示例:
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: sriov-node-policy <.>
namespace: openshift-sriov-network-operator
spec:
deviceType: netdevice <.>
eSwitchMode: "switchdev" <.>
nicSelector:
deviceID: "1019"
rootDevices:
- 0000:d8:00.0
vendor: "15b3"
pfNames:
- ens8f0
nodeSelector:
feature.node.kubernetes.io/network-sriov.capable: "true"
numVfs: 6
priority: 5
resourceName: mlxnics
2. 应用策略的配置:
$ oc create -f sriov-node-policy.yaml
注意
它可能需要几分钟时间来应用配置更改。
17.11.6. 创建网络附加定义
在定义机器配置池和 SR-IOV 网络节点策略后,您可以为您指定的网络接口卡创建网络附加定义。
先决条件
流程
1. 创建一个文件,如 net-attach-def.yaml,其内容类似以下示例:
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: net-attach-def <.>
250
第 17 章 硬件网络
2. 应用网络附加定义的配置:
$ oc create -f net-attach-def.yaml
验证
运行以下命令,以查看是否存在新定义:
$ oc get net-attach-def -A
输出示例
流程
....
metadata:
annotations:
v1.multus-cni.io/default-network: net-attach-def/net-attach-def <.>
<.> 该值必须是您为硬件卸载而创建的网络附加定义的名称和命名空间。
先决条件
251
OpenShift Container Platform 4.10 网络
流程
4. 删除 SR-IOV Webhook:
其他资源
从集群中删除 Operator
252
第 18 章 OPENSHIFT SDN 默认 CNI 网络供应商
出口 IP 支持 支持
出口防火墙 [1] 支持 支持
出口路由器 支持 支持 [2]
IPsec 加密 不支持 支持
Kubernetes 网络策略 支持 支持
多播 支持 支持
硬件卸载 不支持 支持
253
OpenShift Container Platform 4.10 网络
2. OVN-Kubernetes 的出口路由器仅支持重定向模式。
3. IPv6 只在裸机集群中被支持。
18.2. 为项目配置出口 IP
作为集群管理员,您可以配置 OpenShift SDN Container Network Interface(CNI)集群网络供应商,为项
目分配一个或多个出口 IP 地址。
18.2.1. 出口 IP 地址架构设计和实施
OpenShift Container Platform 出口 IP 地址功能可确保来自一个或多个命名空间中的一个或多个 pod 的
流量具有集群网络之外的服务具有一致的源 IP 地址。
分配给命名空间的出口 IP 地址与用来向特定目的地发送流量的出口路由器不同。
重要
18.2.1.1. 平台支持
下表概述了对不同平台中的出口 IP 地址功能的支持:
平台 支持
裸机 是
VMware vSphere 是
Microsoft Azure 是
重要
254
第 18 章 OPENSHIFT SDN 默认 CNI 网络供应商
重要
18.2.1.2. 公共云平台注意事项
对于在公共云基础架构上置备的集群,每个节点绝对的 IP 地址会有一个约束。如下公式描述了每个节点
的可分配 IP 地址或 IP 容量 上限:
注解值是一个带有单个对象的数组,其中包含为主网络接口提供以下信息的字段:
以下示例演示了来自多个公共云提供商上节点的注解。注解被缩进以便于阅读。
cloud.network.openshift.io/egress-ipconfig: [
{
"interface":"eni-078d267045138e436",
"ifaddr":{"ipv4":"10.0.128.0/18"},
"capacity":{"ipv4":14,"ipv6":15}
}
]
cloud.network.openshift.io/egress-ipconfig: [
{
"interface":"nic0",
"ifaddr":{"ipv4":"10.0.128.0/18"},
"capacity":{"ip":14}
}
]
以下小节描述了支持公共云环境的 IP 地址容量,用于容量计算。
255
OpenShift Container Platform 4.10 网络
IP 别名分配存在以下容量限制:
如需更多信息,请参阅网络限制。
18.2.1.3. 限制
您不能在同一节点上同时使用手动分配和自动分配的出口 IP 地址。
注意
18.2.1.4. IP 地址分配方法
在自动分配方法中,给节点分配一个出口 IP 地址范围。
在手动分配方法中,给节点分配包含一个或多个出口 IP 地址的列表。
256
第 18 章 OPENSHIFT SDN 默认 CNI 网络供应商
当对出口 IP 地址使用自动分配方法时,请注意以下事项:
这种方法允许您控制哪些节点可以托管出口 IP 地址。
注意
如果在公共云基础架构上安装了集群,则必须确保为每个节点分配出口 IP 地址,以便有足
够的备用容量来托管 IP 地址。如需更多信息,请参阅上一节中的"平台注意事项"。
当手动分配出口 IP 地址时,请考虑以下事项:
支持一个命名空间带有多个出口 IP 地址。
如果命名空间有多个出口 IP 地址,且这些地址托管在多个节点上,则需要考虑以下额外的注意事项:
18.2.2. 为一个命名空间启用自动分配出口 IP 地址
在 OpenShift Container Platform 中,可以为一个或多个节点上的特定命名空间启用自动分配出口 IP 地
址。
先决条件
流程
257
OpenShift Container Platform 4.10 网络
其中:
<project_name>
指定项目的名称。
<ip_address>
为 egressIPs 数组指定一个或多个出口 IP 地址。
注意
其中:
<node_name>
指定节点名称。
<ip_address_range>
指定 CIDR 格式的 IP 地址范围。您可以为 egressCIDRs 阵列指定多个地址范围。
258
第 18 章 OPENSHIFT SDN 默认 CNI 网络供应商
18.2.3. 为一个命名空间配置手动分配出口 IP 地址
在 OpenShift Container Platform 中,您可以将一个或多个出口 IP 与一个项目关联。
先决条件
流程
其中:
<project_name>
指定项目的名称。
<ip_address>
为 egressIPs 数组指定一个或多个出口 IP 地址。
注意
2. 手动将出口 IP 地址分配给节点主机。
如果在公共云基础架构上安装了集群,则必须确认该节点具有可用的 IP 地址容量。
259
OpenShift Container Platform 4.10 网络
"<ip_address>"
]
}'
其中:
<node_name>
指定节点名称。
<ip_address>
指定一个 IP 地址。您可以为 egressIPs 数组指定多个 IP 地址。
18.2.4. 其他资源
如果要配置手动出口 IP 地址分配,请参阅平台考虑 与 IP 容量规划相关的信息。
18.3. 为项目配置出口防火墙
作为集群管理员,您可以为项目创建一个出口防火墙,用于限制离开 OpenShift Container Platform 集群
的出口流量。
18.3.1. 出口防火墙在一个项目中的工作原理
作为集群管理员,您可以使用一个出口防火墙来限制集群内的一些 pod 或所有 pod 可以访问的外部主
机。出口防火墙适用于以下情况:
pod 只能连接到内部主机,且无法启动到公共互联网的连接。
pod 只能连接到特定的外部主机。
注意
260
第 18 章 OPENSHIFT SDN 默认 CNI 网络供应商
重要
apiVersion: network.openshift.io/v1
kind: EgressNetworkPolicy
metadata:
name: default
namespace: <namespace> 1
spec:
egress:
- to:
cidrSelector: <api_server_address_range> 2
type: Allow
# ...
- to:
cidrSelector: 0.0.0.0/0 3
type: Deny
1 出口防火墙的命名空间。
2 包含 OpenShift Container Platform API 服务器的 IP 地址范围。
3 一个全局拒绝规则会阻止访问 OpenShift Container Platform API 服务器。
如需更多信息,请参阅 BZ#1988324。
重要
如果您使用网络策略模式,则出口防火墙只与每个命名空间的一个策略兼容,且无法用于
共享网络的项目,如全局项目。
警告
18.3.1.1. 出口防火墙的限制
261
OpenShift Container Platform 4.10 网络
出口防火墙有以下限制:
default 项目无法使用出口防火墙。
违反这些限制会导致项目的出口防火墙出现问题,并可能导致所有外部网络流量被丢弃。
18.3.1.2. 出口防火墙策略规则的匹配顺序
域名更新会根据生存时间(TTL)持续时间进行轮询。默认情况下,持续时间为 30 秒。当出口防
火墙控制器查询本地名称服务器以获取域名时,如果响应中包含的 TTL 小于 30 秒,控制器会将
持续时间设置为返回的值。如果响应中的 TTL 大于 30 分钟,控制器会将持续时间设置为 30 分
钟。如果 TTL 介于 30 秒到 30 分钟之间,控制器会忽略该值,并将持续时间设置为 30 秒。
注意
262
第 18 章 OPENSHIFT SDN 默认 CNI 网络供应商
EgressNetworkPolicy 对象
apiVersion: network.openshift.io/v1
kind: EgressNetworkPolicy
metadata:
name: <name> 1
spec:
egress: 2
...
1 出口防火墙的名称。
2 以下部分所述,一个或多个出口网络策略规则的集合。
18.3.2.1. EgressNetworkPolicy 规则
出口策略规则小节
egress:
- type: <type> 1
to: 2
cidrSelector: <cidr> 3
dnsName: <dns_name> 4
4 一个域名。
以下示例定义了几个出口防火墙策略规则:
apiVersion: network.openshift.io/v1
kind: EgressNetworkPolicy
metadata:
name: default
spec:
egress: 1
- type: Allow
to:
cidrSelector: 1.2.3.0/24
- type: Allow
to:
263
OpenShift Container Platform 4.10 网络
dnsName: www.example.com
- type: Deny
to:
cidrSelector: 0.0.0.0/0
1 出口防火墙策略规则对象的集合。
18.3.3. 创建出口防火墙策略对象
作为集群管理员,您可以为项目创建一个出口防火墙策略对象。
重要
先决条件
您需要使用集群管理员身份登陆到集群。
流程
1. 创建策略规则:
b. 在您创建的文件中,定义出口策略对象。
输出示例
egressnetworkpolicy.network.openshift.io/v1 created
18.4. 为项目编辑出口防火墙
作为集群管理员,您可以修改现有出口防火墙的网络流量规则。
18.4.1. 查看 EgressNetworkPolicy 对象
264
第 18 章 OPENSHIFT SDN 默认 CNI 网络供应商
先决条件
您必须登录集群。
流程
输出示例
Name: default
Namespace: project1
Created: 20 minutes ago
Labels: <none>
Annotations: <none>
Rule: Allow to 1.2.3.0/24
Rule: Allow to www.example.com
Rule: Deny to 0.0.0.0/0
18.5. 为项目编辑出口防火墙
作为集群管理员,您可以修改现有出口防火墙的网络流量规则。
18.5.1. 编辑 EgressNetworkPolicy 对象
作为集群管理员,您可以更新一个项目的出口防火墙。
先决条件
您需要使用集群管理员身份登陆到集群。
流程
$ oc replace -f <filename>.yaml
18.6. 从项目中删除出口防火墙
作为集群管理员,您可以从项目中删除出口防火墙,从而删除对项目的离开 OpenShift Container
Platform 集群的网络流量的限制。
18.6.1. 删除 EgressNetworkPolicy 对象
作为集群管理员,您可以从项目中删除出口防火墙。
先决条件
您需要使用集群管理员身份登陆到集群。
流程
注意
266
第 18 章 OPENSHIFT SDN 默认 CNI 网络供应商
注意
重要
18.7.1.1. 出口路由器模式
在 DNS 代理模式 中,出口路由器 pod 作为基于 TCP 服务的 DNS 代理运行,将其自身的 IP 地址转换到
一个或多个目标 IP 地址。要使用保留的源 IP 地址,客户端 pod 必须进行修改来连接到出口路由器 pod,
而不是直接连接到目标 IP 地址。此修改确保了外部的目的地将流量视为来自一个已知源的流量。
18.7.1.3. 部署注意事项
267
OpenShift Container Platform 4.10 网络
具体来说,请确保启用了以下功能:
MAC 地址更改
Forged Transits
18.7.1.4. 故障切换配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: egress-demo-controller
spec:
replicas: 1 1
selector:
matchLabels:
name: egress-router
template:
metadata:
name: egress-router
labels:
name: egress-router
annotations:
pod.network.openshift.io/assign-macvlan: "true"
spec: 2
initContainers:
...
containers:
...
18.7.2. 其他资源
在重定向模式中部署出口路由器
以 HTTP 代理模式部署出口路由器
以 DNS 代理模式部署出口路由器
268
第 18 章 OPENSHIFT SDN 默认 CNI 网络供应商
apiVersion: v1
kind: Pod
metadata:
name: egress-1
labels:
name: egress-1
annotations:
pod.network.openshift.io/assign-macvlan: "true" 1
spec:
initContainers:
- name: egress-router
image: registry.redhat.io/openshift4/ose-egress-router
securityContext:
privileged: true
env:
- name: EGRESS_SOURCE 2
value: <egress_router>
- name: EGRESS_GATEWAY 3
value: <egress_gateway>
- name: EGRESS_DESTINATION 4
value: <egress_destination>
- name: EGRESS_ROUTER_MODE
value: init
containers:
- name: egress-router-wait
image: registry.redhat.io/openshift4/ose-pod
3 值与节点使用的默认网关相同。
apiVersion: v1
269
OpenShift Container Platform 4.10 网络
kind: Pod
metadata:
name: egress-multi
labels:
name: egress-multi
annotations:
pod.network.openshift.io/assign-macvlan: "true"
spec:
initContainers:
- name: egress-router
image: registry.redhat.io/openshift4/ose-egress-router
securityContext:
privileged: true
env:
- name: EGRESS_SOURCE
value: 192.168.12.99/24
- name: EGRESS_GATEWAY
value: 192.168.12.1
- name: EGRESS_DESTINATION
value: |
80 tcp 203.0.113.25
8080 tcp 203.0.113.26 80
8443 tcp 203.0.113.26 443
203.0.113.27
- name: EGRESS_ROUTER_MODE
value: init
containers:
- name: egress-router-wait
image: registry.redhat.io/openshift4/ose-pod
18.8.2. 出口目的地配置格式
当出口路由器 pod 被部署为重定向模式时,您可以使用以下一种或多种格式指定重定向规则:
在示例中定义了几个规则:
最后一行与之前规则中没有指定的端口的流量匹配。
配置示例
80 tcp 203.0.113.25
8080 tcp 203.0.113.26 80
8443 tcp 203.0.113.26 443
270
第 18 章 OPENSHIFT SDN 默认 CNI 网络供应商
203.0.113.27
先决条件
安装 OpenShift CLI(oc)。
流程
1. 创建出口路由器 pod。
apiVersion: v1
kind: Service
metadata:
name: egress-1
spec:
ports:
- name: http
port: 80
- name: https
port: 443
type: ClusterIP
selector:
name: egress-1
18.8.4. 其他资源
使用 ConfigMap 配置出口路由器目的地映射
apiVersion: v1
kind: Pod
271
OpenShift Container Platform 4.10 网络
metadata:
name: egress-1
labels:
name: egress-1
annotations:
pod.network.openshift.io/assign-macvlan: "true" 1
spec:
initContainers:
- name: egress-router
image: registry.redhat.io/openshift4/ose-egress-router
securityContext:
privileged: true
env:
- name: EGRESS_SOURCE 2
value: <egress-router>
- name: EGRESS_GATEWAY 3
value: <egress-gateway>
- name: EGRESS_ROUTER_MODE
value: http-proxy
containers:
- name: egress-router-pod
image: registry.redhat.io/openshift4/ose-egress-http-proxy
env:
- name: EGRESS_HTTP_PROXY_DESTINATION 4
value: |-
...
...
3 值与节点使用的默认网关相同。
18.9.2. 出口目的地配置格式
当出口路由器 pod 以 HTTP 代理模式部署时,您可以使用以下一个或多个格式指定重定向规则。配置中
的每行都指定允许或者拒绝的连接组:
主机名允许代理该主机,如 www.example.com。
272
第 18 章 OPENSHIFT SDN 默认 CNI 网络供应商
! 再加上以前匹配的表达式会拒绝连接。
如果最后一行是 *,则任何没有被显式拒绝的都会被允许。否则,任何没有被允许的都会被拒绝。
您还可以使用 * 允许到所有远程目的地的连接。
配置示例
!*.example.com
!192.168.1.0/24
192.168.2.1
*
先决条件
安装 OpenShift CLI(oc)。
流程
1. 创建出口路由器 pod。
apiVersion: v1
kind: Service
metadata:
name: egress-1
spec:
ports:
- name: http-proxy
port: 8080 1
type: ClusterIP
selector:
name: egress-1
apiVersion: v1
kind: Pod
metadata:
name: app-1
labels:
273
OpenShift Container Platform 4.10 网络
name: app-1
spec:
containers:
env:
- name: http_proxy
value: http://egress-1:8080/ 1
- name: https_proxy
value: http://egress-1:8080/
...
1 上一步中创建的服务。
注意
18.9.4. 其他资源
使用 ConfigMap 配置出口路由器目的地映射
apiVersion: v1
kind: Pod
metadata:
name: egress-1
labels:
name: egress-1
annotations:
pod.network.openshift.io/assign-macvlan: "true" 1
spec:
initContainers:
- name: egress-router
image: registry.redhat.io/openshift4/ose-egress-router
securityContext:
privileged: true
env:
- name: EGRESS_SOURCE 2
value: <egress-router>
- name: EGRESS_GATEWAY 3
value: <egress-gateway>
- name: EGRESS_ROUTER_MODE
value: dns-proxy
containers:
- name: egress-router-pod
274
第 18 章 OPENSHIFT SDN 默认 CNI 网络供应商
image: registry.redhat.io/openshift4/ose-egress-dns-proxy
securityContext:
privileged: true
env:
- name: EGRESS_DNS_PROXY_DESTINATION 4
value: |-
...
- name: EGRESS_DNS_PROXY_DEBUG 5
value: "1"
...
3 值与节点使用的默认网关相同。
4 指定一个或多个代理目的地列表。
18.10.2. 出口目的地配置格式
当路由器以 DNS 代理模式部署时,您会指定一个端口和目标映射列表。目的地可以是 IP 地址,也可以是
DNS 名称。
端口和远程地址
您可以使用两个字段格式来指定源端口和目标主机: <port> <remote_address>。
端口和远程地址对示例
80 172.16.12.11
100 example.com
端口、远程地址和远程端口
您可以使用三字段格式 <port> <remote_address> <remote_port> 指定源端口、目标主机和目的地
端口。
三字段格式的行为与两字段版本相同,但目的地端口可能与源端口不同。
端口、远程地址和远程端口示例
275
OpenShift Container Platform 4.10 网络
8080 192.168.60.252 80
8443 web.example.com 443
先决条件
安装 OpenShift CLI(oc)。
流程
1. 创建出口路由器 pod。
apiVersion: v1
kind: Service
metadata:
name: egress-dns-svc
spec:
ports:
...
type: ClusterIP
selector:
name: egress-dns-proxy
例如:
apiVersion: v1
kind: Service
metadata:
name: egress-dns-svc
spec:
ports:
- name: con1
protocol: TCP
port: 80
targetPort: 80
- name: con2
protocol: TCP
port: 100
targetPort: 100
type: ClusterIP
selector:
name: egress-dns-proxy
276
第 18 章 OPENSHIFT SDN 默认 CNI 网络供应商
b. 要创建服务,请输入以下命令:
$ oc create -f egress-router-service.yaml
18.10.4. 其他资源
使用 ConfigMap 配置出口路由器目的地映射
18.11.1. 使用配置映射配置出口路由器目的地映射
对于大量或经常更换的目标映射集合,您可以使用配置映射来外部维护列表。这种方法的优点是可将编辑
配置映射的权限委派给没有 cluster-admin 特权的用户。因为出口路由器 pod 需要特权容器,没有
cluster-admin 特权的用户无法直接编辑 pod 定义。
注意
先决条件
安装 OpenShift CLI(oc)。
流程
80 tcp 203.0.113.25
# Fallback
203.0.113.27
您可以在这个文件中放入空白行和评论。
277
OpenShift Container Platform 4.10 网络
提示
apiVersion: v1
kind: ConfigMap
metadata:
name: egress-routes
data:
destination: |
# Egress routes for Project "Test", version 3
80 tcp 203.0.113.25
# Fallback
203.0.113.27
...
env:
- name: EGRESS_DESTINATION
valueFrom:
configMapKeyRef:
name: egress-routes
key: destination
...
18.11.2. 其他资源
重定向模式
HTTP 代理模式
DNS 代理模式
18.12. 为项目启用多播
18.12.1. 关于多播
通过使用 IP 多播,数据可同时广播到许多 IP 地址。
重要
278
第 18 章 OPENSHIFT SDN 默认 CNI 网络供应商
重要
目前,多播最适用于低带宽协调或服务发现。它不是一个高带宽解决方案。
先决条件
安装 OpenShift CLI(oc)。
流程
运行以下命令,为项目启用多播。使用您要启用多播的项目的名称替换 <namespace>。
验证
要验证项目是否启用了多播,请完成以下步骤:
1. 将您的当前项目更改为启用多播的项目。使用项目名替换 <project>。
$ oc project <project>
2. 创建 pod 以作为多播接收器:
279
OpenShift Container Platform 4.10 网络
app: multicast-verify
spec:
containers:
- name: mlistener
image: registry.access.redhat.com/ubi8
command: ["/bin/sh", "-c"]
args:
["dnf -y install socat hostname && sleep inf"]
ports:
- containerPort: 30102
name: mlistener
protocol: UDP
EOF
3. 创建 pod 以作为多播发送器:
4. 在新的终端窗口或选项卡中,启动多播监听程序。
a. 获得 Pod 的 IP 地址:
b. 输入以下命令启动多播监听程序:
$ oc exec mlistener -i -t -- \
socat UDP4-RECVFROM:30102,ip-add-membership=224.1.0.1:$POD_IP,fork
EXEC:hostname
5. 启动多播传输。
a. 获取 pod 网络 IP 地址范围:
b. 要发送多播信息,请输入以下命令:
280
第 18 章 OPENSHIFT SDN 默认 CNI 网络供应商
$ oc exec msender -i -t -- \
/bin/bash -c "echo | socat STDIO UDP4-
DATAGRAM:224.1.0.1:30102,range=$CIDR,ip-multicast-ttl=64"
如果多播正在工作,则上一个命令会返回以下输出:
mlistener
18.13. 为项目禁用多播
先决条件
安装 OpenShift CLI(oc)。
流程
运行以下命令来禁用多播:
1 您要禁用多播的项目的 namespace。
您可以通过两种方式更改项目的多租户隔离行为:
18.14.1. 先决条件
您必须将集群配置为以多租户隔离模式使用 OpenShift SDN Container Network Interface (CNI)
插件。
18.14.2. 接合项目
您可以接合两个或多个项目,以允许不同项目中的 Pod 和服务间的网络流量。
先决条件
281
OpenShift Container Platform 4.10 网络
安装 OpenShift CLI(oc)。
流程
1. 使用以下命令,将项目接合到现有项目网络中:
$ oc get netnamespaces
18.14.3. 隔离项目
您可以隔离项目,使其他项目中的 pod 和服务无法访问这个项目中的 pod 和服务。
先决条件
安装 OpenShift CLI(oc)。
流程
要隔离集群中的项目,请运行以下命令:
18.14.4. 对项目禁用网络隔离
您可以对项目禁用网络隔离。
先决条件
安装 OpenShift CLI(oc)。
流程
对项目运行以下命令:
18.15. 配置 KUBE-PROXY
Kubernetes 网络代理 (kube-proxy) 在每个节点上运行,并由 Cluster Network Operator (CNO) 管理。
kube-proxy 维护网络规则,以转发与服务关联的端点的连接。
同步在发生以下事件之一时开始:
发生某一事件,例如服务或端点添加到集群中或从集群中删除。
注意
表 18.2. 参数
参数 描述 值 默认值
18.15.3. 修改 kube-proxy 配置
您可以为集群修改 Kubernetes 网络代理配置。
先决条件
安装 OpenShift CLI(oc)。
使用 cluster-admin 角色登录到正在运行的集群。
流程
283
OpenShift Container Platform 4.10 网络
流程
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
kubeProxyConfig:
iptablesSyncPeriod: 30s
proxyArguments:
iptables-min-sync-period: ["30s"]
3. 保存文件并退出文本编辑器。
保存文件并退出编辑器时,oc 命令会验证其语法。如果您的修改含有语法错误,编辑器会打开该
文件并显示错误消息。
4. 运行以下命令来确认配置更新:
输出示例
apiVersion: v1
items:
- apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
clusterNetwork:
- cidr: 10.128.0.0/14
hostPrefix: 23
defaultNetwork:
type: OpenShiftSDN
kubeProxyConfig:
iptablesSyncPeriod: 30s
proxyArguments:
iptables-min-sync-period:
- 30s
serviceNetwork:
- 172.30.0.0/16
status: {}
kind: List
284
第 18 章 OPENSHIFT SDN 默认 CNI 网络供应商
输出示例
285
OpenShift Container Platform 4.10 网络
19.1.1. OVN-Kubernetes 特性
OVN-Kubernetes Container Network Interface (CNI) 集群网络供应商实现以下功能:
使用 OVN(开源虚拟网络)管理网络流量。OVN 是一个社区开发、与供应商无关的网络虚拟化
解决方案。
实现 Kubernetes 网络策略支持,包括入口和出口规则。
出口 IP 支持 支持
出口防火墙 [1] 支持 支持
出口路由器 支持 [2] 支持
IPsec 加密 支持 不支持
Kubernetes 网络策略 支持 支持
硬件卸载 支持 不支持
多播 支持 支持
286
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
2. OVN-Kubernetes 的出口路由器仅支持重定向模式。
3. IPv6 只在裸机集群中被支持。
19.1.3. OVN-Kubernetes 限制
OVN-Kubernetes Container Network Interface(CNI)集群网络供应商有以下限制:
唯一的解析是重新配置主机网络,以便两个 IP 系列都针对默认网关使用相同的网络接口。
唯一的解析是重新配置主机网络,以便两个 IP 系列都包含默认网关。
其他资源
为项目配置出口防火墙
关于网络策略
记录网络策略事件
为项目启用多播
IPsec 加密配置
Network [operator.openshift.io/v1]
287
OpenShift Container Platform 4.10 网络
裸机硬件
Microsoft Azure
VMware vSphere
重要
命名空间隔离
出口 IP 地址
出口网络策略
出口路由器 pod
多播
288
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
命名空间隔离
OVN-Kubernetes 仅支持网络策略隔离模式。
重要
出口 IP 地址
下表中描述了在 OVN-Kubernetes 和 OpenShift SDN 配置出口 IP 地址的不同:
表 19.2. 出口 IP 地址配置的不同
出口网络策略
下表中描述在 OVN-Kubernetes 和 OpenShift SDN 间配置出口网络策略(也称为出口防火墙)的不同之
处:
表 19.3. 出口网络策略配置的不同
出口路由器 pod
OVN-Kubernetes 支持重定向模式的出口路由器 pod。OVN-Kubernetes 不支持 HTTP 代理模式或 DNS
代理模式的出口路由器 pod。
多播
下表中描述了在 OVN-Kubernetes 和 OpenShift SDN 上启用多播流量的区别:
表 19.4. 多播配置的不同
289
OpenShift Container Platform 4.10 网络
网络策略
OVN-Kubernetes 在 networking.k8s.io/v1 API 组中完全支持 Kubernetes NetworkPolicy API。从
OpenShift SDN 进行迁移时,网络策略不需要更改。
19.2.1.2. 迁移过程如何工作
下表对迁移过程进行了概述,它分为操作中的用户发起的步骤,以及在响应过程中迁移过程要执行的操
作。
用户发起的步骤 迁移操作
将名为 cluster 的
Cluster Network Operator (CNO)
Network.operator.openshift.io 自定义资源
(CR)的 migration 字段设置为 相应地更新名为 cluster 的
Network.config.openshift.io CR 的状态。
OVNKubernetes。在设置值之前,请确保
migration 项为 null 。 Machine Config Operator(MCO)
将更新发布到 OVN-Kubernetes 所需的 systemd
配置 ; MCO 默认更新每个池的单一机器,从而导
致迁移总时间随着集群大小而增加。
更新 Network.config.openshift.io CR 的
CNO
networkType 字段。
执行以下操作:
更新 Multus 对象以反映新的集群网络供
应商。
重新引导集群中的每个节点。
集群
当节点重启时,集群会为 OVN-Kubernetes 集群
网络上的 pod 分配 IP 地址。
290
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
用户发起的步骤 迁移操作
将名为 cluster 的
CNO
Network.operator.openshift.io 自定义资源(CR)
的 migration 字段设置为 OpenShiftSDN 。在设置 相应地更新名为 cluster 的
Network.config.openshift.io CR 的状态。
值之前,请确保 migration 项为 null 。
更新 networkType 字段。
CNO
执行以下操作:
更新 Multus 对象以反映新的集群网络供
应商。
重新引导集群中的每个节点。
集群
当节点重启时,集群会为 OpenShift-SDN 网络上
的 pod 分配 IP 地址。
在集群重启中的所有节点后启用 MCO。
MCO
将更新发布到 OpenShift SDN 所需的 systemd 配
置 ; MCO 默认更新每个池的单一机器,因此迁移
总时间随着集群的大小而增加。
重要
在进行迁移时,集群不可用,工作负载可能会中断。仅在服务中断可以接受时才执行迁
移。
先决条件
etcd 数据库的最新备份可用。
291
OpenShift Container Platform 4.10 网络
可根据每个节点手动触发重新引导。
集群处于已知良好状态,没有任何错误。
流程
1. 要备份集群网络的配置,请输入以下命令:
注意
最大传输单元(MTU)
要自定义之前记录的设置之一,请输入以下命令。如果您不需要更改默认值,请从补丁中省略该
键。
mtu
Geneve 覆盖网络的 MTU。这个值通常是自动配置的;但是,如果集群中的节点没有都使用
相同的 MTU,那么您必须将此值明确设置为比最小节点 MTU 的值小 100。
port
Geneve 覆盖网络的 UDP 端口。如果没有指定值,则默认为 6081。端口不能与 OpenShift
SDN 使用的 VXLAN 端口相同。VXLAN 端口的默认值为 4789。
292
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
"ovnKubernetesConfig":{
"mtu":1200
}}}}'
4. 当 MCO 更新每个机器配置池中的机器时,它会逐一重启每个节点。您必须等到所有节点都已更
新。输入以下命令检查机器配置池状态:
$ oc get mcp
成功更新的节点具有以下状态: UPDATED=true、UPDATING=false、DEGRADED=false。
注意
默认情况下,MCO 会一次在一个池中更新一个机器,从而导致迁移总时间随着集
群大小的增加而增加。
5. 确认主机上新机器配置的状态:
a. 要列出机器配置状态和应用的机器配置名称,请输入以下命令:
输出示例
kubernetes.io/hostname=master-0
machineconfiguration.openshift.io/currentConfig: rendered-master-
c53e221d9d24e1c8bb6ee89dd3d8ad7b
machineconfiguration.openshift.io/desiredConfig: rendered-master-
c53e221d9d24e1c8bb6ee89dd3d8ad7b
machineconfiguration.openshift.io/reason:
machineconfiguration.openshift.io/state: Done
验证以下语句是否正确:
machineconfiguration.openshift.io/currentConfig 字段的值等于
machineconfiguration.openshift.io/desiredConfig 字段的值。
b. 要确认机器配置正确,请输入以下命令:
ExecStart=/usr/local/bin/configure-ovs.sh OVNKubernetes
i. 运行以下命令列出 pod:
293
OpenShift Container Platform 4.10 网络
输出示例
iii. 解决上一命令输出中显示的日志中的任何错误。
要指定网络供应商而不更改集群网络 IP 地址块,请输入以下命令:
要指定不同的集群网络 IP 地址块,请输入以下命令:
重要
294
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
重要
您无法在迁移过程中更改服务网络地址块。
输出示例
Waiting for daemon set "multus" rollout to finish: 1 out of 6 new pods have been updated...
...
Waiting for daemon set "multus" rollout to finish: 5 of 6 updated pods are available...
daemon set "multus" successfully rolled out
#!/bin/bash
9. 确认迁移成功完成:
$ oc get nodes
$ oc get co
295
OpenShift Container Platform 4.10 网络
10. 只有在迁移成功且集群处于良好状态时完成以下步骤:
a. 要从 CNO 配置对象中删除迁移配置,请输入以下命令:
19.2.3. 其他资源
OVN-Kubernetes 网络供应商的配置参数
备份 etcd
关于网络策略
OVN-Kubernetes 功能
配置出口 IP 地址
为项目配置出口防火墙
为项目启用多播
OpenShift SDN 功能
为项目配置出口 IP
为项目配置出口防火墙
为项目启用多播
Network [operator.openshift.io/v1]
重要
296
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
重要
先决条件
安装 OpenShift CLI(oc)。
流程
停止 master 配置池:
停止 worker 机器配置池:
最大传输单元(MTU)
VXLAN 端口
要自定义之前记录的设置或其中的一个设置,进行自定义并输入以下命令。如果您不需要更改默
认值,请从补丁中省略该键。
mtu
297
OpenShift Container Platform 4.10 网络
patch 命令示例
输出示例
Waiting for daemon set "multus" rollout to finish: 1 out of 6 new pods have been updated...
...
Waiting for daemon set "multus" rollout to finish: 5 of 6 updated pods are available...
daemon set "multus" successfully rolled out
#!/bin/bash
6. 重新引导集群中的节点后,启动所有机器配置池:
启动 master 配置池:
启动 worker 配置池:
298
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
当 MCO 更新每个配置池中的机器时,它会重新引导每个节点。
默认情况下,MCO 会在一个时间段内为每个池更新一台机器,因此迁移完成所需要的时间会随集
群大小的增加而增加。
7. 确认主机上新机器配置的状态:
a. 要列出机器配置状态和应用的机器配置名称,请输入以下命令:
输出示例
kubernetes.io/hostname=master-0
machineconfiguration.openshift.io/currentConfig: rendered-master-
c53e221d9d24e1c8bb6ee89dd3d8ad7b
machineconfiguration.openshift.io/desiredConfig: rendered-master-
c53e221d9d24e1c8bb6ee89dd3d8ad7b
machineconfiguration.openshift.io/reason:
machineconfiguration.openshift.io/state: Done
验证以下语句是否正确:
machineconfiguration.openshift.io/currentConfig 字段的值等于
machineconfiguration.openshift.io/desiredConfig 字段的值。
b. 要确认机器配置正确,请输入以下命令:
8. 确认迁移成功完成:
$ oc get nodes
i. 运行以下命令列出 pod:
299
OpenShift Container Platform 4.10 网络
输出示例
iii. 解决上一命令输出中显示的日志中的任何错误。
9. 只有在迁移成功且集群处于良好状态时完成以下步骤:
注意
300
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
注意
19.4.1. 转换为双栈集群网络
作为集群管理员,您可以将单堆栈集群网络转换为双栈集群网络。
注意
先决条件
流程
- op: add
path: /spec/clusterNetwork/-
value: 1
cidr: fd01::/48
hostPrefix: 64
- op: add
path: /spec/serviceNetwork/-
value: fd02::/112 2
2. 要修补集群网络配置,请输入以下命令:
其中:
file
指定您在上一步中创建的文件的名称。
输出示例
301
OpenShift Container Platform 4.10 网络
network.config.openshift.io/cluster patched
验证
完成以下步骤以验证,集群网络是否可以识别您在上一步中指定的 IPv6 地址块。
1. 显示网络配置:
$ oc describe network
输出示例
Status:
Cluster Network:
Cidr: 10.128.0.0/14
Host Prefix: 23
Cidr: fd01::/48
Host Prefix: 64
Cluster Network MTU: 1400
Network Type: OVNKubernetes
Service Network:
172.30.0.0/16
fd02::/112
默认禁用 IPsec。
注意
IPsec 加密只能在集群安装过程中启用,且在启用后无法禁用。有关安装文档,请参阅选择
集群安装方法并为用户准备它。
以下流量流没有加密:
下图中显示了加密和未加密的流程:
302
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
表 19.7. 用于全机器到所有机器通信的端口
协议 port 描述
19.5.3. 安全证书生成和轮转
Cluster Network Operator(CNO)生成自签名 X.509 证书颁发机构(CA),该颁发机构(CA)用于加
密。来自每个节点的证书签名请求(CSR)由 CNO 自动实现。
303
OpenShift Container Platform 4.10 网络
19.6. 为项目配置出口防火墙
作为集群管理员,您可以为项目创建一个出口防火墙,用于限制离开 OpenShift Container Platform 集群
的出口流量。
19.6.1. 出口防火墙在一个项目中的工作原理
作为集群管理员,您可以使用一个出口防火墙来限制集群内的一些 pod 或所有 pod 可以访问的外部主
机。出口防火墙适用于以下情况:
pod 只能连接到内部主机,且无法启动到公共互联网的连接。
pod 只能连接到特定的外部主机。
注意
端口号
重要
304
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
重要
apiVersion: k8s.ovn.org/v1
kind: EgressFirewall
metadata:
name: default
namespace: <namespace> 1
spec:
egress:
- to:
cidrSelector: <api_server_address_range> 2
type: Allow
# ...
- to:
cidrSelector: 0.0.0.0/0 3
type: Deny
1 出口防火墙的命名空间。
2 包含 OpenShift Container Platform API 服务器的 IP 地址范围。
3 一个全局拒绝规则会阻止访问 OpenShift Container Platform API 服务器。
如需更多信息,请参阅 BZ#1988324。
警告
19.6.1.1. 出口防火墙的限制
出口防火墙有以下限制:
违反这些限制会导致项目的出口防火墙出现问题,并可能导致所有外部网络流量被丢弃。
19.6.1.2. 出口防火墙策略规则的匹配顺序
域名更新会根据生存时间(TTL)持续时间进行轮询。默认情况下,持续时间为 30 分钟。当出口
防火墙控制器查询本地名称服务器以获取域名时,如果响应包含 TTL 且 TTL 小于 30 分钟,控制
器会将该 DNS 名称的持续时间设置为返回的值。每个 DNS 名称都会在 DNS 记录的 TTL 过期后
查询。
注意
EgressFirewall 对象
apiVersion: k8s.ovn.org/v1
kind: EgressFirewall
metadata:
name: <name> 1
spec:
egress: 2
...
1 对象的名称必须是 default。
2 以下部分所述,一个或多个出口网络策略规则的集合。
306
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
19.6.2.1. EgressFirewall 规则
出口策略规则小节
egress:
- type: <type> 1
to: 2
cidrSelector: <cidr> 3
dnsName: <dns_name> 4
ports: 5
...
4 DNS 域名。
5 可选:描述该规则的网络端口和协议集合的小节。
端口小节
ports:
- port: <port> 1
protocol: <protocol> 2
以下示例定义了几个出口防火墙策略规则:
apiVersion: k8s.ovn.org/v1
kind: EgressFirewall
metadata:
name: default
spec:
egress: 1
- type: Allow
to:
cidrSelector: 1.2.3.0/24
- type: Deny
to:
cidrSelector: 0.0.0.0/0
307
OpenShift Container Platform 4.10 网络
1 出口防火墙策略规则对象的集合。
apiVersion: k8s.ovn.org/v1
kind: EgressFirewall
metadata:
name: default
spec:
egress:
- type: Deny
to:
cidrSelector: 172.16.1.1
ports:
- port: 80
protocol: TCP
- port: 443
19.6.3. 创建出口防火墙策略对象
作为集群管理员,您可以为项目创建一个出口防火墙策略对象。
重要
先决条件
您需要使用集群管理员身份登陆到集群。
流程
1. 创建策略规则:
b. 在您创建的文件中,定义出口策略对象。
输出示例
308
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
egressfirewall.k8s.ovn.org/v1 created
19.7. 查看项目的出口防火墙
作为集群管理员,您可以列出任何现有出口防火墙的名称,并查看特定出口防火墙的流量规则。
19.7.1. 查看 EgressFirewall 对象
您可以查看集群中的 EgressFirewall 对象。
先决条件
您必须登录集群。
流程
输出示例
Name: default
Namespace: project1
Created: 20 minutes ago
Labels: <none>
Annotations: <none>
Rule: Allow to 1.2.3.0/24
Rule: Allow to www.example.com
Rule: Deny to 0.0.0.0/0
19.8. 为项目编辑出口防火墙
作为集群管理员,您可以修改现有出口防火墙的网络流量规则。
19.8.1. 编辑 EgressFirewall 对象
作为集群管理员,您可以更新一个项目的出口防火墙。
先决条件
309
OpenShift Container Platform 4.10 网络
您需要使用集群管理员身份登陆到集群。
流程
$ oc replace -f <filename>.yaml
19.9. 从项目中删除出口防火墙
作为集群管理员,您可以从项目中删除出口防火墙,从而删除对项目的离开 OpenShift Container
Platform 集群的网络流量的限制。
19.9.1. 删除 EgressFirewall 对象
作为集群管理员,您可以从项目中删除出口防火墙。
先决条件
您需要使用集群管理员身份登陆到集群。
流程
19.10. 配置出口 IP 地址
310
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
19.10.1. 出口 IP 地址架构设计和实施
OpenShift Container Platform 出口 IP 地址功能可确保来自一个或多个命名空间中的一个或多个 pod 的
流量具有集群网络之外的服务具有一致的源 IP 地址。
分配给命名空间的出口 IP 地址与用来向特定目的地发送流量的出口路由器不同。
重要
19.10.1.1. 平台支持
下表概述了对不同平台中的出口 IP 地址功能的支持:
平台 支持
裸机 是
VMware vSphere 是
Microsoft Azure 是
重要
19.10.1.2. 公共云平台注意事项
对于在公共云基础架构上置备的集群,每个节点绝对的 IP 地址会有一个约束。如下公式描述了每个节点
的可分配 IP 地址或 IP 容量 上限:
311
OpenShift Container Platform 4.10 网络
注解值是一个带有单个对象的数组,其中包含为主网络接口提供以下信息的字段:
以下示例演示了来自多个公共云提供商上节点的注解。注解被缩进以便于阅读。
cloud.network.openshift.io/egress-ipconfig: [
{
"interface":"eni-078d267045138e436",
"ifaddr":{"ipv4":"10.0.128.0/18"},
"capacity":{"ipv4":14,"ipv6":15}
}
]
cloud.network.openshift.io/egress-ipconfig: [
{
"interface":"nic0",
"ifaddr":{"ipv4":"10.0.128.0/18"},
"capacity":{"ip":14}
}
]
以下小节描述了支持公共云环境的 IP 地址容量,用于容量计算。
IP 别名分配存在以下容量限制:
如需更多信息,请参阅网络限制。
重要
每次不会将出口 IP 地址分配给多个节点。
出口 IP 地址可在可以托管出口 IP 地址的可用节点之间平衡。
任何节点都不会托管超过一个指定的 IP 地址。
流量在给定命名空间的指定 IP 地址之间大致相等。
如果节点不可用,则会自动重新分配给它的所有出口 IP 地址,但符合前面描述的条件。
313
OpenShift Container Platform 4.10 网络
19.10.1.5. 出口 IP 地址配置架构图
下图显示了出口 IP 地址配置。图中描述了,在一个集群的三个节点上运行的两个不同命名空间中的四个
pod。节点从主机网络上的 192.168.126.0/18 CIDR 块中分配 IP 地址。
Node 1
meta:
name: node1
labels:
k8s.ovn.org/egress-assignable: ""
图中的以下资源被详细描述:
Namespace 对象
命名空间在以下清单中定义:
命名空间对象
apiVersion: v1
kind: Namespace
metadata:
name: namespace1
labels:
env: prod
---
apiVersion: v1
kind: Namespace
metadata:
name: namespace2
labels:
env: prod
EgressIP 对象
以下 EgressIP 对象描述了一个配置,它选择将 env 标签设置为 prod 的任意命名空间中的所有 pod。
所选 pod 的出口 IP 地址为 192.168.126.10 和 192.168.126.102。
EgressIP 对象
apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
name: egressips-prod
spec:
314
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
egressIPs:
- 192.168.126.10
- 192.168.126.102
namespaceSelector:
matchLabels:
env: prod
status:
items:
- node: node1
egressIP: 192.168.126.10
- node: node3
egressIP: 192.168.126.102
19.10.2. EgressIP 对象
以下 YAML 描述了 EgressIP 对象的 API。对象有效的范围为集群,它不是在命名空间中创建的。
apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
name: <name> 1
spec:
egressIPs: 2
- <ip_address>
namespaceSelector: 3
...
podSelector: 4
...
1 EgressIPs 对象的名称。
2 包括一个或多个 IP 地址的数组。
3 出口 IP 地址与其关联的一个或多个命名空间选择器将。
以下 YAML 描述了命名空间选择器的小节:
命名空间选择器小节
namespaceSelector: 1
matchLabels:
<label_name>: <label_value>
1 命名空间的一个或多个匹配规则。如果提供多个匹配规则,则会选择所有匹配的命名空间。
315
OpenShift Container Platform 4.10 网络
Pod 选择器片段
podSelector: 1
matchLabels:
<label_name>: <label_value>
EgressIP 对象示例
apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
name: egress-group1
spec:
egressIPs:
- 192.168.126.11
- 192.168.126.102
podSelector:
matchLabels:
app: web
namespaceSelector:
matchLabels:
env: prod
EgressIP 对象示例
apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
name: egress-group2
spec:
egressIPs:
- 192.168.127.30
- 192.168.127.40
namespaceSelector:
matchExpressions:
- key: environment
operator: NotIn
values:
- development
19.10.3. 标记节点以托管出口 IP 地址
您可以将 k8s.ovn.org/egress-assignable="" 标签应用到集群中的节点,以便 OpenShift Container
Platform 可以为该节点分配一个或多个出口 IP 地址。
316
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
先决条件
安装 OpenShift CLI(oc)。
以集群管理员身份登录集群。
流程
要标记节点,使其可以托管一个或多个出口 IP 地址,请输入以下命令:
1 要标记的节点的名称。
提示
apiVersion: v1
kind: Node
metadata:
labels:
k8s.ovn.org/egress-assignable: ""
name: <node_name>
19.10.4. 后续步骤
分配出口 IP
19.10.5. 其他资源
labelSelector meta/v1
LabelSelectorRequirement meta/v1
19.11. 分配出口 IP 地址
作为集群管理员,您可以为从一个命名空间中,或从一个命名空间内的特定 pod 中离开集群的网络流量分
配一个出口 IP 地址。
19.11.1. 为一个命名空间分配出口 IP 地址
您可以将一个或多个出口 IP 地址分配给一个命名空间,或分配给命名空间中的特定 pod。
先决条件
安装 OpenShift CLI(oc)。
以集群管理员身份登录集群。
至少配置一个节点来托管出口 IP 地址。
317
OpenShift Container Platform 4.10 网络
流程
1. 创建 EgressIP 对象:
apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
name: egress-project1
spec:
egressIPs:
- 192.168.127.10
- 192.168.127.11
namespaceSelector:
matchLabels:
env: qa
2. 运行以下命令来创建对象。
$ oc apply -f <egressips_name>.yaml 1
1 将 <egressips_name> 替换为对象的名称。
输出示例
egressips.k8s.ovn.org/<egressips_name> created
19.11.2. 其他资源
配置出口 IP 地址
注意
318
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
注意
重要
19.12.1.1. 出口路由器模式
注意
出口路由器的部署。
如果您删除了一个出口路由器自定义资源,Operator 会删除上列表中与出口路由器关联的两个对象。
19.12.1.3. 部署注意事项
319
OpenShift Container Platform 4.10 网络
具体来说,请确保启用了以下功能:
MAC 地址更改
Forged Transits
19.12.1.4. 故障切换配置
apiVersion: v1
kind: Service
metadata:
name: app-egress
spec:
ports:
- name: tcp-8080
protocol: TCP
port: 8080
- name: tcp-8443
protocol: TCP
port: 8443
- name: udp-80
protocol: UDP
port: 80
type: ClusterIP
selector:
app: egress-router-cni
19.12.2. 其他资源
在重定向模式中部署出口路由器
19.13.1. 出口路由器自定义资源
apiVersion: network.operator.openshift.io/v1
kind: EgressRouter
metadata:
name: <egress_router_name>
namespace: <namespace> <.>
spec:
addresses: [ <.>
{
ip: "<egress_router>", <.>
gateway: "<egress_gateway>" <.>
}
]
mode: Redirect
redirect: {
redirectRules: [ <.>
{
destinationIP: "<egress_destination>",
port: <egress_router_port>,
targetPort: <target_port>, <.>
protocol: <network_protocol> <.>
},
...
],
fallbackIP: "<egress_destination>" <.>
}
出口路由器规格示例
apiVersion: network.operator.openshift.io/v1
kind: EgressRouter
321
OpenShift Container Platform 4.10 网络
metadata:
name: egress-router-redirect
spec:
networkInterface: {
macvlan: {
mode: "Bridge"
}
}
addresses: [
{
ip: "192.168.12.99/24",
gateway: "192.168.12.1"
}
]
mode: Redirect
redirect: {
redirectRules: [
{
destinationIP: "10.0.0.99",
port: 80,
protocol: UDP
},
{
destinationIP: "203.0.113.26",
port: 8080,
targetPort: 80,
protocol: TCP
},
{
destinationIP: "203.0.113.27",
port: 8443,
targetPort: 443,
protocol: TCP
}
]
}
19.13.2. 以重定向模式部署出口路由器
您可以部署出口路由器,将其自身保留源 IP 地址的流量重定向到一个或多个目标 IP 地址。
先决条件
安装 OpenShift CLI(oc)。
流程
1. 创建出口路由器定义。
322
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
apiVersion: v1
kind: Service
metadata:
name: egress-1
spec:
ports:
- name: web-app
protocol: TCP
port: 8080
type: ClusterIP
selector:
app: egress-router-cni <.>
验证
要验证 Cluster Network Operator 是否启动了出口路由器,请完成以下步骤:
1. 查看 Operator 为出口路由器创建的网络附加定义:
网络附加定义的名称不可配置。
输出示例
NAME AGE
egress-router-cni-nad 18m
部署的名称不可配置。
输出示例
输出示例
323
OpenShift Container Platform 4.10 网络
$ oc debug node/$POD_NODENAME
c. 将 /host 设为 debug shell 中的根目录。debug pod 在 pod 中的 /host 中挂载主机 的 root 文件系
统。将根目录改为 /host,您可以从主机的可执行路径中运行二进制文件:
# chroot /host
d. 在 chroot 环境控制台中显示出口路由器日志:
# cat /tmp/egress-router-log
输出示例
324
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
输出示例
CONTAINER
bac9fae69ddb6
输出示例
68857
g. 输入容器的网络命名空间:
# nsenter -n -t 68857
h. 显示路由表:
# ip route
输出示例
19.14. 为项目启用多播
19.14.1. 关于多播
通过使用 IP 多播,数据可同时广播到许多 IP 地址。
重要
目前,多播最适用于低带宽协调或服务发现。它不是一个高带宽解决方案。
先决条件
325
OpenShift Container Platform 4.10 网络
安装 OpenShift CLI(oc)。
流程
运行以下命令,为项目启用多播。使用您要启用多播的项目的名称替换 <namespace>。
提示
apiVersion: v1
kind: Namespace
metadata:
name: <namespace>
annotations:
k8s.ovn.org/multicast-enabled: "true"
验证
要验证项目是否启用了多播,请完成以下步骤:
1. 将您的当前项目更改为启用多播的项目。使用项目名替换 <project>。
$ oc project <project>
2. 创建 pod 以作为多播接收器:
3. 创建 pod 以作为多播发送器:
326
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
4. 在新的终端窗口或选项卡中,启动多播监听程序。
a. 获得 Pod 的 IP 地址:
b. 输入以下命令启动多播监听程序:
$ oc exec mlistener -i -t -- \
socat UDP4-RECVFROM:30102,ip-add-membership=224.1.0.1:$POD_IP,fork
EXEC:hostname
5. 启动多播传输。
a. 获取 pod 网络 IP 地址范围:
b. 要发送多播信息,请输入以下命令:
$ oc exec msender -i -t -- \
/bin/bash -c "echo | socat STDIO UDP4-
DATAGRAM:224.1.0.1:30102,range=$CIDR,ip-multicast-ttl=64"
如果多播正在工作,则上一个命令会返回以下输出:
mlistener
19.15. 为项目禁用多播
先决条件
327
OpenShift Container Platform 4.10 网络
安装 OpenShift CLI(oc)。
流程
运行以下命令来禁用多播:
1 您要禁用多播的项目的 namespace。
提示
apiVersion: v1
kind: Namespace
metadata:
name: <namespace>
annotations:
k8s.ovn.org/multicast-enabled: null
19.16. 跟踪网络流
作为集群管理员,您可以从集群中收集有关 pod 网络流的信息,以帮助以下区域:
监控 pod 网络上的入口和出口流量。
对性能问题进行故障排除。
为容量规划和安全审计收集数据。
当您启用网络流的集合时,只会收集与流量相关的元数据。例如,不会收集实际的数据包数据,而是只收
集协议、源地址、目标地址、端口号、字节数和其他数据包级别的信息。
数据采用以下一种或多种记录格式收集:
NetFlow
sFlow
IPFIX
328
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
收集网络流数据并将记录发送到收集器会影响性能。节点处理数据包的速度较慢。如果性能影响太大,您
可以删除收集器的目的地,以禁用收集网络流数据并恢复性能。
注意
启用网络流收集器可能会影响集群网络的整体性能。
19.16.1. 用于跟踪网络流的网络对象配置
下表显示了在 Cluster Network Operator(CNO)中配置网络流收集器的字段:
表 19.8. 网络流配置
字段 类型 描述
跟踪网络流的配置示例
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
exportNetworkFlows:
netFlow:
collectors:
- 192.168.1.99:2056
19.16.2. 为网络流收集器添加目的地
作为集群管理器,您可以将 Cluster Network Operator(CNO)配置为发送有关 pod 网络的网络流元数
据到网络流收集器。
329
OpenShift Container Platform 4.10 网络
先决条件
您有一个网络流收集器,知道它所侦听的 IP 地址和端口。
流程
1. 创建补丁文件,用于指定网络流收集器类型以及收集器的 IP 地址和端口信息:
spec:
exportNetworkFlows:
netFlow:
collectors:
- 192.168.1.99:2056
2. 使用网络流收集器配置 CNO:
输出示例
network.operator.openshift.io/cluster patched
验证
通常情况不需要进行验证。您可以运行以下命令,确认每个节点上的 Open vSwitch(OVS)已配置为将
网络流记录发送到一个或多个收集器。
输出示例
{"netFlow":{"collectors":["192.168.1.99:2056"]}}
输出示例
ovnkube-node-xrn4p
330
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
_uuid : a4d2aaca-5023-4f3d-9400-7275f92611f9
active_timeout : 60
add_id_to_interface : false
engine_id : []
engine_type : []
external_ids : {}
targets : ["192.168.1.99:2056"]
ovnkube-node-z4vq9
_uuid : 61d02fdb-9228-4993-8ff5-b27f01a29bd6
active_timeout : 60
add_id_to_interface : false
engine_id : []
engine_type : []
external_ids : {}
targets : ["192.168.1.99:2056"]-
...
19.16.3. 删除网络流收集器的所有目的地
作为集群管理员,您可以配置 Cluster Network Operator(CNO)来停止将网络流元数据发送到网络流收
集器。
先决条件
流程
1. 删除所有网络流收集器:
输出示例
network.operator.openshift.io/cluster patched
19.16.4. 其他资源
Network [operator.openshift.io/v1]
19.17. 配置混合联网
作为集群管理员,您可以配置 OVN-Kubernetes Container Network Interface(CNI)集群网络供应商,允
许 Linux 和 Windows 节点分别托管 Linux 和 Windows 工作负载。
331
OpenShift Container Platform 4.10 网络
重要
先决条件
流程
1. 进入包含安装程序的目录并创建清单:
其中:
<installation_directory>
指定包含集群的 install-config.yaml 文件的目录名称。
其中:
<installation_directory>
指定包含集群的 manifests/ 目录的目录名称。
指定混合网络配置
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
defaultNetwork:
ovnKubernetesConfig:
hybridOverlayConfig:
332
第 19 章 OVN-KUBERNETES 默认 CNI 网络供应商
hybridClusterNetwork: 1
- cidr: 10.132.0.0/14
hostPrefix: 23
hybridOverlayVXLANPort: 9898 2
注意
4. 保存 cluster-network-03-config.yml 文件,再退出文本编辑器。
19.17.2. 其他资源
使用自定义网络在 AWS 上安装集群
333
OpenShift Container Platform 4.10 网络
第 20 章 配置路由
20.1. 路由配置
前提条件
以管理员身份登录。
流程
$ oc new-project hello-openshift
2. 运行以下命令,在项目中创建 pod:
$ oc create -f https://raw.githubusercontent.com/openshift/origin/master/examples/hello-
openshift/hello-pod.json
$ oc expose pod/hello-openshift
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: hello-openshift
spec:
host: hello-openshift-hello-openshift.<Ingress_Domain> 1
port:
targetPort: 8080 2
334
第 20 章 配置路由
to:
kind: Service
name: hello-openshift
注意
要显示您的默认入口域,请运行以下命令:
20.1.2. 配置路由超时
如果您的服务需要低超时(满足服务级别可用性 (SLA) 目的)或高超时(具有慢速后端的情况),您可以
为现有路由配置默认超时。
前提条件
流程
1. 使用 oc annotate 命令,为路由添加超时:
强制 HSTS 策略时,HSTS 会向站点的 HTTP 和 HTTPS 响应添加 Strict Transport Security 标头。您可
以在路由中使用 insecureEdgeTerminationPolicy 值,以将 HTTP 重定向到 HTTPS。强制 HSTS 时,
客户端会在发送请求前将所有请求从 HTTP URL 更改为 HTTPS,无需重定向。
根据每个路由启用 HSTS
335
OpenShift Container Platform 4.10 网络
根据每个路由禁用 HSTS
对一组域强制每个域的 HSTS,或者结合使用命名空间标签与域
重要
前提条件
您可以使用具有项目的管理员特权的用户登陆到集群。
已安装 oc CLI。
流程
注意
配置了注解的路由示例
apiVersion: route.openshift.io/v1
kind: Route
metadata:
annotations:
haproxy.router.openshift.io/hsts_header: max-age=31536000;includeSubDomains;preload
1 2 3
...
spec:
host: def.abc.com
tls:
termination: "reencrypt"
...
wildcardPolicy: "Subdomain"
336
第 20 章 配置路由
2 可选。包含时,includeSubDomains 告知客户端主机的所有子域都必须与主机具有相同的
HSTS 策略。
前提条件
您可以使用具有项目的管理员特权的用户登陆到集群。
已安装 oc CLI。
流程
提示
metadata:
annotations:
haproxy.router.openshift.io/hsts_header: max-age=0
验证
1. 要查询所有路由的注解,请输入以下命令:
337
OpenShift Container Platform 4.10 网络
输出示例
注意
注意
重要
先决条件
您可以使用具有项目的管理员特权的用户登陆到集群。
已安装 oc CLI。
流程
1. 编辑 Ingress 配置文件:
$ oc edit ingresses.config.openshift.io/cluster
HSTS 策略示例
apiVersion: config.openshift.io/v1
kind: Ingress
metadata:
name: cluster
spec:
domain: 'hello-openshift-default.apps.username.devcluster.openshift.com'
requiredHSTSPolicies: 1
- domainPatterns: 2
- '*hello-openshift-default.apps.username.devcluster.openshift.com'
- '*hello-openshift-default2.apps.username.devcluster.openshift.com'
namespaceSelector: 3
matchLabels:
myPolicy: strict
338
第 20 章 配置路由
maxAge: 4
smallestMaxAge: 1
largestMaxAge: 31536000
preloadPolicy: RequirePreload 5
includeSubDomainsPolicy: RequireIncludeSubDomains 6
- domainPatterns: 7
- 'abc.example.com'
- '*xyz.example.com'
namespaceSelector:
matchLabels: {}
maxAge: {}
preloadPolicy: NoOpinion
includeSubDomainsPolicy: RequireNoIncludeSubDomains
3 可选。如果包含 namespaceSelector,它必须与路由所在项目的标签匹配,以便在路由上
强制执行设定 HSTS 策略。仅与 namespaceSelector 而不是 domainPatterns 匹配的路由
不会被验证。
RequirePreload:RequiredHSTSPolicy 需要 preload。
6 可选。includeSubDomainsPolicy 可使用以下之一设置:
339
OpenShift Container Platform 4.10 网络
验证
您可以查看您配置的 HSTS 策略。例如:
输出示例
20.1.4. 吞吐量问题错误排解
有时,通过 OpenShift Container Platform 部署的应用程序可能会导致网络吞吐量问题,如特定服务间的
延迟异常高。
如果 pod 日志未能揭示造成问题的原因,请使用以下方法分析性能问题:
$ tcpdump -s 0 -i any -w /tmp/dump.pcap host <podip 1> && host <podip 2> 1
340
第 20 章 配置路由
注意
如果后端更改,可以将流量定向到错误的服务器,使其更不计。如果您使用负载均衡器来
隐藏源 IP,则会为所有连接和流量都发送到同一 pod 设置相同的数字。
流程
其中:
<route_name>
指定路由的名称。
<cookie_name>
指定 Cookie 的名称。
2. 在变量中捕获路由主机名:
其中:
<route_name>
341
OpenShift Container Platform 4.10 网络
指定路由的名称。
3. 保存 cookie,然后访问路由:
使用上一个命令在连接到路由时保存的 cookie:
20.1.6. 基于路径的路由
基于路径的路由指定了一个路径组件,可以与 URL 进行比较,该 URL 需要基于 HTTP 的路由流量。因
此,可以使用同一主机名提供多个路由,每个主机名都有不同的路径。路由器应该匹配基于最具体路径的
路由。不过,这还取决于路由器的实现。
下表显示了路由及其可访问性示例:
表 20.1. 路由可用性
www.example.com/test www.example.com/test 是
www.example.com 否
www.example.com/test 和 www.example.com/test 是
www.example.com
www.example.com 是
www.example.com 是
带有路径的未安全路由
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: route-unsecured
spec:
host: www.example.com
path: "/test" 1
to:
kind: Service
name: service-name
1 该路径是基于路径的路由的唯一添加属性。
注意
342
第 20 章 配置路由
注意
20.1.7. 特定于路由的注解
Ingress Controller 可以为它公开的所有路由设置默认选项。单个路由可以通过在其注解中提供特定配置来
覆盖这些默认设置。红帽不支持在 Operator 管理的路由中添加路由注解。
重要
要创建带有多个源 IP 或子网的白名单,请使用以空格分隔的列表。任何其他限定类型会导
致忽略列表,而不发出警告或错误消息。
表 20.2. 路由注解
变量 描述 默认的环境变量
router.openshift.io/cookie_n 指定一个可选的、用于此路由的
ame cookie。名称只能包含大写字母和
小写字母、数字、"_" 和 "-"。默认
为路由的内部密钥进行哈希处理。
343
OpenShift Container Platform 4.10 网络
变量 描述 默认的环境变量
344
第 20 章 配置路由
变量 描述 默认的环境变量
haproxy.router.openshift.io/i 为路由设置白名单。白名单是以空
p_whitelist 格分开的 IP 地址和 CIDR 范围列
表,用来代表批准的源地址。来自
白名单以外的 IP 地址的请求会被
丢弃。
白名单中允许的最大 IP 地址和
CIDR 范围数为 61。
haproxy.router.openshift.io/r 在后端中设置请求的重写路径。
ewrite-target
Lax:cookies 在访问的站点和第
三方站点间进行传输。
Strict:cookies 仅限于访问的站
点。
None:cookies 仅限于指定的站
点。
这个值仅适用于重新加密和边缘路
由。如需更多信息,请参阅
SameSite cookies 文档。
345
OpenShift Container Platform 4.10 网络
变量 描述 默认的环境变量
Append附加标头,保留任何现有
的标头。这是默认值。
replace:设置标头,删除任何现
有的标头。
Never :不设置标头,而是保留任
何现有的标头。
if-none :如果没有设置标头,则
设置它。
注意
环境变量不能编辑。
路由器超时变量
TimeUnits 由一个数字及一个时间单位表示:us *(microseconds), ms(毫秒,默认)、s(秒)、m
(分钟)、h *(小时) 、d (天)。
正则表达式是: [1-9][0-9]*(us\|ms\|s\|m\|h\|d)。
变量 默认 Description
ROUTER_DEFAULT_CONNECT_TI 5s 最长连接时间。
MEOUT
346
第 20 章 配置路由
变量 默认 Description
某些有效的超时值可以是某些变量的总
和,而不是特定的预期超时。例如:
ROUTER_SLOWLORIS_HTTP_KEE
PALIVE 调整 timeout http-keep-
alive。默认情况下,它被设置为 300s,
但 HAProxy 也等待 tcp-request
inspect-delay,它被设置为 5s。在这种
情况下,整个超时时间将是 300s 加 5s。
RELOAD_INTERVAL 5s 允许路由器至少执行重新加载和接受新更
改的频率。
设置自定义超时的路由
apiVersion: route.openshift.io/v1
kind: Route
metadata:
annotations:
haproxy.router.openshift.io/timeout: 5500ms 1
...
注意
只允许一个特定 IP 地址的路由
metadata:
annotations:
haproxy.router.openshift.io/ip_whitelist: 192.168.1.10
347
OpenShift Container Platform 4.10 网络
允许多个 IP 地址的路由
metadata:
annotations:
haproxy.router.openshift.io/ip_whitelist: 192.168.1.10 192.168.1.11 192.168.1.12
允许 IP 地址 CIDR 网络的路由
metadata:
annotations:
haproxy.router.openshift.io/ip_whitelist: 192.168.1.0/24
metadata:
annotations:
haproxy.router.openshift.io/ip_whitelist: 180.5.61.153 192.168.1.0/24 10.0.0.0/8
指定重写对象的路由
apiVersion: route.openshift.io/v1
kind: Route
metadata:
annotations:
haproxy.router.openshift.io/rewrite-target: / 1
...
1 将 / 设为后端请求的重写路径。
下表提供了在 spec.path、请求路径和重写对象的各种组合中重写行为的路径示例。
/foo /foo / /
/foo /foo/ / /
348
第 20 章 配置路由
/foo/ /foo/ / /
20.1.8. 配置路由准入策略
管理员和应用程序开发人员可在多个命名空间中运行具有相同域名的应用程序。这是针对多个团队开发
的、在同一个主机名上公开的微服务的机构。
警告
只有在命名空间间有信任的集群才会启用跨命名空间之间的声明,否则恶意用户可能
会接管主机名。因此,默认的准入策略不允许在命名空间间声明主机名。
先决条件
必须具有集群管理员权限。
流程
Ingress 控制器配置参数
spec:
routeAdmission:
namespaceOwnership: InterNamespaceAllowed
...
提示
349
OpenShift Container Platform 4.10 网络
提示
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: default
namespace: openshift-ingress-operator
spec:
routeAdmission:
namespaceOwnership: InterNamespaceAllowed
流程
Ingress 的 YAML 定义
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: frontend
annotations:
route.openshift.io/termination: "reencrypt" 1
spec:
rules:
- host: www.example.com 2
http:
paths:
- backend:
service:
name: frontend
port:
number: 443
path: /
pathType: Prefix
tls:
- hosts:
- www.example.com
secretName: example-com-tls-certificate
350
第 20 章 配置路由
spec:
rules:
- host: www.example.com
http:
paths:
- path: ''
pathType: ImplementationSpecific
backend:
service:
name: frontend
port:
number: 443
$ oc apply -f ingress.yaml
2. 列出您的路由:
$ oc get routes
如果您检查这个路由,它会类似于:
自动生成的路由的 YAML 定义
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: frontend-gnztq
ownerReferences:
- apiVersion: networking.k8s.io/v1
controller: true
kind: Ingress
name: frontend
uid: 4e6c59cc-704d-4f44-b390-617d879033b6
spec:
host: www.example.com
path: /
port:
targetPort: https
tls:
certificate: |
-----BEGIN CERTIFICATE-----
351
OpenShift Container Platform 4.10 网络
[...]
-----END CERTIFICATE-----
insecureEdgeTerminationPolicy: Redirect
key: |
-----BEGIN RSA PRIVATE KEY-----
[...]
-----END RSA PRIVATE KEY-----
termination: reencrypt
to:
kind: Service
name: frontend
前提条件
您有一个要公开的服务。
流程
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: frontend
...
spec:
rules:
...
tls:
- {} 1
1 使用此精确的语法指定 TLS,而不指定自定义证书。
$ oc create -f example-ingress.yaml
验证
352
第 20 章 配置路由
输出示例
apiVersion: v1
items:
- apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: frontend-j9sdd 1
...
spec:
...
tls: 2
insecureEdgeTerminationPolicy: Redirect
termination: edge 3
...
2 要使用默认证书,路由不应指定 spec.certificate。
先决条件
流程
服务 YAML 文件示例
apiVersion: v1
kind: Service
metadata:
creationTimestamp: yyyy-mm-ddT00:00:00Z
labels:
name: <service_name>
manager: kubectl-create
operation: Update
time: yyyy-mm-ddT00:00:00Z
353
OpenShift Container Platform 4.10 网络
name: <service_name>
namespace: <namespace_name>
resourceVersion: "<resource_version_number>"
selfLink: "/api/v1/namespaces/<namespace_name>/services/<service_name>"
uid: <uid_number>
spec:
clusterIP: 172.30.0.0/16
clusterIPs: 1
- 172.30.0.0/16
- <second_IP_address>
ipFamilies: 2
- IPv4
- IPv6
ipFamilyPolicy: RequireDualStack 3
ports:
- port: 8080
protocol: TCP
targetport: 8080
selector:
name: <namespace_name>
sessionAffinity: None
type: ClusterIP
status:
loadbalancer: {}
1 在双栈实例中,提供了两个不同的 clusterIP。
2. 要查看 端点,请输入以下命令:
$ oc get endpoints
3. 要查看 endpointslices,请输入以下命令:
$ oc get endpointslices
其他资源
使用 appsDomain 选项指定备选集群域
20.2. 安全路由
安全路由提供以下几种 TLS 终止功能来为客户端提供证书。以下小节介绍了如何使用自定义证书创建重
新加密、边缘和透传路由。
重要
354
第 20 章 配置路由
重要
20.2.1. 使用自定义证书创建重新加密路由
您可以通过 oc create route 命令,使用重新加密 TLS 终止和自定义证书配置安全路由。
前提条件
您必须具有要公开的服务。
注意
不支持密码保护的密钥文件。要从密钥文件中删除密码,使用以下命令:
流程
此流程使用自定义证书和重新加密 TLS 终止创建 Route 资源。以下步骤假定证书/密钥对位于当前工作目
录下的 tls.crt 和 tls.key 文件中。您还必须指定一个目标 CA 证书,使 Ingress Controller 信任服务的证
书。您也可以根据需要指定 CA 证书来补全证书链。替换 tls.crt、tls.key、cacert.crt 和(可选)ca.crt
的实际路径名称。替换您要为 frontend 公开的 Service 资源的名称。使用适当的主机名替换
www.example.com。
安全路由 YAML 定义
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: frontend
spec:
host: www.example.com
to:
kind: Service
name: frontend
tls:
termination: reencrypt
355
OpenShift Container Platform 4.10 网络
key: |-
-----BEGIN PRIVATE KEY-----
[...]
-----END PRIVATE KEY-----
certificate: |-
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
caCertificate: |-
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
destinationCACertificate: |-
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
20.2.2. 使用自定义证书创建边缘路由
您可以通过 oc create route 命令,使用边缘 TLS 终止和自定义证书配置安全路由。使用边缘路由
时,Ingress Controller 在将流量转发到目标 pod 之前终止 TLS 加密。该路由指定了 Ingress Controller 用
于路由的 TLS 证书和密钥。
前提条件
您必须具有要公开的服务。
注意
不支持密码保护的密钥文件。要从密钥文件中删除密码,使用以下命令:
流程
此流程使用自定义证书和边缘 TLS 终止创建 Route 资源。以下步骤假定证书/密钥对位于当前工作目录下
的 tls.crt 和 tls.key 文件中。您也可以根据需要指定 CA 证书来补全证书链。替换 tls.crt、tls.key 和(可
选)ca.crt 的实际路径名称。替换您要为 frontend 公开的服务名称。使用适当的主机名替换
www.example.com。
安全路由 YAML 定义
356
第 20 章 配置路由
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: frontend
spec:
host: www.example.com
to:
kind: Service
name: frontend
tls:
termination: edge
key: |-
-----BEGIN PRIVATE KEY-----
[...]
-----END PRIVATE KEY-----
certificate: |-
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
caCertificate: |-
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
20.2.3. 创建 passthrough 路由
您可以使用 oc create route 命令使用 passthrough 终止配置安全路由。如果 passthrough 终止,加密的
流量会直接发送到目的地,而路由器不会提供 TLS 终止。因此,路由不需要密钥或证书。
前提条件
您必须具有要公开的服务。
流程
创建 Route 资源:
使用 Passthrough 终止的安全路由
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: route-passthrough-secured 1
spec:
host: www.example.com
port:
targetPort: 8080
tls:
357
OpenShift Container Platform 4.10 网络
termination: passthrough 2
insecureEdgeTerminationPolicy: None 3
to:
kind: Service
name: frontend
1 对象的名称,长度限于 63 个字符。
目标 pod 负责为端点上的流量提供证书。目前,这是唯一支持需要客户端证书的方法,也称双向
验证。
358
第 21 章 配置集群入口流量
第 21 章 配置集群入口流量
21.1. 集群入口流量配置概述
OpenShift Container Platform 提供了以下从集群外部与集群中运行的服务进行通信的方法。
建议采用以下方法,它们按顺序或首选程度排列:
方法 用途
配置 NodePort 在集群中的所有节点上公开某一服务。
IP 故障切换
IP 故障切换管理一组节点的虚拟 IP 地址池。它通过 Keepalived 和虚拟路由器冗余协议 (VRRP) 实
施。IP 故障转移仅仅是第 2 层机制,它依赖于多播。对于某些网络,多播可能有缺点。
MetalLB
MetalLB 具有 2 层模式,但它不使用多播。第 2 层模式有一个缺点,它会通过一个节点传输外部 IP 地
址的所有流量。
手动分配外部 IP 地址
您可以使用 IP 地址块配置集群,用于为服务分配外部 IP 地址。默认情况下禁用此功能。此功能非常
灵活,但给集群或网络管理员带来了最大的负担。集群已准备好接收目标为外部 IP 的流量,但每个客
户必须决定如何将流量路由到节点。
359
OpenShift Container Platform 4.10 网络
作为集群管理员,您可以指定可向集群中服务发送流量的集群外部 IP 地址块。
这个功能通常最适用于在裸机硬件上安装的集群。
21.2.1. 先决条件
您的网络基础架构必须将外部 IP 地址的流量路由到集群。
21.2.2. 关于 ExternalIP
对于非云环境,OpenShift Container Platform 支持通过 ExternalIP 工具将外部 IP 地址分配给 Service
对象的 spec.externalIPs[] 字段。通过设置此字段,OpenShift Container Platform 为服务分配额外的虚
拟 IP 地址。IP 地址可以在为集群定义的服务网络之外。配置了 ExternalIP 功能的服务与具有
type=NodePort 的服务类似,允许您将流量定向到本地节点以进行负载均衡。
您必须配置网络基础架构,以确保您定义的外部 IP 地址块路由到集群。
通过可配置策略对用户使用外部 IP 地址的限制
根据请求自动将外部 IP 地址分配给服务
警告
重要
这个功能只在非云部署中被支持。对于云部署,使用负载均衡器服务自动部署云负载均衡
器,以服务端点为目标。
您可以使用以下方法分配外部 IP 地址:
自动分配一个外部 IP
当创建了一个带有 spec.type=LoadBalancer 设置的 Service 对象时,OpenShift Container
Platform 会从autoAssignCIDRs CIDR 块中自动为 spec.externalIPs[] 分配一个 IP 地址。在本例
中,OpenShift Container Platform 实现了负载均衡器服务类型的非云版本,并为服务分配 IP 地址。
默认情况下,自动分配被禁用,且必须由集群管理员配置,如以下部分所述。
手动分配外部 IP
OpenShift Container Platform 在创建 Service 对象时使用分配给 spec.externalIPs[] 数组的 IP 地
址。您不能指定已经被其他服务使用的 IP 地址。
21.2.2.1. 配置 ExternalIP
重要
注意
apiVersion: v1
kind: Service
metadata:
name: http-service
spec:
clusterIP: 172.30.163.110
externalIPs:
- 192.168.132.253
externalTrafficPolicy: Cluster
ports:
- name: highport
nodePort: 31903
port: 30102
protocol: TCP
targetPort: 30102
selector:
app: web
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer:
ingress:
- ip: 192.168.132.253
361
OpenShift Container Platform 4.10 网络
作为集群管理员,您可以指定允许和拒绝的 IP 地址块。
{
"policy": {
"allowedCIDRs": [],
"rejectedCIDRs": []
}
}
在配置策略限制时,会应用以下规则:
21.2.2.3. 策略对象示例
下面的例子演示了几个不同的策略配置。
apiVersion: config.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
externalIP:
policy: {}
...
apiVersion: config.openshift.io/v1
362
第 21 章 配置集群入口流量
kind: Network
metadata:
name: cluster
spec:
externalIP:
policy:
allowedCIDRs:
- 172.16.66.10/23
rejectedCIDRs:
- 172.16.66.10/24
...
apiVersion: config.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
externalIP:
policy: null
...
重要
network.config.openshift.io CR 名为 cluster
apiVersion: config.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
externalIP:
autoAssignCIDRs: [] 1
policy: 2
...
363
OpenShift Container Platform 4.10 网络
spec.externalIP 字段。默认情况下,不会定义任何限制。
network.config.openshift.io policy 小节
policy:
allowedCIDRs: [] 1
rejectedCIDRs: [] 2
外部 IP 配置示例
以下示例中显示了外部 IP 地址池的一些可能配置:
带有 spec.externalIP.autoAssignCIDRs 的配置示例
apiVersion: config.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
...
externalIP:
autoAssignCIDRs:
- 192.168.132.254/29
带有 spec.externalIP.policy 的示例配置
apiVersion: config.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
...
externalIP:
policy:
allowedCIDRs:
- 192.168.132.0/29
- 192.168.132.8/29
rejectedCIDRs:
- 192.168.132.7/32
364
第 21 章 配置集群入口流量
先决条件
安装 OpenShift CLI(oc)。
流程
2. 要编辑配置,请输入以下命令:
3. 修改 ExternalIP 配置,如下例所示:
apiVersion: config.openshift.io/v1
kind: Network
metadata:
name: cluster
spec:
...
externalIP: 1
...
1 指定 externalIP 小节的配置。
21.2.5. 后续步骤
为服务外部 IP 配置 ingress 集群流量
365
OpenShift Container Platform 4.10 网络
Ingress Controller:
可以纵向扩张,以在更多节点上具有更多副本。
注意
这部分中的流程需要由集群管理员执行先决条件。
21.3.2. 先决条件
在开始以下流程前,管理员必须:
设置集群联网环境的外部端口,使请求能够到达集群。
确定至少有一个用户具有集群管理员角色。要将此角色添加到用户,请运行以下命令:
21.3.3. 创建项目和服务
如果您要公开的项目和服务尚不存在,请首先创建项目,再创建服务。
如果项目和服务都已存在,跳到公开服务以创建路由这一步。
先决条件
按照 oc CLI 并以一个集群管理员身份登陆。
流程
1. 运行 oc new-project 命令为您的服务创建一个新项目:
$ oc new-project myproject
2. 使用 oc new-app 命令来创建服务:
$ oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.git
366
第 21 章 配置集群入口流量
3. 要验证该服务是否已创建,请运行以下命令:
输出示例
默认情况下,新服务没有外部 IP 地址。
21.3.4. 通过创建路由公开服务
您可以使用 oc expose 命令,将服务公开为路由。
流程
公开服务:
2. 登录您想公开的服务所在的项目:
$ oc project myproject
输出示例
route.route.openshift.io/nodejs-ex exposed
$ oc get route
输出示例
输出示例
367
OpenShift Container Platform 4.10 网络
HTTP/1.1 200 OK
...
流程
1. 编辑 router-internal.yaml 文件:
# cat router-internal.yaml
apiVersion: v1
items:
- apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: sharded
namespace: openshift-ingress-operator
spec:
domain: <apps-sharded.basedomain.example.net> 1
nodePlacement:
nodeSelector:
matchLabels:
node-role.kubernetes.io/worker: ""
routeSelector:
matchLabels:
type: sharded
status: {}
kind: List
metadata:
resourceVersion: ""
selfLink: ""
# oc apply -f router-internal.yaml
3. 使用 router-internal.yaml 中配置的域创建新路由:
368
第 21 章 配置集群入口流量
警告
流程
1. 编辑 router-internal.yaml 文件:
# cat router-internal.yaml
输出示例
apiVersion: v1
items:
- apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: sharded
namespace: openshift-ingress-operator
spec:
domain: <apps-sharded.basedomain.example.net> 1
nodePlacement:
nodeSelector:
matchLabels:
node-role.kubernetes.io/worker: ""
namespaceSelector:
matchLabels:
type: sharded
status: {}
kind: List
metadata:
resourceVersion: ""
selfLink: ""
369
OpenShift Container Platform 4.10 网络
# oc apply -f router-internal.yaml
3. 使用 router-internal.yaml 中配置的域创建新路由:
21.3.7. 其他资源
Ingress Operator 管理通配符 DNS。如需更多信息,请参阅 OpenShift Container Platform 中的
Ingress Operator、在裸机上安装集群和在 vSphere 上安装集群。
21.4. 使用负载均衡器配置集群入口流量
OpenShift Container Platform 提供了从集群外部与集群中运行的服务进行通信的方法。此方法使用了负
载均衡器。
21.4.1. 使用负载均衡器使流量进入集群
如果不需要具体的外部 IP 地址,您可以配置负载均衡器服务,以便从外部访问 OpenShift Container
Platform 集群。
注意
如果配置了池,则会在基础架构一级进行,而不是由集群管理员完成。
注意
这部分中的流程需要由集群管理员执行先决条件。
21.4.2. 先决条件
在开始以下流程前,管理员必须:
设置集群联网环境的外部端口,使请求能够到达集群。
确定至少有一个用户具有集群管理员角色。要将此角色添加到用户,请运行以下命令:
21.4.3. 创建项目和服务
370
第 21 章 配置集群入口流量
如果您要公开的项目和服务尚不存在,请首先创建项目,再创建服务。
如果项目和服务都已存在,跳到公开服务以创建路由这一步。
先决条件
按照 oc CLI 并以一个集群管理员身份登陆。
流程
1. 运行 oc new-project 命令为您的服务创建一个新项目:
$ oc new-project myproject
2. 使用 oc new-app 命令来创建服务:
$ oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.git
3. 要验证该服务是否已创建,请运行以下命令:
输出示例
默认情况下,新服务没有外部 IP 地址。
21.4.4. 通过创建路由公开服务
您可以使用 oc expose 命令,将服务公开为路由。
流程
公开服务:
2. 登录您想公开的服务所在的项目:
$ oc project myproject
输出示例
route.route.openshift.io/nodejs-ex exposed
371
OpenShift Container Platform 4.10 网络
$ oc get route
输出示例
输出示例
HTTP/1.1 200 OK
...
21.4.5. 创建负载均衡器服务
使用以下流程来创建负载均衡器服务。
先决条件
确保您要公开的项目和服务已经存在。
流程
创建负载均衡器服务:
2. 加载您要公开的服务所在的项目。
$ oc project project1
负载均衡器配置文件示例
apiVersion: v1
kind: Service
metadata:
name: egress-2 1
spec:
ports:
- name: db
port: 3306 2
loadBalancerIP:
loadBalancerSourceRanges: 3
- 10.0.0.0/8
- 192.168.0.0/16
372
第 21 章 配置集群入口流量
type: LoadBalancer 4
selector:
name: mysql 5
1 为负载均衡器服务输入一个描述性名称。
2 输入您要公开的服务所侦听的同一个端口。
4 输入 Loadbalancer 作为类型。
5 输入服务的名称。
注意
要将通过负载均衡器的流量限制为特定的 IP 地址,建议使用
service.beta.kubernetes.io/load-balancer-source-ranges 注解,而不是设置
loadBalancerSourceRanges 字段。通过注释,您可以更轻松地迁移到
OpenShift API,后者将在未来的发行版中实施。
4. 保存并退出文件。
5. 运行以下命令来创建服务:
$ oc create -f <file-name>
例如:
$ oc create -f mysql-lb.yaml
6. 执行以下命令以查看新服务:
$ oc get svc
输出示例
如果启用了云供应商,该服务会自动分配到一个外部 IP 地址。
$ curl <public-ip>:<port>
例如:
$ curl 172.29.121.74:3306
373
OpenShift Container Platform 4.10 网络
输出示例
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
MySQL [(none)]>
警告
流程
ingresscontroller.yml 文件示例
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
creationTimestamp: null
name: default
namespace: openshift-ingress-operator
spec:
endpointPublishingStrategy:
loadBalancer:
scope: External
providerParameters:
374
第 21 章 配置集群入口流量
type: AWS
aws:
type: NLB
type: LoadBalancerService
先决条件
流程
在现有集群中,创建一个由 AWS NLB 支持的 Ingress Controller。
$ cat ingresscontroller-aws-nlb.yaml
输出示例
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
name: $my_ingress_controller 1
namespace: openshift-ingress-operator
spec:
domain: $my_unique_ingress_domain 2
endpointPublishingStrategy:
type: LoadBalancerService
loadBalancer:
scope: External 3
providerParameters:
type: AWS
aws:
type: NLB
375
OpenShift Container Platform 4.10 网络
2. 在集群中创建资源:
$ oc create -f ingresscontroller-aws-nlb.yaml
重要
先决条件
创建 install-config.yaml 文件并完成对其所做的任何修改。
流程
在新集群中,创建一个由 AWS NLB 支持的 Ingress Controller。
1. 进入包含安装程序的目录并创建清单:
$ touch <installation_directory>/manifests/cluster-ingress-default-ingresscontroller.yaml 1
$ ls <installation_directory>/manifests/cluster-ingress-default-ingresscontroller.yaml
输出示例
cluster-ingress-default-ingresscontroller.yaml
376
第 21 章 配置集群入口流量
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
creationTimestamp: null
name: default
namespace: openshift-ingress-operator
spec:
endpointPublishingStrategy:
loadBalancer:
scope: External
providerParameters:
type: AWS
aws:
type: NLB
type: LoadBalancerService
4. 保存 cluster-ingress-default-ingresscontroller.yaml 文件并退出文本编辑器。
21.5.4. 其他资源
使用自定义网络在 AWS 上安装集群。
21.6.1. 先决条件
您的集群被配置为启用了 ExternalIP。如需更多信息,请参阅为服务配置 ExternalIPs。
注意
流程
2. 为服务附加一个 ExternalIP。
apiVersion: v1
kind: Service
metadata:
name: svc-with-externalip
spec:
...
externalIPs:
- 192.174.120.10
例如:
输出示例
"mysql-55-rhel7" patched
$ oc get svc
输出示例
21.6.3. 其他资源
为服务配置 ExternalIP
重要
使用节点端口需要额外的端口资源。
管理员必须确保外部 IP 地址路由到节点。
注意
这部分中的流程需要由集群管理员执行先决条件。
21.7.2. 先决条件
在开始以下流程前,管理员必须:
设置集群联网环境的外部端口,使请求能够到达集群。
确定至少有一个用户具有集群管理员角色。要将此角色添加到用户,请运行以下命令:
21.7.3. 创建项目和服务
如果您要公开的项目和服务尚不存在,请首先创建项目,再创建服务。
如果项目和服务都已存在,跳到公开服务以创建路由这一步。
先决条件
按照 oc CLI 并以一个集群管理员身份登陆。
流程
1. 运行 oc new-project 命令为您的服务创建一个新项目:
$ oc new-project myproject
379
OpenShift Container Platform 4.10 网络
2. 使用 oc new-app 命令来创建服务:
$ oc new-app nodejs:12~https://github.com/sclorg/nodejs-ex.git
3. 要验证该服务是否已创建,请运行以下命令:
输出示例
默认情况下,新服务没有外部 IP 地址。
21.7.4. 通过创建路由公开服务
您可以使用 oc expose 命令,将服务公开为路由。
流程
公开服务:
2. 登录您想公开的服务所在的项目:
$ oc project myproject
输出示例
service/nodejs-ex-nodeport exposed
4. 可选: 要使用公开的节点端口确认该服务可用,请输入以下命令:
输出示例
380
第 21 章 配置集群入口流量
21.7.5. 其他资源
配置节点端口服务范围
381
OpenShift Container Platform 4.10 网络
第 22 章 KUBERNETES NMSTATE
重要
警告
使用 OVN-Kubernetes 时,不支持更改默认网关接口。
先决条件
流程
1. 选择 Operators → OperatorHub。
5. 点 Install 安装 Operator。
382
第 22 章 KUBERNETES NMSTATE
注意
名称限制是一个已知问题。该实例是整个集群的单个实例。
概述
完成后,Operator 将 NMState State Controller 部署为在所有集群节点中的守护进程集。
先决条件
流程
2. 创建 OperatorGroup :
383
OpenShift Container Platform 4.10 网络
3. 订阅 nmstate Operator:
验证
输出示例
Name Phase
kubernetes-nmstate-operator.4.10.0-202203120157 Succeeded
22.2. 观察节点网络状态
节点网络状态是集群中所有节点的网络配置。
22.2.1. 关于 nmstate
OpenShift Container Platform 使用 nmstate 来报告并配置节点网络的状态。这样就可以通过将单个配置
清单应用到集群来修改网络策略配置,例如在所有节点上创建 Linux 桥接。
节点网络由以下对象监控和更新:
NodeNetworkState
报告该节点上的网络状态。
384
第 22 章 KUBERNETES NMSTATE
NodeNetworkConfigurationPolicy
描述节点上请求的网络配置。您可以通过将 NodeNetworkConfigurationPolicy清单应用到集群来更
新节点网络配置,包括添加和删除网络接口 。
NodeNetworkConfigurationEnactment
报告每个节点上采用的网络策略。
Linux Bridge
VLAN
bond
Ethernet
注意
22.2.2. 查看节点的网络状态
一个 NodeNetworkState 对象存在于集群中的每个节点上。此对象定期更新,并捕获该节点的网络状
态。
流程
$ oc get nns
2. 检查 NodeNetworkState 对象以查看该节点上的网络。为了清楚,这个示例中的输出已被重新编
辑:
输出示例
apiVersion: nmstate.io/v1
kind: NodeNetworkState
metadata:
name: node01 1
status:
currentState: 2
dns-resolver:
...
interfaces:
...
route-rules:
...
385
OpenShift Container Platform 4.10 网络
routes:
...
lastSuccessfulUpdateTime: "2020-01-31T12:14:00Z" 3
1 NodeNetworkState 对象的名称从节点获取。
3 最新成功更新的时间戳。只要节点可以被访问,这个时间戳就会定期更新,它可以用来指示
报告的新旧程度。
22.3. 更新节点网络配置
您可以通过将 NodeNetworkConfigurationPolicy 清单应用到集群来更新节点网络的配置,如为节点添
加或删除接口。
警告
使用 OVN-Kubernetes 时,不支持更改默认网关接口。
22.3.1. 关于 nmstate
OpenShift Container Platform 使用 nmstate 来报告并配置节点网络的状态。这样就可以通过将单个配置
清单应用到集群来修改网络策略配置,例如在所有节点上创建 Linux 桥接。
节点网络由以下对象监控和更新:
NodeNetworkState
报告该节点上的网络状态。
NodeNetworkConfigurationPolicy
描述节点上请求的网络配置。您可以通过将 NodeNetworkConfigurationPolicy清单应用到集群来更
新节点网络配置,包括添加和删除网络接口 。
NodeNetworkConfigurationEnactment
报告每个节点上采用的网络策略。
Linux Bridge
VLAN
bond
Ethernet
注意
386
第 22 章 KUBERNETES NMSTATE
注意
22.3.2. 在节点上创建接口
通过将一个 NodeNetworkConfigurationPolicy 清单应用到集群来在集群的节点上创建一个接口。清单
详细列出了请求的接口配置。
默认情况下,清单会应用到集群中的所有节点。要将接口只添加到特定的节点,在节点选择器上添加
spec: nodeSelector 参数和适当的 <key>:<value> 。
流程
apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
name: br1-eth1-policy 1
spec:
nodeSelector: 2
node-role.kubernetes.io/worker: "" 3
maxUnavailable: 3 4
desiredState:
interfaces:
- name: br1
description: Linux bridge with eth1 as a port 5
type: linux-bridge
state: up
ipv4:
dhcp: true
enabled: true
auto-dns: false
bridge:
options:
stp:
enabled: false
port:
- name: eth1
dns-resolver: 6
config:
search:
- example.com
- example.org
server:
- 8.8.8.8
387
OpenShift Container Platform 4.10 网络
1 策略的名称。
5 可选:接口人类可读的描述。
2. 创建节点网络策略:
$ oc apply -f br1-eth1-policy.yaml 1
1 节点网络配置策略清单的文件名。
其他资源
在相同策略中创建多个接口的示例
策略中不同 IP 管理方法示例
22.3.3. 确认节点上的节点网络策略更新
NodeNetworkConfigurationPolicy 清单描述了您为集群中的节点请求的网络配置。节点网络策略包括您
请求的网络配置以及整个集群中的策略执行状态。
当您应用节点网络策略时,会为集群中的每个节点创建一个 NodeNetworkConfigurationEnactment 对
象。节点网络配置是一个只读对象,代表在该节点上执行策略的状态。如果策略在节点上应用失败,则该
节点会包括 traceback 用于故障排除。
流程
1. 要确认策略已应用到集群,请列出策略及其状态:
$ oc get nncp
2. 可选:如果策略配置成功的时间比预期的要长,您可以检查特定策略请求的状态和状态条件:
3. 可选:如果策略在所有节点上配置成功的时间比预期的要长,您可以列出集群中的 Enactments
的状态:
$ oc get nnce
388
第 22 章 KUBERNETES NMSTATE
22.3.4. 从节点中删除接口
您可以通过编辑 NodeNetworkConfigurationPolicy 对象从集群中的一个或多个节点中删除接口,并将
接口的状态设置为 absent。
从节点中删除接口不会自动将节点网络配置恢复到以前的状态。如果要恢复之前的状态,则需要在策略中
定义节点网络配置。
注意
删除添加接口的节点网络策略不会更改节点上的策略配置。虽然
NodeNetworkConfigurationPolicy 是集群中的一个对象,但它只代表请求的配置。
同样,删除接口不会删除策略。
流程
apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
name: <br1-eth1-policy> 1
spec:
nodeSelector: 2
node-role.kubernetes.io/worker: "" 3
desiredState:
interfaces:
- name: br1
type: linux-bridge
state: absent 4
- name: eth1 5
type: ethernet 6
state: up 7
ipv4:
dhcp: true 8
enabled: true 9
1 策略的名称。
5 要从网桥接口中取消附加的接口名称。
389
OpenShift Container Platform 4.10 网络
6 接口的类型。这个示例创建了以太网网络接口。
7 接口的请求状态。
9 在这个示例中启用 ipv4 。
2. 更新节点上的策略并删除接口:
$ oc apply -f <br1-eth1-policy.yaml> 1
1 策略清单的文件名。
22.3.5. 不同接口的策略配置示例
apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
name: br1-eth1-policy 1
spec:
nodeSelector: 2
kubernetes.io/hostname: <node01> 3
desiredState:
interfaces:
- name: br1 4
description: Linux bridge with eth1 as a port 5
type: linux-bridge 6
state: up 7
ipv4:
dhcp: true 8
enabled: true 9
bridge:
options:
stp:
enabled: false 10
port:
- name: eth1 11
1 策略的名称。
390
第 22 章 KUBERNETES NMSTATE
4 接口的名称。
5 可选:接口人类可读的接口描述。
6 接口的类型。这个示例会创建一个桥接。
7 创建后接口的请求状态。
9 在这个示例中启用 ipv4 。
10 在这个示例中禁用 stp。
11 网桥附加到的节点 NIC。
apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
name: vlan-eth1-policy 1
spec:
nodeSelector: 2
kubernetes.io/hostname: <node01> 3
desiredState:
interfaces:
- name: eth1.102 4
description: VLAN using eth1 5
type: vlan 6
state: up 7
vlan:
base-iface: eth1 8
id: 102 9
1 策略的名称。
4 接口的名称。
5 可选:接口人类可读的接口描述。
6 接口的类型。这个示例创建了一个 VLAN。
391
OpenShift Container Platform 4.10 网络
7 创建后接口的请求状态。
9 VLAN 标签。
22.3.5.3. 示例:绑定接口节点网络配置策略
注意
mode=1 active-backup
mode=2 balance-xor
mode=4 802.3ad
mode=5 balance-tlb
mode=6 balance-alb
apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
name: bond0-eth1-eth2-policy 1
spec:
nodeSelector: 2
kubernetes.io/hostname: <node01> 3
desiredState:
interfaces:
- name: bond0 4
description: Bond with ports eth1 and eth2 5
type: bond 6
state: up 7
ipv4:
dhcp: true 8
enabled: true 9
link-aggregation:
mode: active-backup 10
options:
miimon: '140' 11
port: 12
- eth1
- eth2
mtu: 1450 13
392
第 22 章 KUBERNETES NMSTATE
1 策略的名称。
4 接口的名称。
5 可选:接口人类可读的接口描述。
6 接口的类型。这个示例创建了一个绑定。
7 创建后接口的请求状态。
9 在这个示例中启用 ipv4 。
12 绑定中的下级节点 NIC。
13 可选:绑定的最大传输单元(MTU)。如果没有指定,其默认值为 1500。
22.3.5.4. 示例:以太网接口节点网络配置策略
以下 YAML 文件是一个以太接口的清单示例。它包含了示例值,需要使用自己的信息替换。
apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
name: eth1-policy 1
spec:
nodeSelector: 2
kubernetes.io/hostname: <node01> 3
desiredState:
interfaces:
- name: eth1 4
description: Configuring eth1 on node01 5
type: ethernet 6
state: up 7
ipv4:
dhcp: true 8
enabled: true 9
1 策略的名称。
393
OpenShift Container Platform 4.10 网络
4 接口的名称。
5 可选:接口人类可读的接口描述。
6 接口的类型。这个示例创建了以太网网络接口。
7 创建后接口的请求状态。
9 在这个示例中启用 ipv4 。
22.3.5.5. 示例:同一节点网络配置策略中的多个接口
您可以在相同的节点网络配置策略中创建多个接口。这些接口可以相互引用,允许您使用单个策略清单来
构建和部署网络配置。
#...
interfaces:
- name: bond10
description: Bonding eth2 and eth3 for Linux bridge
type: bond
state: up
link-aggregation:
port:
- eth2
- eth3
- name: br1
description: Linux bridge on bond
type: linux-bridge
state: up
bridge:
port:
- name: bond10
#...
22.3.6. 示例:IP 管理
以下配置片段示例演示了不同的 IP 管理方法。
22.3.6.1. Static
以下片段在以太网接口中静态配置 IP 地址:
...
interfaces:
- name: eth1
description: static IP on eth1
type: ethernet
394
第 22 章 KUBERNETES NMSTATE
state: up
ipv4:
dhcp: false
address:
- ip: 192.168.122.250 1
prefix-length: 24
enabled: true
...
1 使用接口的静态 IP 地址替换这个值。
22.3.6.2. 没有 IP 地址
以下片段确保接口没有 IP 地址:
...
interfaces:
- name: eth1
description: No IP on eth1
type: ethernet
state: up
ipv4:
enabled: false
...
22.3.6.3. 动态主机配置
...
interfaces:
- name: eth1
description: DHCP on eth1
type: ethernet
state: up
ipv4:
dhcp: true
enabled: true
...
...
interfaces:
- name: eth1
description: DHCP without gateway or DNS on eth1
type: ethernet
state: up
ipv4:
dhcp: true
auto-gateway: false
395
OpenShift Container Platform 4.10 网络
auto-dns: false
enabled: true
...
22.3.6.4. DNS
...
interfaces: 1
...
ipv4:
...
auto-dns: false
...
dns-resolver:
config:
search:
- example.com
- example.org
server:
- 8.8.8.8
...
重要
22.3.6.5. 静态路由
...
interfaces:
- name: eth1
description: Static routing on eth1
type: ethernet
state: up
ipv4:
dhcp: false
address:
- ip: 192.0.2.251 1
prefix-length: 24
enabled: true
routes:
config:
- destination: 198.51.100.0/24
metric: 150
next-hop-address: 192.0.2.1 2
396
第 22 章 KUBERNETES NMSTATE
next-hop-interface: eth1
table-id: 254
...
1 以太网接口的静态 IP 地址。
2 节点流量的下一跳地址。这必须与为以太接口设定的 IP 地址位于同一个子网中。
22.4. 对节点网络配置进行故障排除
如果节点网络配置遇到问题,则策略会自动回滚,且报告失败。这包括如下问题:
配置没有在主机上应用。
主机丢失了到默认网关的连接。
22.4.1. 对不正确的节点网络配置策略配置进行故障排除
您可以通过应用节点网络配置策略,对整个集群中的节点网络配置应用更改。如果应用了不正确的配置,
您可以使用以下示例进行故障排除并修正失败的节点网络策略。
流程
apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
name: ens01-bridge-testfail
spec:
desiredState:
interfaces:
- name: br1
description: Linux bridge with the wrong port
type: linux-bridge
state: up
ipv4:
dhcp: true
enabled: true
bridge:
options:
stp:
enabled: false
port:
- name: ens01
$ oc apply -f ens01-bridge-testfail.yaml
397
OpenShift Container Platform 4.10 网络
输出示例
nodenetworkconfigurationpolicy.nmstate.io/ens01-bridge-testfail created
2. 运行以下命令,验证策略的状态:
$ oc get nncp
输出显示策略失败:
输出示例
NAME STATUS
ens01-bridge-testfail FailedToConfigure
但是,仅有策略状态并不表示它在所有节点或某个节点子集中是否失败。
3. 列出节点网络配置以查看策略在任意节点上是否成功。如果策略只针对某个节点子集失败,这表
示问题在于特定的节点配置。如果策略在所有节点上都失败,这表示问题在于策略。
$ oc get nnce
输出显示策略在所有节点上都失败:
输出示例
NAME STATUS
control-plane-1.ens01-bridge-testfail FailedToConfigure
control-plane-2.ens01-bridge-testfail FailedToConfigure
control-plane-3.ens01-bridge-testfail FailedToConfigure
compute-1.ens01-bridge-testfail FailedToConfigure
compute-2.ens01-bridge-testfail FailedToConfigure
compute-3.ens01-bridge-testfail FailedToConfigure
这个命令会返回一个大的回溯信息,它被编辑为 brevity:
输出示例
398
第 22 章 KUBERNETES NMSTATE
bridge:
options:
group-forward-mask: 0
mac-ageing-time: 300
multicast-snooping: true
stp:
enabled: false
forward-delay: 15
hello-time: 2
max-age: 20
priority: 32768
port:
- name: ens01
description: Linux bridge with the wrong port
ipv4:
address: []
auto-dns: true
auto-gateway: true
auto-routes: true
dhcp: true
enabled: true
ipv6:
enabled: false
mac-address: 01-23-45-67-89-AB
mtu: 1500
current
=======
---
name: br1
type: linux-bridge
state: up
bridge:
options:
group-forward-mask: 0
mac-ageing-time: 300
multicast-snooping: true
stp:
enabled: false
forward-delay: 15
hello-time: 2
max-age: 20
priority: 32768
port: []
description: Linux bridge with the wrong port
ipv4:
address: []
auto-dns: true
auto-gateway: true
auto-routes: true
dhcp: true
enabled: true
ipv6:
enabled: false
mac-address: 01-23-45-67-89-AB
mtu: 1500
399
OpenShift Container Platform 4.10 网络
difference
==========
--- desired
+++ current
@@ -13,8 +13,7 @@
hello-time: 2
max-age: 20
priority: 32768
- port:
- - name: ens01
+ port: []
description: Linux bridge with the wrong port
ipv4:
address: []
line 651, in _assert_interfaces_equal\n
current_state.interfaces[ifname],\nlibnmstate.error.NmstateVerificationError:
输出示例
- ipv4:
...
name: ens1
state: up
type: ethernet
6. 通过编辑现有策略修正错误:
...
port:
- name: ens1
保存策略以应用更正。
7. 检查策略的状态,以确保它被成功更新:
$ oc get nncp
输出示例
400
第 22 章 KUBERNETES NMSTATE
NAME STATUS
ens01-bridge-testfail SuccessfullyConfigured
在集群中的所有节点上都成功配置了更新的策略。
401
OpenShift Container Platform 4.10 网络
第 23 章 配置集群范围代理
生产环境可能会拒绝直接访问互联网,而是提供 HTTP 或 HTTPS 代理。您可以通过修改现有集群的
Proxy 对象或在新集群的 install-config.yaml 文件中配置代理设置,将 OpenShift Container Platform 配
置为使用代理。
23.1. 先决条件
查看集群需要访问的站点中的内容,决定这些站点中的任何站点是否需要绕过代理。默认情况
下,所有集群系统的出站流量都需经过代理,包括对托管集群的云供应商 API 的调用。系统范围
的代理仅会影响系统组件,而不会影响用户工作负载。若有需要,将站点添加到 Proxy 对象的
spec.noProxy 字段来绕过代理服务器。
注意
23.2. 启用集群范围代理
Proxy 对象用于管理集群范围出口代理。如果在安装或升级集群时没有配置代理,则 Proxy 对象仍会生
成,但它会有一个空的 spec。例如:
apiVersion: config.openshift.io/v1
kind: Proxy
metadata:
name: cluster
spec:
trustedCA:
name: ""
status:
注意
先决条件
集群管理员权限
流程
注意
402
第 23 章 配置集群范围代理
注意
apiVersion: v1
data:
ca-bundle.crt: | 1
<MY_PEM_ENCODED_CERTS> 2
kind: ConfigMap
metadata:
name: user-ca-bundle 3
namespace: openshift-config 4
1 这个数据键必须命名为 ca-bundle.crt。
3 从 Proxy 对象引用的配置映射名称。
b. 从此文件创建配置映射:
$ oc create -f user-ca-bundle.yaml
$ oc edit proxy/cluster
3. 为代理配置所需的字段:
apiVersion: config.openshift.io/v1
kind: Proxy
metadata:
name: cluster
spec:
httpProxy: http://<username>:<pswd>@<ip>:<port> 1
httpsProxy: https://<username>:<pswd>@<ip>:<port> 2
noProxy: example.com 3
readinessEndpoints:
- http://www.google.com 4
- https://www.google.com
trustedCA:
name: user-ca-bundle 5
403
OpenShift Container Platform 4.10 网络
4. 保存文件以应用更改。
23.3. 删除集群范围代理服务器
cluster Proxy 对象不能被删除。要从一个集群中删除代理,从 Proxy 对象中删除所有 spec 字段。
先决条件
集群管理员权限
流程
1. 使用 oc edit 命令来修改代理:
$ oc edit proxy/cluster
apiVersion: config.openshift.io/v1
kind: Proxy
metadata:
name: cluster
spec: {}
3. 保存文件以使改变生效。
其他资源
替换 CA Bundle 证书
代理证书自定义
404
第 24 章 配置自定义 PKI
第 24 章 配置自定义 PKI
有些平台组件,如 Web 控制台,使用 Routes 进行通信,且必须信任其他组件的证书与其交互。如果您使
用的是自定义公钥基础架构 (PKI) ,您必须将其配置为在集群中识别其私有签名的 CA 证书。
注意
24.1. 在安装过程中配置集群范围的代理
生产环境可能会拒绝直接访问互联网,而是提供 HTTP 或 HTTPS 代理。您可以通过在 install-
config.yaml 文件中配置代理设置,将新的 OpenShift Container Platform 集群配置为使用代理。
先决条件
您检查了集群需要访问的站点,并确定它们中的任何站点是否需要绕过代理。默认情况下,所有
集群出口流量都经过代理,包括对托管云供应商 API 的调用。如果需要,您将在 Proxy 对象的
spec.noProxy 字段中添加站点来绕过代理。
注意
流程
1. 编辑 install-config.yaml 文件并添加代理设置。例如:
apiVersion: v1
405
OpenShift Container Platform 4.10 网络
baseDomain: my.domain.com
proxy:
httpProxy: http://<username>:<pswd>@<ip>:<port> 1
httpsProxy: https://<username>:<pswd>@<ip>:<port> 2
noProxy: example.com 3
additionalTrustBundle: | 4
-----BEGIN CERTIFICATE-----
<MY_TRUSTED_CA_CERT>
-----END CERTIFICATE-----
...
注意
注意
注意
24.2. 启用集群范围代理
Proxy 对象用于管理集群范围出口代理。如果在安装或升级集群时没有配置代理,则 Proxy 对象仍会生
成,但它会有一个空的 spec。例如:
apiVersion: config.openshift.io/v1
kind: Proxy
406
第 24 章 配置自定义 PKI
metadata:
name: cluster
spec:
trustedCA:
name: ""
status:
注意
先决条件
集群管理员权限
流程
注意
apiVersion: v1
data:
ca-bundle.crt: | 1
<MY_PEM_ENCODED_CERTS> 2
kind: ConfigMap
metadata:
name: user-ca-bundle 3
namespace: openshift-config 4
1 这个数据键必须命名为 ca-bundle.crt。
3 从 Proxy 对象引用的配置映射名称。
b. 从此文件创建配置映射:
$ oc create -f user-ca-bundle.yaml
407
OpenShift Container Platform 4.10 网络
$ oc edit proxy/cluster
3. 为代理配置所需的字段:
apiVersion: config.openshift.io/v1
kind: Proxy
metadata:
name: cluster
spec:
httpProxy: http://<username>:<pswd>@<ip>:<port> 1
httpsProxy: https://<username>:<pswd>@<ip>:<port> 2
noProxy: example.com 3
readinessEndpoints:
- http://www.google.com 4
- https://www.google.com
trustedCA:
name: user-ca-bundle 5
4. 保存文件以使改变生效。
重要
408
第 24 章 配置自定义 PKI
重要
config.openshift.io/inject-trusted-cabundle="true"
空 ConfigMap 示例:
apiVersion: v1
data: {}
kind: ConfigMap
metadata:
labels:
config.openshift.io/inject-trusted-cabundle: "true"
name: ca-inject 1
namespace: apache
注意
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-example-custom-ca-deployment
namespace: my-example-custom-ca-ns
spec:
...
spec:
...
containers:
- name: my-container-that-needs-custom-ca
volumeMounts:
- name: trusted-ca
mountPath: /etc/pki/ca-trust/extracted/pem
409
OpenShift Container Platform 4.10 网络
readOnly: true
volumes:
- name: trusted-ca
configMap:
name: trusted-ca
items:
- key: ca-bundle.crt 1
path: tls-ca-bundle.pem 2
410
第 25 章 RHOSP 负载均衡
第 25 章 RHOSP 负载均衡
重要
在更改供应商驱动程序后,Kuryr 会替换现有的负载均衡器。这个过程会产生一些停机时
间。
先决条件
提示
流程
把 Octavia Amphora 供应商驱动改为 Octavia OVN:
1. 打开 kuryr-config ConfigMap。在命令行中运行:
...
kind: ConfigMap
metadata:
annotations:
networkoperator.openshift.io/kuryr-octavia-provider: default 1
...
1 删除这一行。集群将会重新生成,并带有 ovn 值。
411
OpenShift Container Platform 4.10 网络
ovn 供应商值会在输出中显示:
...
kind: ConfigMap
metadata:
annotations:
networkoperator.openshift.io/kuryr-octavia-provider: ovn
...
4. 验证 RHOSP 是否已重新创建其负载均衡器。
a. 在命令行中运行:
a4db683b-2b7b-4988-a582-c39daaad7981 | ostest-7mbj6-kuryr-api-loadbalancer |
84c99c906edd475ba19478a9a6690efd | 172.30.0.1 | ACTIVE | amphora
显示 ovn 类型的负载均衡器。例如:
2dffe783-98ae-4048-98d0-32aa684664cc | openshift-apiserver-operator/metrics |
84c99c906edd475ba19478a9a6690efd | 172.30.167.119 | ACTIVE | ovn
0b1b2193-251f-4243-af39-2f99b29d18c5 | openshift-etcd/etcd |
84c99c906edd475ba19478a9a6690efd | 172.30.143.226 | ACTIVE | ovn
f05b07fc-01b7-4673-bd4d-adaa4391458e | openshift-dns-operator/metrics |
84c99c906edd475ba19478a9a6690efd | 172.30.152.27 | ACTIVE | ovn
先决条件
412
第 25 章 RHOSP 负载均衡
流程
可以使用自己选择的名称而不是 API_OCP_CLUSTER。
2. 负载均衡器成为活跃后,创建监听程序:
注意
3. 创建一个使用轮循算法的池,并启用了会话持久性:
注意
413
OpenShift Container Platform 4.10 网络
注意
您可以重复这个过程来创建其他负载均衡器,这样可降低瓶颈。
先决条件
流程
注意
您可以重复这个过程来创建其他负载均衡器,这样可降低瓶颈。
先决条件
流程
1. 要复制当前的内部路由器服务,在命令行中输入:
414
第 25 章 RHOSP 负载均衡
路由器文件示例
apiVersion: v1
kind: Service
metadata:
labels:
ingresscontroller.operator.openshift.io/owning-ingresscontroller: default
name: router-external-default 1
namespace: openshift-ingress
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: http
- name: https
port: 443
protocol: TCP
targetPort: https
- name: metrics
port: 1936
protocol: TCP
targetPort: 1936
selector:
ingresscontroller.operator.openshift.io/deployment-ingresscontroller: default
sessionAffinity: None
type: LoadBalancer 2
1 确保此值具有描述性,如 router-external-default。
2 确定这个值是 LoadBalancer。
注意
您可以删除与负载均衡相关的时间戳和其他信息。
$ oc apply -f external_router.yaml
a. 在命令行中检索服务的外部 IP 地址:
输出示例
415
OpenShift Container Platform 4.10 网络
80:30112/TCP,443:32359/TCP,1936:30317/TCP 3m38s
router-internal-default ClusterIP 172.30.115.123 <none>
80/TCP,443/TCP,1936/TCP 22h
b. 检索负载均衡器的 IP 地址:
输出示例
| 21bf6afe-b498-4a16-a958-3229e83c002c | openshift-ingress/router-external-default |
66f3816acf1b431691b8d132cc9d793c | 172.30.235.33 | ACTIVE | octavia |
c. 验证您在前面的步骤中获取的地址是否在浮动 IP 列表中相互关联:
输出示例
注意
您可以重复这个过程来创建其他负载均衡器,这样可降低瓶颈。
25.4. 配置外部负载均衡器
您可以在 Red Hat OpenStack Platform(RHOSP)上配置 OpenShift Container Platform 集群,使其使
用外部负载均衡器来代替默认负载均衡器。
先决条件
您的负载均衡器必须能够访问集群中的每台机器。允许此访问的方法包括:
将负载均衡器附加到集群的机器子网。
将浮动 IP 地址附加到使用负载均衡器的机器。
重要
416
第 25 章 RHOSP 负载均衡
重要
流程
HAProxy 配置示例
...
listen my-cluster-api-6443
bind 0.0.0.0:6443
mode tcp
balance roundrobin
server my-cluster-master-2 192.0.2.2:6443 check
server my-cluster-master-0 192.0.2.3:6443 check
server my-cluster-master-1 192.0.2.1:6443 check
listen my-cluster-apps-443
bind 0.0.0.0:443
mode tcp
balance roundrobin
server my-cluster-worker-0 192.0.2.6:443 check
server my-cluster-worker-1 192.0.2.5:443 check
server my-cluster-worker-2 192.0.2.4:443 check
listen my-cluster-apps-80
bind 0.0.0.0:80
mode tcp
balance roundrobin
server my-cluster-worker-0 192.0.2.7:80 check
server my-cluster-worker-1 192.0.2.9:80 check
server my-cluster-worker-2 192.0.2.8:80 check
<load_balancer_ip_address> api.<cluster_name>.<base_domain>
<load_balancer_ip_address> apps.<cluster_name>.<base_domain>
{
"major": "1",
"minor": "11+",
"gitVersion": "v1.11.0+ad103ed",
"gitCommit": "ad103ed",
"gitTreeState": "clean",
417
OpenShift Container Platform 4.10 网络
"buildDate": "2019-01-09T06:44:10Z",
"goVersion": "go1.10.3",
"compiler": "gc",
"platform": "linux/amd64"
}
b. 验证集群应用程序是否可以访问:
注意
$ curl http://console-openshift-console.apps.<cluster_name>.<base_domain> -I -L --
insecure
418
第 26 章 使用 METALLB 进行负载平衡
第 26 章 使用 METALLB 进行负载平衡
您必须配置网络基础架构,以确保外部 IP 地址的网络流量从客户端路由到集群的主机网络。
MetalLB
当您在集群中添加 MetalLB 自定义资源时,MetalLB Operator 会在集群中部署 MetalLB。Operator
只支持单个自定义资源实例。如果删除了实例,Operator 会从集群中删除 MetalLB。
AddressPool
MetalLB 需要一个或多个 IP 地址池,您可以在添加类型为 LoadBalancer 的服务时分配给服务。当您
在集群中添加 AddressPool 自定义资源时,MetalLB Operator 会配置 MetalLB,以便它能够从池中
分配 IP 地址。地址池包含 IP 地址列表。列表可以是使用范围设置的单个 IP 地址,如 1.1.1.1-1.1.1.1、以
CIDR 表示法指定的范围、指定为起始和结束地址的范围,或者以连字符分隔的、两者的组合。地址池
需要名称。文档使用 doc-example、doc-example-reserved 和 doc-example-ipv6 等名称。地址池
指定 MetalLB 是否可以自动从池中分配 IP 地址,或者是否为按名称显式指定池的服务保留 IP 地址。
一个地址池指定 MetalLB 是否使用第 2 层协议公告 IP 地址,还是使用 BGP 协议。
BGPPeer
BGP peer 自定义资源标识 MetalLB 进行通信的 BGP 路由器、路由器的 AS 数量、MetalLB 的 AS 编
号,以及路由公告的自定义。MetalLB 将服务负载平衡器 IP 地址的路由公告给一个或多个 BGP 对等
419
OpenShift Container Platform 4.10 网络
地址池名称必须是唯一的。
IP 地址范围不与现有地址池重叠。
controller
Operator 会启动部署和单个 pod。当您添加类型为 LoadBalancer 的服务时,Kubernetes 使用
controller 从地址池中分配 IP 地址。如果服务失败,请验证 controller pod 日志中有以下条目:
输出示例
speaker
Operator 为 speaker pod 启动守护进程集。默认情况下,在集群的每个节点上启动 pod。您可以在启
动 MetalLB 时在 MetalLB 自定义资源中指定节点选择器,将 pod 限制到特定的节点。如果 控制器 为
服务分配了 IP 地址,并且服务仍不可用,请阅读 speaker pod 日志。如果 speaker pod 不可用,请
运行 oc describe pod -n 命令。
对于第 2 层模式,控制器 为服务分配 IP 地址后, speaker pod 使用一种算法来确定哪些 speaker
pod 将宣布负载均衡器 IP 地址。该算法涉及对节点名称和负载均衡器 IP 地址进行哈希处理。如需更
多信息,请参阅"MetalLB 和外部流量策略"。speaker 使用地址解析协议 (ARP) 来宣布 IPv4 地址和邻
居发现协议 (NDP) 来宣布 IPv6 地址。
注意
421
OpenShift Container Platform 4.10 网络
节点 1 和 3 具有应用程序的 pod。
每次路由器接收负载均衡器 IP 地址的新流量时,它会创建一个新的与节点的连接。每个路由器制造商都
有一个特定于实施的算法,用于选择要启动连接的节点。但是,算法通常设计为在可用节点之间分发流
量,以平衡网络负载。
节点 2 和 3 具有该应用的 pod。
423
OpenShift Container Platform 4.10 网络
客户端流量路由到主机网络上的其中一个节点。在流量进入节点后,服务代理会根据您为服务设
置的外部流量策略,将流量发送到同一节点上的应用 pod 或其他节点。
cluster
这是 spec.externalTrafficPolicy 的默认值。
使用 cluster 流量策略时,节点接收流量后,服务代理会将流量分发到服务中的所有容器集。此策略在
pod 之间提供统一流量分布,但它会模糊客户端 IP 地址,并可能会在 pod 中显示流量源自节点而不是
客户端的应用。
local
采用 local 流量策略时,节点接收流量后,服务代理仅将流量发送到同一节点上的 pod。例如,如果节
点上的 speaker pod 宣布外部服务 IP,则所有流量都发送到节点 A。流量进入节点 A 后,服务代理仅
将流量发送到节点 A 上的服务的 pod。位于其他节点上的服务的 Pod 不会从节点 A 接收任何流量。在
需要故障转移时,其他节点上的服务的 Pod 充当副本。
此策略不会影响客户端 IP 地址。应用容器集可以确定来自传入连接的客户端 IP 地址。
26.1.7. 限制和限制
MetalLB 主要用于内部的裸机安装,因为这些安装不包含原生负载平衡器功能。除了裸机安装外,在有些
基础架构上安装 OpenShift Container Platform 可能不包括原生负载均衡器功能。例如,以下基础架构可
从添加 MetalLB Operator 中受益:
裸机
VMware vSphere
26.1.7.2. 第 2 层模式的限制
26.1.7.2.1. 单节点瓶颈
MetalLB 通过单一节点路由服务的所有流量,该节点可能会成为瓶颈并限制性能。
424
第 26 章 使用 METALLB 进行负载平衡
26.1.7.2.2. 延迟故障转移性能
为最大程度减轻计划内故障转移对过时客户端的影响,在颠倒领导地位后让旧节点保持运行几分钟。旧节
点可以继续转发过期客户端的流量,直到其缓存刷新。
在计划外故障转移期间,服务 IP 无法访问,直到过期的客户端刷新其缓存条目为止。
26.1.7.3.1. 节点故障可能会破坏所有活跃的连接
26.1.7.3.2. 社区被指定为 16 位值
社区作为地址池自定义资源的一部分指定,以冒号分隔的 16 位值的形式指定。例如,要指定,使用知名
NO_ADVERTISE 社区属性公告负载均衡器 IP 地址,请使用如下表示法:
apiVersion: metallb.io/v1beta1
kind: AddressPool
metadata:
name: doc-example-no-advertise
namespace: metallb-system
spec:
protocol: bgp
addresses:
- 192.168.1.100-192.168.1.255
bgpAdvertisements:
- communities:
- 65535:65282
425
OpenShift Container Platform 4.10 网络
MetalLB 属于单个 ASN。如果您试图添加 BGP peer 并为 spec.myASN 指定与现有的 BGP peer 自定义
资源不同的值,您会收到一个错误。
26.1.8. 其他资源
比较:对外部 IP 地址进行容错访问
删除 IP 故障切换
流程
注意
3. 安装 MetalLB Operator:
426
第 26 章 使用 METALLB 进行负载平衡
验证
验证 MetalLB Operator 是否已成功安装:
注意
3. 如果 Operator 安装不成功,您可以进一步排除故障:
先决条件
安装 OpenShift CLI(oc)。
流程
输出示例
2. 创建 metallb-system 命名空间:
427
OpenShift Container Platform 4.10 网络
5. 确认 Operator 组已安装在命名空间中:
输出示例
NAME AGE
metallb-operator 14m
6. 订阅 MetalLB Operator。
b. 要为 Operator 创建订阅自定义资源,请输入以下命令:
7. 确认安装计划位于命名空间中:
输出示例
428
第 26 章 使用 METALLB 进行负载平衡
8. 要验证是否已安装 Operator,请输入以下命令:
输出示例
Name Phase
metallb-operator.4.10.0-nnnnnnnnnnnn Succeeded
先决条件
安装 OpenShift CLI(oc)。
安装 MetalLB Operator。
流程
1. 创建 MetalLB 自定义资源的单一实例:
验证
确认 MetalLB 控制器的部署和 MetalLB speaker 的守护进程集正在运行。
1. 检查控制器的部署是否正在运行:
输出示例
2. 检查 speaker 的守护进程集是否正在运行:
429
OpenShift Container Platform 4.10 网络
输出示例
apiVersion: metallb.io/v1beta1
kind: MetalLB
metadata:
name: metallb
namespace: metallb-system
spec:
nodeSelector: <.>
node-role.kubernetes.io/worker: ""
speakerTolerations: <.>
- key: "Example"
operator: "Exists"
effect: "NoExecute"
其他资源
如需有关污点和容限的更多信息,请参阅了解污点和容限。
430
第 26 章 使用 METALLB 进行负载平衡
26.2.4. 后续步骤
配置 MetalLB 地址池
26.3.1. 关于地址池自定义资源
下表中描述了地址池自定义资源的字段。
字段 类型 描述
bgpAdvertisements 对象的字段在下表中定义:
字段 类型 描述
431
OpenShift Container Platform 4.10 网络
字段 类型 描述
NO_EXPORT: 65535:65281
NO_ADVERTISE: 65535:65282
NO_EXPORT_SUBCONFED : 65535:65283
26.3.2. 配置地址池
作为集群管理员,您可以在集群中添加地址池来控制 MetalLB 可分配给负载均衡器服务的 IP 地址。
先决条件
安装 OpenShift CLI(oc)。
流程
1. 创建一个包含类似以下示例内容的文件,如 addresspool.yaml :
apiVersion: metallb.io/v1alpha1
kind: AddressPool
metadata:
namespace: metallb-system
name: doc-example
spec:
protocol: layer2
addresses:
- 203.0.113.1-203.0.113.10
- 203.0.113.65-203.0.113.75
2. 为地址池应用配置:
$ oc apply -f addresspool.yaml
432
第 26 章 使用 METALLB 进行负载平衡
验证
查看地址池:
输出示例
Name: doc-example
Namespace: metallb-system
Labels: <none>
Annotations: <none>
API Version: metallb.io/v1alpha1
Kind: AddressPool
Metadata:
...
Spec:
Addresses:
203.0.113.1-203.0.113.10
203.0.113.65-203.0.113.75
Auto Assign: true
Protocol: layer2
Events: <none>
26.3.3. 地址池配置示例
apiVersion: metallb.io/v1beta1
kind: AddressPool
metadata:
name: doc-example-cidr
namespace: metallb-system
spec:
protocol: layer2
addresses:
- 192.168.100.0/24
- 192.168.200.0/24
- 192.168.255.1-192.168.255.5
26.3.3.2. 示例:保留 IP 地址
apiVersion: metallb.io/v1beta1
kind: AddressPool
metadata:
433
OpenShift Container Platform 4.10 网络
name: doc-example-reserved
namespace: metallb-system
spec:
protocol: layer2
addresses:
- 10.0.100.0/28
autoAssign: false
apiVersion: metallb.io/v1beta1
kind: AddressPool
metadata:
name: doc-example-combined
namespace: metallb-system
spec:
protocol: layer2
addresses:
- 10.0.100.0/28
- 2002:2:2::1-2002:2:2::100
apiVersion: metallb.io/v1beta1
kind: AddressPool
metadata:
name: doc-example-bgp
namespace: metallb-system
spec:
protocol: bgp
addresses:
- 203.0.113.200/30
- fc00:f853:ccd:e799::/124
您可以指定复杂的自定义公告。
apiVersion: metallb.io/v1beta1
kind: AddressPool
metadata:
name: doc-example-bgp-adv
434
第 26 章 使用 METALLB 进行负载平衡
namespace: metallb-system
spec:
protocol: bgp
addresses:
- 203.0.113.200/30
- fc00:f853:ccd:e799::/124
bgpAdvertisements:
- communities:
- 65535:65282
aggregationLength: 32
localPref: 100
- communities:
- 8000:800
aggregationLength: 30
aggregationLengthV6: 124
26.3.4. 后续步骤
对于 BGP 模式,请参阅 配置 MetalLB BGP peer 。
配置服务以使用 MetalLB。
435
OpenShift Container Platform 4.10 网络
字段 类型 描述
436
第 26 章 使用 METALLB 进行负载平衡
先决条件
安装 OpenShift CLI(oc)。
流程
1. 创建一个文件,如 bgppeer.yaml,其内容类似以下示例:
apiVersion: metallb.io/v1beta1
kind: BGPPeer
metadata:
namespace: metallb-system
name: doc-example-peer
spec:
peerAddress: 10.0.0.1
peerASN: 64501
myASN: 64500
routerID: 10.10.10.10
$ oc apply -f bgppeer.yaml
其他资源
apiVersion: metallb.io/v1beta1
kind: BGPPeer
metadata:
name: doc-example-nodesel
namespace: metallb-system
spec:
peerAddress: 10.0.20.1
peerASN: 64501
myASN: 64500
nodeSelectors:
- matchExpressions:
437
OpenShift Container Platform 4.10 网络
- key: kubernetes.io/hostname
operator: In
values: [compute-1.example.com, compute-2.example.com]
您可以指定一个 BFD 配置集,以与 BGP 对等点关联。BFD 复杂的 BGP 通过单独提供与 BGP 间通信故
障的更快速检测。
apiVersion: metallb.io/v1beta1
kind: BGPPeer
metadata:
name: doc-example-peer-bfd
namespace: metallb-system
spec:
peerAddress: 10.0.20.1
peerASN: 64501
myASN: 64500
holdTime: "10s"
bfdProfile: doc-example-bfd-profile-full
注意
要支持双栈网络,请为 IPv4 添加一个 BGP peer 自定义资源,并为 IPv6 添加一个 BGP peer 自定义资
源。
apiVersion: metallb.io/v1beta1
kind: BGPPeer
metadata:
name: doc-example-dual-stack-ipv4
namespace: metallb-system
spec:
peerAddress: 10.0.20.1
peerASN: 64500
myASN: 64500
---
apiVersion: metallb.io/v1beta1
kind: BGPPeer
metadata:
name: doc-example-dual-stack-ipv6
namespace: metallb-system
spec:
peerAddress: 2620:52:0:88::104
peerASN: 64500
myASN: 64500
其他资源
438
第 26 章 使用 METALLB 进行负载平衡
其他资源
将服务配置为使用 MetalLB
字段 类型 描述
spec.detectMult 整数 指定确定数据包丢失的检测倍数。远程传输间隔乘以这个值来确
iplier 定连接丢失检测计时器。
例如,当本地系统的检测倍数设置为 3,而远程系统会将传输间
隔设置为 300 时,本地系统仅在没有接收数据包的 900 ms 后才
会检测故障。
范围为 2 到 255。默认值为 3。
启用回显传输模式时,请考虑增加控制数据包的传输间隔,以减
少带宽使用量。例如,考虑将传输间隔增加到 2000 毫秒。
spec.echoInterv 整数 指定此系统用来发送和接收回显数据包的最小传输间隔(较少
al 的)。范围为 10 到 60000 。默认值为 50 ms。
默认值为 254,表示系统在该系统和对等点之间仅需要一个跃
点。
439
OpenShift Container Platform 4.10 网络
字段 类型 描述
当您有一个作为星星网络的中央节点,并且您希望发送不需要系
统发送的控制数据包时,如果您有一个路由器将会话标记为被
动。
spec.receiveInte 整数 指定此系统可以接收控制数据包的最低间隔。范围为 10 到
rval 60000 。默认值为 300 ms。
spec.transmitInt 整数 指定此系统用来发送控制数据包的最小传输间隔(较少的)。范
erval 围为 10 到 60000 。默认值为 300 ms。
先决条件
安装 OpenShift CLI(oc)。
流程
1. 创建一个文件,如 bfdprofile.yaml,其内容如下:
apiVersion: metallb.io/v1beta1
kind: BFDProfile
metadata:
name: doc-example-bfd-profile-full
namespace: metallb-system
spec:
receiveInterval: 300
transmitInterval: 300
detectMultiplier: 3
echoMode: false
passiveMode: true
minimumTtl: 254
2. 为 BFD 配置集应用配置:
$ oc apply -f bfdprofile.yaml
440
第 26 章 使用 METALLB 进行负载平衡
26.5.3. 后续步骤
将 BGP peer 配置为 使用 BFD 配置集。
26.6.1. 请求特定 IP 地址
与其他一些负载均衡器实施一样,MetalLB 接受服务规格中的 spec.loadBalancerIP 字段。
特定 IP 地址的服务 YAML 示例
apiVersion: v1
kind: Service
metadata:
name: <service_name>
annotations:
metallb.universe.tf/address-pool: <address_pool_name>
spec:
selector:
<label_key>: <label_value>
ports:
- port: 8080
targetPort: 8080
protocol: TCP
type: LoadBalancer
loadBalancerIP: <ip_address>
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning AllocationFailed 3m16s metallb-controller Failed to allocate IP for "default/invalid-
request": "4.3.2.1" is not allowed in config
26.6.2. 从特定池中请求 IP 地址
要从特定范围分配 IP 地址,但您不关注特定的 IP 地址,您可以使用 metallb.universe.tf/address-pool
注解从指定地址池中请求 IP 地址。
apiVersion: v1
441
OpenShift Container Platform 4.10 网络
kind: Service
metadata:
name: <service_name>
annotations:
metallb.universe.tf/address-pool: <address_pool_name>
spec:
selector:
<label_key>: <label_value>
ports:
- port: 8080
targetPort: 8080
protocol: TCP
type: LoadBalancer
26.6.3. 接受任何 IP 地址
默认情况下,地址池配置为允许自动分配。MetalLB 从这些地址池中分配 IP 地址。
若要接受任何为自动分配配置的池的 IP 地址,不需要特殊注释或配置。
apiVersion: v1
kind: Service
metadata:
name: <service_name>
spec:
selector:
<label_key>: <label_value>
ports:
- port: 8080
targetPort: 8080
protocol: TCP
type: LoadBalancer
26.6.4. 共享特定 IP 地址
默认情况下,服务不共享 IP 地址。但是,如果您需要在单个 IP 地址上并置服务,可以通过向服务添加
metallb.universe.tf/allow-shared-ip 注解来启用选择性 IP 共享。
apiVersion: v1
kind: Service
metadata:
name: service-http
annotations:
metallb.universe.tf/address-pool: doc-example
metallb.universe.tf/allow-shared-ip: "web-server-svc" 1
spec:
ports:
- name: http
port: 80 2
442
第 26 章 使用 METALLB 进行负载平衡
protocol: TCP
targetPort: 8080
selector:
<label_key>: <label_value> 3
type: LoadBalancer
loadBalancerIP: 172.31.249.7 4
---
apiVersion: v1
kind: Service
metadata:
name: service-https
annotations:
metallb.universe.tf/address-pool: doc-example
metallb.universe.tf/allow-shared-ip: "web-server-svc" 5
spec:
ports:
- name: https
port: 443 6
protocol: TCP
targetPort: 8080
selector:
<label_key>: <label_value> 7
type: LoadBalancer
loadBalancerIP: 172.31.249.7 8
2 6 为服务指定不同的端口号。
先决条件
443
OpenShift Container Platform 4.10 网络
至少配置一个地址池。
配置网络,将流量从客户端路由到集群的主机网络。
流程
2. 创建服务:
$ oc apply -f <service_name>.yaml
输出示例
service/<service_name> created
验证
描述该服务:
输出示例
Name: <service_name>
Namespace: default
Labels: <none>
Annotations: metallb.universe.tf/address-pool: doc-example <.>
Selector: app=service_name
Type: LoadBalancer <.>
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.105.237.254
IPs: 10.105.237.254
LoadBalancer Ingress: 192.168.100.5 <.>
Port: <unset> 80/TCP
TargetPort: 8080/TCP
NodePort: <unset> 30550/TCP
Endpoints: 10.244.0.50:8080
Session Affinity: None
External Traffic Policy: Cluster
Events: <.>
Type Reason Age From Message
---- ------ ---- ---- -------
Normal nodeAssigned 32m (x2 over 32m) metallb-speaker announcing from node "
<node_name>"
444
第 26 章 使用 METALLB 进行负载平衡
先决条件
流程
1. 创建一个文件,如 setdebugloglevel.yaml,其内容类似以下示例:
apiVersion: metallb.io/v1beta1
kind: MetalLB
metadata:
name: metallb
namespace: metallb-system
spec:
logLevel: debug
nodeSelector:
node-role.kubernetes.io/worker: ""
2. 应用配置:
$ oc replace -f setdebugloglevel.yaml
注意
输出示例
注意
445
OpenShift Container Platform 4.10 网络
注意
4. 查看 speaker 日志:
输出示例
{"branch":"main","caller":"main.go:92","commit":"3d052535","goversion":"gc / go1.17.1 /
amd64","level":"info","msg":"MetalLB speaker starting (commit 3d052535, branch
main)","ts":"2022-05-17T09:55:05Z","version":""}
{"caller":"announcer.go:110","event":"createARPResponder","interface":"ens4","level":"info","m
sg":"created ARP responder for interface","ts":"2022-05-17T09:55:05Z"}
{"caller":"announcer.go:119","event":"createNDPResponder","interface":"ens4","level":"info","m
sg":"created NDP responder for interface","ts":"2022-05-17T09:55:05Z"}
{"caller":"announcer.go:110","event":"createARPResponder","interface":"tun0","level":"info","ms
g":"created ARP responder for interface","ts":"2022-05-17T09:55:05Z"}
{"caller":"announcer.go:119","event":"createNDPResponder","interface":"tun0","level":"info","m
sg":"created NDP responder for interface","ts":"2022-05-17T09:55:05Z"}
I0517 09:55:06.515686 95 request.go:665] Waited for 1.026500832s due to client-side
throttling, not priority and fairness, request:
GET:https://172.30.0.1:443/apis/operators.coreos.com/v1alpha1?timeout=32s
{"Starting Manager":"(MISSING)","caller":"k8s.go:389","level":"info","ts":"2022-05-
17T09:55:08Z"}
{"caller":"speakerlist.go:310","level":"info","msg":"node event - forcing sync","node
addr":"10.0.128.4","node event":"NodeJoin","node name":"ci-ln-qb8t3mb-72292-7s7rh-
worker-a-vvznj","ts":"2022-05-17T09:55:08Z"}
{"caller":"service_controller.go:113","controller":"ServiceReconciler","enqueueing":"openshift-
kube-controller-manager-operator/metrics","epslice":"{\"metadata\":{\"name\":\"metrics-
xtsxr\",\"generateName\":\"metrics-\",\"namespace\":\"openshift-kube-controller-manager-
operator\",\"uid\":\"ac6766d7-8504-492c-9d1e-
4ae8897990ad\",\"resourceVersion\":\"9041\",\"generation\":4,\"creationTimestamp\":\"2022-
05-17T07:16:53Z\",\"labels\":{\"app\":\"kube-controller-manager-
operator\",\"endpointslice.kubernetes.io/managed-by\":\"endpointslice-
controller.k8s.io\",\"kubernetes.io/service-name\":\"metrics\"},\"annotations\":
{\"endpoints.kubernetes.io/last-change-trigger-time\":\"2022-05-
17T07:21:34Z\"},\"ownerReferences\":
[{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"name\":\"metrics\",\"uid\":\"0518eed3-6152-42be-
b566-0bd00a60faf8\",\"controller\":true,\"blockOwnerDeletion\":true}],\"managedFields\":
[{\"manager\":\"kube-controller-
manager\",\"operation\":\"Update\",\"apiVersion\":\"discovery.k8s.io/v1\",\"time\":\"2022-05-
17T07:20:02Z\",\"fieldsType\":\"FieldsV1\",\"fieldsV1\":{\"f:addressType\":{},\"f:endpoints\":
{},\"f:metadata\":{\"f:annotations\":{\".\":{},\"f:endpoints.kubernetes.io/last-change-trigger-
time\":{}},\"f:generateName\":{},\"f:labels\":{\".\":{},\"f:app\":
{},\"f:endpointslice.kubernetes.io/managed-by\":{},\"f:kubernetes.io/service-name\":
{}},\"f:ownerReferences\":{\".\":{},\"k:{\\\"uid\\\":\\\"0518eed3-6152-42be-b566-
0bd00a60faf8\\\"}\":{}}},\"f:ports\":{}}}]},\"addressType\":\"IPv4\",\"endpoints\":[{\"addresses\":
[\"10.129.0.7\"],\"conditions\":{\"ready\":true,\"serving\":true,\"terminating\":false},\"targetRef\":
{\"kind\":\"Pod\",\"namespace\":\"openshift-kube-controller-manager-
operator\",\"name\":\"kube-controller-manager-operator-6b98b89ddd-
8d4nf\",\"uid\":\"dd5139b8-e41c-4946-a31b-
1a629314e844\",\"resourceVersion\":\"9038\"},\"nodeName\":\"ci-ln-qb8t3mb-72292-7s7rh-
446
第 26 章 使用 METALLB 进行负载平衡
master-0\",\"zone\":\"us-central1-a\"}],\"ports\":
[{\"name\":\"https\",\"protocol\":\"TCP\",\"port\":8443}]}","level":"debug","ts":"2022-05-
17T09:55:08Z"}
5. 查看 FRR 日志:
输出示例
Started watchfrr
2022/05/17 09:55:05 ZEBRA: client 16 says hello and bids fair to announce only bgp routes
vrf=0
2022/05/17 09:55:05 ZEBRA: client 31 says hello and bids fair to announce only vnc routes
vrf=0
2022/05/17 09:55:05 ZEBRA: client 38 says hello and bids fair to announce only static routes
vrf=0
2022/05/17 09:55:05 ZEBRA: client 43 says hello and bids fair to announce only bfd routes
vrf=0
2022/05/17 09:57:25.089 BGP: Creating Default VRF, AS 64500
2022/05/17 09:57:25.090 BGP: dup addr detect enable max_moves 5 time 180 freeze
disable freeze_time 0
2022/05/17 09:57:25.090 BGP: bgp_get: Registering BGP instance (null) to zebra
2022/05/17 09:57:25.090 BGP: Registering VRF 0
2022/05/17 09:57:25.091 BGP: Rx Router Id update VRF 0 Id 10.131.0.1/32
2022/05/17 09:57:25.091 BGP: RID change : vrf VRF default(0), RTR ID 10.131.0.1
2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF br0
2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF ens4
2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF ens4 addr 10.0.128.4/32
2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF ens4 addr
fe80::c9d:84da:4d86:5618/64
2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF lo
2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF ovs-system
2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF tun0
2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF tun0 addr 10.131.0.1/23
2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF tun0 addr
fe80::40f1:d1ff:feb6:5322/64
2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF veth2da49fed
2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF veth2da49fed addr
fe80::24bd:d1ff:fec1:d88/64
2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF veth2fa08c8c
2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF veth2fa08c8c addr
fe80::6870:ff:fe96:efc8/64
2022/05/17 09:57:25.091 BGP: Rx Intf add VRF 0 IF veth41e356b7
2022/05/17 09:57:25.091 BGP: Rx Intf address add VRF 0 IF veth41e356b7 addr
fe80::48ff:37ff:fede:eb4b/64
2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF veth1295c6e2
2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF veth1295c6e2 addr
fe80::b827:a2ff:feed:637/64
2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF veth9733c6dc
2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF veth9733c6dc addr
fe80::3cf4:15ff:fe11:e541/64
2022/05/17 09:57:25.092 BGP: Rx Intf add VRF 0 IF veth336680ea
2022/05/17 09:57:25.092 BGP: Rx Intf address add VRF 0 IF veth336680ea addr
fe80::94b1:8bff:fe7e:488c/64
447
OpenShift Container Platform 4.10 网络
26.7.1.1. FRRouting(FRR)日志级别
表 26.5. 日志级别
448
第 26 章 使用 METALLB 进行负载平衡
日志级别 描述
all 为所有日志记录级别提供所有日志信息。
info 提供始终应记录的信息,但在正常情况下,不需要用户干预。这是默认的日
志记录级别。
错误 对 MetalLB 功能有验证影响的重大错误。这些错误通常需要管理员干预才能
修复。
none 关闭所有日志。
先决条件
流程
输出示例
2. 显示 FRR 的运行配置:
输出示例
Building configuration...
449
OpenShift Container Platform 4.10 网络
Current configuration:
!
frr version 7.5.1_git
frr defaults traditional
hostname some-hostname
log file /etc/frr/frr.log informational
log timestamp precision 3
service integrated-vtysh-config
!
router bgp 64500 1
bgp router-id 10.0.1.2
no bgp ebgp-requires-policy
no bgp default ipv4-unicast
no bgp network import-check
neighbor 10.0.2.3 remote-as 64500 2
neighbor 10.0.2.3 bfd profile doc-example-bfd-profile-full 3
neighbor 10.0.2.3 timers 5 15
neighbor 10.0.2.4 remote-as 64500 4
neighbor 10.0.2.4 bfd profile doc-example-bfd-profile-full 5
neighbor 10.0.2.4 timers 5 15
!
address-family ipv4 unicast
network 203.0.113.200/30 6
neighbor 10.0.2.3 activate
neighbor 10.0.2.3 route-map 10.0.2.3-in in
neighbor 10.0.2.4 activate
neighbor 10.0.2.4 route-map 10.0.2.4-in in
exit-address-family
!
address-family ipv6 unicast
network fc00:f853:ccd:e799::/124 7
neighbor 10.0.2.3 activate
neighbor 10.0.2.3 route-map 10.0.2.3-in in
neighbor 10.0.2.4 activate
neighbor 10.0.2.4 route-map 10.0.2.4-in in
exit-address-family
!
route-map 10.0.2.3-in deny 20
!
route-map 10.0.2.4-in deny 20
!
ip nht resolve-via-default
!
ipv6 nht resolve-via-default
!
line vty
!
bfd
profile doc-example-bfd-profile-full 8
transmit-interval 35
receive-interval 35
passive-mode
echo-mode
echo-interval 35
minimum-ttl 10
450
第 26 章 使用 METALLB 进行负载平衡
!
!
end
<.> router bgp 部分表示 MetalLB 的 ASN。<.> 确认存在 neighbor <ip-address> remote-as
<peer-ASN> 行,用于您添加的每个 BGP peer 自定义资源。<.>如果配置了 BFD,请确认 BFD
配置集与正确的 BGP peer 关联,并确认 BFD 配置集会出现在命令输出中。<.> 确认 network
<ip-address-range> 行与您在您在地址池自定义资源中指定的 IP 地址范围匹配。
3. 显示 BGP 概述:
输出示例
451
OpenShift Container Platform 4.10 网络
输出示例
先决条件
流程
输出示例
2. 显示 BFD 对等点:
输出示例
Session count: 2
SessionId LocalAddress PeerAddress Status
========= ============ =========== ======
3909139637 10.0.1.2 10.0.2.3 up <.>
452
第 26 章 使用 METALLB 进行负载平衡
其他资源
有关使用监控仪表板的信息,请参阅 查询指标。
/etc/frr/frr.conf
/etc/frr/frr.log
/etc/frr/daemons 配置文件
/etc/frr/vtysh.conf
show running-config
453
OpenShift Container Platform 4.10 网络
其他资源
收集集群数据
454
第 27 章 将二级接口指标与网络附加关联
第 27 章 将二级接口指标与网络附加关联
27.1. 为监控扩展二级网络指标
二级设备或接口用于不同目的。为了对采用相同分类的二级设备的指标数据进行汇总,需要有一个方法来
对它们进行分类。
公开的指标会包括接口,但不会指定接口的起始位置。当没有其他接口时,这可以正常工作。但是,如果
添加了二级接口,则很难使用指标,因为只使用接口名称识别接口比较困难。
在添加二级接口时,它们的名称取决于添加它们的顺序,不同的二级接口可能属于不同的网络,并可用于
不同的目的。
通过使用 pod_network_name_info,可以使用标识接口类型的额外信息来扩展当前的指标。这样,就可
以聚合指标,并为特定接口类型添加特定的警告。
27.1.1. 网络指标守护进程
网络指标守护进程是收集并发布与网络相关的指标的守护进程组件。
kubelet 已经发布了您可以观察到的网络相关指标。这些指标是:
container_network_receive_bytes_total
container_network_receive_errors_total
container_network_receive_packets_total
container_network_receive_packets_dropped_total
container_network_transmit_bytes_total
container_network_transmit_errors_total
container_network_transmit_packets_total
container_network_transmit_packets_dropped_total
这些指标中的标签包括:
Pod 名称
Pod 命名空间
接口名称(比如 eth0)
interface 标签指向接口名称,但它不知道接口的作用是什么。在有多个不同接口的情况下,无法了解您监
控的指标代表什么网络。
455
OpenShift Container Platform 4.10 网络
27.1.2. 带有网络名称的指标
此 daemonset 发布一个 pod_network_name_info 指标,固定值为 0:
pod_network_name_info{interface="net0",namespace="namespacename",network_name="nadname
space/firstNAD",pod="podname"} 0
使用 Multus 所添加的注解生成网络名称标签。它是网络附加定义所属命名空间的连接,加上网络附加定
义的名称。
456
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
28.1.1.1. 准备下一次更新
28.1.1.2. 新功能及功能增强
28.1.1.2.1. 流量流视图中的直方图
现在,您可以选择显示一段时间内流的直方图表。histogram 可让您视觉化流历史记录,而不会
达到 Loki 查询的限制。如需更多信息,请参阅使用直方图。
28.1.1.2.2. 对话跟踪
28.1.1.3. 程序错误修复
457
OpenShift Container Platform 4.10 网络
28.1.1.4. 已知问题
28.1.1.5. 主要的技术变化
28.1.2.1. 程序错误修复
28.2. 关于网络可观察性
红帽为集群管理员提供 Network Observability Operator 来观察 OpenShift Container Platform 集群的网
络流量。Network Observability 使用 eBPF 技术创建网络流。然后,OpenShift Container Platform 信息
会增强网络流,并存储在 Loki 中。您可以在 OpenShift Container Platform 控制台中查看和分析所存储
的 netflow 信息,以进一步洞察和故障排除。
458
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
28.2.4.1. 网络 Observability 指标
28.2.4.3. 流量流表
注意
459
OpenShift Container Platform 4.10 网络
注意
先决条件
支持的日志存储 (AWS S3, Google Cloud Storage, Azure, Swift, Minio, OpenShift Data
Foundation)
流程
apiVersion: v1
kind: Secret
metadata:
name: loki-s3
namespace: netobserv
stringData:
access_key_id: QUtJQUlPU0ZPRE5ON0VYQU1QTEUK
access_key_secret:
460
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
d0phbHJYVXRuRkVNSS9LN01ERU5HL2JQeFJmaUNZRVhBTVBMRUtFWQo=
bucketnames: s3-bucket-name
endpoint: https://s3.eu-central-1.amazonaws.com
region: eu-central-1
重要
流程
apiVersion: loki.grafana.com/v1
kind: LokiStack
metadata:
name: loki
namespace: netobserv
spec:
size: 1x.small
storage:
schemas:
- version: v12
effectiveDate: '2022-06-01'
secret:
name: loki-s3
type: s3
storageClassName: gp3 1
tenants:
mode: openshift-network
重要
您不能重复使用用于集群日志的相同的 LokiStack。
28.3.1.1.1. 部署大小
注意
461
OpenShift Container Platform 4.10 网络
注意
1x.extra-small 仅用于演示目录,它不被支持。
表 28.1. Loki 大小
复制因子 无 2 3
以下是配置的限制示例:
spec:
limits:
global:
ingestion:
ingestionBurstSize: 40
ingestionRate: 20
maxGlobalStreamsPerTenant: 25000
queries:
maxChunksPerQuery: 2000000
maxEntriesLimitPerQuery: 10000
maxQuerySeries: 3000
28.3.2. 创建用于身份验证和授权的角色
通过定义 ClusterRole 和 ClusterRoleBinding 指定身份验证和授权配置。您可以创建一个 YAML 文件
来定义这些角色。
流程
462
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: loki-netobserv-tenant
rules:
- apiGroups:
- 'loki.grafana.com'
resources:
- network
resourceNames:
- logs
verbs:
- 'get'
- 'create'
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: loki-netobserv-tenant
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: loki-netobserv-tenant
subjects:
- kind: ServiceAccount
name: flowlogs-pipeline 1
namespace: netobserv
注意
要卸载 Kafka,请参考与用来安装的方法对应的卸载过程。
先决条件
注意
463
OpenShift Container Platform 4.10 网络
流程
spec.agent.ebpf.Sampling:指定流的抽样大小。较低的抽样大小会对资源利用率造成
负面影响。如需更多信息,请参阅 spec.agent.ebpf 下的 FlowCollector API 引用。
loki.statusUrl:将其设置为 https://loki-query-frontend-http.netobserv.svc:3100/。
URL 的第一个部分"loki"应与 LokiStack 的名称匹配。
loki.authToken: 选择 FORWARD 值。
tls.enable :验证复选框是否已选中(代表已启用)。
b. 点 Create。
验证
要确认这一点,当您进入到 Observe 时,您应该看到选项中列出的 Network Traffic。
重要
其他资源
流程
1. 删除 FlowCollector 自定义资源。
b. 查找 FlowCollector 并点选项菜单 。
c. 选择 Delete CustomResourceDefinition。
重要
465
OpenShift Container Platform 4.10 网络
28.4.1. 查看状态
Network Observability Operator 提供 Flow Collector API。创建 Flow Collector 资源时,它会部署 pod
和服务,以在 Loki 日志存储中创建和存储网络流,并在 OpenShift Container Platform Web 控制台中显
示仪表板、指标和流。
流程
$ oc get flowcollector/cluster
输出示例
输出示例
输出示例
466
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
输出示例
流程
$ oc describe flowcollector/cluster
28.5.1. 查看 FlowCollector 资源
您可以在 OpenShift Container Platform Web 控制台中直接查看和编辑 YAML。
流程
467
OpenShift Container Platform 4.10 网络
抽样 FlowCollector 资源
apiVersion: flows.netobserv.io/v1beta1
kind: FlowCollector
metadata:
name: cluster
spec:
namespace: netobserv
deploymentModel: DIRECT
agent:
type: EBPF 1
ebpf:
sampling: 50 2
logLevel: info
privileged: false
resources:
requests:
memory: 50Mi
cpu: 100m
limits:
memory: 800Mi
processor:
logLevel: info
resources:
requests:
memory: 100Mi
cpu: 100m
limits:
memory: 800Mi
conversationEndTimeout: 10s
logTypes: FLOW 3
conversationHeartbeatInterval: 30s
loki: 4
url: 'http://loki-gateway-http.netobserv.svc:8080/api/logs/v1/network'
statusUrl: 'https://loki-query-frontend-http.netobserv.svc:3100/'
authToken: FORWARD
tls:
enable: true
caCert:
type: configmap
name: loki-gateway-ca-bundle
certFile: service-ca.crt
consolePlugin:
register: true
logLevel: info
portNaming:
enable: true
portNames:
"3100": loki
468
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
quickFilters: 5
- name: Applications
filter:
src_namespace!: 'openshift-,netobserv'
dst_namespace!: 'openshift-,netobserv'
default: true
- name: Infrastructure
filter:
src_namespace: 'openshift-,netobserv'
dst_namespace: 'openshift-,netobserv'
- name: Pods network
filter:
src_kind: 'Pod'
dst_kind: 'Pod'
default: true
- name: Services network
filter:
dst_kind: 'Service'
3 可选规格 spec.processor.logTypes,spec.processor.conversationHeartbeatInterval, 和
spec.processor.conversationEndTimeout 可以被设置为启用对话跟踪。启用后,可在 web 控制
台中查询对话事件。spec.processor.logTypes 的值如下:FLOWS
CONVERSATIONS、ENDED_CONVERSATIONS 或 ALL。ALL 的存储要求最
高,ENDED_CONVERSATIONS 的存储要求最低。
其他资源
有关对话跟踪的更多信息,请参阅使用对话。
469
OpenShift Container Platform 4.10 网络
deploymentModel: KAFKA 1
kafka:
address: "kafka-cluster-kafka-bootstrap.netobserv" 2
topic: network-flows 3
tls:
enable: false 4
28.5.3. 导出增强的网络流数据
您可以将网络流发送到 Kafka,以便它们可以被支持 Kafka 输入的任何处理器或存储使用,如 Splunk、
Elasticsearch 或 Fluentd。
先决条件
安装的 Kafka
流程
apiVersion: flows.netobserv.io/v1alpha1
kind: FlowCollector
metadata:
name: cluster
spec:
exporters:
- type: KAFKA
kafka:
address: "kafka-cluster-kafka-bootstrap.netobserv"
topic: netobserv-flows-export 1
tls:
enable: false 2
470
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
其他资源
有关指定流格式的更多信息,请参阅网络流格式参考。
28.5.4. 更新流收集器资源
作为在 OpenShift Container Platform Web 控制台中编辑 YAML 的替代方法,您可以通过修补
flowcollector 自定义资源 (CR) 来配置规格,如 eBPF 抽样:
流程
28.5.5. 配置快速过滤器
您可以修改 FlowCollector 资源中的过滤器。可以使用双引号对值进行完全匹配。否则,会对文本值进行
部分匹配。感叹号(!)字符放置在键的末尾,表示负效果。有关修改 YAML 的更多信息,请参阅示例
FlowCollector 资源。
注意
以下是所有可用过滤器键的列表:
表 28.2. 过滤键
Unive 源 目的地 描述
rsal*
471
OpenShift Container Platform 4.10 网络
Unive 源 目的地 描述
rsal*
28.6. 观察网络流量
作为管理员,您可以观察 OpenShift Container Platform 控制台中的网络流量,以了解故障排除和分析的
详细故障排除和分析。此功能帮助您从不同的流量流的图形表示获得见解。观察网络流量有几种可用的视
图。
28.6.1.1. 使用 Overview 视图
流程
472
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
您可以通过点菜单图标来配置每个流速率数据的范围。
Scope:选择网络流量流之间的组件详情。您可以将范围设置为 Node、Namespace、Owner 或
Resource。Owner 是一个资源聚合。Resource 可以是一个 pod、服务、节点(主机网络流
量),或未知 IP 地址。默认值为 Namespace。
Truncate labels:从下拉列表中选择标签所需的宽度。默认值为 M。
28.6.1.2.1. 管理面板
28.6.2. 从流量流视图观察网络流量
流量流 视图显示网络流的数据以及表中的流量数量。作为管理员,您可以使用流量流表监控应用程序间的
流量数量。
28.6.2.1. 使用流量流视图
流程
您可以点击每行来获取对应的流信息。
28.6.2.2. 为流量流视图配置高级选项
28.6.2.2.1. 管理列
您可以选择显示所需的列,并对它们进行重新排序。若要管理列,可点 Manage 列。
28.6.2.2.2. 导出流量流数据
您可以从流量流视图导出数据。
流程
473
OpenShift Container Platform 4.10 网络
1. 点 Export data。
3. 单击 Export。
28.6.2.3. 使用对话跟踪
作为管理员,您可以对属于同一对话的网络流进行分组。对话被定义为一组由 IP 地址、端口和协议标识
的对等点,从而产生唯一的 Conversation Id。您可以在 web 控制台中查询对话事件。这些事件在 web
控制台中表示,如下所示:
Flow :这是在指定间隔内的网络流量流。
流程
配置 FlowCollector 以对话跟踪
apiVersion: flows.netobserv.io/v1alpha1
kind: FlowCollector
metadata:
name: cluster
spec:
processor:
conversationEndTimeout: 10s 1
logTypes: FLOWS 2
conversationHeartbeatInterval: 30s 3
3
Conversation tick 事件表示当网络连接活跃时,在 FlowCollector
474
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
注意
28.6.2.3.1. 使用直方图
28.6.3.1. 使用 Topology 视图
流程
Layout:要选择图形表示的布局。默认值为 ColaNoForce。
组 :通过对组件进行分组来充分了解所有权。默认值为 None。
475
OpenShift Container Platform 4.10 网络
Truncate labels:从下拉列表中选择标签所需的宽度。默认值为 M。
28.6.3.2.1. 导出拓扑视图
28.6.4. 过滤网络流量
默认情况下,Network Traffic 页面根据 FlowCollector 实例中配置的默认过滤器显示集群中的流量流数
据。您可以通过更改 preset 过滤器,使用过滤器选项观察所需的数据。
查询选项
您可以使用 Query Options 来优化搜索结果,如下所示:
Match filters:您可以确定高级过滤器中选择的不同过滤器参数之间的关系。可用的选项包括
Match all 和 Match any。Match all 提供与所有值都匹配的结果,而 Match any 则提供与输
入的任何值匹配的结果。默认值为 Match all。
Limit:内部后端查询的数据限制。根据匹配和过滤器设置,流量流数据的数量显示在指定的
限制中。
快速过滤器
Quick 过滤器 下拉菜单中的默认值在 FlowCollector 配置中定义。您可从控制台修改选项。
高级过滤器
您可以通过提供要过滤的参数及其相应的文本值来设置高级过滤器。参数下拉列表中的 Common 部分
会过滤与 Source 或 Destination 匹配的结果。要启用或禁用应用的过滤器,您可以点过滤器选项下面
列出的应用过滤器。
注意
要了解指定文本值的规则,请点了解更多。
另外,您也可以访问 Namespaces, Services, Routes, Nodes, and Workloads 页中的 Network Traffic
标签页,它们提供了相关部分的聚合过滤数据。
其他资源
476
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
28.7.1. 查看健康信息
您可从 web 控制台的 Dashboards 页面中访问 Network Observability Operator 健康和资源使用的指标。
当触发警报时,您定向到仪表板的健康警报横幅可能会出现在 Network Traffic 和 Home 页面中。在以下
情况下生成警报:
流程
28.7.1.1. 禁用健康警报
4. 添加 spec.processor.metrics.disableAlerts 来禁用健康警报,如下例所示:
apiVersion: flows.netobserv.io/v1alpha1
kind: FlowCollector
metadata:
name: cluster
spec:
processor:
metrics:
disableAlerts: [NetObservLokiError, NetObservNoFlows] 1
1 您可以指定一个或多个包含要禁用的警报类型的列表。
477
OpenShift Container Platform 4.10 网络
类型
对象
属性 类型 描述
status 对象 FlowCollectorStatus 定义
FlowCollector 的观察状态
28.8.1.1. .spec
描述
FlowCollectorSpec 定义所需的 FlowCollector 状态
类型
对象
必填
agent
deploymentModel
478
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
属性 类型 描述
agent 对象 流提取的代理。
loki 对象 Loki,流存储、客户端设置。
processor 对象 处理器定义从代理接收流的组件设
置,增强它们,并将它们转发到
Loki 持久层。
28.8.1.2. .spec.agent
描述
流提取的代理。
类型
对象
必填
479
OpenShift Container Platform 4.10 网络
type
属性 类型 描述
28.8.1.2.1. .spec.agent.ebpf
描述
eBPF 描述了当 "agent.type" 属性设置为 "EBPF" 时,与基于 eBPF 的流报告程序相关的设置。
类型
对象
属性 类型 描述
480
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
属性 类型 描述
资源 对象 资源是此容器所需的计算资源。更
多信息:
https://kubernetes.io/docs/conc
epts/configuration/manage-
resources-containers/
481
OpenShift Container Platform 4.10 网络
属性 类型 描述
28.8.1.2.2. .spec.agent.ebpf.debug
描述
debug 允许设置 eBPF 代理的内部配置的一些方面。本节专门用于调试和精细的性能优化,如 GOGC
和 GOMAXPROCS env vars。用户设置其值会自行承担任何风险。
类型
对象
属性 类型 描述
28.8.1.2.3. .spec.agent.ebpf.resources
描述
资源是此容器所需的计算资源。更多信息:
https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
类型
对象
属性 类型 描述
482
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
属性 类型 描述
28.8.1.2.4. .spec.agent.ipfix
描述
ipfix 描述了当 "agent.type" 属性设置为 "IPFIX" 时,与基于 IPFIX 的流报告程序相关的设置。
类型
对象
属性 类型 描述
483
OpenShift Container Platform 4.10 网络
属性 类型 描述
28.8.1.2.5. .spec.agent.ipfix.clusterNetworkOperator
描述
clusterNetworkOperator 定义与 OpenShift Container Platform Cluster Network Operator 相关的设
置(如果可用)。
类型
对象
属性 类型 描述
28.8.1.2.6. .spec.agent.ipfix.ovnKubernetes
描述
OVNKubernetes 定义 OVN-Kubernetes CNI 的设置(当可用)。在没有 OpenShift Container
Platform 的情况下使用 OVN 的 IPFIX 导出时使用此配置。使用 OpenShift Container Platform 时,请
参阅 clusterNetworkOperator 属性。
类型
对象
属性 类型 描述
28.8.1.3. .spec.consolePlugin
484
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
描述
ConsolePlugin 定义与 OpenShift Container Platform 控制台插件相关的设置(如果可用)。
类型
对象
必填
register
属性 类型 描述
端口 整数 port 是插件服务端口
485
OpenShift Container Platform 4.10 网络
属性 类型 描述
资源 对象 资源,根据此容器所需的计算资
源。更多信息:
https://kubernetes.io/docs/conc
epts/configuration/manage-
resources-containers/
28.8.1.3.1. .spec.consolePlugin.autoscaler
描述
Pod 横向自动扩展的自动扩展规格来为插件部署设置。请参阅 HorizontalPodAutoscaler 文档
(autoscaling/v2)
28.8.1.3.2. .spec.consolePlugin.portNaming
描述
portNaming 定义端口到服务名称转换的配置
类型
对象
属性 类型 描述
28.8.1.3.3. .spec.consolePlugin.quickFilters
描述
quickFilters 为 Console 插件配置快速过滤器预设置
类型
数组
28.8.1.3.4. .spec.consolePlugin.quickFilters[]
描述
QuickFilter 为控制台的快速过滤器定义预设置配置
类型
对象
必填
filter
486
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
name
属性 类型 描述
28.8.1.3.5. .spec.consolePlugin.resources
描述
资源,根据此容器所需的计算资源。更多信息:
https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
类型
对象
属性 类型 描述
28.8.1.4. .spec.exporters
描述
exporters 为自定义消耗或存储定义了其他可选导出器。这是一个实验性功能。目前,只有 KAFKA 导
出器可用。
类型
数组
487
OpenShift Container Platform 4.10 网络
28.8.1.4.1. .spec.exporters[]
描述
FlowCollectorExporter 定义了一个额外的导出器来发送增强的流
类型
对象
必填
type
属性 类型 描述
28.8.1.4.2. .spec.exporters[].kafka
描述
描述 kafka 配置,如地址或主题,以发送丰富的流。
类型
对象
必填
address
topic
属性 类型 描述
28.8.1.4.3. .spec.exporters[].kafka.tls
488
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
描述
TLS 客户端配置。使用 TLS 时,验证地址是否与用于 TLS 的 Kafka 端口匹配,通常为 9093。请注
意,当使用 eBPF 代理时,Kafka 证书需要复制到代理命名空间中(默认为 netobserv-privileged)。
类型
对象
属性 类型 描述
28.8.1.4.4. .spec.exporters[].kafka.tls.caCert
描述
caCert 定义证书颁发机构的证书引用
类型
对象
属性 类型 描述
28.8.1.4.5. .spec.exporters[].kafka.tls.userCert
描述
UserCert 定义用于 mTLS 的用户证书引用(您可以在使用常规的单向 TLS 时忽略它)
489
OpenShift Container Platform 4.10 网络
类型
对象
属性 类型 描述
28.8.1.5. .spec.kafka
描述
kafka 配置,允许使用 Kafka 作为流集合管道的一部分。当 "spec.deploymentModel" 为 "KAFKA" 时可
用。
类型
对象
必填
address
topic
属性 类型 描述
28.8.1.5.1. .spec.kafka.tls
490
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
描述
TLS 客户端配置。使用 TLS 时,验证地址是否与用于 TLS 的 Kafka 端口匹配,通常为 9093。请注
意,当使用 eBPF 代理时,Kafka 证书需要复制到代理命名空间中(默认为 netobserv-privileged)。
类型
对象
属性 类型 描述
28.8.1.5.2. .spec.kafka.tls.caCert
描述
caCert 定义证书颁发机构的证书引用
类型
对象
属性 类型 描述
28.8.1.5.3. .spec.kafka.tls.userCert
描述
UserCert 定义用于 mTLS 的用户证书引用(您可以在使用常规的单向 TLS 时忽略它)
491
OpenShift Container Platform 4.10 网络
类型
对象
属性 类型 描述
28.8.1.6. .spec.loki
描述
Loki,流存储、客户端设置。
类型
对象
属性 类型 描述
492
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
属性 类型 描述
28.8.1.6.1. .spec.loki.tls
描述
TLS 客户端配置。
类型
对象
493
OpenShift Container Platform 4.10 网络
属性 类型 描述
28.8.1.6.2. .spec.loki.tls.caCert
描述
caCert 定义证书颁发机构的证书引用
类型
对象
属性 类型 描述
28.8.1.6.3. .spec.loki.tls.userCert
描述
UserCert 定义用于 mTLS 的用户证书引用(您可以在使用常规的单向 TLS 时忽略它)
类型
对象
494
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
属性 类型 描述
28.8.1.7. .spec.processor
描述
处理器定义从代理接收流的组件设置,增强它们,并将它们转发到 Loki 持久层。
类型
对象
属性 类型 描述
495
OpenShift Container Platform 4.10 网络
属性 类型 描述
kafkaConsumerQueueCapaci 整数 kafkaConsumerQueueCapacity 定
ty 义 Kafka 消费者客户端中使用的内
部消息队列的容量。如果不使用
Kafka,则忽略。
metrics 对象 指标定义了有关指标的处理器配置
端口 整数 流收集器(主机端口) 的端口。惯
例,一些未授权的端口值不能低于
1024,且不得是以下值:4789,
6081, 500 和 4500
496
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
属性 类型 描述
资源 对象 资源是此容器所需的计算资源。更
多信息:
https://kubernetes.io/docs/conc
epts/configuration/manage-
resources-containers/
28.8.1.7.1. .spec.processor.debug
描述
debug 允许设置流处理器的内部配置。本节专门用于调试和精细的性能优化,如 GOGC 和
GOMAXPROCS env vars。用户设置其值会自行承担任何风险。
类型
对象
属性 类型 描述
28.8.1.7.2. .spec.processor.kafkaConsumerAutoscaler
描述
pod 横向自动扩展的 kafkaConsumerAutoscaler spec 为 flowlogs-pipeline-transformer 设置,它使用
Kafka 信息。当 Kafka 被禁用时,会忽略此设置。请参阅 HorizontalPodAutoscaler 文档
(autoscaling/v2)
28.8.1.7.3. .spec.processor.metrics
描述
指标定义了有关指标的处理器配置
类型
对象
属性 类型 描述
497
OpenShift Container Platform 4.10 网络
属性 类型 描述
28.8.1.7.4. .spec.processor.metrics.server
描述
Prometheus scraper 的 metricsServer 端点配置
类型
对象
属性 类型 描述
端口 整数 prometheus HTTP 端口
28.8.1.7.5. .spec.processor.metrics.server.tls
描述
TLS 配置。
类型
对象
属性 类型 描述
498
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
属性 类型 描述
28.8.1.7.6. .spec.processor.metrics.server.tls.provided
描述
TLS 配置。
类型
对象
属性 类型 描述
28.8.1.7.7. .spec.processor.resources
描述
资源是此容器所需的计算资源。更多信息:
https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
类型
对象
属性 类型 描述
499
OpenShift Container Platform 4.10 网络
属性 类型 描述
28.8.1.8. .status
描述
FlowCollectorStatus 定义 FlowCollector 的观察状态
类型
对象
必填
conditions
属性 类型 描述
conditions 数组 条件代表对象状态的最新可用影响
500
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
属性 类型 描述
28.8.1.8.1. .status.conditions
描述
条件代表对象状态的最新可用影响
类型
array
28.8.1.8.2. .status.conditions[]
描述
条件包含此 API 资源当前状态的一个方面的详情。--- 这个结构旨在直接用作字段路径
.status.conditions 中的数组。例如,输入 FooStatus struct{ // Represents the observations of a foo’s
current state. // Known .status.conditions.type are: "Available", "Progressing", and "Degraded" //
+patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions
[]metav1.Condition json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type"
protobuf:"bytes,1,rep,name=conditions" // other fields }
类型
对象
必填
lastTransitionTime
message
501
OpenShift Container Platform 4.10 网络
reason
status
type
属性 类型 描述
observedGeneration 整数 observedGeneration 代表
.metadata.generation,这是条件
设置所基于的条件。例如,如果
.metadata.generation 目前为 12,
但
.status.conditions[x].observedGe
neration 是 9,则代表条件与实例
的当前状态已不匹配。
28.9. 网络流格式参考
502
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
28.9.1. 网络流格式参考
文档分为两个主要类别:标签 和常规的 字段。只有在查询 Loki 时,这个区别才重要。这是因为 标签必须
在流选择器中使用,这与字段不同,。
28.9.1.1. 标签
SrcK8S_Namespace
可选 SrcK8S_Namespace:字符串
源命名空间
DstK8S_Namespace
可选 DstK8S_Namespace:字符串
目标命名空间
SrcK8S_OwnerName
可选 SrcK8S_OwnerName:字符串
源所有者,如 Deployment、StatefulSet 等。
DstK8S_OwnerName
可选 DstK8S_OwnerName:字符串
目标所有者,如 Deployment、StatefulSet 等。
FlowDirection
来自节点观察点的流方向
_RecordType
可选 _RecordType:RecordType
28.9.1.2. 字段
503
OpenShift Container Platform 4.10 网络
SrcAddr
SrcAddr:字符串
源 IP 地址 (ipv4 或 ipv6)
DstAddr
DstAddr: 字符串
目标 IP 地址 (ipv4 或 ipv6)
SrcMac
SrcMac: 字符串
源 MAC 地址
DstMac
DstMac: 字符串
目标 MAC 地址
SrcK8S_Name
可选 SrcK8S_Name:字符串
DstK8S_Name
可选 DstK8S_Name:字符串
SrcK8S_Type
可选 SrcK8S_Type:字符串
DstK8S_Type
可选 DstK8S_Type:字符串
SrcPort
SrcPort:数字
504
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
源端口
DstPort
DstPort:数字
目的地端口
SrcK8S_OwnerType
可选 SrcK8S_OwnerType:字符串
DstK8S_OwnerType
可选 DstK8S_OwnerType:字符串
SrcK8S_HostIP
可选 SrcK8S_HostIP:字符串
源节点 IP
DstK8S_HostIP
可选 DstK8S_HostIP:字符串
目的地节点 IP
SrcK8S_HostName
可选 SrcK8S_HostName:字符串
源节点名称
DstK8S_HostName
可选 DstK8S_HostName:字符串
目标节点名称
Proto
Proto:数字
L4 协议
Interface
505
OpenShift Container Platform 4.10 网络
可选 Interface: 字符串
网络接口
Packets
Packets: 数字
此流中的数据包数量
Packets_AB
可选 Packets_AB:数字
在对话跟踪中,每个对话中 A 到 B 的数据包计数器
Packets_BA
可选 Packets_BA:数字
在对话跟踪中,每个对话中 B 到 A 的数据包计数器
Bytes
bytes:数字
此流中的字节数
Bytes_AB
可选 Bytes_AB:数字
在对话跟踪中,每个对话中 A 到 B 的字节计数器
Bytes_BA
可选 Bytes_BA:数字
在对话跟踪中,每个对话中 B 到 A 的字节计数器
TimeFlowStartMs
TimeFlowStartMs: 数字
开始此流的时间戳,以毫秒为单位
TimeFlowEndMs
TimeFlowEndMs: 数字
此流的结束时间戳,以毫秒为单位
506
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
TimeReceived
TimeReceived:数字
由流被流收集器接收并处理时的时间戳,以秒为单位
_HashId
可选 _HashId:字符串
在对话跟踪中,对话标识符
_IsFirst
可选 _IsFirst:字符串
在对话跟踪中,标识第一个流的标记
numFlowLogs
可选 numFlowLogs :数字
在对话跟踪中,每个对话的流日志计数器
入口
ingress = "0"
来自节点观察点的传入流量
Egress
egress = "1"
来自节点观察点的传出流量
先决条件
507
OpenShift Container Platform 4.10 网络
流程
输出示例
apiVersion: flows.netobserv.io/v1alpha1
kind: FlowCollector
metadata:
name: cluster
spec:
consolePlugin:
register: false
输出示例
...
spec:
plugins:
- netobserv-plugin
...
输出示例
apiVersion: flows.netobserv.io/v1alpha1
kind: FlowCollector
metadata:
name: cluster
spec:
consolePlugin:
register: true
5. 运行以下命令重启控制台 pod:
6. 清除浏览器缓存和历史记录。
508
第 28 章 NETWORK OBSERVABILITY(网络可观察性)
输出示例
输出示例
流程
流程
输出示例
apiVersion: flows.netobserv.io/v1alpha1
kind: FlowCollector
metadata:
name: cluster
509
OpenShift Container Platform 4.10 网络
spec:
agent:
type: EBPF
ebpf:
interfaces: [ 'br-int', 'br-ex' ] 1
1 指定网络接口。
流程
1. 运行以下命令来修补 CSV:
输出示例
clusterserviceversion.operators.coreos.com/network-observability-operator.v1.0.0 patched
2. 运行以下命令来查看更新的 CSV:
510