mirror of https://github.com/k3s-io/k3s
Remove limit of attached AWS devices from kubelet.
Limit of nr. of attached EBS volumes to a node is now enforced by scheduler. It can be adjusted by KUBE_MAX_PD_VOLS env. variable there. Therefore we don't need the same check in kubelet. If the system admin wants to attach more, we should allow it. Kubelet limit is now 650 attached volumes ('ba'..'zz').pull/6/head
parent
6441e1fc33
commit
e4dc6709de
|
@ -904,23 +904,6 @@ type awsInstanceType struct {
|
||||||
// This should be stored as a single letter (i.e. c, not sdc or /dev/sdc)
|
// This should be stored as a single letter (i.e. c, not sdc or /dev/sdc)
|
||||||
type mountDevice string
|
type mountDevice string
|
||||||
|
|
||||||
// TODO: Also return number of mounts allowed?
|
|
||||||
func (self *awsInstanceType) getEBSMountDevices() []mountDevice {
|
|
||||||
// See: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html
|
|
||||||
// We will generate "ba", "bb", "bc"..."bz", "ca", ..., up to DefaultMaxEBSVolumes
|
|
||||||
devices := []mountDevice{}
|
|
||||||
count := 0
|
|
||||||
for first := 'b'; count < DefaultMaxEBSVolumes; first++ {
|
|
||||||
for second := 'a'; count < DefaultMaxEBSVolumes && second <= 'z'; second++ {
|
|
||||||
device := mountDevice(fmt.Sprintf("%c%c", first, second))
|
|
||||||
devices = append(devices, device)
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return devices
|
|
||||||
}
|
|
||||||
|
|
||||||
type awsInstance struct {
|
type awsInstance struct {
|
||||||
ec2 EC2
|
ec2 EC2
|
||||||
|
|
||||||
|
@ -1050,19 +1033,20 @@ func (self *awsInstance) getMountDevice(volumeID string, assign bool) (assigned
|
||||||
return mountDevice(""), false, nil
|
return mountDevice(""), false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check all the valid mountpoints to see if any of them are free
|
// Find the first unused device in sequence 'ba', 'bb', 'bc', ... 'bz', 'ca', ... 'zz'
|
||||||
valid := instanceType.getEBSMountDevices()
|
var chosen mountDevice
|
||||||
chosen := mountDevice("")
|
for first := 'b'; first <= 'z' && chosen == ""; first++ {
|
||||||
for _, mountDevice := range valid {
|
for second := 'a'; second <= 'z' && chosen == ""; second++ {
|
||||||
_, found := deviceMappings[mountDevice]
|
candidate := mountDevice(fmt.Sprintf("%c%c", first, second))
|
||||||
if !found {
|
if _, found := deviceMappings[candidate]; !found {
|
||||||
chosen = mountDevice
|
chosen = candidate
|
||||||
break
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if chosen == "" {
|
if chosen == "" {
|
||||||
glog.Warningf("Could not assign a mount device (all in use?). mappings=%v, valid=%v", deviceMappings, valid)
|
glog.Warningf("Could not assign a mount device (all in use?). mappings=%v", deviceMappings)
|
||||||
return "", false, fmt.Errorf("Too many EBS volumes attached to node %s.", self.nodeName)
|
return "", false, fmt.Errorf("Too many EBS volumes attached to node %s.", self.nodeName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue