OpenShift Virtualization - 从集群外部访问集群中的 VM(附视频)

news2025/2/12 3:46:23

《OpenShift / RHEL / DevSecOps 汇总目录》
说明:本文已经在 OpenShift 4.12 的环境中验证

文章目录

  • 方法1:通过 Service 的 NodePort 访问 VM
  • 方法2:通过外部 IP 访问 VM
    • 确认 OpenShift 集群环境
    • 为 Worker 节点添加 Linux Bridge
    • 创建使用 Linux Bridge 的 NetworkAttachmentDefinition
    • 在 VM 中使用附加网络
      • 自动获得 IP 的 VM
      • 指定固定 IP 的 VM
      • 修改 VM 的外部固定 IP
  • 演示视频
  • 参考

可以使用以下两种方法实现从 OpenShift 集群外部访问运行在容器 VM 中的服务:

方法1:通过 Service 的 NodePort 访问 VM

缺省情况下运行在 OpenShift Virtualization 中的 VM 使用的是 Pod 网络,因此只能通过 Pod 网络实现从 OpenShift 集群外部访问 VM 或从 VM 访问外部资源。由于每次 VM 重启后其对应的 Pod 都会变更其 IP,因此即便是在集群内部也无法直接用 IP 地址访问 VM。如果只需要从集群内部访问 VM,使用 Service 对应 Pod 即可,但如果需要从 OpenShift 集群外部访问 VM,还需要为 Service 绑定 NodePort 才可以。

可参考《OpenShift 4 - 通过 SSH 远程访问 OpenShift Virtualization 的虚拟机》一文。该文以运行在 22 端口的 SSH 服务为例,也适用于其他服务。

方法2:通过外部 IP 访问 VM

为了能够以固定 IP 访问OpenShift Virtualization 中 VM,我们可以为运行在 OpenShift Virtualization 中的 VM 配置第二个 Network Interface,并将其 IP 配置到外部网络(例如外部主机网段)。

为了实现该场景,需要以下配置步骤:
在这里插入图片描述

  1. 安装 NMStat Operator
  2. 首先在 OpenShift 中使用 NodeNetworkConfigurationPolicy 对象为 Worker 节点添加 Linux Bridge,这些 Linux Bridge 即可使用主机节点的 IP 网段地址。
  3. 然后在 OpenShift 中创建一个使用该 Linux Bridge 的 NetworkAttachmentDefinition 对象
  4. 最后在 VM 中添加第二个 Network Interface,将其配置到 NetworkAttachmentDefinition 对象,这样 VM 就可以通过 Linux Bridge 使用外部的主机 IP 网段地址了。

此种方法虽然需要在 OpenShift 上进行单独的配置,但由于可通过外部主机使用的 IP 网段直接访问 VM,因此具有更高的网络性能。此方法另外的优势是由于该 VM 在第二个 Network Interface 上使用了外部 IP,因此当 VM 重启后,第二个 Network Interface 对应的 IP 地址不会发生变化。

VM 使用的外部 IP 可以是通过集群外部的 DHCP 分配的,也可是通过手动直接配置的。另外该 IP 的 DNS 解析也需要通过集群外部的 DNS 完成。

确认 OpenShift 集群环境

以下为 BareMetal 部署模式的 OpenShift 集群。

  1. 从“裸机主机” 中确认 Worker 节点的配置中有 enp3s0 的 nic 配置和对应的网段,该外网段为外部主机网段。
    在这里插入图片描述
  2. 由于每个 Node 运行在对应的裸机主机上,因此每个 Worker Node 也有 enp3s0 网络接口。
    在这里插入图片描述
  3. 创建一个运行 VM 的项目。
$ oc new-project my-vm
  1. 执行命令,查看节点相关的 “192.168” 网段 IP 地址。注意此时只有 enp2s0 网络接口有该网段地址。
$ oc debug node/<WORKER_NODE_NAME> -- ip a | grep -B 2 192.168
Temporary namespace openshift-debug-f5gxs is created for debugging node...
Starting pod/ocp4-worker1aioexamplecom-debug ...
To use host binaries, run `chroot /host`

3: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:00:00:04 brd ff:ff:ff:ff:ff:ff
    inet 192.168.123.104/24 brd 192.168.123.255 scope global dynamic noprefixroute enp2s0

为 Worker 节点添加 Linux Bridge

  1. 使用默认配置安装 Kubernetes NMState Operator。
  2. 在安装好的 Kubernetes NMState Operator 中使用默认配置创建一个 NMState 实例。
  3. 创建以下配置的 NodeNetworkConfigurationPolicy 对象,它将在节点名为 enp3s0 的 NIC 上创建 linux-bridge。注意:这里的 ipv4 的 dhcp 和 enabled、bridge 的 enabled 都为 true。
apiVersion: nmstate.io/v1
kind: NodeNetworkConfigurationPolicy
metadata:
  name: br-flat
spec:
  nodeSelector:
    node-role.kubernetes.io/worker: ""
  desiredState:
    interfaces:
      - name: br-flat
        description: Linux bridge with enp3s0 as a port
        type: linux-bridge
        state: up
        ipv4:
          dhcp: true
          enabled: true
        bridge:
          options:
            stp:
              enabled: true
          port:
            - name: enp3s0
  1. 由于使用了 nodeSelector,因此完成创建后确认在 Worker 节点完成了配置。
    在这里插入图片描述
  2. 完成后可以执行以下命令,可以找到 br-flat 网桥相关配置。注意:如果前面 NodeNetworkConfigurationPolicy 对象的 ipv4 和 bridge 设的是 false,则以下 br-flat 不会获得 IP 地址 192.168.3.108。
$ oc debug node/ocp4-worker1.aio.example.com -- ip a | grep -A 1 br-flat
Temporary namespace openshift-debug-z5w2p is created for debugging node...
Starting pod/ocp4-worker1aioexamplecom-debug ...
To use host binaries, run `chroot /host`

4: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br-flat state UP group default qlen 1000
    link/ether 52:54:00:00:01:04 brd ff:ff:ff:ff:ff:ff
9: br-flat: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:54:00:00:01:04 brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.108/24 brd 192.168.3.255 scope global dynamic noprefixroute br-flat
       valid_lft 2307sec preferred_lft 2307sec

$ oc debug node/ocp4-worker1.aio.example.com -- ip a | grep 192.168
Temporary namespace openshift-debug-lzqjb is created for debugging node...
Starting pod/ocp4-worker1aioexamplecom-debug ...
To use host binaries, run `chroot /host`
    inet 192.168.123.104/24 brd 192.168.123.255 scope global dynamic noprefixroute enp2s0
    inet 192.168.3.108/24 brd 192.168.3.255 scope global dynamic noprefixroute br-flat

$ oc debug node/ocp4-worker1.aio.example.com -- cat /host/etc/sysconfig/network-scripts/ifcfg-enp3s0
Temporary namespace openshift-debug-v6pms is created for debugging node...
Starting pod/ocp4-worker1aioexamplecom-debug ...
To use host binaries, run `chroot /host`

TYPE=Ethernet
NAME=enp3s0
DEVICE=enp3s0
ONBOOT=yes
BRIDGE_PORT_VLANS=2-4094
UUID=63aa2036-8665-f54d-9a92-c3035bad03f7
LLDP=no
BRIDGE_UUID=1d670e6a-944c-427b-994f-b4d2690e00b2
BRIDGE=br-flat

创建使用 Linux Bridge 的 NetworkAttachmentDefinition

  1. 进入 OpenShift 控制台的“网络-NetworkAttachmentDefinition”菜单,然后在 my-vm 项目下点击“创建 Network Attachment Definition”。
    在这里插入图片描述
  2. 在 Create Network Attachment Definition 页面中按下图创建 NetworkAttachmentDefinition 对象。
    在这里插入图片描述

在 VM 中使用附加网络

自动获得 IP 的 VM

  1. 在 OpenShift 中创建一个 VM,在它的 Network Interfaces 栏中点击 Add network interface。
    在这里插入图片描述
  2. 在 Add network interface 配置窗口中按照下图指定其类型和使用的 Network。
    在这里插入图片描述
  3. 创建并运行 VM。启动 VM 后确认该 VM 的第二个网络接口的 IP 地址,并可从外部 ping 通该 IP。
    在这里插入图片描述
[fedora@fedora-1 ~] $ ip a show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 02:9e:7c:00:00:01 brd ff:ff:ff:ff:ff:ff
    altname enp2s0
    inet 192.168.3.103/24 brd 192.168.3.255 scope global dynamic noprefixroute eth1
       valid_lft 2905sec preferred_lft 2905sec
    inet6 fe80::9fe3:1227:d23:1d9b/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

[fedora@fedora-1 ~] $ nmcli con show 'Wired connection 1' | grep DHCP4
DHCP4.OPTION[1]:                        broadcast_address = 192.168.3.255
DHCP4.OPTION[2]:                        dhcp_client_identifier = 01:02:9e:7c:00:00:01
DHCP4.OPTION[3]:                        dhcp_lease_time = 3600
DHCP4.OPTION[4]:                        dhcp_server_identifier = 192.168.3.1
DHCP4.OPTION[5]:                        domain_name_servers = 192.168.3.1
DHCP4.OPTION[6]:                        expiry = 1684047661
DHCP4.OPTION[7]:                        host_name = fedora-1
DHCP4.OPTION[8]:                        ip_address = 192.168.3.103
DHCP4.OPTION[9]:                        next_server = 192.168.3.1
DHCP4.OPTION[10]:                       requested_broadcast_address = 1
DHCP4.OPTION[11]:                       requested_domain_name = 1
DHCP4.OPTION[12]:                       requested_domain_name_servers = 1
DHCP4.OPTION[13]:                       requested_domain_search = 1
DHCP4.OPTION[14]:                       requested_host_name = 1
DHCP4.OPTION[15]:                       requested_interface_mtu = 1
DHCP4.OPTION[16]:                       requested_ms_classless_static_routes = 1
DHCP4.OPTION[17]:                       requested_nis_domain = 1
DHCP4.OPTION[18]:                       requested_nis_servers = 1
DHCP4.OPTION[19]:                       requested_ntp_servers = 1
DHCP4.OPTION[20]:                       requested_rfc3442_classless_static_routes = 1
DHCP4.OPTION[21]:                       requested_root_path = 1
DHCP4.OPTION[22]:                       requested_routers = 1
DHCP4.OPTION[23]:                       requested_static_routes = 1
DHCP4.OPTION[24]:                       requested_subnet_mask = 1
DHCP4.OPTION[25]:                       requested_time_offset = 1
DHCP4.OPTION[26]:                       requested_wpad = 1
DHCP4.OPTION[27]:                       routers = 192.168.3.1
DHCP4.OPTION[28]:                       subnet_mask = 255.255.255.0

指定固定 IP 的 VM

在上一步正式运行 fedora-1 前先进入 VM 的 YAML,在 cloudInitNoCloud 下面增加以下使用固定 IP 的网卡配置,保存后再创建 VM。

            networkData: |
              version: 2
              ethernets:
                eth1:
                  addresses:
                  - 192.168.3.201/24

在这里插入图片描述

修改 VM 的外部固定 IP

  1. 重启 VM,然后确认第二个网络接口的 IP 地址不会变化。
  2. 执行命令进入 VM 的 Console 并登录 VM。注意命令提示的退出 VM Console 的方式。
$ virtctl console fedora-1
Successfully connected to fedora-1 console. The escape sequence is ^]

fedora-1 login:
  1. 在 VM 中查看 eth1 的 IP 地址,例如 192.168.3.103。
[fedora@fedora-1 ~] ip a show eth1
  1. 执行命令,将 VM 使用的外部 IP 地址修改为 192.168.3.201/24。
[fedora@fedora-1 ~] nmcli con show
[fedora@fedora-1 ~] sudo nmcli con modify "Wired connection 1" +ipv4.addresses 192.168.3.201/24
[fedora@fedora-1 ~] sudo nmcli con modify "Wired connection 1" -ipv4.addresses 192.168.3.103/24
[fedora@fedora-1 ~] sudo nmcli con down "Wired connection 1"
[fedora@fedora-1 ~] sudo nmcli con up "Wired connection 1"
  1. 在 VM 中安装 NginX。
[fedora@fedora-1 ~] sudo yum install -y nginx
[fedora@fedora-1 ~] sudo systemctl start nginx
  1. 退出 VM Console。
  2. 然后确认可以从外部 ping 通 VM 新的 IP 地址并能访问 NginX,而且在重启 VM 后 IP 地址也不会变化。
$ ping 192.168.3.201
$ curl 192.168.3.201
  1. 删除 VM 的 default 的网络接口,然后确认还可从外部访问 ping 通主机和访问 NginX。

