6.9. 导入虚拟机

6.9.1. DataVolume 导入的 TLS 证书

6.9.1.1. 添加用于身份验证 DataVolume 导入的 TLS 证书

registry 或 HTTPS 端点的 TLS 证书必须添加到 ConfigMap 中才可从这些源导入数据。该 ConfigMap 必须存在于目标 DataVolume 的命名空间中。

通过引用 TLS 证书的相对文件路径来创建 ConfigMap。

流程

  1. 确定您处于正确的命名空间中。ConfigMap 只有位于相同命名空间中才可被 DataVolume 引用。

    $ oc get ns
  2. 创建 ConfigMap:

    $ oc create configmap <configmap-name> --from-file=</path/to/file/ca.pem>

6.9.1.2. 示例:从 TLS 证书创建的 ConfigMap

以下示例是从 ca.pem TLS 证书创建的 ConfigMap。

apiVersion: v1
kind: ConfigMap
metadata:
  name: tls-certs
data:
  ca.pem: |
    -----BEGIN CERTIFICATE-----
    ... <base64 encoded cert> ...
    -----END CERTIFICATE-----

6.9.2. 使用 DataVolume 导入虚拟机镜像

您可将现有虚拟机镜像导入到您的 OpenShift Container Platform 集群中。容器原生虚拟化使用 DataVolume 自动导入数据并创建底层 PersistentVolumeClaim (PVC)。

重要

当您将磁盘镜像导入到 PVC 中时,磁盘镜像扩展为使用 PVC 中请求的全部存储容量。要使用该空间,可能需要扩展虚拟机中的磁盘分区和文件系统。

调整大小的流程因虚拟机上安装的操作系统而异。详情请参阅操作系统文档。

6.9.2.1. 先决条件

