vSphere Policies
vSphere Policies provide a declarative way to manage compute policies, tags, and operational constraints for virtual machines running in a vSphere environment. These policies are part of the vsphere.policy.vmware.com API group and integrate with VM Operator to enable policy-driven VM management.
Overview
The vSphere Policy APIs introduce three main resource types:
- ComputePolicy: Defines compute-related policies for workloads
- TagPolicy: Defines vSphere tags to be applied to workloads
- PolicyEvaluation: Evaluates which policies should apply to a workload
These resources work together to provide flexible, declarative policy management that can be applied either explicitly or automatically based on matching criteria.
ComputePolicy
A ComputePolicy resource defines compute-related policies that control various aspects of VM behavior, placement, and resource allocation in vSphere.
Specification
apiVersion: vsphere.policy.vmware.com/v1alpha1
kind: ComputePolicy
metadata:
name: production-policy
namespace: my-namespace
spec:
description: "Production workload policy"
policyID: "vsphere-policy-123" # Optional vSphere policy ID
enforcementMode: Mandatory # Or Optional
match:
workload:
labels:
- key: tier
operator: In
values:
- production
kind: VirtualMachine
tags:
- production-tag-policy
Enforcement Modes
ComputePolicy resources support two enforcement modes:
Mandatory Policies
- Automatically applied to all matching workloads in the namespace
- Cannot be overridden or removed by users
- Applied based on the
matchcriteria - If no
matchis specified, applies to all workloads in the namespace
Optional Policies
- Must be explicitly referenced in a VM's
spec.policiesfield - Users can choose whether to apply these policies
- Provide flexibility for workload-specific requirements
Match Specifications
The match field allows sophisticated matching based on:
Workload Properties
- Labels: Match based on workload labels using label selector requirements
- Kind: Filter by workload type (
PodorVirtualMachine) - Guest OS: Match based on guest ID or guest family
Image Properties
- Name: Match based on image name patterns
- Labels: Match based on image labels
Boolean Operations
- And: All conditions must match (default)
- Or: At least one condition must match
Example of complex matching:
spec:
match:
op: Or
match:
- workload:
labels:
- key: tier
operator: In
values: [production]
- image:
name:
op: HasPrefix
value: "production-"
TagPolicy
A TagPolicy resource defines vSphere tags that should be applied to workloads. These are typically referenced by ComputePolicy objects.
Specification
apiVersion: vsphere.policy.vmware.com/v1alpha1
kind: TagPolicy
metadata:
name: production-tag-policy
namespace: my-namespace
spec:
tags:
- "urn:vmomi:InventoryServiceTag:12345678-1234-1234-1234-123456789abc:GLOBAL"
- "urn:vmomi:InventoryServiceTag:87654321-4321-4321-4321-cba987654321:GLOBAL"
Tags are specified as UUIDs that correspond to tags configured in vSphere. When a ComputePolicy references a TagPolicy, the tags are applied to activate the policy on the workload.
PolicyEvaluation
A PolicyEvaluation resource is used to evaluate which policies should apply to a theoretical workload configuration. This is useful for testing and validation before actually creating VMs.
Specification
apiVersion: vsphere.policy.vmware.com/v1alpha1
kind: PolicyEvaluation
metadata:
name: test-evaluation
namespace: my-namespace
spec:
workload:
labels:
tier: production
guest:
guestID: ubuntu64Guest
guestFamily: Linux
image:
name: ubuntu-22.04
labels:
os: ubuntu
policies:
- apiVersion: vsphere.policy.vmware.com/v1alpha1
kind: ComputePolicy
name: specific-policy
Status
After evaluation, the status will contain the list of policies that would apply:
status:
policies:
- apiVersion: vsphere.policy.vmware.com/v1alpha1
kind: ComputePolicy
name: production-policy
observedGeneration: 2
tags:
- "urn:vmomi:InventoryServiceTag:12345678-1234-1234-1234-123456789abc:GLOBAL"
- apiVersion: vsphere.policy.vmware.com/v1alpha1
kind: ComputePolicy
name: namespace-default
observedGeneration: 1
conditions:
- type: Ready
status: "True"
Applying Policies to VirtualMachines
Explicit Application
Optional policies can be explicitly applied to a VM using the spec.policies field:
apiVersion: vmoperator.vmware.com/v1alpha5
kind: VirtualMachine
metadata:
name: my-vm
namespace: my-namespace
spec:
className: my-vm-class
imageName: ubuntu-22.04
storageClass: my-storage-class
policies:
- apiVersion: vsphere.policy.vmware.com/v1alpha1
kind: ComputePolicy
name: performance-policy
- apiVersion: vsphere.policy.vmware.com/v1alpha1
kind: ComputePolicy
name: compliance-policy
Automatic Application
Mandatory policies are automatically applied based on their match criteria. The VM's status will reflect all applied policies:
status:
policies:
- apiVersion: vsphere.policy.vmware.com/v1alpha1
kind: ComputePolicy
name: performance-policy
generation: 3
- apiVersion: vsphere.policy.vmware.com/v1alpha1
kind: ComputePolicy
name: compliance-policy
generation: 1
- apiVersion: vsphere.policy.vmware.com/v1alpha1
kind: ComputePolicy
name: namespace-mandatory-policy
generation: 2
The generation field indicates which version of the policy was applied, helping track when policies need to be re-evaluated.
Match Operations
The policy matching system supports various string and pattern matching operations:
| Operation | Description | Example |
|---|---|---|
Equal |
Exact match | value: "production" |
NotEqual |
Does not match | value: "development" |
HasPrefix |
Starts with | value: "prod-" |
NotHasPrefix |
Does not start with | value: "test-" |
HasSuffix |
Ends with | value: "-prod" |
NotHasSuffix |
Does not end with | value: "-test" |
Contains |
Contains substring | value: "production" |
NotContains |
Does not contain | value: "test" |
Match |
Regex match | value: "^prod-.*-v[0-9]+$" |
NotMatch |
Does not match regex | value: "^test-.*" |
Guest Family Types
When matching based on guest operating system family, the following values are supported:
Darwin: macOS guestsLinux: Linux-based guestsNetware: NetWare guestsOther: Other guest typesSolaris: Solaris guestsWindows: Windows guests
Best Practices
Policy Naming
- Use descriptive names that indicate the policy's purpose
- Include environment or tier indicators (e.g.,
production-compute-policy) - Be consistent with naming conventions across namespaces
Match Criteria
- Keep match criteria as specific as needed but not overly complex
- Use labels for flexible, user-controllable matching
- Use image and guest properties for system-enforced matching
Enforcement Modes
- Use mandatory policies for namespace-wide requirements
- Use optional policies for workload-specific optimizations
- Document which policies are available and their purposes
Policy Updates
- Monitor the
generationfield in VM status to track policy versions - Test policy changes with PolicyEvaluation before applying
- Consider the impact on existing VMs when updating policies
Troubleshooting
Policies Not Applied
- Check the policy's
enforcementMode- optional policies need explicit reference - Verify match criteria using a PolicyEvaluation resource
- Ensure the policy exists in the same namespace as the VM
Policy Conflicts
- Review all mandatory policies in the namespace
- Check for overlapping match criteria
- Use PolicyEvaluation to test combinations
Tag Activation
- Verify TagPolicy resources contain valid vSphere tag UUIDs
- Ensure referenced TagPolicy resources exist
- Check vSphere permissions for tag application