code: func ChooseZonesForVolume(zones sets.String, pvcName string, numZones uint32) sets.String {
  	// No zones available, return empty set.
  	replicaZones := sets.NewString()
  	if zones.Len() == 0 {
  		return replicaZones
  	}
  
  	// We create the volume in a zone determined by the name
  	// Eventually the scheduler will coordinate placement into an available zone
  	hash, index := getPVCNameHashAndIndexOffset(pvcName)
  
  	// Zones.List returns zones in a consistent order (sorted)
  	// We do have a potential failure case where volumes will not be properly spread,
  	// if the set of zones changes during StatefulSet volume creation.  However, this is
  	// probably relatively unlikely because we expect the set of zones to be essentially
  	// static for clusters.
  	// Hopefully we can address this problem if/when we do full scheduler integration of
  	// PVC placement (which could also e.g. avoid putting volumes in overloaded or
  	// unhealthy zones)
  	zoneSlice := zones.List()
  
  	startingIndex := index * numZones
  	for index = startingIndex; index < startingIndex+numZones; index++ {
  		zone := zoneSlice[(hash+index)%uint32(len(zoneSlice))]
  		replicaZones.Insert(zone)
  	}
  
  	klog.V(2).Infof("Creating volume for replicated PVC %q; chosen zones=%q from zones=%q",
  		pvcName, replicaZones.UnsortedList(), zoneSlice)
  	return replicaZones
  }
docs: // ChooseZonesForVolume is identical to ChooseZoneForVolume, but selects a multiple zones, for multi-zone disks.