演示视频

视频1
视频2

参考

https://www.cnblogs.com/djlsunshine/p/9733182.html
http://kubevirt.io/2023/OVN-kubernetes-secondary-networks.html
https://cloud.redhat.com/blog/using-the-multus-cni-in-openshift
https://github.com/nmstate/kubernetes-nmstate/blob/main/docs/examples/static-ip.yaml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/645854.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大文件上传功能在标签服务的简单应用和代码实现

各位看官大家好&#xff0c;今天给大家分享的又是一篇实战文章&#xff0c;希望大家能够喜欢。 目前「袋鼠云客户数据洞察平台」标签服务的群组按种类划分&#xff0c;可以分为三大类&#xff0c;分别是实时群组、动态群组以及静态群组。如果按创建方式划分则有两种&#xff0…

6.11 有名管道和无名管道

目录 进程间通讯介绍 System V IPC 无名管道 无名管道特点 无名管道创建-pipe 无名管道通信 无名管道-示例 有名管道特点 有名管道创建-mkfifo 有名管道读写-示例 进程间通讯介绍 无名管道&#xff08;pipe&#xff09; 有名管道 &#xff08;fifo&#xff09; 信号…

制造业供应商合作该如何协调?SRM供应商管理系统的出现改变一切

制造业是使用SRM系统频率最高的行业了&#xff0c;因为该行业需要与大量供应商合作和协调&#xff0c;以便及时获得所需的原材料和零件。同时&#xff0c;该行业生产周期长&#xff0c;需求通常较为稳定&#xff0c;需要稳定的供应链管理来确保生产效率和质量。因此&#xff0c…

写一个vscode支持vue文件跳转到定义的插件,又可以愉快地摸鱼了

1. 背景 vscode自身是支持vue文件组件跳转到定义的&#xff0c;但是支持的力度是非常弱的。我们在vue-cli的配置的下&#xff0c;可以写很多灵活的用法&#xff0c;这样可以提升我们的生产效率。但是正是这些灵活的写法&#xff0c;导致了vscode自身提供的功能无法支持跳转到文…

MySQL数据库语言二:DML、DQL

&#x1f618;作者简介&#xff1a;正在努力的99年打工人。 &#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。 &#x1f64f;创作不易&#xff0c;动…

Linux---网络传输命令(ping、wget、curl)

1. ping命令 执行 ping 指令会使用 ICMP 传输协议&#xff0c;发出要求回应的信息&#xff0c;若远端主机的网络功能没有问题&#xff0c; 就会回应该信息&#xff0c;因而得知该主机运作正常。 语法&#xff1a;ping [参数] IP名或主机名 参数包括&#xff1a; 注意&#…

Jmeter实现Dubbo接口测试

目录 前言&#xff1a; 一、准备 二、编写我们的测试工程 三、Jmeter来测试这个工程 前言&#xff1a; JMeter可以用来测试Dubbo接口的性能和负载。Dubbo是阿里巴巴的高性能RPC框架&#xff0c;常用于分布式服务的调用。为了测试Dubbo接口&#xff0c;需要使用JMeter提供的…

Android Chrome Custom Tabs

参考文档 API文档 链接 Chrome Custom Tabs 参考文档 https://developer.chrome.com/docs/android/custom-tabs/ Chrome Custom Tabs最佳实践_customtabs_Just_Sanpark的博客-CSDN博客 Chrome Custom Tabs最佳实践_chrome custom tabs集成_wxx614817的博客-CSDN博客 Chrome…

红黑树(RBTree)c++实现

目录 红黑树介绍 红黑树的性质&#xff1a; 红黑树的结点类 搜索(红黑)树的旋转 旋转分为4种(左旋&#xff0c;右旋&#xff0c;左右双旋&#xff0c;右左双旋)&#xff1a; 左旋(RotateL) 右旋(RotateR) 左右双旋(RotateLR) 右左双旋(RotateRL) 红黑树的插入 插入结…

计算机中丢失MSVCP140.dll无法启动此程序怎么办,可以使用这个方法修复

计算机中丢失MSVCP140.dll会导致很多软件跟游戏无法启动运行&#xff0c;这个问题相信困扰着不少小伙伴&#xff0c;遇到这个问题其实不用慌&#xff0c;也无需重装系统。需要先了解清楚MSVCP140.dll文件是什么&#xff0c;已经在我们电脑系统中的作用&#xff0c;了解清楚以后…

