apiVersion: v1 kind: Pod #建立的資源類型能夠是,Deployment、Job、Ingress、Service等 metadata: #包含Pod的一些meta信息,好比名稱、namespace、標籤等信息 name: ng1 #Podname labels: #標籤 app: web spec: containers: - name: ng1 #容器name image: hub.c.163.com/library/nginx #鏡像拉取地址 imagePullPolicy: IfNotPresent #鏡像拉取策略,Always,(不管本地是否有每次都拉取) Never,(每次都不拉取,即便本地沒有也不拉取) IfNotPresent(本地有就用,沒有就去拉) ports: #對外開放端口 - containerPort: 80
節點選擇器: nodeSelector、nodeName
基於node_name調度node
apiVersion: v1 kind: Pod metadata: name: ng2 spec: nodeName: cs25 #指定調度到"cs25" node節點上 containers: - name: ng2 image: hub.c.163.com/library/nginx
基於node標籤來調度
kubectl label nodes cs25 disk=ssd
#給節點cs25 添加標籤nginx
apiVersion: v1 kind: Pod metadata: name: ng2 spec: nodeSelector: disk: ssd #表示要只有node節點上有"disk=ssd",才能被調度上去 containers: - name: ng2 image: hub.c.163.com/library/nginx
節點親和性調度: nodeAffinityweb
apiVersion: v1 kind: Pod metadata: name: ng2 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: #requiredDuringSchedulingIgnoredDuringExecution 硬親和性 必須知足親和性,知足不調用 #preferredDuringSchedulingIgnoredDuringExecution 軟親和性 能知足最好,不知足也不要緊。 nodeSelectorTerms: - matchExpressions: - key: disk operator: In #表示上面那個字段必須包含下面兩個值, 還能夠換成"NotIn"取反 values: - jx - ssd #表示 只能調度到node有"disk=jx" 或"node=ssd" containers: - name: ng2
POD調度 podAffinity 和 podAntiAffinityapi
apiVersion: v1 kind: Pod metadata: name: ng2 labels: app: nginx spec: containers: - name: ng2 image: hub.c.163.com/library/nginx --- apiVersion: v1 kind: Pod metadata: name: ng3 spec: containers: - name: ng3 image: hub.c.163.com/library/nginx affinity: podAntiAffinity: #反親和,表示知足條件的,讓兩個主機不在同一臺node主機上運行,換成"podAffinity:"功能相反 requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - {key: app, operator: In, values: ["nginx"]} topologyKey: kubernetes.io/hostname
labelSelector : 選擇跟那組Pod親和
namespaces : 選擇哪一個命名空間
topologyKey : 指定節點上的哪一個鍵
假如在反親和場景"topologyKey: type" 這個node標籤全部主機都有,則第二臺容器沒法被調度到任何主機app
kubectl taint nodes cs25 key=value:NoSchedule
NoSchedule:僅影響調度過程,對現存的Pod對象不產生影響;
NoExecute:既影響調度過程,也影響顯著的Pod對象;不容忍的Pod對象將被驅逐
PreferNoSchedule: 表示儘可能不調度ide
建立污點
kubectl taint node cs25 rongren=true:NoSchedule
#表示在cs25節點上建立一個 rongren的鍵 鍵值爲"true",調度策略爲NoSchedule
kubectl taint node cs25 rongren-
#刪除污點,指定鍵名加"-"便可
ui
apiVersion: v1 kind: Pod metadata: name: ng6 spec: containers: - name: ng6 image: nginx tolerations: #設置容忍性 - key: "rongren" operator: "Equal" #若是操做符爲Exists,那麼value屬性可省略,表示key這個存在即經過,若是不指定operator,則默認爲Equal,value必定要和設置的值相等,不然沒法經過 value: "true" effect: "NoSchedule" #意思是這個Pod要容忍的有污點的Node的key是」rongren「 Equal true,效果是NoSchedule, #tolerations屬性下各值必須使用引號,容忍的值都是設置Node的taints時給的值。
若是在設置node的Taints(污點)以前,就已經運行了一些Pod,那麼這些Pod是否還能繼續在此Node上運行? 這就要看設置Taints污點時的effect(效果)了。spa
若是effect的值是NoSchedule或PreferNoSchedule,那麼已運行的Pod仍然能夠運行,只是新Pod(若是沒有容忍)不會再往上調度。 而若是effect的值是NoExecute,那麼此Node上正在運行的Pod,只要沒有容忍的,馬上被驅逐。 雖然是馬上被驅逐,可是K8S爲了彰顯人性化,又給具備NoExecute效果的污點, 在容忍屬性中有一個可選的 tolerationSeconds字段,用來設置這些Pod還能夠在這個Node之上運行多久,給它們一點寬限的時間,到時間才驅逐。 若是是以Pod來啓動的,那麼Pod被驅逐後, 將不會再被運行,就等於把它刪除了。 若是是deployment/rc,那麼刪除的pod會再其它節點運行。 若是是DaemonSet在此Node上啓動的Pod,那麼也不會再被運行,直到Node上的NoExecute污被去除或者Pod容忍。