《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. 创建项目。
$ VM_PROJECT=my-vm
$ oc new-project $VM_PROJECT
  1. 执行命令,在要运行 Pipeline 的项目中安装最新版的 Tekton 的 Task,以及 ClusterRole、RoleBinding、ServiceAccount 等资源。(注意:最新版 kubevirt-tekton-tasks-okd.yaml 已经不再使用 ClusterTask 了,而是使用 Task。)
$ 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 -n $VM_PROJECT
  1. 主要的任务如下:

创建密钥对

  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-1generateName: fedora-vm-1-
spec:dataVolumeTemplates:- metadata:name: fedora-vm-1spec:sourceRef:kind: DataSourcename: fedoranamespace: openshift-virtualization-os-imagesstorage:resources:requests:storage: 30Girunning: truetemplate:metadata:labels:kubevirt.io/domain: fedora-vm-1spec:domain:cpu:cores: 1devices:disks:- bootOrder: 1disk:bus: virtioname: rootdisk- bootOrder: 2disk:bus: virtioname: cloudinitdiskinterfaces:- bridge: {}name: defaultmachine:type: ""resources:requests:memory: 1Ginetworks:- name: 'default'pod: {}volumes:- dataVolume:name: fedora-vm-1name: rootdisk- cloudInitConfigDrive:userData: |#cloud-configuser: fedorapassword: passwordchpasswd:expire: falsefinal_message: boot finished, up $UPTIME secondshostname: fedora-vm-1ssh_authorized_keys:- >-ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8Fp8GqfM9+lmL/wFW6ykbA6ftnjSGYGM2tsm+8UlOYWSkcnr7WXICLnfvp0gkDkzd5zIBm8t8O4tp8dT6vcfGuFhHuhZ4G16bFwHk5HRhHrZhEikHDMtjuaGsUCfuArkJHiuv6M0Gc553Ii/NloMGrlVEe5DBVvNNIaaShASCmw5erTElUSpLXRTQurh13MKoe/ZYbYTxjnYdgQKZ5S5mkH5P+AG4GWbqcp7/nfMKuaEE6bSDrgU2BmNENd57PTnXP6OFsSWMmGCfwxlKKzWC/Zx+46FzgaM509zDbPKFdrFgqiGKedNHPYUMb98+K/6Z124/+sOq5Ga0xp3SJX2t dawnsky@crcruncmd:- >-yum -y install httpd; systemctl enable --now httpd; echo SNO with VMS rules!$HOSTNAME > /var/www/html/index.htmlname: cloudinitdisk
  1. 最后可查看生成的 Pipeline 的 YAML 视图,其内容如下:
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:name: create-vm-pipeline
spec:tasks:- name: create-vm-from-manifestparams:- name: manifestvalue: |-apiVersion: kubevirt.io/v1kind: VirtualMachinemetadata:labels:kubevirt.io/vm: fedora-vm-1generateName: fedora-vm-1-spec:dataVolumeTemplates:- metadata:name: fedora-vm-1spec:sourceRef:kind: DataSourcename: fedoranamespace: openshift-virtualization-os-imagesstorage:resources:requests:storage: 30Girunning: truetemplate:metadata:labels:kubevirt.io/domain: fedora-vm-1spec:domain:cpu:cores: 1sockets: 1threads: 1devices:disks:- bootOrder: 1disk:bus: virtioname: rootdisk- bootOrder: 2disk:bus: virtioname: cloudinitdiskinterfaces:- bridge: {}name: defaultmachine:type: ""resources:requests:memory: 1Ginetworks:- name: 'default'pod: {}volumes:- dataVolume:name: fedora-vm-1name: rootdisk- cloudInitConfigDrive:userData: |#cloud-configuser: fedorapassword: passwordchpasswd:expire: falsefinal_message: boot finished, up $UPTIME secondshostname: fedora-vm-1ssh_authorized_keys:- >-ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8Fp8GqfM9+lmL/wFW6ykbA6ftnjSGYGM2tsm+8UlOYWSkcnr7WXICLnfvp0gkDkzd5zIBm8t8O4tp8dT6vcfGuFhHuhZ4G16bFwHk5HRhHrZhEikHDMtjuaGsUCfuArkJHiuv6M0Gc553Ii/NloMGrlVEe5DBVvNNIaaShASCmw5erTElUSpLXRTQurh13MKoe/ZYbYTxjnYdgQKZ5S5mkH5P+AG4GWbqcp7/nfMKuaEE6bSDrgU2BmNENd57PTnXP6OFsSWMmGCfwxlKKzWC/Zx+46FzgaM509zDbPKFdrFgqiGKedNHPYUMb98+K/6Z124/+sOq5Ga0xp3SJX2t dawnsky@crcruncmd:- >-yum -y install httpd; systemctl enable --now httpd; echo SNO with VMS rules!$HOSTNAME > /var/www/html/index.htmlname: cloudinitdisktaskRef:kind: Taskname: create-vm-from-manifest
  1. 在 OpenShift 控制台中运行该 Pipeline,然后手动运行 VM,最后确认在 VM 中安装并运行的 httpd 服务。

