Documentation
¶
Index ¶
- Constants
- Variables
- func BuildKubeConfig(sConfig *Config) *rest.Config
- func WatchConfig(configPath *string, c *Config)
- type AffinityGroup
- type AffinityGroupList
- type AffinityGroupMemberBindInfo
- type AffinityGroupMemberSpec
- type AffinityGroupSpec
- type AffinityGroupState
- type AffinityGroupStatus
- type CellAddress
- type CellHealthiness
- type CellState
- type CellStatus
- type CellType
- type CellTypeSpec
- type ClusterStatus
- type Config
- type LazyPreemptionStatus
- type ObjectMeta
- type PhysicalCellSpec
- type PhysicalCellStatus
- type PhysicalClusterSpec
- type PhysicalClusterStatus
- type PinnedCellId
- type PinnedCellSpec
- type PodBindInfo
- type PodPlacementInfo
- type PodSchedulingSpec
- type VirtualCellSpec
- type VirtualCellStatus
- type VirtualClusterName
- type VirtualClusterSpec
- type VirtualClusterStatus
- type WebServerError
- type WebServerPaths
Constants ¶
const ( ComponentName = "hivedscheduler" GroupName = "hivedscheduler.microsoft.com" UnlimitedValue = -1 // To leverage this scheduler, at least one container in the Pod should contain // below resource limit with any positive int16 value. ResourceNamePodSchedulingEnable = GroupName + "/pod-scheduling-enable" // To leverage this scheduler, the Pod should contain below annotation in // PodSchedulingSpec YAML format. AnnotationKeyPodSchedulingSpec = GroupName + "/pod-scheduling-spec" // To leverage this scheduler, the Pod could reference below annotation to // use the allocated leaf cells for the whole Pod. AnnotationKeyPodLeafCellIsolation = GroupName + "/pod-leaf-cell-isolation" DeprecatedAnnotationKeyPodGpuIsolation = GroupName + "/pod-gpu-isolation" // Populated by this scheduler, used to track and recover allocated placement. // It is in PodBindInfo YAML format. AnnotationKeyPodBindInfo = GroupName + "/pod-bind-info" // Priority Range of Guaranteed Pod. MaxGuaranteedPriority = int32(1000) MinGuaranteedPriority = int32(0) // Priority of Opportunistic Pod. OpportunisticPriority = int32(-1) )
///////////////////////////////////////////////////////////////////////////////////// General Constants /////////////////////////////////////////////////////////////////////////////////////
const ( RootPath = "/" VersionPath = RootPath + "v1" // Scheduler Extender API: API with K8S Default Scheduler ExtenderPath = VersionPath + "/extender" FilterPath = ExtenderPath + "/filter" BindPath = ExtenderPath + "/bind" PreemptPath = ExtenderPath + "/preempt" // Scheduler Inspect API: API to inspect current scheduling status // Notes: // 1. Both Binding and Bound AffinityGroups/Pods are considered as Allocated. InspectPath = VersionPath + "/inspect" // Inspect current allocated AffinityGroup(s) AffinityGroupsPath = InspectPath + "/affinitygroups/" // Inspect current cluster status ClusterStatusPath = InspectPath + "/clusterstatus" // Inspect current physical cluster status PhysicalClusterPath = ClusterStatusPath + "/physicalcluster" // Inspect current virtual cluster(s)' status VirtualClustersPath = ClusterStatusPath + "/virtualclusters/" )
///////////////////////////////////////////////////////////////////////////////////// WebServer Constants /////////////////////////////////////////////////////////////////////////////////////
Variables ¶
var EnvValueConfigFilePath = common.GetEnv("CONFIG", "./hivedscheduler.yaml")
var EnvValueKubeApiServerAddress = common.GetEnv("KUBE_APISERVER_ADDRESS", "")
var EnvValueKubeConfigFilePath = common.GetEnv("KUBECONFIG", os.Getenv("HOME")+"/.kube/config")
Functions ¶
func BuildKubeConfig ¶
func WatchConfig ¶ added in v0.3.4
Types ¶
type AffinityGroup ¶
type AffinityGroup struct {
ObjectMeta `json:"metadata"`
Status AffinityGroupStatus `json:"status"`
}
type AffinityGroupList ¶ added in v0.2.4
type AffinityGroupList struct {
Items []AffinityGroup `json:"items"`
}
type AffinityGroupMemberBindInfo ¶ added in v0.2.0
type AffinityGroupMemberBindInfo struct {
PodPlacements []PodPlacementInfo `yaml:"podPlacements"`
}
type AffinityGroupMemberSpec ¶ added in v0.2.0
type AffinityGroupSpec ¶ added in v0.2.0
type AffinityGroupSpec struct {
Name string `yaml:"name"`
Members []AffinityGroupMemberSpec `yaml:"members"`
}
type AffinityGroupState ¶ added in v0.3.1
type AffinityGroupState string
type AffinityGroupStatus ¶ added in v0.2.4
type AffinityGroupStatus struct {
VC VirtualClusterName `json:"vc"`
Priority int32 `json:"priority"`
State AffinityGroupState `json:"state"`
PhysicalPlacement map[string][]int32 `json:"physicalPlacement,omitempty"` // node -> leaf cell indices
VirtualPlacement map[CellAddress][]CellAddress `json:"virtualPlacement,omitempty"` // preassigned cell -> leaf cells
AllocatedPods []types.UID `json:"allocatedPods,omitempty"`
PreemptingPods []types.UID `json:"preemptingPods,omitempty"`
LazyPreemptionStatus *LazyPreemptionStatus `json:"lazyPreemptionStatus,omitempty"`
}
type CellAddress ¶
type CellAddress string
///////////////////////////////////////////////////////////////////////////////////// General Types /////////////////////////////////////////////////////////////////////////////////////
type CellHealthiness ¶ added in v0.3.0
type CellHealthiness string
const ( CellHealthy CellHealthiness = "Healthy" CellBad CellHealthiness = "Bad" )
type CellStatus ¶ added in v0.3.0
type CellStatus struct {
LeafCellType string `json:"leafCellType,omitempty"`
CellType CellType `json:"cellType"`
IsNodeLevel bool `json:"isNodeLevel,omitempty"`
// Address of a physical cell consists of its address (or index) in each level
// (e.g., node0/0/0/0 may represent node0, CPU socket 0, PCIe switch 0, GPU 0.
// Address of a virtual cell consists of its VC name, index of the preassigned cell,
// and the relative index in each level inside the preassigned cell
// (e.g., VC1/0/0 may represent VC1, preassigned cell 0, index 0 among its children)
CellAddress CellAddress `json:"cellAddress"`
// CellState and CellHealthiness are two orthogonal fields.
// CellState represents whether the cell is used (or reserved) by an affinity group.
// CellHealthiness represents whether the physical hardware is working normally.
CellState CellState `json:"cellState"`
CellHealthiness CellHealthiness `json:"cellHealthiness"`
CellPriority int32 `json:"cellPriority"`
}
type CellType ¶
type CellType string
///////////////////////////////////////////////////////////////////////////////////// General Types /////////////////////////////////////////////////////////////////////////////////////
type CellTypeSpec ¶
type ClusterStatus ¶ added in v0.3.0
type ClusterStatus struct {
// Status of cells in the physical cluster
PhysicalCluster PhysicalClusterStatus `json:"physicalCluster"`
// Status of cells in each VC
VirtualClusters map[VirtualClusterName]VirtualClusterStatus `json:"virtualClusters"`
}
type Config ¶
type Config struct {
// KubeApiServerAddress is default to ${KUBE_APISERVER_ADDRESS}.
// KubeConfigFilePath is default to ${KUBECONFIG} then falls back to ${HOME}/.kube/config.
//
// If both KubeApiServerAddress and KubeConfigFilePath after defaulting are still empty, falls back to the
// [k8s inClusterConfig](https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#accessing-the-api-from-a-pod).
//
// If both KubeApiServerAddress and KubeConfigFilePath after defaulting are not empty,
// KubeApiServerAddress overrides the server address specified in the file referred by KubeConfigFilePath.
//
// If only KubeApiServerAddress after defaulting is not empty, it should be an insecure ApiServer address (can be got from
// [Insecure ApiServer](https://kubernetes.io/docs/reference/access-authn-authz/controlling-access/#api-server-ports-and-ips) or
// [kubectl proxy](https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#using-kubectl-proxy))
// which does not enforce authentication.
//
// If only KubeConfigFilePath after defaulting is not empty, it should be an valid
// [KubeConfig File](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#explore-the-home-kube-directory)
// which inlines or refers the valid
// [ApiServer Credential Files](https://kubernetes.io/docs/reference/access-authn-authz/controlling-access/#transport-security).
//
// Address should be in format http[s]://host:port
KubeApiServerAddress *string `yaml:"kubeApiServerAddress"`
KubeConfigFilePath *string `yaml:"kubeConfigFilePath"`
// WebServer
// Default to :9096
WebServerAddress *string `yaml:"webServerAddress"`
// Specify a threshold for PodBindAttempts, that after it is exceeded, an extra
// Pod binding will be executed forcefully.
ForcePodBindThreshold *int32 `yaml:"forcePodBindThreshold"`
// If a Pod is decided to be PodWaiting, it will block the whole scheduling by
// WaitingPodSchedulingBlockMilliSec.
// Large value can be used to achieve stronger FIFO scheduling by sacrificing
// the scheduling throughput.
// This is a workaround until PodMaxBackoffSeconds can be configured for
// K8S Default Scheduler.
WaitingPodSchedulingBlockMilliSec *int64 `yaml:"waitingPodSchedulingBlockMilliSec"`
// Specify the whole physical cluster
// TODO: Automatically construct it based on node info from Device Plugins
PhysicalCluster *PhysicalClusterSpec `yaml:"physicalCluster"`
// Specify all the virtual clusters belongs to the physical cluster
VirtualClusters *map[VirtualClusterName]VirtualClusterSpec `yaml:"virtualClusters"`
}
func InitRawConfig ¶ added in v0.2.4
type LazyPreemptionStatus ¶ added in v0.2.4
type ObjectMeta ¶ added in v0.2.4
type ObjectMeta struct {
Name string `json:"name"`
}
WebServer Exposed Objects: Align with K8S Objects
type PhysicalCellSpec ¶
type PhysicalCellSpec struct {
CellType CellType `yaml:"cellType"`
CellAddress CellAddress `yaml:"cellAddress"`
PinnedCellId PinnedCellId `yaml:"pinnedCellId"`
CellChildren []PhysicalCellSpec `yaml:"cellChildren,omitempty"`
}
Specify physical Cell instances.
type PhysicalCellStatus ¶ added in v0.3.0
type PhysicalCellStatus struct {
CellStatus
CellChildren []*PhysicalCellStatus `json:"cellChildren,omitempty"`
VC VirtualClusterName `json:"vc,omitempty"`
VirtualCell *VirtualCellStatus `json:"virtualCell,omitempty"`
}
type PhysicalClusterSpec ¶
type PhysicalClusterSpec struct {
CellTypes map[CellType]CellTypeSpec `yaml:"cellTypes"`
PhysicalCells []PhysicalCellSpec `yaml:"physicalCells"`
}
Physical cluster definition
type PhysicalClusterStatus ¶ added in v0.3.0
type PhysicalClusterStatus []*PhysicalCellStatus
func (PhysicalClusterStatus) DeepCopy ¶ added in v0.3.0
func (pcs PhysicalClusterStatus) DeepCopy() PhysicalClusterStatus
type PinnedCellId ¶ added in v0.3.3
type PinnedCellId string
///////////////////////////////////////////////////////////////////////////////////// General Types /////////////////////////////////////////////////////////////////////////////////////
type PinnedCellSpec ¶ added in v0.3.3
type PinnedCellSpec struct {
PinnedCellId PinnedCellId `yaml:"pinnedCellId"`
}
type PodBindInfo ¶
type PodBindInfo struct {
Node string `yaml:"node"` // node to bind
LeafCellIsolation []int32 `yaml:"leafCellIsolation"` // leaf cells to bind
CellChain string `yaml:"cellChain"` // cell chain selected
AffinityGroupBindInfo []AffinityGroupMemberBindInfo `yaml:"affinityGroupBindInfo"`
}
Used to recover scheduler allocated resource
type PodPlacementInfo ¶ added in v0.2.0
type PodPlacementInfo struct {
PhysicalNode string `yaml:"physicalNode"`
PhysicalLeafCellIndices []int32 `yaml:"physicalLeafCellIndices"`
// preassigned cell types used by the pods. used to locate the virtual cells
// when adding an allocated pod
PreassignedCellTypes []CellType `yaml:"preassignedCellTypes"`
}
type PodSchedulingSpec ¶
type PodSchedulingSpec struct {
VirtualCluster VirtualClusterName `yaml:"virtualCluster"`
Priority int32 `yaml:"priority"`
PinnedCellId PinnedCellId `yaml:"pinnedCellId"`
LeafCellType string `yaml:"leafCellType"`
LeafCellNumber int32 `yaml:"leafCellNumber"`
GangReleaseEnable bool `yaml:"gangReleaseEnable"`
LazyPreemptionEnable bool `yaml:"lazyPreemptionEnable"`
IgnoreK8sSuggestedNodes bool `yaml:"ignoreK8sSuggestedNodes" default:"true"`
AffinityGroup *AffinityGroupSpec `yaml:"affinityGroup"`
}
type VirtualCellSpec ¶
type VirtualCellStatus ¶ added in v0.3.0
type VirtualCellStatus struct {
CellStatus
CellChildren []*VirtualCellStatus `json:"cellChildren,omitempty"`
PhysicalCell *PhysicalCellStatus `json:"physicalCell,omitempty"`
}
type VirtualClusterSpec ¶
type VirtualClusterSpec struct {
VirtualCells []VirtualCellSpec `yaml:"virtualCells"`
PinnedCells []PinnedCellSpec `yaml:"pinnedCells,omitempty"`
}
type VirtualClusterStatus ¶ added in v0.3.0
type VirtualClusterStatus []*VirtualCellStatus
func (VirtualClusterStatus) DeepCopy ¶ added in v0.3.0
func (vcs VirtualClusterStatus) DeepCopy() VirtualClusterStatus
type WebServerError ¶
func NewWebServerError ¶
func NewWebServerError(code int, message string) *WebServerError
func (*WebServerError) Error ¶
func (err *WebServerError) Error() string
type WebServerPaths ¶
type WebServerPaths struct {
Paths []string `json:"paths"`
}