OpenShift 4 - 在 CI/CD Pipeline 中创建 KubeVirt 容器虚拟机 - 方法1+2 (视频)

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

文章目录

  • 准备环境
    • 安装可实现 KubeVirt 操作的 Tekton 资源
    • 创建密钥对
  • 在 CI/CD 流水线管道中创建 VM
    • 方法1:通过 Manifest 任务创建 VM
    • 方法2:通过 Template 创建 VM
      • 创建 Secret
      • 创建 VM Template
      • 创建并运行 CI/CD 流水线管道
      • 访问 VM
  • 演示视频
  • 参考

准备环境

在 OpenShift 控制台的 Operator Hub 中使用 OpenShift Pipeline Operator 安装 OpenShift Pipeline 环境,安装过程使用缺省配置即可。
参考《OpenShift 4 - 在单机版 OpenShift Local 中运行 OpenShift Virtualization》一文安装 OpenShift Virtualization 环境。

因为要运行的组件较多,而且还要运行 VM,因此如果是单机,建议 OpenShift 环境至少有 24 GB 内存。

安装可实现 KubeVirt 操作的 Tekton 资源

  1. 执行命令,安装最新版的 Tekton 的 ClusterTask,以及 ClusterRole、RoleBinding、ServiceAccount 等资源。
$ VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt-tekton-tasks/releases | jq '.[] | select(.prerelease==false) | .tag_name' | sort -V | tail -n1 | tr -d '"')
$ oc apply -f https://github.com/kubevirt/kubevirt-tekton-tasks/releases/download/${VERSION}/kubevirt-tekton-tasks-okd.yaml
  1. 主要的任务如下:
    在这里插入图片描述
  2. 创建项目。
$ oc new-project ocp-vm

创建密钥对

  1. 执行命令创建密钥对(如有提示,全部输入 y 或回车即可)。
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/dawnsky/.ssh/id_rsa): 
/home/dawnsky/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/dawnsky/.ssh/id_rsa.
Your public key has been saved in /home/dawnsky/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:TuDfmBo334JvSp6REs5QZdhuNU5233gT4DEFd5/6hkw dawnsky@crc
The key's randomart image is:
+---[RSA 2048]----+
|       oo    =+o.|
|      .o. = o +.+|
|      o. = o o +o|
|     o .o .   +.o|
|    . o.S    E ..|
|     + = =  o o  |
|      = @..  o o |
|       B.=o.  .  |
|      . ++o..    |
+----[SHA256]-----+

在 CI/CD 流水线管道中创建 VM

方法1:通过 Manifest 任务创建 VM

此种方法是直接将定义 VirtualMachine 的 YAML 提供给 CI/CD 流水线管道中的 Task。

  1. 进入 OpenShift 控制台的管道菜单,然后创建一个新的管道。
  2. 在“管道构建器”中设置管道名称为 create-vm-from-manifest-pipeline。
    在这里插入图片描述
  3. 在 “任务” 区域中点击“添加任务”,然后找到 create-vm-from-manifest 任务,将其添加到管道中。
  4. 选中 create-vm-from-manifest 任务,然后将以下定义 VirtualMachine 的 YAML 复制到页面右侧“参数”区域的 manifest 中。最后点击窗口下方的“创建”。
    在这里插入图片描述
    请用前面创建的公钥文件中的内容替换以下 YAML 中的 ssh_authorized_keys 对应的字符串。
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  labels:
    kubevirt.io/vm: fedora-vm-1
  generateName: fedora-vm-1-
