1. 程式人生 > >kubernetes Pod 排程到指定的 Node

kubernetes Pod 排程到指定的 Node

        我們知道,kubernetes 的 Scheduler 服務(kube-scheduler程序)負責實現 Pod 的排程,整個排程過程通過執行一系列的演算法最終為每個 Pod 計算出一個最佳的目標節點,這一過程是自動完成的,我們無法知道 Pod 最終會被排程到哪個節點上。有時我們可能需要將 Pod 排程到一個指定的 Node 上,此時,我們可以通過 Node 的標籤 (Label)和Pod 的 nodeSelector 屬性相匹配,來達到上述目的。

        首先,我們可以通過 kubectl label 命令給目標 Node 打上一個特定的標籤,下面是此命令的完整用法:

        kubectl label nodes <node-name> <label-key>=<label-value>

        這裡,我們為kubernetes-minion1 節點上打上一個 zone=north 的標籤,表明它是 “北方”的一個節點:

        $ kubectl label nodes kubernetes-minion1 zone=north

        NAME                                             LABELS                                                                                       STATUS

        kubernetes-minion1                 kubernetes.io/hostname=kubernetes-minion1,zone=north                 Ready

        上述命令操作也可以通過修改資源定義檔案的方式,並執行 kubectl replace -f xxx.yaml 命令來完成。

        然後,在 Pod 的配置檔案中加入 nodeSelector 定義,以 redis-master0controller.yaml 為例:

        apiVersion:  v1

        kind:  ReplicationController

        metadata:

            name:  redis-master

            lables:

                name:  redis-master

        spec:

            replicas:  1

            selector:

                name:  redis-master

            template:

                metadata:

                     lables:

                         name:  redis-master

                     spec:

                         containers:

                         -  name:  master

                             images:  kubeguide/redis-master

                             ports:

                             -  containerPort:  6379

                        nodeSelector:

                            zone:  north 

        執行 kubectl create -f 命令建立 Pod,scheduler 會將該 Pod 排程到擁有 zone=north 標籤的 node 上去。

        使用 kubectl get pods -o wide

        $ kubectl get pods -o wide

        NAME                                     READY            STATUS         RESTARTS         AGE                   NODE

        redis-master-1                         1/1                   Running                0                     18s                   kubernetes-minion1

        如果我們給多個 Node 都定義了相同的標籤(如 zone=north),則scheduler 將會根據排程演算法從這組 Node 中 挑選一個可用的 Node 進行Pod 排程。

        這種基於 Node 標籤的排程方式靈活性很高,比如我們可以把一組 Node 分別貼上 “開發環境” “測試環境” “使用者驗收環境” 這三組標籤中的一種,此時一個 kubernetes叢集就承載了3個環境,這將大大提高開發效率。

        需要注意的是,如果我們指定了 Pod 的 nodeSelector 條件,且叢集中不存在包含相應標籤的 Node時,即使還有其他可供排程的 Node,這個 Pod 也最終會排程失敗。