OpenShift Virtualization - 通过外部固定 IP 访问 VM 中的服务(附视频)

news2024/11/16 9:33:18

《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。

演示视频

视频

参考

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/657008.html

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

相关文章

『DevOps最佳实践』使用Jenkins和Harbor进行持续集成和交付的解决方案

&#x1f4e3;读完这篇文章里你能收获到 全文采用图文形式讲解学会使用Harbor配置项目学会在Jenkins中配置Harbor推送权限使用Jenkins和Harbor进行持续集成的实践感谢点赞收藏&#xff0c;避免下次找不到~ 文章目录 一、准备工作1. 环境准备2. 修改Docker配置文件3. Docker登陆…

2023蓝桥杯大学A组C++国赛游记+个人题解

Day0 发烧了一晚上没睡着&#xff0c;感觉鼻子被打火机烧烤一样难受&#xff0c;心情烦躁 早上6点起来吃了个早饭&#xff0c;思考能力完全丧失了&#xff0c;开始看此花亭奇谭 看了六集&#xff0c;准备复习数据结构考试&#xff0c;然后秒睡 一睁眼就是下午2点了 挂了个…

04- c语言数组 (C语言)

一 数组的概念 1、在程序设计中&#xff0c;为了方便处理数据把具有相同类型的若干变量按有序形式组织起来,这些按序排列的 同类数据元素的集合 称为 数组。 2、在C语言中&#xff0c;数组属于构造数据类型。一个数组可以分解为多个数组元素&#xff0c;这些数组元素可以是基本…

力扣动态规划专题(三)完全背包 518.零钱兑换II 377. 组合总和 Ⅳ 70. 爬楼梯 322. 零钱兑换 279.完全平方数 步骤及C++实现

文章目录 完全背包一维dp数组 滚动数组 518.零钱兑换II377. 组合总和 Ⅳ70. 爬楼梯322. 零钱兑换279.完全平方数139.单词拆分 完全背包 完全背包的物品数量是无限的&#xff0c;01背包的物品数量只有一个 完全背包和01背包分许步骤一样&#xff0c;唯一不同就是体现在遍历顺序上…

deque的介绍

前言 为什么会存在deque呢&#xff1f;在c标准库中deque是作为 stack和queue的底层容器就是deque&#xff0c;我们要是了解过list和vector就会知道这两种容器各有优劣&#xff0c;vector的优点是支持随机访问&#xff0c;进而可以支持排序和二分查找等算法&#xff0c;它的缺点…

鼠标事件 获取鼠标坐标及点击事件

运行效果&#xff1a; 头文件 #ifndef MOUSEEVENT_H #define MOUSEEVENT_H #include #include #include #include class MouseEvent : public QMainWindow { Q_OBJECT public: MouseEvent(QWidget *parent 0); ~MouseEvent(); protected: void mousePressEvent(QMouse…

Linux:一键搭建ftp服务(vsftpd)

《TRO-23614-VSFTPD》 如果csdn收费 可以和我si liao 我会免费发给你 我发的这个是一个tar归档包&#xff0c;脚本就在其中 Linux&#xff1a;《tar》归档命令_鲍海超-GNUBHCkalitarro的博客-CSDN博客 tar xfz tarro_vsftpd.tar.gz -C /root/ # tar xfz tar包路径 -…

SpringBoot第27讲:SpringBoot集成MySQL - MyBatis 多个数据源

SpringBoot第27讲&#xff1a;SpringBoot集成MySQL - MyBatis 多个数据源 本文是SpringBoot第27讲&#xff0c;在某些场景下&#xff0c;Springboot需要使用多个数据源&#xff0c;以及某些场景会需要多个数据源的动态切换。本文主要介绍上述场景及 SpringBootMyBatis实现多个数…

【期末满分作业】C语言程序设计 实训1——奖学金评定系统的设计与实现(附带实验报告、源码以及解释)