方法2:通过 Template 创建 VM

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

创建 Secret

  1. 执行命令,基于公要和私钥创建 Secret。注意:私钥中的用户为 fedora,另外还需有 disable-strict-host-key-checking=true。
$ oc create secret generic fedora-vm-public-key -n $VM_PROJECT --from-file=ssh-publickey=$HOME/.ssh/id_rsa.pub
$ oc create secret generic fedora-vm-private-key -n $VM_PROJECT --from-file=ssh-privatekey=$HOME/.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 -n $VM_PROJECT | grep fedora
fedora-vm-private-key      kubernetes.io/ssh-auth                3      47s
fedora-vm-public-key       Opaque                                1      21s

创建 VM Template

  1. 在 OpenShift 控制台中进入 Virtualization 的 Template 菜单。
  2. 点击 Create Template 按钮,然后可在“创建模板” 页面中修改 name、使用的 image 等配置后创建模板。本文使用的配置如下:
kind: Template
apiVersion: template.openshift.io/v1
metadata:name: vm-template-fedora36labels:template.kubevirt.io/type: vmworkload.template.kubevirt.io/server: 'true'annotations:description: Fedora36 VM templateiconClass: icon-fedoraopenshift.io/display-name: My Fedora36 VM
objects:- apiVersion: kubevirt.io/v1kind: VirtualMachinemetadata:name: '${NAME}'annotations:description: Fedora36 VMlabels:app: '${NAME}'vm.kubevirt.io/template: vm-template-fedora36spec:running: truetemplate:metadata:annotations:vm.kubevirt.io/os: fedoravm.kubevirt.io/workload: serverlabels:kubevirt.io/domain: '${NAME}'spec:domain:cpu:cores: 1devices:disks:- disk:bus: virtioname: containerdisk- disk:bus: virtioname: cloudinitdiskinterfaces:- masquerade: {}model: virtioname: defaultresources:requests:memory: 2Gihostname: '${NAME}'networks:- name: defaultpod: {}volumes:- containerDisk:image: 'quay.io/containerdisks/fedora:36'name: containerdisk- cloudInitConfigDrive:userData: |-#cloud-configuser: fedorapassword: ${PASSWORD}chpasswd: { expire: False }name: cloudinitdiskaccessCredentials:- sshPublicKey:source:secret:secretName: '${PUBLIC_KEY_SECRET}'propagationMethod:configDrive: {}
parameters:- name: NAMEdescription: Name for the new VMgenerate: expressionfrom: 'fedora-vm-[a-z0-9]{6}'required: true- name: PASSWORDdescription: Password for user fedoragenerate: expressionfrom: '[a-z0-9]{6}'required: true- name: PUBLIC_KEY_SECRETdescription: Secret including public keyvalue: fedora-vm-public-keyrequired: 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 Namename: vmNametype: string- description: Password for user fedoraname: vmPasswordtype: stringdefault: password- name: publicKeySecrettype: stringdefault: fedora-vm-public-key- name: privateKeySecrettype: stringdefault: fedora-vm-private-keytasks:- name: create-vm-from-templateparams:- name: templateNamevalue: vm-template-fedora- name: templateParamsvalue:- 'NAME:$(params.vmName)'- 'PASSWORD:$(params.vmPassword)'- 'PUBLIC_KEY_SECRET:$(params.publicKeySecret)'- name: dataVolumesvalue: []- name: ownDataVolumesvalue: []- name: persistentVolumeClaimsvalue: []- name: ownPersistentVolumeClaimsvalue: []taskRef:kind: Taskname: create-vm-from-template- name: execute-in-vmparams:- name: vmNamevalue: $(params.vmName)- name: secretNamevalue: $(params.privateKeySecret)- name: commandvalue: []- name: argsvalue: []- name: scriptvalue: |-#!/usr/bin/env bashset -exsudo yum install -y nginxsudo systemctl enable --now nginxecho helloworld > hello.htmlsudo cp hello.html /usr/share/nginx/html/hello.htmlcurl localhost/hello.htmlrunAfter:- create-vm-from-templatetaskRef:kind: Taskname: execute-in-vm