6.9.2.2. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt(QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

Archive+

✓ TAR

✓ TAR

✓ TAR

□ TAR

□ TAR

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

+ 存档不支持块模式 DV

6.9.2.3. 关于 DataVolume

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层 PersistentVolumeClaim (PVC) 关联的导入、克隆和上传操作。DataVolume 与 KubeVirt 集成,它们可在 PVC 准备好前阻止虚拟机启动。

6.9.2.4. 使用 DataVolume 将虚拟机镜像导入到对象中

要从所导入的镜像创建虚拟机,请在创建虚拟机前在 VirtualMachine 配置文件中指定镜像位置。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 具有 RAW、ISO 或 QCOW2 格式的虚拟机磁盘镜像,可选择使用 xzgz 进行压缩
  • 托管镜像的 HTTP 端点,以及访问数据源所需的任何身份验证凭证
  • 至少一个可用 PersistentVolume

流程

  1. 确定用于托管您要导入的虚拟磁盘镜像的 HTTP 文件服务器。您需要一个正确格式的完整 URL:

  2. 如果您的数据源需要身份验证凭证,请编辑 endpoint-secret.yaml 文件,并在集群中应用更新的配置:

    apiVersion: v1
    kind: Secret
    metadata:
      name: <endpoint-secret>
      labels:
        app: containerized-data-importer
    type: Opaque
    data:
      accessKeyId: "" 1
      secretKey:   "" 2
    1
    可选:您的密钥或用户名,base64 编码
    2
    可选:您的 secret 或密码,base64 编码
    $ oc apply -f endpoint-secret.yaml
  3. 编辑虚拟机配置文件,为您要导入的镜像指定数据源。在本例中,导入了一个 Fedora 镜像:

    apiVersion: kubevirt.io/v1alpha3
    kind: VirtualMachine
    metadata:
      creationTimestamp: null
      labels:
        kubevirt.io/vm: vm-fedora-datavolume
      name: vm-fedora-datavolume
    spec:
      dataVolumeTemplates:
      - metadata:
          creationTimestamp: null
          name: fedora-dv
        spec:
          pvc:
            accessModes:
            - ReadWriteOnce
            resources:
              requests:
                storage: 2Gi
            storageClassName: local
          source:
            http:
              url: https://download.fedoraproject.org/pub/fedora/linux/releases/28/Cloud/x86_64/images/Fedora-Cloud-Base-28-1.1.x86_64.qcow2 1
              secretRef: "" 2
              certConfigMap: "" 3
        status: {}
      running: false
      template:
        metadata:
          creationTimestamp: null
          labels:
            kubevirt.io/vm: vm-fedora-datavolume
        spec:
          domain:
            devices:
              disks:
              - disk:
                  bus: virtio
                name: datavolumedisk1
            machine:
              type: ""
            resources:
              requests:
                memory: 64M
          terminationGracePeriodSeconds: 0
          volumes:
          - dataVolume:
              name: fedora-dv
            name: datavolumedisk1
    status: {}
    1
    您要导入的镜像的 HTTP 源。
    2
    secretRef 参数是可选的。
    3
    与使用自签名证书或者由系统 CA 捆绑包没有签名的证书的服务器进行通信需要 certConfigMap。所引用的 ConfigMap 必须与 DataVolume 位于相同命名空间中。
  4. 创建虚拟机:

    $ oc create -f vm-<name>-datavolume.yaml
    注意

    oc create 命令创建 DataVolume 和虚拟机。CDI 控制器使用正确注解创建底层 PVC,导入过程随即开始。导入完成后,DataVolume 状态变为 Succeeded,虚拟机可以启动。

    DataVolume 置备在后台进行,因此无需监控。您可以启动虚拟机,该虚拟机将在导入完成后才会运行。

可选验证步骤

  1. 运行 oc get pods 并查找导入程序 Pod。该 Pod 会从指定的 URL 下载镜像,并将其存储在置备的 PV 上。
  2. 监控 DataVolume 的状态,直至状态显示为 Succeeded

    $ oc describe dv <data-label> 1
    1
    在虚拟机配置文件中指定的 DataVolume 的数据标签。
  3. 要验证置备是否已完成以及 VMI 是否已启动,请尝试访问其串行控制台:

    $ virtctl console <vm-fedora-datavolume>

6.9.2.5. 模板:DataVolume 虚拟机配置文件

example-dv-vm.yaml

apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachine
metadata:
  labels:
    kubevirt.io/vm: example-vm
  name: example-vm
spec:
  dataVolumeTemplates:
  - metadata:
      name: example-dv
    spec:
      pvc:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 1G
      source:
          http:
             url: "" 1
  running: false
  template:
    metadata:
      labels:
        kubevirt.io/vm: example-vm
    spec:
      domain:
        cpu:
          cores: 1
        devices:
          disks:
          - disk:
              bus: virtio
            name: example-dv-disk
        machine:
          type: q35
        resources:
          requests:
            memory: 1G
      terminationGracePeriodSeconds: 0
      volumes:
      - dataVolume:
          name: example-dv
        name: example-dv-disk
1
您要导入的镜像的 HTTP 源(如适用)。

6.9.2.6. 模板:DataVolume 导入配置文件

example-import-dv.yaml

apiVersion: cdi.kubevirt.io/v1alpha1
kind: DataVolume
metadata:
  name: "example-import-dv"
spec:
  source:
      http:
         url: "" 1
         secretRef: "" 2
  pvc:
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: "1G"
1
您要导入的镜像的 HTTP 源。
2
secretRef 参数是可选的。

6.9.3. 使用 DataVolume 将虚拟机镜像导入到块存储

您可将现有虚拟机镜像导入到您的 OpenShift Container Platform 集群中。容器原生虚拟化使用 DataVolume 自动导入数据并创建底层 PersistentVolumeClaim (PVC)。

重要

当您将磁盘镜像导入到 PVC 中时,磁盘镜像扩展为使用 PVC 中请求的全部存储容量。要使用该空间,可能需要扩展虚拟机中的磁盘分区和文件系统。

调整大小的流程因虚拟机上安装的操作系统而异。详情请参阅操作系统文档。

6.9.3.1. 先决条件

6.9.3.2. 关于 DataVolume

DataVolume 对象是 Containerized Data Importer (CDI) 项目提供的自定义资源。DataVolume 编配与底层 PersistentVolumeClaim (PVC) 关联的导入、克隆和上传操作。DataVolume 与 KubeVirt 集成,它们可在 PVC 准备好前阻止虚拟机启动。

6.9.3.3. 关于块 PersistentVolume

块 PersistentVolume (PV) 是一个受原始块设备支持的 PV。这些卷没有文件系统。对于可以直接写入磁盘或者实现其自己的存储服务的虚拟机来说,使用它可以获得性能优势。

原始块卷可以通过在 PV 和 PersistentVolumeClaim (PVC) 规格中指定 volumeMode: Block 来置备。

6.9.3.4. 创建本地块 PersistentVolume

通过填充文件并将其挂载为循环设备,在节点上创建本地块 PersistentVolume (PV)。然后您可以在 PV 配置中将该循环设备引用为 Block 卷,并将其用作虚拟机镜像的块设备。

流程

  1. root 身份登录节点,在其上创建本地 PV。本流程以 node01 为例。
  2. 创建一个文件并用空字符填充,以便可将其用作块设备。以下示例创建 loop10 文件,大小为 2Gb(20,100 Mb 块):

    $ dd if=/dev/zero of=<loop10> bs=100M count=20
  3. loop10 文件挂载为 loop 设备。

    $ losetup </dev/loop10>d3 <loop10> 1 2
    1
    挂载 loop 设备的文件路径。
    2
    上一步中创建的文件,挂载为 loop 设备。
  4. 创建引用所挂载 loop 设备的 PersistentVolume 配置。

    kind: PersistentVolume
    apiVersion: v1
    metadata:
      name: <local-block-pv10>
      annotations:
    spec:
      local:
        path: </dev/loop10> 1
      capacity:
        storage: <2Gi>
      volumeMode: Block 2
      storageClassName: local 3
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Delete
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - <node01> 4
    1
    节点上的 loop 设备路径。
    2
    将其指定为块 PV。
    3
    可选:为 PV 设置一个 StorageClass。如果省略此项,将使用默认集群。
    4
    挂载块设备的节点。
  5. 创建块 PV。

    # oc create -f <local-block-pv10.yaml>1
    1
    上一步中创建的 PersistentVolume 的文件名。

6.9.3.5. 使用 DataVolume 导入虚拟机镜像至块 PersistentVolume

您可将现有虚拟机镜像导入到您的 OpenShift Container Platform 集群中。容器原生虚拟化使用 DataVolume 自动导入数据并创建底层 PersistentVolumeClaim (PVC)。然后您可以在虚拟机配置中引用 DataVolume。

先决条件

  • 具有 RAW、ISO 或 QCOW2 格式的虚拟机磁盘镜像,可选择使用 xzgz 进行压缩。
  • 托管镜像的 HTTPs3 端点,以及访问数据源所需的任何身份验证凭证
  • 至少有一个可用块 PV。

流程

  1. 如果您的数据源需要身份验证凭证,请编辑 endpoint-secret.yaml 文件,并在集群中应用更新的配置。

    1. 利用您首选的文本编辑器来编辑 endpoint-secret.yaml 文件:

      apiVersion: v1
      kind: Secret
      metadata:
        name: <endpoint-secret>
        labels:
          app: containerized-data-importer
      type: Opaque
      data:
        accessKeyId: "" 1
        secretKey:   "" 2
      1
      可选:您的密钥或用户名,base64 编码
      2
      可选:您的 secret 或密码,base64 编码
    2. 更新 secret:

      $ oc apply -f endpoint-secret.yaml
  2. 创建 DataVolume 配置,用于指定要导入的镜像的数据源和 volumeMode: Block,以便使用可用块 PV。

    apiVersion: cdi.kubevirt.io/v1alpha1
    kind: DataVolume
    metadata:
      name: <import-pv-datavolume> 1
    spec:
      storageClassName: local 2
      source:
          http:
             url: <http://download.fedoraproject.org/pub/fedora/linux/releases/28/Cloud/x86_64/images/Fedora-Cloud-Base-28-1.1.x86_64.qcow2> 3
             secretRef: <endpoint-secret> 4
      pvc:
        volumeMode: Block 5
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: <2Gi>
    1
    DataVolume 的名称。
    2
    可选:设置存储类,或忽略此项,接受集群默认值。
    3
    要导入的镜像的 HTTP 源。
    4
    仅在数据源需要身份验证时才需要。
    5
    导入到块 PV 时需要。
  3. 创建 DataVolume 以导入虚拟机镜像。

    $ oc create -f <import-pv-datavolume.yaml>1
    1
    上一步中创建的文件名 DataVolume。

6.9.3.6. CDI 支持的操作列表

此列表针对端点显示内容类型支持的 CDI 操作,以及哪些操作需要涂销空间(scratch space)。

内容类型HTTPHTTPSHTTP 基本身份验证Registry上传

KubeVirt(QCOW2)

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2**
✓ GZ*
✓ XZ*

✓ QCOW2
✓ GZ*
✓ XZ*

✓ QCOW2*
□ GZ
□ XZ

✓ QCOW2*
✓ GZ*
✓ XZ*

KubeVirt (RAW)

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW
✓ GZ
✓ XZ

✓ RAW*
□ GZ
□ XZ

✓ RAW*
✓ GZ*
✓ XZ*

Archive+

✓ TAR

✓ TAR

✓ TAR

□ TAR

□ TAR

✓ 支持的操作

□ 不支持的操作

* 需要涂销空间

** 如果需要自定义证书颁发机构,则需要涂销空间

+ 存档不支持块模式 DV

6.9.4. 导入 VMware 虚拟机或模板

您可将一个单一的 VMware 虚拟机或模板导入到您的 OpenShift Container Platform 集群中。

如果您导入了 VMware 模板,向导会根据模板创建一个虚拟机。

重要

导入 VMware 虚拟机或模板只是一个技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的详情,请参阅 https://access.redhat.com/support/offerings/techpreview/

导入过程使用 VMware Virtual Disk Development Kit(VDDK)来复制 VMware 虚拟磁盘。您可以下载 VDDK SDK,构建 VDDK 镜像,将镜像上传到您的镜像 registry 中,并将其添加到 v2v-vmware ConfigMap 中。

您可以使用虚拟机向导导入 VMware VM,然后更新虚拟机的网络名称。

6.9.4.1. 为 VDDK 镜像配置镜像 registry

您可以配置内部 OpenShift Container Platform 镜像 registry 或 VDDK 镜像的安全外部镜像 registry。

注意

在公共仓库中存储 VDDK 镜像可能会违反 VMware 许可证的条款。

6.9.4.1.1. 配置内部镜像 registry

您可以通过更新 Image Registry Operator 配置在裸机上配置内部 OpenShift Container Platform 镜像 registry。

6.9.4.1.1.1. 更改镜像 registry 的管理状态

要启动镜像 registry,需要把 Image Registry Operator 配置的 managementStateRemoved 改为 Managed

流程

  • ManagementState Image Registry Operator 配置从 Removed 改为 Managed。例如:

    $ oc patch configs.imageregistry.operator.openshift.io cluster --type merge --patch '{"spec":{"managementState":"Managed"}}'
6.9.4.1.1.2. 为裸机配置 registry 存储

作为集群管理员,在安装后需要配置 registry 来使用存储。

先决条件

  • 具有 Cluster Administrator 权限
  • 在裸机上有一个集群。
  • 为集群置备持久性存储,如 Red Hat OpenShift Container Storage。若要部署私有镜像 registry,您的存储必须提供 ReadWriteMany 访问模式。
  • 必须有“ 100Gi”容量。

流程

  1. 为了配置 registry 使用存储,需要修改 configs.imageregistry/cluster 资源中的 spec.storage.pvc

    注意

    当使用类似 NFS 的共享存储时,强烈建议使用 supplementalGroups 策略,即指明安全性上下文的允许补充组,而不是 fsGroup ID。详情请参考 NFS 组 ID 文档。

  2. 验证您没有 registry Pod:

    $ oc get pod -n openshift-image-registry
    注意
    • 如果存储类型为 emptyDIR,则副本数不能超过 1
    • 如果存储类型是 NFS,您必须启用 no_wdelayroot_squash 挂载选项。例如:

      # cat /etc/exports
      /mnt/data *(rw,sync,no_wdelay,root_squash,insecure,fsid=0)
      sh-4.3# exportfs -rv
      exporting *:/mnt/data
  3. 检查 registry 配置:

    $ oc edit configs.imageregistry.operator.openshift.io
    
    storage:
      pvc:
        claim:

    claim 字段留空以允许自动创建一个 image-registry-storage PVC。

  4. 检查 clusteroperator 的状态:

    $ oc get clusteroperator image-registry
6.9.4.1.2. 配置对内部镜像 registry 的访问

您可以通过一个路由公开 registry,直接从集群内部或外部访问 OpenShift Container Platform 内部 registry。

6.9.4.1.2.1. 直接从集群访问registry

您可以从集群内部访问registry。

流程

通过使用内部路由从集群访问registry:

  1. 使用节点地址来访问节点:

    $ oc get nodes
    $ oc debug nodes/<node_address>
  2. 要使用节点上的 ocpodman 等工具程序,请运行以下命令:

    sh-4.2# chroot /host
  3. 使用您的访问令牌登录到容器镜像registry:

    sh-4.4# oc login -u kubeadmin -p <password_from_install_log> https://api-int.<cluster_name>.<base_domain>:6443
    sh-4.4# podman login -u kubeadmin -p $(oc whoami -t) image-registry.openshift-image-registry.svc:5000

    您应该看到一条确认登录的消息,例如:

    Login Succeeded!
    注意

    用户名可以是任何值,令牌包含了所有必要的信息。如果用户名包含冒号,则会导致登录失败。

    因为 Image Registry Operator 创建了路由,所以它将与 default-route-openshift-image-registry.<cluster_name> 类似。

  4. 针对您的registry执行podman pullpodman push操作:

    重要

    您可以抓取任意镜像,但是如果已添加了system:registry角色,则只能将镜像推送到您自己的registry中。

    在以下示例中,使用:

    组件

    <registry_ip>

    172.30.124.220

    <port>

    5000

    <project>

    openshift

    <image>

    image

    <tag>

    忽略 (默认为 latest)

    1. 抓取任意镜像:

      $ podman pull name.io/image
    2. 使用 <registry_ip>:<port>/<project>/<image> 格式标记(tag)新镜像。项目名称必须出现在这个 pull 规范中,以供OpenShift Container Platform 把这个镜像正确放置在 registry 中,并在以后正确访问 registry 中的这个镜像:

      $ podman tag name.io/image image-registry.openshift-image-registry.svc:5000/openshift/image
      注意

      您必须具有指定项目的system:image-builder角色,该角色允许用户写或推送镜像。否则,下一步中的podman push将失败。为了进行测试,您可以创建一个新项目来推送镜像。

    3. 将新标记的镜像推送到registry:

      $ podman push image-registry.openshift-image-registry.svc:5000/openshift/image
6.9.4.1.2.2. 手动公开受保护的registry

通过使用路由可以开放从外部访问OpenShift Container Platform registry的通道,用户不再需要从集群内部登录到OpenShift Container Platform registry。您可以使用路由地址从集群以外登陆到 registry,并使用路由主机进行镜像的 tag 和 push 操作。

先决条件

  • 以下的先决条件会被自动执行:

    • 部署 Registry Operator。
    • 部署 Ingress Operator。

流程

您可以使用configs.imageregistry.operator.openshift.io资源中的DefaultRoute参数或使用自定义路由来公开路由。

使用DefaultRoute公开registry:

  1. DefaultRoute设置为True

    $ oc patch configs.imageregistry.operator.openshift.io/cluster --patch '{"spec":{"defaultRoute":true}}' --type=merge
  2. 使用Podman登录:

    $ HOST=$(oc get route default-route -n openshift-image-registry --template='{{ .spec.host }}')
    $ podman login -u $(oc whoami) -p $(oc whoami -t) --tls-verify=false $HOST 1
    1
    如果集群的默认路由证书不受信任,则需要--tls-verify=false 。您可以将一个自定义的可信证书设置为 Ingress Operator 的默认证书。

使用自定义路由公开registry:

  1. 使用路由的 TLS 密钥创建一个 secret:

    $ oc create secret tls public-route-tls \
        -n openshift-image-registry \
        --cert=</path/to/tls.crt> \
        --key=</path/to/tls.key>

    此步骤是可选的。如果不创建一个secret,则路由将使用Ingress Operator的默认TLS配置。

  2. 在 Registry Operator 中:

    spec:
      routes:
        - name: public-routes
          hostname: myregistry.mycorp.organization
          secretName: public-route-tls
    ...

    如果为registry的路由提供了一个自定义的 TLS 配置,则仅需设置secretName

6.9.4.1.3. 配置对外部镜像 registry 的访问

如果将外部镜像 registry 用于 VDDK 镜像,您可以将外部镜像 registry 的证书颁发机构添加到 OpenShift Container Platform 集群。

另外,您可以从 Docker 凭证中创建一个 pull secret,并将其添加到您的服务帐户中。

6.9.4.1.3.1. 在集群中添加证书颁发机构

您可以将证书颁发机构 (CA) 添加到集群,以便按照以下方法在推送和拉取镜像时使用。

先决条件

  • 您必须具有集群管理员特权。
  • 您必须有权访问 registry 的公共证书,通常是位于 /etc/docker/certs.d/ 目录中的 hostname/ca.crt 文件。

流程

  1. openshift-config 命名空间中创建一个 ConfigMap,其中包含使用自签名证书的 registry 的可信证书。对于每个 CA 文件,请确保 ConfigMap 中的键是 hostname[..port] 格式的 registry 主机名:

    $ oc create configmap registry-cas -n openshift-config \
    --from-file=myregistry.corp.com..5000=/etc/docker/certs.d/myregistry.corp.com:5000/ca.crt \
    --from-file=otherregistry.com=/etc/docker/certs.d/otherregistry.com/ca.crt
  2. 更新集群镜像配置:

    $ oc patch image.config.openshift.io/cluster --patch '{"spec":{"additionalTrustedCA":{"name":"registry-cas"}}}' --type=merge
6.9.4.1.3.2. 允许 Pod 引用其他安全 registry 中的镜像

Docker 客户端的 .dockercfg $HOME/.docker/config.json 文件是一个 Docker 凭证文件,如果您之前已登录安全或不安全的 registry,则该文件会保存您的身份验证信息。

要拉取(pull)并非来自 OpenShift Container Platform 内部 registry 的安全容器镜像,您必须从 Docker 凭证创建一个 pull secret,并将其添加到您的服务帐户。

流程

  • 如果您已有该安全 registry 的 .dockercfg 文件,则可运行以下命令从该文件中创建一个 secret:

    $ oc create secret generic <pull_secret_name> \
        --from-file=.dockercfg=<path/to/.dockercfg> \
        --type=kubernetes.io/dockercfg
  • 或者,如果您已有 $HOME/.docker/config.json 文件,则可运行以下命令:

    $ oc create secret generic <pull_secret_name> \
        --from-file=.dockerconfigjson=<path/to/.docker/config.json> \
        --type=kubernetes.io/dockerconfigjson
  • 如果您还没有安全 registry 的 Docker 凭证文件,则可运行以下命令创建一个 secret:

    $ oc create secret docker-registry <pull_secret_name> \
        --docker-server=<registry_server> \
        --docker-username=<user_name> \
        --docker-password=<password> \
        --docker-email=<email>
  • 要使用 secret 为 Pod 拉取(pull)镜像,您必须将该 secret 添加到您的服务帐户。本例中服务帐户的名称应与 Pod 所用服务帐户的名称匹配。default 是默认服务帐户:

    $ oc secrets link default <pull_secret_name> --for=pull
  • 要使用 secret 来推送(push)和拉取(pull)构建镜像,该 secret 必须可挂载至 Pod 中。您可通过运行以下命令实现这一目的:

    $ oc secrets link builder <pull_secret_name>

6.9.4.2. 创建并使用 VDDK 镜像

您可以下载 VMware Virtual Disk Development Kit(VDDK),构建 VDDK 镜像,并将 VDDK 镜像推送到您的镜像 registry。然后,将 VDDK 镜像添加到 v2v-vmware ConfigMap 中。

先决条件

  • 您必须有权访问 OpenShift Container Platform 内部镜像 registry 或安全的外部 registry。

流程

  1. 创建并导航到临时目录:

    $ mkdir /tmp/<dir_name> && cd /tmp/<dir_name>
  2. 在一个浏览器中,进入 VMware code 并点 SDKs
  3. Compute Virtualization 下,点 Virtual Disk Development Kit(VDDK)
  4. 选择最新的 VDDK 版本,点 Download,然后在临时目录中保存 VDDK 归档。
  5. 提取 VDDK 归档:

    $ tar -xzf VMware-vix-disklib-<version>.x86_64.tar.gz
  6. 创建 Dockerfile

    $ cat > Dockerfile <<EOF
    FROM busybox:latest
    COPY vmware-vix-disklib-distrib /vmware-vix-disklib-distrib
    RUN mkdir -p /opt
    ENTRYPOINT ["cp", "-r", "/vmware-vix-disklib-distrib", "/opt"]
    EOF
  7. 构建镜像:

    $ podman build . -t <registry_route_or_server_path>/vddk:<tag> 1
    1
    指定您的镜像 registry:
    • 对于内部 OpenShift Container Platform registry,请使用内部 registry 路由,如 image-registry.openshift-image-registry.svc:5000/openshift/vddk:<tag>
    • 对于外部 registry,指定服务器名称、路径和标签。例如 server.example.com:5000/vddk:<tag>
  8. 将镜像推送至 registry:

    $ podman push <registry_route_or_server_path>/vddk:<tag>
  9. 确保镜像可以被 OpenShift Container PlatformO 环境访问。
  10. 编辑 openshift-cnv 项目中的 v2v- vmware ConfigMap:

    $ oc edit configmap v2v-vmware -n openshift-cnv
  11. vddk-init-image 参数添加到 data 小节中:

    ...
    data:
      vddk-init-image: <registry_route_or_server_path>/vddk:<tag>

6.9.4.3. 使用虚拟机向导来导入 VMware 虚拟机或模板

您可以使用虚拟机向导来导入 VMware 虚拟机或模板。

先决条件

  • 您必须创建 VDDK 镜像,将其推送到一个镜像 registry,并将其添加到 v2v-vmware ConfigMap 中。
  • 导入磁盘必须有足够的存储空间。

    警告

    如果您尝试导入磁盘大小大于可用存储空间的虚拟机,则操作将无法完成。因为没有足够的资源来删除对象,您将无法导入另一个虚拟机或清除存储。要解决这种情况,您必须在存储后端中添加更多对象存储设备。

  • VMware 虚拟机必须关机。

流程

  1. 在容器原生虚拟化 web 控制台中,点击 WorkloadsVirtual Machines
  2. 点击 Create Virtual Machine 并选择 Import with Wizard
  3. General 屏幕中,执行以下步骤:

    1. Provider 列表中选择 VMware
    2. 选择 Connect to New Instance 或从 vCenter instance 列表中选择保存的 vCenter 实例。

      • 如果您选择 Connect to New Instance,请填写 vCenter hostnameUsernamePassword
      • 如果您选择了一个保存的 vCenter 实例,向导将使用保存的凭证连接到 vCenter 实例。
    3. VM or Template to Import 列表中选择要导入的虚拟机或模板。
    4. 选择操作系统。
    5. Flavor 列表中选择现有类别或 Custom

      如果您选择 Custom,请指定 Memory (GB)CPUs

    6. 选择 Workload Profile
    7. 如果虚拟机名称已经在命名空间中被另一个虚拟机使用,请更新该名称。
    8. Next
  4. Networking 屏幕中,执行以下步骤:

    1. 点击网络接口 kebab 的 Options 菜单并选择 Edit
    2. 输入一个有效的网络接口名称。

      名称可包含小写字母 (a-z)、数字 (0-9) 和连字符 (-),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格、句点 (.) 或特殊字符。

    3. 选择网络接口型号。
    4. 选择网络定义。
    5. 选择网络接口类型。
    6. 输入 MAC 地址。
    7. 点击 Save,然后点击 Next
  5. Storage 屏幕中,执行以下步骤:

    1. 点击磁盘 kebab 的 Options 菜单并选择 Edit
    2. 输入有效名称。

      名称可包含小写字母 (a-z)、数字 (0-9) 和连字符 (-),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格、句点 (.) 或特殊字符。

    3. 选择接口类型。
    4. 选择存储类。

      如果您没有选择存储类,容器原生虚拟化将使用默认存储类来创建虚拟机。

    5. 点击 Save,然后点击 Next
  6. Advanced 屏幕中,如果您使用 cloud-init,请输入 HostnameAuthorized SSH Keys
  7. Next
  8. 检查您的设置并点击 Create Virtual Machine

    此时会显示 Successfully created virtual machine 消息以及为虚拟机创建的资源列表。关闭电源的虚拟机会出现在 WorkloadsVirtual Machines 中。

  9. 点击 See virtual machine details 查看导入的虚拟机的仪表板。

    如果发生错误,请执行以下步骤:

    1. 点击 WorkloadsPods
    2. 点击 Conversion Pod,例如 kubevirt-v2v-conversion-rhel7-mini-1-27b9h
    3. 点击 Logs 并检查错误消息。

有关向导字段的详情,请参考虚拟机向导字段部分。

6.9.4.4. 更新导入的 VMware 虚拟机的 NIC 名称

您必须更新从 VMware 导入的虚拟机的 NIC 名称,以符合容器原生虚拟化命名约定。

流程

  1. 登录虚拟机。
  2. 进入 /etc/sysconfig/network-scripts 目录。
  3. 将网络配置文件名称改为 ifcfg-eth0

    $ mv vmnic0 ifcfg-eth0 1
    1
    额外网络配置文件按顺序编号,例如:ifcfg-eth1ifcfg-eth2
  4. 更新网络配置文件中的 NAMEDEVICE 参数:

    NAME=eth0
    DEVICE=eth0
  5. 重启网络:

    $ systemctl restart network

6.9.4.5. 导入 VMware 虚拟机的故障排除

如果导入的虚拟机的状态是 Import error: (VMware),您可以检查 Conversion Pod 日志中的错误:

  1. 获取 Conversion Pod 名称:

    $ oc get pods -n <project> | grep v2v 1
    kubevirt-v2v-conversion-f66f7d-zqkz7            1/1     Running     0          4h49m
    1
    指定导入的虚拟机的项目。
  2. 获取 Conversion Pod 日志:

    $ oc logs kubevirt-v2v-conversion-f66f7d-zqkz7 -f -n <project>
6.9.4.5.1. 错误信息
  • 如果导入的虚拟机事件显示出错信息 Readiness probe failed,以下错误信息会出现在 Conversion Pod 的日志中:

    INFO - have error: ('virt-v2v error: internal error: invalid argument: libvirt domain ‘v2v_migration_vm_1’ is running or paused. It must be shut down in order to perform virt-v2v conversion',)"

    您必须确保在导入虚拟机前关闭该虚拟机。

6.9.4.5.2. 已知问题
  • 您的 OpenShift Container Platform 环境中必须为导入的磁盘有足够的存储空间。

    如果您尝试导入磁盘大小大于可用存储空间的虚拟机,则操作将无法完成。因为没有足够的资源来删除对象,您将无法导入另一个虚拟机或清除存储。要解决这种情况,您必须在存储后端中添加更多对象存储设备。(BZ#1721504)

  • 如果将 NFS 后端存储用于附加到 Conversion Pod 的 2 GB 磁盘,您必须 配置 hostPath 卷(BZ#1814611)

6.9.4.6. 虚拟机向导字段

6.9.4.6.1. 虚拟机向导字段
名称参数描述

Template

 

从中创建虚拟机的模板。选择一个模板将自动填写其他字段。

Source

PXE

从 PXE 菜单置备虚拟机。集群中需要支持 PXE 的 NIC。

URL

从由 HTTPS3 端点提供的镜像置备虚拟机。

Container

从可通过集群访问的注册表中的可启动操作系统容器置备虚拟机。示例:kubevirt/cirros-registry-disk-demo

Disk

从一个磁盘置备虚拟机。

Attach Disk

 

附加之前已克隆或创建并在 PersistentVolumeClaims 中提供的现有磁盘。选择这个选项后,您必须手动输入Operating SystemFlavorWorkload Profile 字段中的内容。

Operating System

 

这是为虚拟机选择的主要操作系统。

Flavor

small、medium、large、tiny、Custom

预设值,用于决定分配给虚拟机的 CPU 和内存量。显示的 Flavor 的预设置值是根据操作系统决定的。

Workload Profile

high performance

针对高性能负载进行了优化的虚拟机配置。

Server

针对运行服务器工作负载进行优化的配置集。

Desktop

用于桌面的虚拟机配置。

名称

 

名称可包含小写字母 (a-z)、数字 (0-9) 和连字符 (-),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格、句点 (.) 或特殊字符。

描述

 

可选的描述字段。

Start virtual machine on creation

 

选择此项可在创建时自动启动虚拟机。

6.9.4.6.2. Cloud-init 字段
名称描述

Hostname

为虚拟机设置具体主机名。

Authenticated SSH Keys

复制到虚拟机上 ~/.ssh/authorized_keys 的用户公钥。

Use custom script

将其他选项替换为您粘贴自定义 cloud-init 脚本的字段。

6.9.4.6.3. 网络字段
名称描述

名称

网络接口卡的名称

Model

网络接口卡的驱动或网络接口卡的型号。

网络

可用 NetworkAttachmentDefinition 对象列表。

类型

可用绑定方法列表。对于默认的 Pod 网络,masquerade 是唯一推荐的绑定方法。对于辅助网络,请使用 bridge 绑定方法。非默认网络不支持 masquerade 绑定方法。

MAC 地址

网络接口卡的 MAC 地址。如果未指定 MAC 地址,将为会话生成一个临时地址。

6.9.4.6.4. 存储字段
名称描述

Source

为虚拟机选择一个空白磁盘,或者从可用的选项中选择: PXEContainerURLDisk。要选择现有磁盘并将其附加到虚拟机,请从可用 PersistentVolumeClaims (PVC) 列表中选择 Attach Disk ,或者从克隆的磁盘中选择。

名称

磁盘的名称。名称可包含小写字母 (a-z)、数字 (0-9)、连字符 (-) 和句点 (.),最多 253 个字符。第一个和最后一个字符必须为字母数字。名称不得包含大写字母、空格或特殊字符。

SIZE (GB)

磁盘大小(以 GB 为单位)。

Interface

接口的名称。

Storage class

底层 StorageClass 的名称。