spec:
  dataVolumeTemplates:
    - metadata:
        name: fedora-vm-1
      spec:
        preallocation: false
        sourceRef:
          kind: DataSource
          name: fedora
          namespace: openshift-virtualization-os-images
        storage:
          resources:
            requests:
              storage: 30Gi
          storageClassName: crc-csi-hostpath-provisioner
  running: true
  template:
    metadata:
      labels:
        kubevirt.io/domain: fedora-vm-1
    spec:
      domain:
        cpu:
          cores: 1
        devices:
          disks:
            - bootOrder: 1
              disk:
                bus: virtio
              name: rootdisk
            - bootOrder: 2
              disk:
                bus: virtio
              name: cloudinitdisk
          interfaces:
            - bridge: {}
              name: default
        machine:
          type: ""
        resources:
          requests:
            memory: 1Gi
      networks:
        - name: 'default'
          pod: {}
      volumes:
        - dataVolume:
            name: fedora-vm-1
          name: rootdisk
        - cloudInitConfigDrive:
            userData: |
              #cloud-config
              user: fedora
              password: password
              chpasswd:
                expire: false
              final_message: boot finished, up $UPTIME seconds
              hostname: fedora-vm-1
              ssh_authorized_keys:
                - >-
                  ssh-rsa
                  AAAAB3NzaC1yc2EAAAADAQABAAABAQC8Fp8GqfM9+lmL/wFW6ykbA6ftnjSGYGM2tsm+8UlOYWSkcnr7WXICLnfvp0gkDkzd5zIBm8t8O4tp8dT6vcfGuFhHuhZ4G16bFwHk5HRhHrZhEikHDMtjuaGsUCfuArkJHiuv6M0Gc553Ii/NloMGrlVEe5DBVvNNIaaShASCmw5erTElUSpLXRTQurh13MKoe/ZYbYTxjnYdgQKZ5S5mkH5P+AG4GWbqcp7/nfMKuaEE6bSDrgU2BmNENd57PTnXP6OFsSWMmGCfwxlKKzWC/Zx+46FzgaM509zDbPKFdrFgqiGKedNHPYUMb98+K/6Z124/+sOq5Ga0xp3SJX2t
                  dawnsky@crc
              runcmd:
                - >-
                  yum -y install httpd; systemctl enable --now httpd; echo SNO with VMS rules!
                  $HOSTNAME > /var/www/html/index.html
          name: cloudinitdisk
  1. 最后可查看生成的 Pipeline 的 YAML 视图,其内容如下:
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: create-vm-pipeline
spec:
  tasks:
    - name: create-vm-from-manifest
      params:
        - name: manifest
          value: |-
            apiVersion: kubevirt.io/v1
            kind: VirtualMachine
            metadata:
              labels:
                kubevirt.io/vm: fedora-vm-1
              generateName: fedora-vm-1-
            spec:
              dataVolumeTemplates:
                - metadata:
                    name: fedora-vm-1
                  spec:
                    preallocation: false
                    sourceRef:
                      kind: DataSource
                      name: fedora
                      namespace: openshift-virtualization-os-images
                    storage:
                      resources:
                        requests:
                          storage: 30Gi
                      storageClassName: crc-csi-hostpath-provisioner
              running: true
              template:
                metadata:
                  labels:
                    kubevirt.io/domain: fedora-vm-1
                spec:
                  domain:
                    cpu:
                      cores: 1
                      sockets: 1
                      threads: 1
                    devices:
                      disks:
                        - bootOrder: 1
                          disk:
                            bus: virtio
                          name: rootdisk
                        - bootOrder: 2
                          disk:
                            bus: virtio
                          name: cloudinitdisk
                      interfaces:
                        - bridge: {}
                          name: default
                    machine:
                      type: ""
                    resources:
                      requests:
                        memory: 1Gi
                  networks:
                    - name: 'default'
                      pod: {}
                  volumes:
                    - dataVolume:
                        name: fedora-vm-1
                      name: rootdisk
                    - cloudInitConfigDrive:
                        userData: |
                          #cloud-config
                          user: fedora
                          password: password
                          chpasswd:
                            expire: false
                          final_message: boot finished, up $UPTIME seconds
                          hostname: fedora-vm-1
                          ssh_authorized_keys:
                            - >-
                              ssh-rsa
                              AAAAB3NzaC1yc2EAAAADAQABAAABAQC8Fp8GqfM9+lmL/wFW6ykbA6ftnjSGYGM2tsm+8UlOYWSkcnr7WXICLnfvp0gkDkzd5zIBm8t8O4tp8dT6vcfGuFhHuhZ4G16bFwHk5HRhHrZhEikHDMtjuaGsUCfuArkJHiuv6M0Gc553Ii/NloMGrlVEe5DBVvNNIaaShASCmw5erTElUSpLXRTQurh13MKoe/ZYbYTxjnYdgQKZ5S5mkH5P+AG4GWbqcp7/nfMKuaEE6bSDrgU2BmNENd57PTnXP6OFsSWMmGCfwxlKKzWC/Zx+46FzgaM509zDbPKFdrFgqiGKedNHPYUMb98+K/6Z124/+sOq5Ga0xp3SJX2t
                              dawnsky@crc
                          runcmd:
                            - >-
                              yum -y install httpd; systemctl enable --now httpd; echo SNO with VMS rules!
                              $HOSTNAME > /var/www/html/index.html
                      name: cloudinitdisk
      taskRef:
        kind: ClusterTask
        name: create-vm-from-manifest
  1. 在 OpenShift 控制台中运行该 Pipeline,然后确认创建的 VM,以及在 VM 中安装并运行的 httpd 服务。

