From e0c29cda724313f0d06227d3e97bdd1c7c480c19 Mon Sep 17 00:00:00 2001 From: Moath Qasim Date: Tue, 28 Jan 2025 09:31:01 +0100 Subject: [PATCH] Support kubevirt evection strategy in kv provider (#1897) * support evictStrategy in VMs Signed-off-by: moadqassem Signed-off-by: moadqassem * add tests Signed-off-by: moadqassem Signed-off-by: moadqassem --------- Signed-off-by: moadqassem --- .../provider/kubevirt/provider.go | 15 ++++ .../provider/kubevirt/provider_test.go | 8 ++ .../eviction-strategy-live-migrate.yaml | 80 +++++++++++++++++++ .../provider/kubevirt/types/types.go | 1 + 4 files changed, 104 insertions(+) create mode 100644 pkg/cloudprovider/provider/kubevirt/testdata/eviction-strategy-live-migrate.yaml diff --git a/pkg/cloudprovider/provider/kubevirt/provider.go b/pkg/cloudprovider/provider/kubevirt/provider.go index 8f1e35d98..dbcb0dc8c 100644 --- a/pkg/cloudprovider/provider/kubevirt/provider.go +++ b/pkg/cloudprovider/provider/kubevirt/provider.go @@ -117,6 +117,7 @@ type Config struct { ExtraHeaders []string ExtraHeadersSecretRef string DataVolumeSecretRef string + EvictionStrategy kubevirtv1.EvictionStrategy ProviderNetworkName string SubnetName string @@ -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 } @@ -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 } @@ -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 diff --git a/pkg/cloudprovider/provider/kubevirt/provider_test.go b/pkg/cloudprovider/provider/kubevirt/provider_test.go index 49b5b1a5d..4651889d5 100644 --- a/pkg/cloudprovider/provider/kubevirt/provider_test.go +++ b/pkg/cloudprovider/provider/kubevirt/provider_test.go @@ -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 { @@ -104,6 +105,9 @@ func (k kubevirtProviderSpecConf) rawProviderSpec(t *testing.T) []byte { }, {{- end }} "virtualMachine": { + {{- if .EvictStrategy }} + "evictionStrategy": "LiveMigrate", + {{- end }} {{- if .ProviderNetwork }} "providerNetwork": { "name": "kubeovn", @@ -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) { diff --git a/pkg/cloudprovider/provider/kubevirt/testdata/eviction-strategy-live-migrate.yaml b/pkg/cloudprovider/provider/kubevirt/testdata/eviction-strategy-live-migrate.yaml new file mode 100644 index 000000000..709d0f4ac --- /dev/null +++ b/pkg/cloudprovider/provider/kubevirt/testdata/eviction-strategy-live-migrate.yaml @@ -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 diff --git a/pkg/cloudprovider/provider/kubevirt/types/types.go b/pkg/cloudprovider/provider/kubevirt/types/types.go index e86c8c4e8..79e7100fc 100644 --- a/pkg/cloudprovider/provider/kubevirt/types/types.go +++ b/pkg/cloudprovider/provider/kubevirt/types/types.go @@ -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.