K8S Scheduler 是做什么的

- 预选,K8S会遍历当前集群中的所有 Node,筛选出其中符合要求的 Node 作为候选
- 优选,K8S将对候选的 Node 进行打分
K8S Scheduler 提供的预选策略

K8S Scheduler 提供的优选策略

如何扩展 K8S Scheduler

如何实现自己的 Scheduler 扩展
编写扩展程序
func (e *Extender) serveHTTP(w http.ResponseWriter, req *http.Request) {
if strings.Contains(req.URL.Path, filter) {
e.processFilterRequest(w, req)
} else if strings.Contains(req.URL.Path, prioritize) {
e.processPrioritizeRequest(w, req)
} else {
http.Error(w, “Unsupported request”, http.StatusNotFound)
}
}
func (e *Extender) processFilterRequest(w http.ResponseWriter, req *http.Request) {
decoder := json.NewDecoder(req.Body)
defer func() {
if err := req.Body.Close(); err != nil {
glog.Errorf(“Error closing decoder”)
}
}()
encoder := json.NewEncoder(w)var args schedulerApi.ExtenderArgs
if err := decoder.Decode(&args); err != nil {
glog.Errorf(“Error decoding filter request: %v”, err)
http.Error(w, “Decode error”, http.StatusBadRequest)
return
}// Your logic
pod := args.Pod
nodes := args.Nodes.Itemsresponse := &schedulerApi.ExtenderFilterResult{
Nodes: &v1.NodeList{
Items: nodes,
},
}
if err := encoder.Encode(response); err != nil {
glog.Errorf(“Error encoding filter response: %+v : %v”, response, err)
}
}
func (e *Extender) processPrioritizeRequest(w http.ResponseWriter, req *http.Request) {
decoder := json.NewDecoder(req.Body)
defer func() {
if err := req.Body.Close(); err != nil {
glog.Fatalf(“Error closing decoder”)
}
}()
encoder := json.NewEncoder(w)var args schedulerApi.ExtenderArgs
if err := decoder.Decode(&args); err != nil {
glog.Errorf(“Error decoding prioritize request: %v”, err)
http.Error(w, “Decode error”, http.StatusBadRequest)
return
}// Your logic
for _, node := range args.Nodes.Items {
hostPriority := schedulerApi.HostPriority{Host: node.Name, Score: 1}
respList = append(respList, hostPriority)
}if err := encoder.Encode(respList); err != nil {
glog.Errorf(“Failed to encode response: %v”, err)
}
}
部署新的 Scheduler
创建 Scheduler 配置
apiVersion: v1
kind: ConfigMap
metadata:
name: yrcloudfile-scheduler-config
namespace: yanrongyun
data:
policy.cfg: |-
{
“kind”: “Policy”,
“apiVersion”: “v1”,
“predicates”: [],
“priorities”: [],
“extenders”: [
{
“urlPrefix”: “http://yrcloudfile-extender-service.yanrongyun.svc.cluster.local:8099”,
“apiVersion”: “v1beta1”,
“filterVerb”: “filter”,
“prioritizeVerb”: “prioritize”,
“weight”: 5,
“enableHttps”: false,
“nodeCacheCapable”: false
}
]
}
部署 Scheduler
apiVersion: apps/v1beta1
kind: Deployment
metadata:
labels:
component: scheduler
tier: control-plane
name: yrcloudflie-scheduler
namespace: yanrongyun
initializers:
pending: []spec:
replicas: 3
template:
metadata:
labels:
component: scheduler
tier: control-plane
name: yrcloudflie-scheduler
spec:
containers:
– command:
– /usr/local/bin/kube-scheduler
– –address=0.0.0.0
– –leader-elect=true
– –scheduler-name=yrcloudfile-scheduler
– –policy-configmap=yrcloudfile-scheduler-config
– –policy-configmap-namespace=yanrongyun
– –lock-object-name=yrcloudfile-scheduler
image: k8s.gcr.io/kube-scheduler:v1.13.0
livenessProbe:
httpGet:
path: /healthz
port: 10251
initialDelaySeconds: 15
name: yrcloudflie-scheduler
readinessProbe:
httpGet:
path: /healthz
port: 10251
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
– labelSelector:
matchExpressions:
– key: “name”
operator: In
values:
– yrcloudflie-scheduler
topologyKey: “kubernetes.io/hostname”
hostPID: false
serviceAccountName: yrcloudflie-scheduler-account
如何使用新的 Scheduler
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
labels:
app: busyboxspec:
replicas: 1
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:schedulerName: yrcloudfile-scheduler
containers:
– image: busybox
imagePullPolicy: IfNotPresent
name: busybox
YRCloudFile扩展的K8S Scheduler
在焱融云最新发布的YRCloudFile 6.0 版本中,新增了对 CSI 故障动态感知的功能,这个功能就是通过扩展 Scheduler 实现的。
在使用 default-scheduler 的情况下,如果Work Node的存储集群连接中断, Kubernetes 并不能感知到这种故障,仍然会将 Pod 调度到故障 Node 中,这使得 Kubernetes 会不断重复的做无用的调度,使 Pod 无法正常完成部署,影响了整个集群的效能。
如图所示,我们部署了3副本的 busybox 容器,并且 node-3.yr 节点和存储存在连接故障,该节点上的 Pod 一直保持在 ContainerCreating 状态,无法创建成功;




登录后评论
立即登录 注册