大家好&#xff0c;各位努力奋斗的大学生小伙伴们&#xff01;今天&#xff0c;我将带你们领略一项令人惊叹的程序设计奇迹——《奖学金评定系统》&#xff01;是不是感到激动呢&#xff1f;别急&#xff0c;让我为你们揭开这个能让你在C语言程序设计中拿满分的秘密武器&#x…

ASP.NET Core MVC 从入门到精通之Identity入门

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…

pikache靶场通关——XSS漏洞

文章目录 前言环境第一关、反射型xss(get)Step.1、输入特殊字符测试Step.2、输入js语句Step.3、在URL中输入js语句 第二关、反射性xss(post)Step.1、输入获取cookie的js语句 第三关、存储型xssStep.1、输入获取cookie的js语句Step.2、查看页面源码Step.3、感受危害性 第四关、D…

1 君正IPC芯片方案介绍

专栏特色 1、所有源码严格遵守统一的编码规范。 2、手把手教学&#xff0c;让你从零开始&#xff0c;深入了解君正方案IPC库的方方面面。 3、纯C接口&#xff0c;接口封装严谨&#xff0c;接口功能丰富&#xff0c;应用层调用简单便捷。 4、近二十年行业经验和技术积累打造的高…

风电光伏iEEE33节点蒙特卡洛概率潮流计算

基于蒙特卡洛法的概率潮流 以IEEE33节点的电网为研究对象 建立了光伏和风电的概率出力模型 采用蒙特卡洛法进行随机抽样 之后基于抽样序列进行概率潮流计算 最后得到电网的电压概率出力曲线

使用数字钥匙技术的车辆有多安全?

首发微信公众号网络研究院&#xff0c;关注获取更多。 虽然有几种不同的方法来实现汽车使用的数字钥匙&#xff0c;但安全的数字钥匙标准应该利用近场通信 (NFC) 和超宽带 (UWB) 结合蓝牙低功耗 (BLE) 来访问车辆&#xff0c;开始引擎&#xff0c;固定车辆&#xff0c;或授权各…

云原生之使用Docker部署Dashy个人导航页

云原生之使用Docker部署Dashy个人导航页 一、Dashy介绍1.1 Dashy简介1.2 Dashy特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、部署前准备工作4.1下载Dashy源码包4.2 查看D…

vue基础-ref (!)

&#xff01;1、ref 引用 在父组件中直接去调 子组件中的方法&#xff0c;使用ref 很简单&#xff0c;比父子传值 简单很多 1、使用ref引用DOM元素 第一步&#xff1a;给标签里 写 ref“xxx” 第二步&#xff1a;就可以用this.$refs.xxx 来拿到这个元素 使用 ! 2、使用ref引…

Spring - Bean的6种作用域

1、Bean作用域问题2、作用域定义2.1、Bean的6种作用域singleton 单例模式prototype 原型作用域request 请求作用域session 会话作用域application 全局作用域&#xff08;了解&#xff09;websocket 单例作用域 vs 全局作用域 2.设置作用域 1、Bean作用域问题 通过一个案例来看…

[工业互联-10]:PLC入门简介

目录 前言 PLC的用途 PLC的特点 PLC的分类 1、按PLC的控制规模分类 2、按PLC的控制性能分类 3、按PLC的结构分类 PLC的技术指标 1、硬件指标 2、软件指标 3、主要性能指标介绍 1) 存储容量 2) 输入/输出&#xff08;I/O&#xff09;点数 3) 扫描速度 4) 指令的功…

【Redis】五种数据结构

在内存种种存储形式如下&#xff1a;

练习2:逻辑回归

练习2&#xff1a;逻辑回归 介绍 在本练习中&#xff0c;您将实现逻辑回归并将其应用于两个不同的数据集。还将通过将正则化加入训练算法&#xff0c;来提高算法的鲁棒性&#xff0c;并用更复杂的情形来测试模型算法。 在开始练习前&#xff0c;需要下载如下的文件进行数据上…