Documentation ¶
Index ¶
- Constants
- func New(plArgs runtime.Object, fh framework.Handle, fts feature.Features) (framework.Plugin, error)
- type AssumeCache
- type BindingInfo
- type CapacityCheck
- type ConflictReason
- type ConflictReasons
- type FakeVolumeBinder
- func (b *FakeVolumeBinder) AssumePodVolumes(assumedPod *v1.Pod, nodeName string, podVolumes *PodVolumes) (bool, error)
- func (b *FakeVolumeBinder) BindPodVolumes(ctx context.Context, assumedPod *v1.Pod, podVolumes *PodVolumes) error
- func (b *FakeVolumeBinder) FindPodVolumes(pod *v1.Pod, _ *PodVolumeClaims, node *v1.Node) (podVolumes *PodVolumes, reasons ConflictReasons, err error)
- func (b *FakeVolumeBinder) GetEligibleNodes(boundClaims []*v1.PersistentVolumeClaim) (eligibleNodes sets.Set[string])
- func (b *FakeVolumeBinder) GetPodVolumeClaims(pod *v1.Pod) (podVolumeClaims *PodVolumeClaims, err error)
- func (b *FakeVolumeBinder) RevertAssumedPodVolumes(_ *PodVolumes)
- type FakeVolumeBinderConfig
- type InTreeToCSITranslator
- type PVAssumeCache
- type PVCAssumeCache
- type PodVolumeClaims
- type PodVolumes
- type SchedulerVolumeBinder
- type StorageResource
- type VolumeBinding
- func (pl *VolumeBinding) EventsToRegister() []framework.ClusterEventWithHint
- func (pl *VolumeBinding) Filter(ctx context.Context, cs *framework.CycleState, pod *v1.Pod, ...) *framework.Status
- func (pl *VolumeBinding) Name() string
- func (pl *VolumeBinding) PreBind(ctx context.Context, cs *framework.CycleState, pod *v1.Pod, nodeName string) *framework.Status
- func (pl *VolumeBinding) PreFilter(ctx context.Context, state *framework.CycleState, pod *v1.Pod) (*framework.PreFilterResult, *framework.Status)
- func (pl *VolumeBinding) PreFilterExtensions() framework.PreFilterExtensions
- func (pl *VolumeBinding) Reserve(ctx context.Context, cs *framework.CycleState, pod *v1.Pod, nodeName string) *framework.Status
- func (pl *VolumeBinding) Score(ctx context.Context, cs *framework.CycleState, pod *v1.Pod, nodeName string) (int64, *framework.Status)
- func (pl *VolumeBinding) ScoreExtensions() framework.ScoreExtensions
- func (pl *VolumeBinding) Unreserve(ctx context.Context, cs *framework.CycleState, pod *v1.Pod, nodeName string)
Constants ¶
const ( // ErrReasonBindConflict is used for VolumeBindingNoMatch predicate error. ErrReasonBindConflict ConflictReason = "node(s) didn't find available persistent volumes to bind" // ErrReasonNodeConflict is used for VolumeNodeAffinityConflict predicate error. ErrReasonNodeConflict ConflictReason = "node(s) had volume node affinity conflict" // ErrReasonNotEnoughSpace is used when a pod cannot start on a node because not enough storage space is available. ErrReasonNotEnoughSpace = "node(s) did not have enough free storage" // ErrReasonPVNotExist is used when a pod has one or more PVC(s) bound to non-existent persistent volume(s)" ErrReasonPVNotExist = "node(s) unavailable due to one or more pvc(s) bound to non-existent pv(s)" )
const Name = names.VolumeBinding
Name is the name of the plugin used in Registry and configurations.
Variables ¶
This section is empty.
Functions ¶
Types ¶
type AssumeCache ¶ added in v1.23.0
type AssumeCache interface { // Assume updates the object in-memory only Assume(obj interface{}) error // Restore the informer cache's version of the object Restore(objName string) // Get the object by name Get(objName string) (interface{}, error) // GetAPIObj gets the API object by name GetAPIObj(objName string) (interface{}, error) // List all the objects in the cache List(indexObj interface{}) []interface{} }
AssumeCache is a cache on top of the informer that allows for updating objects outside of informer events and also restoring the informer cache's version of the object. Objects are assumed to be Kubernetes API objects that implement meta.Interface
func NewAssumeCache ¶ added in v1.23.0
func NewAssumeCache(informer cache.SharedIndexInformer, description, indexName string, indexFunc cache.IndexFunc) AssumeCache
NewAssumeCache creates an assume cache for general objects.
type BindingInfo ¶ added in v1.23.0
type BindingInfo struct {
// contains filtered or unexported fields
}
BindingInfo holds a binding between PV and PVC.
func (*BindingInfo) StorageClassName ¶ added in v1.23.0
func (b *BindingInfo) StorageClassName() string
StorageClassName returns the name of the storage class.
func (*BindingInfo) StorageResource ¶ added in v1.23.0
func (b *BindingInfo) StorageResource() *StorageResource
StorageResource returns storage resource.
type CapacityCheck ¶ added in v1.23.0
type CapacityCheck struct { CSIDriverInformer storageinformers.CSIDriverInformer CSIStorageCapacityInformer storageinformers.CSIStorageCapacityInformer }
CapacityCheck contains additional parameters for NewVolumeBinder that are only needed when checking volume sizes against available storage capacity is desired.
type ConflictReason ¶ added in v1.23.0
type ConflictReason string
ConflictReason is used for the special strings which explain why volume binding is impossible for a node.
type ConflictReasons ¶ added in v1.23.0
type ConflictReasons []ConflictReason
ConflictReasons contains all reasons that explain why volume binding is impossible for a node.
func (ConflictReasons) Len ¶ added in v1.23.0
func (reasons ConflictReasons) Len() int
func (ConflictReasons) Less ¶ added in v1.23.0
func (reasons ConflictReasons) Less(i, j int) bool
func (ConflictReasons) Swap ¶ added in v1.23.0
func (reasons ConflictReasons) Swap(i, j int)
type FakeVolumeBinder ¶ added in v1.23.0
type FakeVolumeBinder struct { AssumeCalled bool BindCalled bool // contains filtered or unexported fields }
FakeVolumeBinder represents a fake volume binder for testing.
func NewFakeVolumeBinder ¶ added in v1.23.0
func NewFakeVolumeBinder(config *FakeVolumeBinderConfig) *FakeVolumeBinder
NewFakeVolumeBinder sets up all the caches needed for the scheduler to make topology-aware volume binding decisions.
func (*FakeVolumeBinder) AssumePodVolumes ¶ added in v1.23.0
func (b *FakeVolumeBinder) AssumePodVolumes(assumedPod *v1.Pod, nodeName string, podVolumes *PodVolumes) (bool, error)
AssumePodVolumes implements SchedulerVolumeBinder.AssumePodVolumes.
func (*FakeVolumeBinder) BindPodVolumes ¶ added in v1.23.0
func (b *FakeVolumeBinder) BindPodVolumes(ctx context.Context, assumedPod *v1.Pod, podVolumes *PodVolumes) error
BindPodVolumes implements SchedulerVolumeBinder.BindPodVolumes.
func (*FakeVolumeBinder) FindPodVolumes ¶ added in v1.23.0
func (b *FakeVolumeBinder) FindPodVolumes(pod *v1.Pod, _ *PodVolumeClaims, node *v1.Node) (podVolumes *PodVolumes, reasons ConflictReasons, err error)
FindPodVolumes implements SchedulerVolumeBinder.FindPodVolumes.
func (*FakeVolumeBinder) GetEligibleNodes ¶ added in v1.27.0
func (b *FakeVolumeBinder) GetEligibleNodes(boundClaims []*v1.PersistentVolumeClaim) (eligibleNodes sets.Set[string])
GetEligibleNodes implements SchedulerVolumeBinder.GetEligibleNodes.
func (*FakeVolumeBinder) GetPodVolumeClaims ¶ added in v1.27.0
func (b *FakeVolumeBinder) GetPodVolumeClaims(pod *v1.Pod) (podVolumeClaims *PodVolumeClaims, err error)
GetPodVolumeClaims implements SchedulerVolumeBinder.GetPodVolumes.
func (*FakeVolumeBinder) RevertAssumedPodVolumes ¶ added in v1.23.0
func (b *FakeVolumeBinder) RevertAssumedPodVolumes(_ *PodVolumes)
RevertAssumedPodVolumes implements SchedulerVolumeBinder.RevertAssumedPodVolumes
type FakeVolumeBinderConfig ¶ added in v1.23.0
type FakeVolumeBinderConfig struct { AllBound bool FindReasons ConflictReasons FindErr error AssumeErr error BindErr error }
FakeVolumeBinderConfig holds configurations for fake volume binder.
type InTreeToCSITranslator ¶ added in v1.23.0
type InTreeToCSITranslator interface { IsPVMigratable(pv *v1.PersistentVolume) bool GetInTreePluginNameFromSpec(pv *v1.PersistentVolume, vol *v1.Volume) (string, error) TranslateInTreePVToCSI(pv *v1.PersistentVolume) (*v1.PersistentVolume, error) }
InTreeToCSITranslator contains methods required to check migratable status and perform translations from InTree PV's to CSI
type PVAssumeCache ¶ added in v1.23.0
type PVAssumeCache interface { AssumeCache GetPV(pvName string) (*v1.PersistentVolume, error) GetAPIPV(pvName string) (*v1.PersistentVolume, error) ListPVs(storageClassName string) []*v1.PersistentVolume }
PVAssumeCache is a AssumeCache for PersistentVolume objects
func NewPVAssumeCache ¶ added in v1.23.0
func NewPVAssumeCache(informer cache.SharedIndexInformer) PVAssumeCache
NewPVAssumeCache creates a PV assume cache.
type PVCAssumeCache ¶ added in v1.23.0
type PVCAssumeCache interface { AssumeCache // GetPVC returns the PVC from the cache with given pvcKey. // pvcKey is the result of MetaNamespaceKeyFunc on PVC obj GetPVC(pvcKey string) (*v1.PersistentVolumeClaim, error) GetAPIPVC(pvcKey string) (*v1.PersistentVolumeClaim, error) }
PVCAssumeCache is a AssumeCache for PersistentVolumeClaim objects
func NewPVCAssumeCache ¶ added in v1.23.0
func NewPVCAssumeCache(informer cache.SharedIndexInformer) PVCAssumeCache
NewPVCAssumeCache creates a PVC assume cache.
type PodVolumeClaims ¶ added in v1.27.0
type PodVolumeClaims struct {
// contains filtered or unexported fields
}
type PodVolumes ¶ added in v1.23.0
type PodVolumes struct { // StaticBindings are binding decisions for PVCs which can be bound to // pre-provisioned static PVs. StaticBindings []*BindingInfo // DynamicProvisions are PVCs that require dynamic provisioning DynamicProvisions []*v1.PersistentVolumeClaim }
PodVolumes holds pod's volumes information used in volume scheduling.
type SchedulerVolumeBinder ¶ added in v1.23.0
type SchedulerVolumeBinder interface { // GetPodVolumeClaims returns a pod's PVCs separated into bound, unbound with delayed binding (including provisioning), // unbound with immediate binding (including prebound) and PVs that belong to storage classes of unbound PVCs with delayed binding. GetPodVolumeClaims(pod *v1.Pod) (podVolumeClaims *PodVolumeClaims, err error) // GetEligibleNodes checks the existing bound claims of the pod to determine if the list of nodes can be // potentially reduced down to a subset of eligible nodes based on the bound claims which then can be used // in subsequent scheduling stages. // // If eligibleNodes is 'nil', then it indicates that such eligible node reduction cannot be made // and all nodes should be considered. GetEligibleNodes(boundClaims []*v1.PersistentVolumeClaim) (eligibleNodes sets.Set[string]) // FindPodVolumes checks if all of a Pod's PVCs can be satisfied by the // node and returns pod's volumes information. // // If a PVC is bound, it checks if the PV's NodeAffinity matches the Node. // Otherwise, it tries to find an available PV to bind to the PVC. // // It returns an error when something went wrong or a list of reasons why the node is // (currently) not usable for the pod. // // If the CSIStorageCapacity feature is enabled, then it also checks for sufficient storage // for volumes that still need to be created. // // This function is called by the scheduler VolumeBinding plugin and can be called in parallel FindPodVolumes(pod *v1.Pod, podVolumeClaims *PodVolumeClaims, node *v1.Node) (podVolumes *PodVolumes, reasons ConflictReasons, err error) // AssumePodVolumes will: // 1. Take the PV matches for unbound PVCs and update the PV cache assuming // that the PV is prebound to the PVC. // 2. Take the PVCs that need provisioning and update the PVC cache with related // annotations set. // // It returns true if all volumes are fully bound // // This function is called serially. AssumePodVolumes(assumedPod *v1.Pod, nodeName string, podVolumes *PodVolumes) (allFullyBound bool, err error) // RevertAssumedPodVolumes will revert assumed PV and PVC cache. RevertAssumedPodVolumes(podVolumes *PodVolumes) // BindPodVolumes will: // 1. Initiate the volume binding by making the API call to prebind the PV // to its matching PVC. // 2. Trigger the volume provisioning by making the API call to set related // annotations on the PVC // 3. Wait for PVCs to be completely bound by the PV controller // // This function can be called in parallel. BindPodVolumes(ctx context.Context, assumedPod *v1.Pod, podVolumes *PodVolumes) error }
SchedulerVolumeBinder is used by the scheduler VolumeBinding plugin to handle PVC/PV binding and dynamic provisioning. The binding decisions are integrated into the pod scheduling workflow so that the PV NodeAffinity is also considered along with the pod's other scheduling requirements.
This integrates into the existing scheduler workflow as follows:
- The scheduler takes a Pod off the scheduler queue and processes it serially: a. Invokes all pre-filter plugins for the pod. GetPodVolumeClaims() is invoked here, pod volume information will be saved in current scheduling cycle state for later use. If pod has bound immediate PVCs, GetEligibleNodes() is invoked to potentially reduce down the list of eligible nodes based on the bound PV's NodeAffinity (if any). b. Invokes all filter plugins, parallelized across nodes. FindPodVolumes() is invoked here. c. Invokes all score plugins. Future/TBD d. Selects the best node for the Pod. e. Invokes all reserve plugins. AssumePodVolumes() is invoked here. i. If PVC binding is required, cache in-memory only: * For manual binding: update PV objects for prebinding to the corresponding PVCs. * For dynamic provisioning: update PVC object with a selected node from c) * For the pod, which PVCs and PVs need API updates. ii. Afterwards, the main scheduler caches the Pod->Node binding in the scheduler's pod cache, This is handled in the scheduler and not here. f. Asynchronously bind volumes and pod in a separate goroutine i. BindPodVolumes() is called first in PreBind phase. It makes all the necessary API updates and waits for PV controller to fully bind and provision the PVCs. If binding fails, the Pod is sent back through the scheduler. ii. After BindPodVolumes() is complete, then the scheduler does the final Pod->Node binding.
- Once all the assume operations are done in e), the scheduler processes the next Pod in the scheduler queue while the actual binding operation occurs in the background.
func NewVolumeBinder ¶ added in v1.23.0
func NewVolumeBinder( kubeClient clientset.Interface, podInformer coreinformers.PodInformer, nodeInformer coreinformers.NodeInformer, csiNodeInformer storageinformers.CSINodeInformer, pvcInformer coreinformers.PersistentVolumeClaimInformer, pvInformer coreinformers.PersistentVolumeInformer, storageClassInformer storageinformers.StorageClassInformer, capacityCheck CapacityCheck, bindTimeout time.Duration) SchedulerVolumeBinder
NewVolumeBinder sets up all the caches needed for the scheduler to make volume binding decisions.
capacityCheck determines how storage capacity is checked (CSIStorageCapacity feature).
type StorageResource ¶ added in v1.23.0
StorageResource represents storage resource.
type VolumeBinding ¶
type VolumeBinding struct { Binder SchedulerVolumeBinder PVCLister corelisters.PersistentVolumeClaimLister // contains filtered or unexported fields }
VolumeBinding is a plugin that binds pod volumes in scheduling. In the Filter phase, pod binding cache is created for the pod and used in Reserve and PreBind phases.
func (*VolumeBinding) EventsToRegister ¶ added in v1.22.0
func (pl *VolumeBinding) EventsToRegister() []framework.ClusterEventWithHint
EventsToRegister returns the possible events that may make a Pod failed by this plugin schedulable.
func (*VolumeBinding) Filter ¶
func (pl *VolumeBinding) Filter(ctx context.Context, cs *framework.CycleState, pod *v1.Pod, nodeInfo *framework.NodeInfo) *framework.Status
Filter invoked at the filter extension point. It evaluates if a pod can fit due to the volumes it requests, for both bound and unbound PVCs.
For PVCs that are bound, then it checks that the corresponding PV's node affinity is satisfied by the given node.
For PVCs that are unbound, it tries to find available PVs that can satisfy the PVC requirements and that the PV node affinity is satisfied by the given node.
If storage capacity tracking is enabled, then enough space has to be available for the node and volumes that still need to be created.
The predicate returns true if all bound PVCs have compatible PVs with the node, and if all unbound PVCs can be matched with an available and node-compatible PV.
func (*VolumeBinding) Name ¶
func (pl *VolumeBinding) Name() string
Name returns name of the plugin. It is used in logs, etc.
func (*VolumeBinding) PreBind ¶ added in v1.19.0
func (pl *VolumeBinding) PreBind(ctx context.Context, cs *framework.CycleState, pod *v1.Pod, nodeName string) *framework.Status
PreBind will make the API update with the assumed bindings and wait until the PV controller has completely finished the binding operation.
If binding errors, times out or gets undone, then an error will be returned to retry scheduling.
func (*VolumeBinding) PreFilter ¶ added in v1.19.0
func (pl *VolumeBinding) PreFilter(ctx context.Context, state *framework.CycleState, pod *v1.Pod) (*framework.PreFilterResult, *framework.Status)
PreFilter invoked at the prefilter extension point to check if pod has all immediate PVCs bound. If not all immediate PVCs are bound, an UnschedulableAndUnresolvable is returned.
func (*VolumeBinding) PreFilterExtensions ¶ added in v1.19.0
func (pl *VolumeBinding) PreFilterExtensions() framework.PreFilterExtensions
PreFilterExtensions returns prefilter extensions, pod add and remove.
func (*VolumeBinding) Reserve ¶ added in v1.19.0
func (pl *VolumeBinding) Reserve(ctx context.Context, cs *framework.CycleState, pod *v1.Pod, nodeName string) *framework.Status
Reserve reserves volumes of pod and saves binding status in cycle state.
func (*VolumeBinding) Score ¶ added in v1.21.0
func (pl *VolumeBinding) Score(ctx context.Context, cs *framework.CycleState, pod *v1.Pod, nodeName string) (int64, *framework.Status)
Score invoked at the score extension point.
func (*VolumeBinding) ScoreExtensions ¶ added in v1.21.0
func (pl *VolumeBinding) ScoreExtensions() framework.ScoreExtensions
ScoreExtensions of the Score plugin.
func (*VolumeBinding) Unreserve ¶ added in v1.19.0
func (pl *VolumeBinding) Unreserve(ctx context.Context, cs *framework.CycleState, pod *v1.Pod, nodeName string)
Unreserve clears assumed PV and PVC cache. It's idempotent, and does nothing if no cache found for the given pod.