2017-08-02 44 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 
相關問題