完成后 Pipeline 如下:

  1. 最后在控制台中运行 create-vm-from-template-pipeline 管道,在启动管道窗口输入以下参数即可开始运行。
  2. 等待管道成功完成运行。
  3. 完成运行后查看执行日志,确认有 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

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

  1. OpenShift 4 Hands-on Lab (8) 基于Gogs+Nexus+Sonarqube的Jenkins CI/CD Pipeline

    <OpenShift 4.x HOL教程汇总> 说明:本文已经在 OpenShift 4.8 环境中验证(OpenShift 4.9 环境的 Jenkins 版本较新,编译 Java 报错 ...

  2. OpenShift 4之实现一个基于Gogs+Nexus+Sonarqube的Jenkins CI/CD Pipeline

    OpenShift 4之实现一个基于Gogs+Nexus+Sonarqube的Jenkins CI/CD Pipeline 场景说明 运行环境 配置操作过程 准备运行所需资源 配置Gogs并导入应用代 ...

  3. 自动部署 管道 ci cd_自动化测试在CI CD管道中的作用

    自动部署 管道 ci cd 业界广泛采用的软件开发实践:持续集成和持续部署可确保良好地交付产品并经常交付. 常规代码提交需要常规/连续测试,而如果忽略它,则可能导致非弹性基础结构. 如何交付坚固的CI ...

  4. 自动化测试在CI CD管道中的作用

    业界广泛采用的软件开发实践:持续集成和持续部署可确保良好地交付产品并经常交付. 常规代码提交需要常规/连续测试,而如果忽略它,则可能导致基础架构无法恢复. 如何交付坚固的CI CD管道? 对于许多公司 ...

  5. java 获取对象方法有哪些方法有哪些方法有哪些_Java中创建String 对象的方法有哪些...

    Java中创建String 对象的方法有哪些 发布时间:2020-11-25 16:45:30 来源:亿速云 阅读:71 作者:Leah 这篇文章将为大家详细讲解有关Java中创建String 对象的 ...

  6. java 创建文件夹的方法_java中创建文件夹的方法

    java中创建文件夹的方法 发布时间:2020-06-10 11:46:49 来源:亿速云 阅读:461 作者:Leah 这篇文章给大家分享的是java中创建文件夹的方法.小编觉得挺实用的,因此分享给 ...

  7. Docker中创建MySQL容器,将宿主机目录直接挂载到目录

    Docker中创建MySQL容器,将宿主机目录直接挂载到目录 1.在Docker中下载MySQL镜像 docker pull mysql:5.7.25 2.创建目录/tmp/mysql/data和/t ...

  8. 在Docker中创建CentOS容器

    在Docker中创建CentOS容器 前提 镜像准备 运行并保存容器 再次运行容器 前提 前提是机器上安装了docker,并运行了docker服务.本人为图方便(没钱买服务器,懒得装虚拟机),使用的操 ...

  9. gitlab项目中启用或禁用 GitLab CI/CD Pipeline

    默认情况下,GitLab CI/CD 在新安装上会默认启用,要关闭的话,有两种方式: 需要在每个项目下单独关闭. 通过修改源安装和 Omnibus 安装中的设置.(未验证) 1.每个项目单独关闭 要在 ...

最新文章

  1. torch量化的流程
  2. linux系统安装mysql
  3. 零基础自学python的建议-【老男孩Python课堂安排】零基础Python学习方法
  4. Linux下vi和vim模式相互切换
  5. 丁可以组什么词_有哪些量词可以用来描述生意经?
  6. [转]调整 VirtualBox 虚拟机的磁盘大小
  7. 矩池云上加速下载GitHub文件办法
  8. 开课吧课堂之如何创建多级类层次
  9. 算法导论第三版 21.2-3习题答案
  10. 计算机二级C语言怎么过
  11. Vue表格table样式
  12. QQ邮箱中转站文件即将过期时如何转存到微云
  13. git 找回删除的文件
  14. TigerGraph百万美元挑战赛奖项全揭晓,通过图技术解决全球问题的创新方案令人印象深刻
  15. html中svg是什么文件,svg是什么文件格式?如何打开svg文件?
  16. 2019-5-25-win10-uwp-win2d-入门-看这一篇就够了
  17. 网页版双色球号码生成工具
  18. 如何将CentOS Stream退回为CentOS 8.5
  19. word2vec Parameter Learning Explained(Hierarchical Softmax,Negative Sampling)
  20. CResourceException Warning: Uncaught exception in WindowProc (returning 0).

热门文章

  1. Chest X-Ray Images (Pneumonia)(胸部X光片(肺炎)相关数据集)
  2. js判断是安卓 还是 ios webview?
  3. 接私活必备的几个开源项目!收藏
  4. Azkaban与Oozie详细对比
  5. AT89C51单片机的抢答器的设计(2位一体共阳)
  6. Lync(Skype)接口开发实录
  7. 年度回顾:2021年区块链安全问题建议
  8. vagrant springcloud java 镜像:制作详解(带下载地址)
  9. web实现QQ第三方登录
  10. 关于tkinter的的布局管理pack()篇