{"record":{"id":"d29ad327deedf3c4","repo":"kubernetes/kops","slug":"error-creating-loadbalancer-v","errorCode":null,"errorMessage":"error creating loadbalancer: %v","messagePattern":"error creating loadbalancer: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/openstack/loadbalancer.go","lineNumber":221,"sourceCode":"\t} else {\n\t\treturn wait.ErrWaitTimeout\n\t}\n}\n\nfunc (c *openstackCloud) CreateLB(opt loadbalancers.CreateOptsBuilder) (*loadbalancers.LoadBalancer, error) {\n\treturn createLB(c, opt)\n}\n\nfunc createLB(c OpenstackCloud, opt loadbalancers.CreateOptsBuilder) (*loadbalancers.LoadBalancer, error) {\n\tif c.LoadBalancerClient() == nil {\n\t\treturn nil, fmt.Errorf(\"loadbalancer support not available in this deployment\")\n\t}\n\n\tvar i *loadbalancers.LoadBalancer\n\tdone, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {\n\t\tv, err := loadbalancers.Create(context.TODO(), c.LoadBalancerClient(), opt).Extract()\n\t\tif err != nil {\n\t\t\treturn false, fmt.Errorf(\"error creating loadbalancer: %v\", err)\n\t\t}\n\t\ti = v\n\t\treturn true, nil\n\t})\n\tif err != nil {\n\t\treturn i, err\n\t} else if done {\n\t\treturn i, nil\n\t} else {\n\t\treturn i, wait.ErrWaitTimeout\n\t}\n}\n\nfunc (c *openstackCloud) GetLB(loadbalancerID string) (lb *loadbalancers.LoadBalancer, err error) {\n\treturn getLB(c, loadbalancerID)\n}\n\nfunc getLB(c OpenstackCloud, loadbalancerID string) (lb *loadbalancers.LoadBalancer, err error) {","sourceCodeStart":203,"sourceCodeEnd":239,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/openstack/loadbalancer.go#L203-L239","documentation":"Within createLB, loadbalancers.Create is retried via vfs.RetryWithBackoff; every failure from the Octavia API is wrapped as 'error creating loadbalancer: %v' and retried until writeBackoff gives up. The message carries the underlying API error (validation, quota, conflict, outage).","triggerScenarios":"Octavia create rejected: invalid CreateOpts (bad vip_subnet_id/flavor), quota exceeded for loadbalancers, subnet/vip not found, 409 on provisioning status, or API 5xx during service provisioning for a LoadBalancer-type Kubernetes service.","commonSituations":"Kubernetes service of type LoadBalancer stuck Pending because Octavia quota (loadbalancer count) is exhausted; wrong subnet/network in the cluster spec; Octavia flavor_id referencing a nonexistent flavor; API outage during scale-up.","solutions":["Read the wrapped error: 403/quota — raise the project's loadbalancer quota; 404 — fix vip subnet/network IDs in the spec","Validate CreateOpts against the deployed Octavia version (flavor, provider, vip_subnet_id) and correct the cluster spec","Check Octavia service health (amphora capacity, API logs) if errors are 5xx and retry","Confirm the configured project/network can host the VIP and has ports available","Retry the operation after transient failures — backoff is already applied, so persistence implies a config/quota issue"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// pre-validate CreateOpts against the environment\nif opt.GetVipSubnetID() == \"\" { return fmt.Errorf(\"vip_subnet_id is required\") }\nif flavorID != \"\" {\n\tif _, err := flavors.Get(context.TODO(), client, flavorID).Extract(); err != nil {\n\t\treturn fmt.Errorf(\"flavor %s does not exist in this Octavia\", flavorID)\n\t}\n}\n// also check quota: os_quota.versions loadbalancer limit","typeGuard":null,"tryCatchPattern":"done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {\n\tv, err := loadbalancers.Create(context.TODO(), client, opt).Extract()\n\tif err != nil {\n\t\tvar gerr gophercloud.ErrUnexpectedResponseCode\n\t\tif errors.As(err, &gerr) && (gerr.Actual == 403 || gerr.Actual == 404) {\n\t\t\treturn false, err // config/quota problem: do not blind-retry\n\t\t}\n\t\treturn false, fmt.Errorf(\"error creating loadbalancer: %v\", err) // transient: retry\n\t}\n\treturn true, nil\n})","preventionTips":["Raise loadbalancer quotas before large rollouts","Validate subnet/network/flavor IDs in the cluster spec against the live environment","Keep Octavia capacity (amphora) monitored; 5xx often means provider shortage","Distinguish permanent (403/404) from transient failures in retry logic"],"tags":["openstack","octavia","loadbalancer","api-error","quota"],"backgroundTag":"resource-create-failed","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}