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

news2024/12/23 23:38:34

《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

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

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

相关文章

如何实现Spring AOP以及Spring AOP的实现原理

AOP:面向切面编程,它和OOP(面向对象编程)类似。 AOP组成: 1、切面:定义AOP是针对那个统一的功能的,这个功能就叫做一个切面,比如用户登录功能或方法的统计日志,他们就各种是一个切面。切面是有切点加通知组成的。 2、连接点:所有可…

ClickHouse快速入门

目录 1 ClickHouse介绍1.1 ClickHouse 的特点1.1.1 列式存储1.1.2 DBMS 的功能1.1.3 多样化引擎1.1.4 高吞吐写入能力1.1.5 数据分区与线程级并行1.1.6 性能对比 2 数据类型2.1 整型2.2 浮点型2.3 布尔型2.4 Decimal 型2.5 字符串2.6 枚举类型2.7 时间类型2.8 数组 3 表引擎3.1…

SpringBoot tomcat核心参数

server.tomcat.threads.min-spare10server.tomcat.threads.max200server.tomcat.max-connections8192server.tomcat.accept-count100 第一个参数代表程序启动就会开启10个线程。 如果我改成20个,看看什么情况,可以看到初始化了20个线程 看第二个参数&am…

2022年中国云市场份额:阿里云腾讯云下降

我是卢松松,点点上面的头像,欢迎关注我哦! 4月23日,IDC发布《中国公有云服务市场(2022下半年)跟踪》,占据前四的分别为阿里云(40.6%)、华为云(11.0%)、腾讯云(11.0%)、中国电信(8.7%)。咱们说重点,如下图所…

DFMEA 在车用燃料电池空压机设计中的应用

摘要: DFMEA在空压机研发中的应用 氢气具有资源丰富、热值高和无污染等特点,因而是燃料电池汽车最理想的二次能源。空压机作为燃料电池汽车的关键总成,掌握其核心部件的设计和制造技术非常必要。应用传统的设计方法进行相关零部件如空气轴承…

D3.js(2) Data-Join

什么是Data-Join? 本质上是将数据与图元绑定 可以省去大量根据数据设置图元属性的代码量,对动态变化的数据提供统一接口 D3.js绑定数据的三个状态 Enter 数据数量>图元数量,d3.js会根据新增的数据生成相应的图元 给不存在数据绑定的图…

跨境电商服务简单说明

​ 前言 跨境电商服务是指通过互联网平台进行国际贸易的一种新型商业模式,涉及跨境物流、跨境支付、跨境电商平台等多个领域。随着全球化的不断推进和消费者需求的不断变化,跨境电商服务行业呈现出快速发展的趋势。 发展背景 跨境电商服务行业的发展背景…

基于ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析

生态系统服务是指生态系统所形成的用于维持人类赖以生存和发展的自然环境条件与效用,是人类直接或间接从生态系统中得到的各种惠益。联合国千年生态系统评估(Millennium ecosystem assessment,MA)提出生态系统服务包括供给、调节、…

JavaScript 函数调用和JavaScript 闭包

文章目录 一、JavaScript 函数调用二、JavaScript 闭包总结 一、JavaScript 函数调用 JavaScript 函数有 4 种调用方式。 每种方式的不同在于 this 的初始化。 this 关键字 一般而言,在Javascript中,this指向函数执行时的当前对象。 注意 this 是保留…

美创科技首届渠道高峰论坛| 两大分论坛亮点汇聚

4月22日,美创科技首届渠道高峰论坛在海南三亚隆重举行,本届高峰论坛以“新起点 新战略 共赢数安蓝海”为主题,全国各地200余家合作伙伴齐聚。当日下午,行业分论坛、技术分论坛两大论坛以及圆桌会议,多方视角、全方位共…

C++篇----auto、内联函数、函数重载

文章目录 一、auto二、内联函数&#xff08;inline)三、函数重载 一、auto auto在c中是会根据等号右边表达式自动推导等号左边的类型 #include<iostream> using namespace std;int main() {int a 0;auto b a;double c 1.1;auto d c;//打印类型typeid().name()cout &l…

OpenGL与Metal API的Point Sprite

我们在实际用OpenGL等3D图形渲染API时 点图元 往往用得不多&#xff0c;而在粒子系统中可能也是用一个正方形来绘制一单个粒子。不过在当前大部分3D图形渲染API中都能支持用点图元来绘制一个具有纹理贴图的粒子&#xff0c;从早在OpenGL 1.4开始就能支持了&#xff0c;而在Open…

机器学习:基于逻辑回归(Logistic Regression)对股票客户流失预测分析

基于逻辑回归对股票客户流失预测分析 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1…

npm install报错

出现这个错误&#xff0c;我百度之后得到的解决方案是&#xff1a; 在node.js安装目录下找到node_modules文件夹并删除 但是当我操作完成之后&#xff0c;却出现了另外一个ERROR&#xff1a; 于是我又还原了原来的node_modules文件夹&#xff0c;于是又报一开始的错 仔细瞅瞅…

Netty 单机百万连接测试

1.Netty框架简介 1.1.Netty简介 netty是jboss提供的一个java开源框架&#xff0c;netty提供异步的、事件驱动的网络应用程序框架和工具&#xff0c;用以快速开发高性能、高可用性的网络服务器和客户端程序。也就是说netty是一个基于nio的编程框架&#xff0c;使用netty可以快…

NFC 学习笔记 5 MFRC522读写器2 NDEF

NDEF简介 NDEF&#xff08;NFC Data Exchange Format&#xff09;是一种标准化的数据格式&#xff0c;用于将数据存储在NFC标签或智能手机中。该格式是NFC论坛定义的&#xff0c;目的是在不同的NFC设备之间交换信息。 NDEF格式可以存储各种类型的数据&#xff0c;例如URL、文本…

面对市场内卷,不同品牌应该如何做客户增长?

后疫情时代&#xff0c;我国新生人口减少、人口老龄化加剧&#xff0c;chatgpt火爆和AI替代论盛行&#xff0c;市场上&#xff0c;口红效应依旧繁荣&#xff0c;消费者的延迟满足、替代性满足成为常见心理&#xff0c;面对宏观的不确定性&#xff0c;人们在消费上更需要确定性的…

github 基础

github 基础 前面讲了 git 的基本使用&#xff0c;这里简单的提一下 github 的基本使用&#xff0c;主要还是 pull 和 push 两个部分。其中 pull 好像有了一些变化&#xff0c;现在似乎是需要 rebase 而不是自动就帮你做了……&#xff1f;不过 rebase 的部分之后再提。 当然…

Vuex实现数据共享

目录 一&#xff1a;index.js的创建 二&#xff1a;index.js的引入 三&#xff1a;Count.vue 四&#xff1a;App.vue的使用 五&#xff1a;mapstate等的使用 五&#xff1a;多组件数据共享&#xff08;模块化编程&#xff09; vc通过dispatch联系actions&#xff0c;acti…

Python小姿势 - ###### 随机选取的知识点:Python日期时间处理

随机选取的知识点&#xff1a;Python日期时间处理 Python日期时间处理&#xff1a;一种更简单的方式 日期和时间处理是许多程序中必不可少的部分。Python提供了一个标准库来处理日期和时间&#xff0c;这个库叫做datetime&#xff0c;它提供了一些类来处理不同的日期和时间格式…