node 節(jié)點選擇器
我們在創(chuàng)建 pod 資源的時候,pod 會根據(jù) schduler 進(jìn)行調(diào)度,那么默認(rèn)會調(diào)度到隨機(jī)的一個工
作節(jié)點,如果我們想要 pod 調(diào)度到指定節(jié)點或者調(diào)度到一些具有相同特點的 node 節(jié)點,怎么辦呢?
可以使用
pod 中的 nodeName 或者 nodeSelector 字段指定要調(diào)度到的 node 節(jié)點
1、nodeName:
指定
pod 節(jié)點運行在哪個具體 node
cat pod-node.yaml
apiVersion: v1? ?#pod屬于k8s核心組v1
kind: Pod? ? ? ? ?#創(chuàng)建的是一個pod資源? ?
metadata:? ? ? ? #元數(shù)據(jù)
? name: demo-pod1? #pod名字
? namespace: default? ?#pod所屬的名稱空間
? labels:? ? ?#標(biāo)簽
? ? app: myapp? ?#pod具有的標(biāo)簽
? ? env: dev? ? ? ? ? #pod具有的標(biāo)簽
spec:
? nodeName: god64
? containers:? ? ? ? ?#定義一個容器,容器是獨享列表
? - name: tomcat-pod-java? ?#容器名字
? ? ports:
? ? - containerPort: 8080? ? #容器內(nèi)部的port
?的? ? image: tomcat:8.5-jre8-alpine? #容器使用的景象
? ? imagePullPolicy: IfNotPresent? ? ? ?#容器拉取的策略
? - name: busybox
? ? image: busybox:latest
? ? command:? ? ? ?#command是一個列表,定義的時候下面的參數(shù)加橫線
? ? - "/bin/sh"
? ? - "-c"
? ? - "sleep 3600"
#kubectl apply -f?pod-node.yaml
#kubectl get pods -o wide 查看調(diào)度到哪里了
#優(yōu)雅刪除
kubectl delete -f pod-node.yaml
#強(qiáng)制刪除
kubectl delete -f pod-node.yaml --force --grace-period=0
2、nodeSelector:
指定?
pod?調(diào)度到具有哪些標(biāo)簽的?node?節(jié)點上
#給?node?節(jié)點打標(biāo)簽,打個具有?disk=ceph?的標(biāo)簽
kubectl label nodes god62 disk=ceph
kubectl get nodes god62 --show-labels
#定義?pod?的時候指定要調(diào)度到具有?disk=ceph?標(biāo)簽的?node?上
vim pod1.yaml
apiVersion: v1
kind: Pod
metadata:
? name: demo-pod-1
? namespace: default
? labels:
? ? app: myapp
? ? env: dev
spec:
? nodeSelector: ? ?##定義?pod?的時候指定要調(diào)度到具有?disk=ceph?標(biāo)簽的?node?上
? ? disk: ceph
? containers:
? - name: tomcat-pod-java
? ? ports:
? ? - containerPort: 8080
? ? image: tomcat:8.5-jre8-alpine
? ? imagePullPolicy: IfNotPresent
#更新,查看調(diào)度到哪里了
kubectl apply -f pod-1.yaml
kubectl get pods -o wide
# 查看kubectl describe pods demo-pod 詳細(xì)信息
3.污點和容忍度
node?節(jié)點親和性調(diào)度:nodeAffinity
kubectl explain pods.spec.affinity
FIELDS:
? nodeAffinity <Object>
? ? Describes node affinity scheduling rules for the pod.
? podAffinity? <Object>
? ? Describes pod affinity scheduling rules (e.g. co-locate this pod in the
? ? same node, zone, etc. as some other pod(s)).
? podAntiAffinity? ? ? <Object>
? ? Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod
? ? in the same node, zone, etc. as some other pod(s)).
#在查詢kubectl explain pods.spec.affinity.nodeAffinity
preferredDuringSchedulingIgnoredDuringExecution <[]Object>
prefered?表示有節(jié)點盡量滿足這個位置定義的親和性,這不是一個必須的條件,軟親和性?
requiredDuringSchedulingIgnoredDuringExecution <Object>
require?表示必須有節(jié)點滿足這個位置定義的親和性,這是個硬性條件,硬親和性
kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.no deSelectorTerms
FIELDS:
matchExpressions <[]Object> matchFields <[]Object>
matchExpressions:匹配表達(dá)式的?matchFields: 匹配字段的
? nodeSelectorTerms? ? <[]Object> -required- ? ? ? ? ?#required必須字段
kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.no deSelectorTerms.matchFields
VERSION: v1
RESOURCE: matchExpressions <[]Object>
DESCRIPTION:
FIELDS:
key <string> -required- operator <string> -required- values <[]string>
key:檢查?label
operator:做等值選則還是不等值選則?
values:給定值
使用?requiredDuringSchedulingIgnoredDuringExecution?硬親和性?#把?myapp-v1.tar.gz?上傳到 62?和 64?上,手動解壓:
docker load -i myapp-v1.tar.gz
vim pod-nodeaffinity-demo.yaml
apiVersion: v1
kind: Pod
metadata:
? ? ? ? name: pod-node-affinity-demo
? ? ? ? namespace: default
? ? ? ? labels:
? ? ? ? ? ? app: myapp
? ? ? ? ? ? tier: frontend
spec:
? ? containers:
? ? - name: myapp
? ? ? image: ikubernetes/myapp:v1
? ? affinity:
? ? ? ? nodeAffinity:
? ? ? ? ? ? requiredDuringSchedulingIgnoredDuringExecution:
? ? ? ? ? ? ? ? ? nodeSelectorTerms:
? ? ? ? ? ? ? ? ? - matchExpressions:
? ? ? ? ? ? ? ? ? ? - key: zone
? ? ? ? ? ? ? ? ? ? ? operator: In
? ? ? ? ? ? ? ? ? ? ? values:
? ? ? ? ? ? ? ? ? ? ? - foo
? ? ? ? ? ? ? ? ? ? ? - bar
spec:我們檢查當(dāng)前節(jié)點中有任意一個節(jié)點擁有?zone?標(biāo)簽的值是?foo?或者?bar,就可以把?pod?調(diào)度到 這個?node?節(jié)點的?foo?或者?bar?標(biāo)簽上的節(jié)點上
? ? containers:
? ? - name: myapp
? ? ? image: ikubernetes/myapp:v1
? ? affinity:
? ? ? ? nodeAffinity:
? ? ? ? ? ? requiredDuringSchedulingIgnoredDuringExecution:
? ? ? ? ? ? ? ? ? nodeSelectorTerms:
? ? ? ? ? ? ? ? ? - matchExpressions:
? ? ? ? ? ? ? ? ? ? - key: zone
? ? ? ? ? ? ? ? ? ? ? operator: In
? ? ? ? ? ? ? ? ? ? ? values:
? ? ? ? ? ? ? ? ? ? ? - foo
? ? ? ? ? ? ? ? ? ? ? - bar
kubectl apply -f pod-nodeaffinity-demo.yaml?
?kubectl get pods -o wide | grep pod-node
status?的狀態(tài)是?pending,上面說明沒有完成調(diào)度,因為沒有一個擁有?zone?的標(biāo)簽的值是?foo?或者?bar,而且使用的是硬親和性,必須滿足條件才能完成調(diào)度
kubectl label nodes god64 zone=foo
給這個 god64?節(jié)點打上標(biāo)簽?zone=foo,在查看
使用?preferredDuringSchedulingIgnoredDuringExecution?軟親和性
vi pod-nodeaffinity-demo-2.yaml
apiVersion: v1
kind: Pod
metadata:
? ? ? ? name: pod-node-affinity-demo-2
? ? ? ? namespace: default
? ? ? ? labels:
? ? ? ? ? ? app: myapp
? ? ? ? ? ? tier: frontend
spec:
? ? containers:
? ? - name: myapp
? ? ? image: ikubernetes/myapp:v1
? ? affinity:
? ? ? ? nodeAffinity:
? ? ? ? ? ? preferredDuringSchedulingIgnoredDuringExecution:
? ? ? ? ? ? - preference:
? ? ? ? ? ? ? matchExpressions:
? ? ? ? ? ? ? - key: zone1
? ? ? ? ? ? ? ? operator: In
? ? ? ? ? ? ? ? values:
? ? ? ? ? ? ? ? - foo1
? ? ? ? ? ? ? ? - bar1
? ? ? ? ? ? ? weight: 60
Pod?節(jié)點親和性
pod?自身的親和性調(diào)度有兩種表示形式
podaffinity:pod?和?pod?更傾向膩在一起,把相近的?pod?結(jié)合到相近的位置,如同一區(qū)域,同 一機(jī)架,這樣的話?pod?和?pod?之間更好通信,比方說有兩個機(jī)房,這兩個機(jī)房部署的集群有?1000?臺主機(jī),那么我們希望把?nginx?和?tomcat?都部署同一個地方的?node?節(jié)點上,可以提高 通信效率;
podunaffinity:pod?和?pod?更傾向不膩在一起,如果部署兩套程序,那么這兩套程序更傾向于 反親和性,這樣相互之間不會有影響。
第一個?pod?隨機(jī)選則一個節(jié)點,做為評判后續(xù)的?pod?能否到達(dá)這個?pod?所在的節(jié)點上的運行方 式,這就稱為?pod?親和性;我們怎么判定哪些節(jié)點是相同位置的,哪些節(jié)點是不同位置的;我們 在定義?pod?親和性時需要有一個前提,哪些?pod?在同一個位置,哪些?pod?不在同一個位置,這 個位置是怎么定義的,標(biāo)準(zhǔn)是什么?以節(jié)點名稱為標(biāo)準(zhǔn),這個節(jié)點名稱相同的表示是同一個位置, 節(jié)點名稱不相同的表示不是一個位置。
kubectl explain pods.spec.affinity.podAffinity
podAffinity ?親和性
podAntiAffinity 反親和性
requiredDuringSchedulingIgnoredDuringExecution: 硬親和性?preferredDuringSchedulingIgnoredDuringExecution:軟親和性
topologyKey: 位置拓?fù)涞逆I,這個是必須字段 怎么判斷是不是同一個位置:?rack=rack1
row=row1
使用?rack?的鍵是同一個位置
使用 row?的鍵是同一個位置
labelSelector:
我們要判斷 pod?跟別的?pod?親和,跟哪個?pod?親和,需要靠?labelSelector,通過?labelSelector?選則一組能作為親和對象的?pod?資源
namespace:
labelSelector?需要選則一組資源,那么這組資源是在哪個名稱空間中呢,通過?namespace?指 定,如果不指定?namespaces,那么就是當(dāng)前創(chuàng)建?pod?的名稱空間
定義兩個?pod,第一個?pod?做為基準(zhǔn),第二個?pod?跟著它走 cat pod-required-affinity-demo.yaml
apiVersion: v1
kind: Pod
metadata:
? name: pod-first
? labels:
? ? app: myapp
? ? tier: frontend
spec:
? ? containers:
? ? - name: myapp
? ? ? image: ikubernetes/myapp:v1
---
apiVersion: v1
kind: Pod
metadata:
? name: pod-second
? labels:
? ? app: backend
? ? tier: db
spec:
? ? containers:
? ? - name: busybox
? ? ? image: busybox:latest
? ? ? imagePullPolicy: IfNotPresent
? ? ? command: ["sh","-c","sleep 3600"]
? ? affinity:
? ? ? podAffinity:
? ? ? ? requiredDuringSchedulingIgnoredDuringExecution:
? ? ? ? - labelSelector:
? ? ? ? ? ? ? matchExpressions:
? ? ? ? ? ? ? - {key: app, operator: In, values: ["myapp"]}
? ? ? ? ? topologyKey: kubernetes.io/hostname
#? ? ? ? ? ? ? - {key: app, operator: In, values: ["myapp"]}. ?key里面的app引用的是之前pod的labels的app
operator 的ln代表等值關(guān)系,values: ["myapp]對應(yīng)app的 myapp ,靠第一個pod的標(biāo)簽對應(yīng)親和性,第二個標(biāo)簽會找標(biāo)簽app: myapp的標(biāo)簽
#更新看親和性
kubectl apply -f pod-required-affinity-demo.yaml
kubectl get pods -o wide
看到pod-second跟pod-first在同一個節(jié)點
上面說明第一個?pod?調(diào)度到哪,第二個?pod?也調(diào)度到哪,這就是?pod?節(jié)點親和性
kubectl delete -f pod-required-affinity-demo.yaml
pod?節(jié)點反親和性
定義兩個?
pod,第一個?pod?做為基準(zhǔn),第二個?pod?跟它調(diào)度節(jié)點相反
?cat pod-required-anti-affinity-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-first labels:
app: myapp
tier: frontend spec:
---
containers:
- name: myapp
image: ikubernetes/myapp:v1
apiVersion: v1 kind: Pod metadata:
name: pod-second labels:
app: backend
tier: db spec:
containers:
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["sh","-c","sleep 3600"] affinity:
podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector:
matchExpressions:
- {key: app, operator: In, values: ["myapp"]} topologyKey: kubernetes.io/hostname
?kubectl apply -f pod-required-anti-affinity-demo.yaml?
?kubectl get pods -o wide?顯示兩個?pod?不在一個?node?節(jié)點上,這 就是?pod?節(jié)點反親和性
pod-first running god64
pod-second running ?god62
kubectl delete -f pod-required-anti-affinity-demo.yaml
換一個?topologykey
kubectl label nodes god62 zone=foo
kubectl label nodes god64 zone=foo
cat pod-required-anti-affinity-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:
? name: pod-first
? labels:
? ? app: myapp
? ? tier: frontend
spec:
? ? containers:
? ? - name: myapp
? ? ? image: ikubernetes/myapp:v1
---
apiVersion: v1
kind: Pod
metadata:
? name: pod-second
? labels:
? ? app: backend
? ? tier: db
spec:
? ? containers:
? ? - name: busybox
? ? ? image: busybox:latest
? ? ? imagePullPolicy: IfNotPresent
? ? ? command: ["sh","-c","sleep 3600"]
? ? affinity:
? ? ? podAffinity:
? ? ? ? requiredDuringSchedulingIgnoredDuringExecution:
? ? ? ? - labelSelector:
? ? ? ? ? ? ? matchExpressions:
? ? ? ? ? ? ? - {key: app, operator: In, values: ["myapp"]}
? ? ? ? ? topologyKey: zone
kubectl apply -f pod-required-anti-affinity-demo.yaml?
kubectl get pods -o wide?顯示如下:
pod-first running god64
pod-second pending
第二個節(jié)點現(xiàn)是?pending,因為兩個節(jié)點是同一個位置,現(xiàn)在沒有不是同一個位置的了,而且我 們要求反親和性,所以就會處于?pending?狀態(tài),如果在反親和性這個位置把?required?改成?preferred,那么也會運行。
podaffinity:pod?節(jié)點親和性,pod?傾向于哪個?pod
nodeaffinity:node?節(jié)點親和性,pod?傾向于哪個?node
tolerationSeconds參數(shù)含義:
假如說你原來node1節(jié)點沒有污點,上面會有很多pod在運行,現(xiàn)在你把node1節(jié)點打個污點,排斥等級是NoExecute,這樣你node1上的pod就會被驅(qū)逐走,那多長時間被攆走,取決于tolerationSeconds,這個參數(shù)知識在定義排斥等級是NoExecute的時候才會用到