方法2:通过 Template 创建 VM

此种方法是先定义一个 VirtualMachine 的 Template,然后在 Task 中根据 Template 创建 VM。

创建 Secret

  1. 执行命令,基于公要和私钥创建 Secret(请替换 /home/dawnsky 目录)。注意:私钥中的用户为 fedora,另外还需有 disable-strict-host-key-checking=true。
$ oc create secret generic fedora-vm-public-key --from-file=ssh-publickey=/home/dawnsky/.ssh/id_rsa.pub
$ oc create secret generic fedora-vm-private-key --from-file=ssh-privatekey=/home/dawnsky/.ssh/id_rsa --from-literal=disable-strict-host-key-checking=true --from-literal=user=fedora --type=kubernetes.io/ssh-auth
  1. 确认创建的 secret 及其类型。
$ oc get secret
NAME                       TYPE                                  DATA   AGE
...
fedora-vm-private-key      kubernetes.io/ssh-auth                3      47m
fedora-vm-public-key       Opaque                                1      21h
...

创建 VM Template

  1. 在 OpenShift 控制台中进入 Virtualization 的 Template 菜单。
  2. 点击 Create Template 按钮,然后可在“创建模板” 页面中修改 name、使用的 image 等配置后创建模板。本文使用的配置如下:
kind: Template
apiVersion: template.openshift.io/v1
metadata:
  name: vm-template-fedora36
  labels:
    template.kubevirt.io/type: vm
    workload.template.kubevirt.io/server: 'true'
  annotations:
    description: Fedora36 VM template
    iconClass: icon-fedora
    openshift.io/display-name: My Fedora36 VM
objects:
  - apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: '${NAME}'
      annotations:
        description: Fedora36 VM
      labels:
        app: '${NAME}'
        vm.kubevirt.io/template: vm-template-fedora36
    spec:
      running: true
      template:
        metadata:
          annotations:
            vm.kubevirt.io/os: fedora
            vm.kubevirt.io/workload: server
          labels:
            kubevirt.io/domain: '${NAME}'
        spec:
          domain:
            cpu:
              cores: 1
            devices:
              disks:
                - disk:
                    bus: virtio
                  name: containerdisk
                - disk:
                    bus: virtio
                  name: cloudinitdisk
              interfaces:
                - masquerade: {}
                  model: virtio
                  name: default
            resources:
              requests:
                memory: 2Gi
          hostname: '${NAME}'
          networks:
            - name: default
              pod: {}
          volumes:
            - containerDisk:
                image: 'quay.io/containerdisks/fedora:36'
              name: containerdisk
            - cloudInitNoCloud:
                userData: |-
                  #cloud-config
                  password: ${PASSWORD}
                  chpasswd: { expire: False }
              name: cloudinitdisk
          accessCredentials:
            - sshPublicKey:
                source:
                  secret:
                    secretName: '${PUBLIC_KEY_SECRET}'
                propagationMethod:
                  configDrive: {}
parameters:
  - name: NAME
    description: Name for the new VM
    generate: expression
    from: 'fedora-vm-[a-z0-9]{6}'
    required: true
  - name: PASSWORD
    description: Password for user fedora
    generate: expression
    from: '[a-z0-9]{6}'
    required: true
  - name: PUBLIC_KEY_SECRET
    description: Secret including public key
    required: true

