正如上一篇vSphere 7.0U2a支持主管集群使用Kubernetes 管理虚拟机所说,vSphere with Tanzu 提供虚拟机服务功能,因此,除了容器,DevOps 工程师还可以在通用的共享 Kubernetes 环境中部署并运行虚拟机。容器和虚拟机共享相同的主管命名空间资源,并且可以通过单个 vSphere with Tanzu 界面进行管理。

V记官方看来,虚拟机服务解决了 DevOps 团队的以下需求:

  • 使用 Kubernetes,但基于虚拟机的现有工作负载无法轻松容器化。
  • 有助于用户减少同时管理非 Kubernetes 平台和容器平台的开销。

vSphere with Tanzu 平台与虚拟机使用场景

在 Kubernetes 平台上运行容器和虚拟机时,DevOps 团队可以将其使用的工作负载整合到一个平台上。

容器中启动vsftd vsphere 容器_vsphere


不同于由vSphere创建的虚拟机,通过虚拟机服务部署的每个虚拟机都作为运行所有组件(包括自己的操作系统)的完整计算机运行在 vSphere with Tanzu 基础架构之上。虚拟机可以访问主管集群提供的网络和存储,并且使用标准 Kubernetes kubectl 命令进行管理。虚拟机作为完全隔离的系统运行,不受 Kubernetes 环境中其他虚拟机或工作负载的干扰。

在考虑业务需求和目标的时候。以下几个场景是推荐使用虚拟机的:

  • 应用程序无法容器化。
  • 具有项目的特定硬件要求。
  • 应用程序专为自定义内核或自定义操作系统而设计。
  • 应用程序更适用于在虚拟机中运行。
  • 甲方希望具有一致的 Kubernetes 体验并避免开销。基础架构部门或Devops团队不必为非 Kubernetes平台和容器平台运行一组单独的基础架构,而是可以整合这些堆栈并使用熟悉的 kubectl 命令进行管理。

vSphere With Tanzu中的虚拟机服务

在 Kubernetes 平台上运行虚拟机服务,需要描述要在主管命名空间中部署的虚拟机的状态,可以使用诸如虚拟机类、虚拟机映像和存储类等参数。然后,虚拟机服务将这些规范汇集在一起,创建独立集群或支持 Tanzu Kubernetes 集群的虚拟机。

容器中启动vsftd vsphere 容器_基础架构_02

VM 服务

虚拟机服务是 vSphere with Tanzu 的一个组件,用来生成虚拟机。可提供声明式 Kubernetes 式 API,用于管理虚拟机和关联的 vSphere 资源。

虚拟机服务使 vSphere 管理员可以交付资源,并为 Kubernetes 提供虚拟机类和虚拟机映像等模板。

DevOps 工程师可以使用这些资源描述虚拟机的所需状态。DevOps 工程师指定虚拟机状态后,虚拟机服务会依据备用基础架构资源将所需状态转换为实际状态。

对于通过虚拟机服务创建的虚拟机,只能从 Kubernetes 命名空间使用 kubectl 命令进行管理。vSphere 管理员无法从 vSphere Client 管理虚拟机,但可以显示其详细信息并监控其使用的资源。

安装好vSphere with Tanzau后,可以在工作负载管理下看到多了一个Service选项,在这下面现在只有一个VM服务

容器中启动vsftd vsphere 容器_vsphere_03

VM 类

虚拟机类是虚拟机规范,可用于为虚拟机请求一组资源。虚拟机类由 vSphere 管理员控制和管理,并可定义虚拟 CPU 数量、内存容量和预留设置等参数。定义的参数由主管集群的底层基础架构资源提供支持和保证。

系统的工作负载管理提供了几个默认虚拟机类。
示例:


CPU

内存 (GB)

预留的 CPU 和内存

guaranteed-large

4

16


best-effort-large

4

16


guaranteed-small

2

4


best-effort-small

2

4


点击上图的VM Service->MANAGE->VM Classes

容器中启动vsftd vsphere 容器_命名空间_04

通常,每个默认类的类型都有两个版本:保证和最大努力。
保证版本(100%Reservation)会完全预留虚拟机规范请求的资源。最大努力类版本则不然,它允许超额分配资源。
通常,在生产环境中推荐使用保证类型

除此之外,vSphere 管理员可以创建自定义虚拟机类。

我们在实验中添加一个自己定义的VM类:

容器中启动vsftd vsphere 容器_tanzu_05


