kubernetes/kops · error
found VMSS without properties
Error message
found VMSS without properties
What it means
Find requires the VMSS model to carry a non-nil Properties block; without it kops cannot read provisioning state or the VM profile. This invariant check fires when Azure returns a scale set whose Properties pointer is nil, meaning the response is structurally incomplete for reconciliation.
Source
Thrown at upup/pkg/fi/cloudup/azuretasks/vmscaleset.go:109
return s.Name
}
// Find discovers the VMScaleSet in the cloud provider.
func (s *VMScaleSet) Find(c *fi.CloudupContext) (*VMScaleSet, error) {
cloud := c.T.Cloud.(azure.AzureCloud)
found, err := cloud.VMScaleSet().Get(context.TODO(), *s.ResourceGroup.Name, *s.Name)
if err != nil && !strings.Contains(err.Error(), "NotFound") {
return nil, err
}
if found == nil {
return nil, nil
}
if found.ID == nil {
return nil, fmt.Errorf("found VMSS without ID")
}
if found.Properties == nil {
return nil, fmt.Errorf("found VMSS without properties")
}
if fi.ValueOf(found.Properties.ProvisioningState) == "Failed" {
klog.Warningf("found VMSS %q in failed provisioning state", *s.Name)
return nil, nil
}
if found.Properties.VirtualMachineProfile == nil {
return nil, fmt.Errorf("found VMSS without VM profile")
}
if found.Properties.VirtualMachineProfile.NetworkProfile == nil {
return nil, fmt.Errorf("found VMSS without network profile")
}
if found.Properties.VirtualMachineProfile.OSProfile == nil {
return nil, fmt.Errorf("found VMSS without OS profile")
}
profile := found.Properties.VirtualMachineProfile
nwConfigs := profile.NetworkProfile.NetworkInterfaceConfigurationsView on GitHub (pinned to 4c8573c808)
Solutions
- Verify the VMSS exists fully in Azure (az vmss show) and re-run kops apply to recreate it.
- Fix test fixtures so the mocked VirtualMachineScaleSet sets Properties.
- Align the azure-sdk-for-go version with kops expectations so Properties is populated.
Example fix
// before
found := &compute.VirtualMachineScaleSet{ID: &id}
// after
found := &compute.VirtualMachineScaleSet{ID: &id, Properties: &compute.VirtualMachineScaleSetProperties{}} Defensive patterns
Strategy: validation
Validate before calling
if vmss == nil || vmss.Properties == nil {
return fmt.Errorf("VMSS %s has no properties; delete and re-apply", name)
} Type guard
func hasProperties(v *compute.VirtualMachineScaleSet) bool { return v != nil && v.Properties != nil } Try / catch
task, err := s.Find(context, cloud)
if err != nil {
if strings.Contains(err.Error(), "without properties") {
return markForRecreate(err)
}
return err
} Prevention
- Avoid concurrent edits to the same VMSS by other IaC tools.
- Include Properties in all mocked SDK responses.
- Keep the azure-sdk-for-go version aligned with kops.
When it happens
Trigger: A Get/List VirtualMachineScaleSets response deserialized with Properties == nil — typically a stub response, an empty/half-provisioned resource, or an API shape mismatch.
Common situations: VMSS deleted concurrently with reconciliation; mock/test fixtures omitting Properties; SDK upgrade where fields moved out of Properties.
Related errors
- expected exactly one subnet for InstanceGroup %q; subnets wa
- unexpected subnet type: for InstanceGroup %q; type was %s
- instance group must have the same min and max size in Azure,
- malformed format of image urn: %s
- creating VMSS VMs client: %w
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/37a108919f59895e.
Report an issue: GitHub.