Code change:
waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID) <del> listener, err := listeners.Create(lbaas.network, listeners.CreateOpts{ Name:           name, Protocol:       listeners.ProtocolTCP, ProtocolPort:   (int)(ports[0].Port), //TODO: need to handle multi-port LoadbalancerID: loadbalancer.ID, }).Extract() if err != nil { // cleanup what was created so far _ = lbaas.EnsureLoadBalancerDeleted(clusterName, apiService) return nil, err } waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID) pool, err := v2_pools.Create(lbaas.network, v2_pools.CreateOpts{ Name:        name, Protocol:    v2_pools.ProtocolTCP, LBMethod:    lbmethod, ListenerID:  listener.ID, Persistence: persistence, }).Extract() if err != nil { // cleanup what was created so far _ = lbaas.EnsureLoadBalancerDeleted(clusterName, apiService) return nil, err } for _, host := range hosts { addr, err := getAddressByName(lbaas.compute, host) </del> <ins> for portIndex, port := range ports { listener, err := listeners.Create(lbaas.network, listeners.CreateOpts{ Name:           fmt.Sprintf("listener_%s_%d", name, portIndex), Protocol:       listeners.Protocol(port.Protocol), ProtocolPort:   int(port.Port), LoadbalancerID: loadbalancer.ID, }).Extract() </ins> if err != nil { <ins> // cleanup what was created so far _ = lbaas.EnsureLoadBalancerDeleted(clusterName, apiService) </ins> return nil, err } waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID) <del> _, err = v2_pools.CreateAssociateMember(lbaas.network, pool.ID, v2_pools.MemberCreateOpts{ ProtocolPort: int(ports[0].NodePort), //TODO: need to handle multi-port Address:      addr, SubnetID:     lbaas.opts.SubnetId, </del> <ins> pool, err := v2_pools.Create(lbaas.network, v2_pools.CreateOpts{ Name:        fmt.Sprintf("pool_%s_%d", name, portIndex), Protocol:    v2_pools.Protocol(port.Protocol), LBMethod:    lbmethod, ListenerID:  listener.ID, Persistence: persistence, </ins> }).Extract() if err != nil { // cleanup what was created so far _ = lbaas.EnsureLoadBalancerDeleted(clusterName, apiService) return nil, err } <del> } if lbaas.opts.CreateMonitor { </del> waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID) <del> _, err = v2_monitors.Create(lbaas.network, v2_monitors.CreateOpts{ PoolID:     pool.ID, Type:       monitors.TypeTCP, Delay:      int(lbaas.opts.MonitorDelay.Duration.Seconds()), Timeout:    int(lbaas.opts.MonitorTimeout.Duration.Seconds()), MaxRetries: int(lbaas.opts.MonitorMaxRetries), }).Extract() if err != nil { // cleanup what was created so far _ = lbaas.EnsureLoadBalancerDeleted(clusterName, apiService) return nil, err </del> <ins> for _, host := range hosts { addr, err := getAddressByName(lbaas.compute, host) if err != nil { // cleanup what was created so far _ = lbaas.EnsureLoadBalancerDeleted(clusterName, apiService) return nil, err } _, err = v2_pools.CreateAssociateMember(lbaas.network, pool.ID, v2_pools.MemberCreateOpts{ ProtocolPort: int(port.NodePort), Address:      addr, SubnetID:     lbaas.opts.SubnetId, }).Extract() if err != nil { // cleanup what was created so far _ = lbaas.EnsureLoadBalancerDeleted(clusterName, apiService) return nil, err } waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID) } if lbaas.opts.CreateMonitor { _, err = v2_monitors.Create(lbaas.network, v2_monitors.CreateOpts{ PoolID:     pool.ID, Type:       string(port.Protocol), Delay:      int(lbaas.opts.MonitorDelay.Duration.Seconds()), Timeout:    int(lbaas.opts.MonitorTimeout.Duration.Seconds()), MaxRetries: int(lbaas.opts.MonitorMaxRetries), }).Extract() if err != nil { // cleanup what was created so far _ = lbaas.EnsureLoadBalancerDeleted(clusterName, apiService) return nil, err } waitLoadbalancerActiveProvisioningStatus(lbaas.network, loadbalancer.ID) </ins> } }

Related discussion:
text: LBaaS implementation (v1 or v2) will not support services that require to load balancer more than one port.
Fixed for LBaaS v2 by I suspect LBaaS v1 can't support multiple ports (not sure if reusing the VIP across multiple loadbalancers is a universally supported thing). I also believe LBaaS v1 is also mostly gone in favour of v2 in deployments so trying to address this in v1 is extremely low priority unless someone steps forward to ask for it. So: I think we can close this bug now, but I lack the powers to do that directly.
thank you for the update.