首先介紹下什么是Label?
Label是Kubernetes系列中一個核心概念。是一組綁定到K8s資源對象上的key/value對。同一個對象的labels屬性的key必須唯一。label可以附加到各種資源對象上,如Node,Pod,Service,RC等。
通過給指定的資源對象捆綁一個或多個不用的label來實現多維度的資源分組管理功能,以便於靈活,方便地進行資源分配,調度,配置,部署等管理工作。
默認配置下,Scheduler 會將 Pod 調度到所有可用的 Node。不過有些實際情況我們希望將 Pod 部署到指定的 Node,比如將有大量磁盤 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 需要 GPU,需要運行在配置了 GPU 的節點上。
下面我們來實際的操作下,比如執行如下命令標注 k8s-node1 是配置了 SSD的節點。
kubectl label node k8snode1 disktype=ssd
然后通過 kubectl get node –show-labels 查看節點的 label。
可以看到disktype=ssd 已經成功添加到 k8snode1,除了 disktype,Node 還有幾個 Kubernetes 自己維護的 label。有了 disktype 這個自定義 label,接下來就可以指定將 Pod 部署到 k8snod1。比如我編輯nginx.yml,增加nodeSelector標簽,指定將此Pod部署到具有ssd屬性的Node上去。
最后通過kubectl get pod -o wide。
如果要刪除 label disktype,就執行如下命令刪除即可:
kubectl label node k8s-node1 disktype-
但是要注意已經部署的 Pod 並不會重新部署,依然在 k8snode1 上運行。可能會有人說了,那怎么讓Pod變回原樣呢也就是分配到多個node上,那就需要一個笨方法了(至少在目前我學習的方法里面只會這樣操作),就是在剛才編輯的那個nginx.yml文件里面刪除nodeSelector標簽,然后在利用kubectl apply重新部署,Kubernetes 會刪除之前的 Pod 並調度和運行新的 Pod。