创建并运行 CI/CD 流水线管道

  1. 点击 OpenShift 控制台的“管道”菜单,然后创建一个新的管道。
  2. 在“管道构建器”中将管道名称设为 create-vm-from-template-pipeline。
  3. 点击“添加任务”,然后找出 create-vm-from-template 任务添加到管道。
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: create-vm-from-template-pipeline
spec:
  params:
    - description: VM Name
      name: vmName
      type: string
    - description: Password for user fedora
      name: vmPassword
      type: string
    - name: publicKeySecret
      type: string
    - name: privateKeySecret
      type: string
  tasks:
    - name: create-vm-from-template
      params:
        - name: templateName
          value: vm-template-fedora
        - name: templateParams
          value:
            - 'NAME:$(params.vmName)'
            - 'PASSWORD:$(params.vmPassword)'
            - 'PUBLIC_KEY_SECRET:$(params.publicKeySecret)'
        - name: dataVolumes
          value: []
        - name: ownDataVolumes
          value: []
        - name: persistentVolumeClaims
          value: []
        - name: ownPersistentVolumeClaims
          value: []
      taskRef:
        kind: ClusterTask
        name: create-vm-from-template
    - name: execute-in-vm
      params:
        - name: vmName
          value: $(params.vmName)
        - name: secretName
          value: $(params.privateKeySecret)
        - name: command
          value: []
        - name: args
          value: []
        - name: script
          value: |-
            #!/usr/bin/env bash
            set -ex
            sudo yum install -y httpd
            sudo systemctl enable --now httpd
            echo helloworld > index.html
            sudo mv index.html /var/www/html/index.html
            curl localhost
      runAfter:
        - create-vm-from-template
      taskRef:
        kind: ClusterTask
        name: execute-in-vm

完成后 Pipeline 如下:
在这里插入图片描述

  1. 最后在控制台中运行 create-vm-from-template-pipeline 管道,在启动管道窗口输入以下参数即可开始运行。
    在这里插入图片描述
  2. 等待管道成功完成运行。
    在这里插入图片描述
    完成运行后查看执行日志,确认有 helloworld 的输出。
    在这里插入图片描述

访问 VM

  1. 在 VM 的 Detail 页面中打开 SSH over NodePort。
    在这里插入图片描述

  2. 复制并执行上图的 ssh 命令,确认 VM 可以访问。

$ ssh fedora@console-openshift-console.apps-crc.testing -p 30514
The authenticity of host '[console-openshift-console.apps-crc.testing]:30010 ([192.168.130.11]:30514)' can't be established.
ECDSA key fingerprint is SHA256:sDacCgp5UsNbNccBpOwUSQy+pIoK8/dVfeo+Nm2wJLU.
ECDSA key fingerprint is MD5:5f:51:44:66:2a:8a:f0:10:09:46:70:b2:37:96:27:ac.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[console-openshift-console.apps-crc.testing]:30010,[192.168.130.11]:30514' (ECDSA) to the list of known hosts.
Last login: Mon Apr 17 11:24:48 2023
  1. 执行命令确认可以访问 hello.html 页面。
[fedora@fedora-vm-1 ~] $ curl localhost/hello.html
helloworld

演示视频

参考

https://gitee.com/dawnskyliu/kubevirt-tekton-tasks
https://github.com/kubevirt/kubevirt-tekton-tasks

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶企业面临哪些数据安全挑战?

近期,“特斯拉员工被曝私下分享用户隐私”不可避免地成了新闻热点,据说连马斯克也不能幸免。 据相关媒体报道,9名前特斯拉员工爆料在2019年至2022年期间,特斯拉员工通过内部消息系统私下分享了一些车主车载摄像头记录的隐私视频和…

spring框架注解

3.Spring有哪些常用注解呢? Spring常用注解 Web: Controller:组合注解(组合了Component注解),应用在MVC层(控制层)。 RestController:该注解为一个组合注解,相当于Con…

MySql-高级( 面试问题简析) 学习笔记

文章目录 1. MySql 中 MyISAM 和 InnoDB 存储引擎区别1.1. MyISAM1.2. InnoDB 2. 索引的数据结构2.1. B Tree索引2.2. BTree索引2.3. MySql 做的优化 3. 为什么使用BTree索引而不使用Hash索引?4. 为什么使用BTree索引而不使用B-Tree索引?5. MyISAM 存储引…

设计模式-创建型模式之建造者模式

5. 建造者模式 5.1. 模式动机 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮、方向盘、发送机等各种部件。而对于大多数用户而言,无须知道这些部件的装配细节&…

FPGA学习笔记(三):PLL 锁相环

在 FPGA 芯片内部集成了 PLL(phase-locked loop,锁相环),可以倍频分频,产生其它时钟类型。PLL 是 FPGA 中的重要资源,因为一个复杂的 FPGA 系统需要不同频率、相位的时钟信号,一个 FPGA 芯片中 PLL 的数量是衡量 FPGA …

chatgpt智能提效职场办公-ppt怎么加音乐背景

作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 在 PowerPoint 中,您可以轻松地将音乐作为背景音乐添加到您的演示文稿中。下面是步骤: 打开您的 PowerPoint 演…

Linux文件类型与属性