在 Kubernetes 端,虚拟机类显示为 VirtualMachineClassVirtualMachineClassBinding 资源。

虚拟机映像

虚拟机映像是一个包含软件配置(包括操作系统、应用程序和数据)的模板。
DevOps 工程师创建虚拟机时,可以从与命名空间关联的内容库中选择映像。
对于 DevOps,映像将公开为 *VirtualMachineImage *对象。

虚拟机服务支持数量有限的虚拟机映像和客户机操作系统。兼容的虚拟机映像在 VMware Marketplace 中显示为 OVF。确保仅使用虚拟机服务支持的虚拟机映像。要查找兼容的映像,请在 VMware Cloud Marketplace 网站上搜索虚拟机服务映像。

导航到V记应用市场,选CentOS试试:

容器中启动vsftd vsphere 容器_vsphere_06


FREE!

太好了

赶紧login,尴尬了

容器中启动vsftd vsphere 容器_容器中启动vsftd_07


说好的FREE呢?

没有image怎么办呢?想起来在做负载管理准备的时候,导入内容库的Tanzu Cluster的VM镜像,也是基于Linux的,百分百通过V记认证的,用这个试试吧

容器中启动vsftd vsphere 容器_命名空间_08

内容源

DevOps 工程师使用内容库作为映像源来创建虚拟机。与虚拟机类类似,vSphere 管理员可以将现有内容库分配给命名空间,使其可供 DevOps 工程师使用。

存储类

虚拟机服务使用存储类来放置虚拟磁盘和动态附加持久卷。

[root@localhost yaml]# kubectl get sc
NAME           PROVISIONER              RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
tanzu-policy   csi.vsphere.vmware.com   Delete          Immediate           true                   4h26m

虚拟机规范

DevOps 工程师在 YAML 文件中描述了虚拟机的所需状态,此状态汇集了虚拟机映像、虚拟机类和存储类。

网络

虚拟机服务没有任何特定要求,它依赖于 vSphere with Tanzu 中提供的网络。虚拟机服务支持两种类型的网络,即 vSphere 网络和 NSX-T。
部署虚拟机时,可用网络提供程序会为虚拟机分配静态 IP 地址。
我们的环境使用NSX-T。

置备和部署虚拟机

官方针对vSphere管理员和Devops工程师分别给出置备工作流。

vSphere 管理员置备虚拟机的工作流

  • 1 创建和管理虚拟机类。
  • 2 将一组虚拟机类与命名空间相关联。
    在Namespace里选择VM Sercice,点击Manage VM Classes
  • 容器中启动vsftd vsphere 容器_基础架构_09

  • 选择需要的类。我们在此选择了Tiny和guaranteed-small
  • 3 创建和管理内容库。
  • 4 将内容库与命名空间相关联。
    在Namespace里选择VM Sercice,点击Manage Content Libraries
  • 容器中启动vsftd vsphere 容器_基础架构_10

  • 5 将存储类与命名空间关联。
  • 容器中启动vsftd vsphere 容器_容器中启动vsftd_11

  • 6 监控部署的虚拟机。
    这一步是在Devops完成VM部署后,可以在vCenter上面监控的。

DevOps 工程师置备虚拟机的工作流

具有权限的 DevOps 工程师可以检查可用的虚拟机资源,以及将虚拟机部署到命名空间中。
可以使用 kubectl 命令执行以下任务。

  • 1 列出与命名空间关联的虚拟机类、映像和其他资源。
    我们化身Devops工程师,登录到工作负载平台
oot@localhost Downloads]# kubectl-vsphere login --server=https://172.80.88.1 --vsphere-username administrator@vsphere.local --insecure-ski p-tls-verify

KUBECTL_VSPHERE_PASSWORD environment variable is not set. Please enter the password below
Password:
Logged in successfully.

You have access to the following contexts:
   172.80.88.1
   ns-dev

If the context you wish to use is not in this list, you may need to try
logging in again later, or contact your cluster administrator.

To change context, use `kubectl config use-context <workload name>`

查看系统参数:

oot@localhost yaml]# kubectl get virtualmachineclassbindings
NAME               VIRTUALMACHINECLASS   AGE
guaranteed-small   guaranteed-small      4h54m
tiny               tiny                  4h54m
[root@localhost yaml]# kubectl get virtualmachineimages.vmoperator.vmware.com
NAME                VERSION                          OSTYPE                FORMAT   AGE
photon-ova-1.19.7   v1.19.7+vmware.1-tkg.2.f52f85a   vmwarePhoton64Guest   ovf      109m
[root@localhost yaml]# kubectl get sc
NAME           PROVISIONER              RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
tanzu-policy   csi.vsphere.vmware.com   Delete          Immediate           true                   4h56m
[root@localhost yaml]# kubectl get resourcequotas
NAME                  AGE     REQUEST                                                                            LIMIT
ns-dev-storagequota   4h57m   tanzu-policy.storageclass.storage.k8s.io/requests.storage: 0/9223372036854775807
nd: VirtualMachine
metadata:
  name: vmsvc-test-vm
  namespace: ns-dev
spec:
  imageName: photon-ova-1.19.7
  className: tiny
  powerState: poweredOn
  storageClass: tanzu-policy
  networkInterfaces:
  - networkType: nsx-t

我们选用了tiny类和photon-ova-1.19.7镜像,网络和容器网络一致,利用nsx-t自动配置。

oot@localhost yaml]# kubectl apply -f vmtest.yaml
virtualmachine.vmoperator.vmware.com/vmsvc-test-vm created
[root@localhost yaml]# kubectl get vm -owide
NAME            POWERSTATE   CLASS   IMAGE               AGE
vmsvc-test-vm                tiny    photon-ova-1.19.7   2m1s

需要等待几分钟

oot@localhost yaml]# kubectl get vm -owide
NAME            POWERSTATE   CLASS   IMAGE               AGE
vmsvc-test-vm   poweredOn    tiny    photon-ova-1.19.7   6m34s

虚机已经建好了。

在vCenter上面看看:

容器中启动vsftd vsphere 容器_基础架构_12


可以看到该vm的信息,不过,web console等可以配置的入口都是灰色的。

Devops工程师也可以利用kubectl命令查看vm的具体信息

[root@localhost yaml]# kubectl describe vm vmsvc-test-vm
Name:         vmsvc-test-vm
Namespace:    ns-dev
Labels:       <none>
Annotations:  <none>
API Version:  vmoperator.vmware.com/v1alpha1
Kind:         VirtualMachine
Metadata:
  Creation Timestamp:  2021-05-25T07:29:41Z
  Finalizers:
    virtualmachine.vmoperator.vmware.com
  Generation:  1
  Managed Fields:
    API Version:  vmoperator.vmware.com/v1alpha1
    Fields Type:  FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .:
          f:kubectl.kubernetes.io/last-applied-configuration:
      f:spec:
        .:
        f:className:
        f:imageName:
        f:networkInterfaces:
        f:powerState:
        f:storageClass:
    Manager:      kubectl-client-side-apply
    Operation:    Update
    Time:         2021-05-25T07:29:41Z
    API Version:  vmoperator.vmware.com/v1alpha1
    Fields Type:  FieldsV1
    fieldsV1:
      f:metadata:
        f:finalizers:
      f:status:
        .:
        f:biosUUID:
        f:changeBlockTracking:
        f:conditions:
        f:host:
        f:instanceUUID:
        f:phase:
        f:powerState:
        f:uniqueID:
        f:vmIp:
    Manager:         manager
    Operation:       Update
    Time:            2021-05-25T07:34:55Z
  Resource Version:  159425
  Self Link:         /apis/vmoperator.vmware.com/v1alpha1/namespaces/ns-dev/virtualmachines/vmsvc-test-vm
  UID:               5c9b845f-69f0-441e-8468-7114b35d63f9
Spec:
  Class Name:  tiny
  Image Name:  photon-ova-1.19.7
  Network Interfaces:
    Network Type:  nsx-t
  Power State:     poweredOn
  Storage Class:   tanzu-policy
Status:
  Bios UUID:              42323392-9bc7-81e3-47b4-0ccf3a4d274a
  Change Block Tracking:  false
  Conditions:
    Last Transition Time:  2021-05-25T07:29:42Z
    Status:                True
    Type:                  VirtualMachinePrereqReady
  Host:                    esx-01a.corp.tanzu
  Instance UUID:           5032a75e-93ad-ed5e-4aa4-16dc59f949da
  Phase:                   Created
  Power State:             poweredOn
  Unique ID:               vm-85
  Vm Ip:                   172.211.0.34
Events:                    <none>

在vSphere with Tanzu平台上的VM就建好了,它和vSphere POD有同段的IP地址和该平台全局访问权限。

以上。