2017-08-02 41 views

回答

1

假设你已经配置了谷歌针对云团kubectl,即你可以得到节点:

$ kubectl get nodes 

在终端A,只是运行以下命令:

$ kubectl proxy 

这将让您的调度程序脚本通过localhost与api-server进行交互:8001

在终端B,运行以下命令以创建自定义调度POD部署文件(注意 “schedulerName:我调度”):

$ cat > pod-to-schedule.yaml <<EOF 
apiVersion: v1 
kind: Pod 
metadata: 
    name: nginx 
    labels: 
    app: nginx 
spec: 
    schedulerName: my-scheduler 
    containers: 
    - name: nginx 
    image: nginx:1.10 
EOF 

部署荚:

$ kubectl create -f pod-to-schedule.yaml 

检查荚状态:

$ kubectl get pods nginx 
NAME  READY  STATUS RESTARTS AGE 
nginx  0/1  Pending 0   12s 

因为没有名为“my-scheduler”的调度程序,所以Pod状态为“Pending”。

现在,保存调度脚本在你博客中提到的:

$ cat << 'EOF' > my-scheduler.sh 
#!/bin/bash 
SERVER='localhost:8001' 
while true; 
do 
    for PODNAME in $(kubectl --server $SERVER get pods -o json | jq '.items[] | select(.spec.schedulerName == "my-scheduler") | select(.spec.nodeName == null) | .metadata.name' | tr -d '"'); 
    do 
     NODES=($(kubectl --server $SERVER get nodes -o json | jq '.items[].metadata.name' | tr -d '"')) 
     NUMNODES=${#NODES[@]} 
     CHOSEN=${NODES[$[ $RANDOM % $NUMNODES ]]} 
     curl --header "Content-Type:application/json" --request POST --data '{"apiVersion":"v1", "kind": "Binding", "metadata": {"name": "'$PODNAME'"}, "target": {"apiVersion": "v1", "kind" 
: "Node", "name": "'$CHOSEN'"}}' http://$SERVER/api/v1/namespaces/default/pods/$PODNAME/binding/ 
     echo "Assigned $PODNAME to $CHOSEN" 
    done 
    sleep 1 
done 
EOF 

运行您的调度:

$ bash my-scheduler.sh 
{ 
    "kind": "Status", 
    "apiVersion": "v1", 
    "metadata": {}, 
    "status": "Success", 
    "code": 201 
}Assigned nginx to gke-cluster-1-default-pool-ac152967-nd30 

观察输出,说明一个节点分配(调度)为您的吊舱完成。验证吊舱不再挂起:

$ kubectl get pods nginx 
NAME  READY  STATUS RESTARTS AGE 
nginx  1/1  Running 0   10m 
相关问题