一、文件类型 Linux 系统下一共分为 7 种文件类型。通过 stat 命令或者 ls 命令来查看文件类型。 - :普通文件 d :目录文件 c :字符设备文件 b :块设备文件 l :符号链接文件 s :套接字文件 p &…

关于今年五一调休。。

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect个人…

11、HOOK原理上

一、HOOK 1.1 HOOK简介 HOOK,中文译为“挂钩”或“钩子”.在iOS逆向中是指改变程序运行流程的一种技术.通过hook可以让别人的程序执行自己所写的代码. 在逆向中经常使用这种技术重点要了解其原理,这样能够对恶意代码进行有效的防护. 1.2 Hook的应用场景 描述一个HOOK实用技…

【李老师云计算】实验一:Hadoop伪分布式集群部署与Eclipse访问Hadoop进行单词计数统计

索引 前言实验内容1. 安装虚拟机1.1 安装与激活1.2 ★解决使用虚拟机蓝屏(绿屏) 2. 安装CentOS2.1 下载CentOS2.2 VMware新建虚拟机2.3 安装CentOS(包括GUI、主机名)2.4 ★解决已经创建虚拟机改主机名 3. VMWare 网络配置3.0 使用VI编辑器和VMware3.0.1 使用VI编辑器3.0.2 使用…

遇到Spring事务失效,你该怎么办?

Spring 事务场景失效是一个常见的问题。今天来分析这个问题。 1、事务方法被final、static关键字修饰,方法访问权限不是public Service public class UserService {Autowiredprivate UserDao userDao;// final修饰的事务方法Transactionalpublic final void addUse…

技术干货|直流电源自动测试系统功能介绍

直流电源是一种将交流电转换为恒定电压或电流输出的电子设备。在实际生产生活中,直流电源被广泛应用于各种场合。但由于各种原因,包括工艺、质量等因素,直流电源存在一定的出厂偏差。为了确保直流电源的精度和稳定性,在生产过程中…

如何将模块加载到linux内核

一 顺利的情况 假设存在一个文件叫mymq.c,下该文件相同目录下的makefile如下语句: obj-y mymq.o 然后编译:编译完成了以后,mymq.c文件中,有个函数叫mymq_open,搜索这个函数在不在System.map文件中,如果在&#xff…

开放式耳机真的比封闭式强很多吗?推荐几款主流的开放式耳机

​开放式耳机,顾名思义,就是通过骨头振动来传导声音的耳机。相比于传统耳机,它的声音传输更加开放,不会对耳膜造成压迫感,也不会对耳膜旁的内毛细胞造成损害。因此开放式耳机既是运动蓝牙耳机,又是音乐蓝牙…

Spring依赖注入的三种方式使用及优缺点

初学Spring的时候,我们从Spring容器中获取Bean对象都是通过bean标签先将Bean对象注册到Spring容器中,然后通过上下文对象congtext的getBean方法进行获取,显然这种方法较为麻烦,所以有了更简单的存方法:五大类注解;取方…

在Linux中进行Jenkins-2.190的安装及使用

Jenkins-2.190安装在公网IP为x.x.x.x的服务器上 环境准备 第一步,下载server-jre-8u202-linux-x64.tar.gz安装包。 登录地址:https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html下载server-jre-8u202-linux-x64.tar.gz…

3自由度并联绘图机器人实现写字功能(一)

1. 功能说明 本文示例将实现R305样机3自由度并联绘图机器人写字的功能。 2. 电子硬件 在这个示例中,采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno) 扩展板Bigfish2.1扩展板电池7.4V锂电池 3. 功能…

能量密度的必要性:城市比乡村具有更高的能量密度

文章目录 引言I 人口密度1.1 人口密度太低对于经济的发展的不利因素1.2 足够的人口密度带来的好处1.3 乌鲁克城II 农耕文明和商业文明2.1 农耕文明2.2 商业文明III 有效掌握动力的文明处于优势3.1 苏美尔人- 轮子&风能的利用3.2 英国人- 以蒸汽机为代表的工业革命引言 文明…

作业3综合练习

综合练习: 要求:请给openlab搭建web网站 网站需求: 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,基于www.openlab.com/student #更改配置文件 (虚拟主机标签…

2023好玩的解压游戏,压力大点开玩可以放松自己

你是不是经常感觉到压力大? 现代社会,竞争逐步激烈,不管是来自学习上,工作上,还是生活上的,压力都非常大! 这时候,我们要学会自我减压,有效的放松是为了更好地前行。 …