Skip to content

Commit

Permalink
Support kubevirt evection strategy in kv provider (#1897)
Browse files Browse the repository at this point in the history
* support evictStrategy in VMs
Signed-off-by: moadqassem <[email protected]>

Signed-off-by: moadqassem <[email protected]>

* add tests
Signed-off-by: moadqassem <[email protected]>

Signed-off-by: moadqassem <[email protected]>

---------

Signed-off-by: moadqassem <[email protected]>
  • Loading branch information
moadqassem authored Jan 28, 2025
1 parent cb06308 commit e0c29cd
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 0 deletions.
15 changes: 15 additions & 0 deletions pkg/cloudprovider/provider/kubevirt/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ type Config struct {
ExtraHeaders []string
ExtraHeadersSecretRef string
DataVolumeSecretRef string
EvictionStrategy kubevirtv1.EvictionStrategy

ProviderNetworkName string
SubnetName string
Expand Down Expand Up @@ -366,6 +367,10 @@ func (p *provider) getConfig(provSpec clusterv1alpha1.ProviderSpec) (*Config, *p
}
}

if rawConfig.VirtualMachine.EvictionStrategy != "" {
config.EvictionStrategy = kubevirtv1.EvictionStrategy(rawConfig.VirtualMachine.EvictionStrategy)
}

return &config, pconfig, nil
}

Expand Down Expand Up @@ -635,6 +640,13 @@ func (p *provider) Validate(ctx context.Context, _ *zap.SugaredLogger, spec clus
return fmt.Errorf("failed to request VirtualMachineInstances: %w", err)
}

if c.EvictionStrategy != "" {
if c.EvictionStrategy != kubevirtv1.EvictionStrategyExternal &&
c.EvictionStrategy != kubevirtv1.EvictionStrategyLiveMigrate {
return fmt.Errorf("unsupported vm eviction strategy: %s", c.EvictionStrategy)
}
}

return nil
}

Expand Down Expand Up @@ -729,6 +741,9 @@ func (p *provider) newVirtualMachine(c *Config, pc *providerconfigtypes.Config,
terminationGracePeriodSeconds := int64(30)

evictionStrategy := kubevirtv1.EvictionStrategyExternal
if c.EvictionStrategy != "" {
evictionStrategy = c.EvictionStrategy
}

resourceRequirements := kubevirtv1.ResourceRequirements{}
labels["kubevirt.io/vm"] = machine.Name
Expand Down
8 changes: 8 additions & 0 deletions pkg/cloudprovider/provider/kubevirt/provider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ type kubevirtProviderSpecConf struct {
PullMethod cdiv1beta1.RegistryPullMethod
ProviderNetwork *types.ProviderNetwork
ExtraHeadersSet bool
EvictStrategy string
}

func (k kubevirtProviderSpecConf) rawProviderSpec(t *testing.T) []byte {
Expand Down Expand Up @@ -104,6 +105,9 @@ func (k kubevirtProviderSpecConf) rawProviderSpec(t *testing.T) []byte {
},
{{- end }}
"virtualMachine": {
{{- if .EvictStrategy }}
"evictionStrategy": "LiveMigrate",
{{- end }}
{{- if .ProviderNetwork }}
"providerNetwork": {
"name": "kubeovn",
Expand Down Expand Up @@ -275,6 +279,10 @@ func TestNewVirtualMachine(t *testing.T) {
name: "pvc-image-source",
specConf: kubevirtProviderSpecConf{OsImageSource: pvcSource, OsImageDV: "ns/dvname"},
},
{
name: "eviction-strategy-live-migrate",
specConf: kubevirtProviderSpecConf{EvictStrategy: "LiveMigrate"},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
annotations:
labels:
cluster.x-k8s.io/cluster-name: cluster-name
cluster.x-k8s.io/role: worker
kubevirt.io/vm: eviction-strategy-live-migrate
md: md-name
name: eviction-strategy-live-migrate
namespace: test-namespace
spec:
dataVolumeTemplates:
- metadata:
name: eviction-strategy-live-migrate
spec:
storage:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: longhorn
source:
http:
url: http://x.y.z.t/ubuntu.img
runStrategy: Once
template:
metadata:
creationTimestamp: null
annotations:
"kubevirt.io/allow-pod-bridge-network-live-migration": "true"
"ovn.kubernetes.io/allow_live_migration": "true"
labels:
cluster.x-k8s.io/cluster-name: cluster-name
cluster.x-k8s.io/role: worker
kubevirt.io/vm: eviction-strategy-live-migrate
md: md-name
spec:
affinity: {}
domain:
devices:
disks:
- disk:
bus: virtio
name: datavolumedisk
- disk:
bus: virtio
name: cloudinitdisk
interfaces:
- name: default
bridge: {}
networkInterfaceMultiqueue: true
resources:
limits:
cpu: "2"
memory: 2Gi
requests:
cpu: "2"
memory: 2Gi
networks:
- name: default
pod: {}
terminationGracePeriodSeconds: 30
topologyspreadconstraints:
- maxskew: 1
topologykey: kubernetes.io/hostname
whenunsatisfiable: ScheduleAnyway
labelselector:
matchlabels:
md: md-name
volumes:
- dataVolume:
name: eviction-strategy-live-migrate
name: datavolumedisk
- cloudInitNoCloud:
secretRef:
name: udsn
name: cloudinitdisk
evictionStrategy: LiveMigrate
1 change: 1 addition & 0 deletions pkg/cloudprovider/provider/kubevirt/types/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ type VirtualMachine struct {
Location *Location `json:"location,omitempty"`
ProviderNetwork *ProviderNetwork `json:"providerNetwork,omitempty"`
EnableNetworkMultiQueue providerconfigtypes.ConfigVarBool `json:"enableNetworkMultiQueue,omitempty"`
EvictionStrategy string `json:"evictionStrategy,omitempty"`
}

// Flavor.
Expand Down

0 comments on commit e0c29cd

Please sign in to comment.