【技术干货】数字电路电平标准

信号的逻辑电平经历了从单端信号到差分信号、从低速信号到高速信号的发展过程。最基本的单端信号逻辑电平为CMOS、TTL&#xff0c;在此基础上随着电压摆幅的降低&#xff0c;出现LVCMOS、LVTTL等逻辑电平&#xff0c;随着信号速率的提升又出现ECL、PECL、LVPECL、LVDS、CML等差…

2.7V至25V宽输入电压15A 峰值电流

HT7179是一款高功率异步升压转换器&#xff0c;集成 20mΩ功率开关管&#xff0c;为便携式系统提供高效的 小尺寸解决方案。 HT7179具有2.7V至25V宽输入电压范围&#xff0c;可为 采用单节或两节锂电池&#xff0c;或12V铅酸电池的应 用提供支持。该器件具备15A开关电流能力&a…

【Java基础学习打卡05】命令提示符

目录 引言一、命令提示符是什么二、命令提示符常用命令1.打开命令提示符2.命令演示3.常用命令 总结 引言 知道命令提示符是什么&#xff0c;熟练打开命令提示符&#xff0c;熟练使用常用命令&#xff0c;并自行尝试其他命令。本文只是对命令提示符进行简单介绍和使用。 一、命…

绝版功能回归,Win11开始向Win7进化了

如果将 Win11 上架到 Steam 提供评论打分&#xff0c;那么 Win11 会和很多有争议的游戏一样&#xff1a;褒贬不一。 许多功能是吸引人的&#xff0c;但微软总会在什么时候突然给你一击。 前有 VBS 影响性能、谜之卡顿&#xff0c;后有各种广告、自动安装微软电脑管家。 以及我…

运营活动类项目测试方案设计

1、背景 随着业务的不断发展成熟&#xff0c;商业业务逐渐向重运营、重策略的模式发展&#xff0c;提出的需求中运营活动类需求数量也不断增多。而通过项目的积累、与其他业务的讨论共创&#xff0c;我们也积累了一批对运营活动类项目的测试点和对应的测试方案。下面我将从设计…

List容器(Java)

文章目录 1.容器介绍1.1 容器接口结构1.2 简单解析 2. List容器创建3. 访问操作(get, iterator, for)4. 修改操作(add, remove, set)5. 容量操作(clear, contains, isEmpty, size)6. 其他操作(toArray, )7. 泛型操作 1.容器介绍 1.1 容器接口结构 a. Java存储结构划分   Java…

通过使用动态ip解决网络连接问题

互联网的使用已经成为我们生活中不可或缺的一种生活方式。但是&#xff0c;有时候我们会遇到网络连接问题&#xff0c;如IP地址冲突、网络瘫痪等等。这种情况往往会影响我们的工作&#xff0c;现在我们一般使用动态ip地址来解决这些问题。 一、什么是动态ip地址 动态IP地址是由…

小白也可以做智慧大屏?我来帮你踩踩坑!【华为云Astro低代码体验季】

前提 进入华为云官网进行操作&#xff1a;https://www.huaweicloud.com/ Astro的便捷 其内部丰富的组件&#xff0c;简洁的操作&#xff0c;可支持独立空间管理&#xff0c;让人可以在短时间内就完成非常炫酷以及功能完善的页面 进入编辑页面后&#xff0c;可通过选择左侧的…

GPIO(嵌入式学习)

GPIO知识学习 1. GPIO的基本概念2. GPIO的实际应用3. 功能描述3.1 IO结构框图3.2 知识铺垫模拟/数字信号VDD、VSS、VCC施密特触发器片上外设 3.3 功能详述浮空输入上拉输入下拉输入模拟输入开漏输出推挽输出 4. GPIO相关寄存器4.1 寄存器4.2 功能 1. GPIO的基本概念 GPIO是英文…

java面经1

String, StringBuffer, StringBuilder区别 第一点是可变性。String不可变&#xff0c;String Buffer和StringBuider可变。这是因为String被final修饰&#xff0c;每次操作都生成新的对象。StringBuffer和StringBuilder的父类AbstractStringBuilder没有被final修饰。 第二点是…