labels 在 K8s 中是一個很重要的概念,作為一個標識,Service、Deployments 和 Pods 之間的關聯都是通過 label 來實現的。而每個節點也都擁有 label,通過設置 label 相關的策略可以使得 pods 關聯到對應 label 的節點上。
nodeSelector
nodeSelector
是最簡單的約束方式。nodeSelector
是 PodSpec
的一個字段。
通過 --show-labels
可以查看當前 nodes
的labels
$ kubectl get nodes --show-labels NAME STATUS ROLES AGE VERSION LABELS minikube Ready <none> 1m v1.10.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/ hostname=minikube
如果沒有額外添加 nodes labels,那么看到的如上所示的默認標簽。我們可以通過 kubectl label node 命令給指定 node 添加 labels:
$ kubectl label node minikube disktype=ssd node/minikube labeled $ kubectl get nodes --show-labels NAME STATUS ROLES AGE VERSION LABELS minikube Ready <none> 5m v1.10.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/host
當然,你也可以通過 kubectl label node 刪除指定的 labels(標簽 key 接 - 號即可)
$ kubectl label node minikube disktype- node/minikube labeled $ kubectl get node --show-labels NAME STATUS ROLES AGE VERSION LABELS minikube Ready <none> 23m v1.10.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=minikube
創建測試 pod 並指定 nodeSelector 選項綁定節點:
$ cat nginx.yaml apiVersion: v1 kind: Pod metadata: name: nginx labels: env: test spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent nodeSelector: disktype: ssd $ kubectl create -f nginx.yaml pod/nginx created
查看 pod 調度的節點,即我們指定有 disktype=ssd label 的 minikube 節點:
$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx 1/1 Running 0 1m 172.18.0.4 minikube